blob: 3f9705093c6321533b073f90e52ebf6549f4e64d [file] [log] [blame]
yuezonghe824eb0c2024-06-27 02:32:26 -07001/*
2 BlueZ - Bluetooth protocol stack for Linux
3 Copyright (C) 2000-2001 Qualcomm Incorporated
4
5 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License version 2 as
9 published by the Free Software Foundation;
10
11 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
12 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
14 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
15 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
16 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
20 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
22 SOFTWARE IS DISCLAIMED.
23*/
24
25/* Bluetooth address family and sockets. */
26
27#include <linux/module.h>
28
29#include <linux/types.h>
30#include <linux/list.h>
31#include <linux/errno.h>
32#include <linux/kernel.h>
33#include <linux/sched.h>
34#include <linux/skbuff.h>
35#include <linux/init.h>
36#include <linux/poll.h>
37#include <net/sock.h>
38#include <asm/ioctls.h>
39#include <linux/kmod.h>
40
41#include <net/bluetooth/bluetooth.h>
42
43#ifdef CONFIG_ANDROID_PARANOID_NETWORK
44#include <linux/android_aid.h>
45#endif
46
47#ifndef CONFIG_BT_SOCK_DEBUG
48#undef BT_DBG
49#define BT_DBG(D...)
50#endif
51
52#define VERSION "2.16"
53
54/* Bluetooth sockets */
55#define BT_MAX_PROTO 8
56static const struct net_proto_family *bt_proto[BT_MAX_PROTO];
57static DEFINE_RWLOCK(bt_proto_lock);
58
59static struct lock_class_key bt_lock_key[BT_MAX_PROTO];
60static const char *const bt_key_strings[BT_MAX_PROTO] = {
61 "sk_lock-AF_BLUETOOTH-BTPROTO_L2CAP",
62 "sk_lock-AF_BLUETOOTH-BTPROTO_HCI",
63 "sk_lock-AF_BLUETOOTH-BTPROTO_SCO",
64 "sk_lock-AF_BLUETOOTH-BTPROTO_RFCOMM",
65 "sk_lock-AF_BLUETOOTH-BTPROTO_BNEP",
66 "sk_lock-AF_BLUETOOTH-BTPROTO_CMTP",
67 "sk_lock-AF_BLUETOOTH-BTPROTO_HIDP",
68 "sk_lock-AF_BLUETOOTH-BTPROTO_AVDTP",
69};
70
71static struct lock_class_key bt_slock_key[BT_MAX_PROTO];
72static const char *const bt_slock_key_strings[BT_MAX_PROTO] = {
73 "slock-AF_BLUETOOTH-BTPROTO_L2CAP",
74 "slock-AF_BLUETOOTH-BTPROTO_HCI",
75 "slock-AF_BLUETOOTH-BTPROTO_SCO",
76 "slock-AF_BLUETOOTH-BTPROTO_RFCOMM",
77 "slock-AF_BLUETOOTH-BTPROTO_BNEP",
78 "slock-AF_BLUETOOTH-BTPROTO_CMTP",
79 "slock-AF_BLUETOOTH-BTPROTO_HIDP",
80 "slock-AF_BLUETOOTH-BTPROTO_AVDTP",
81};
82
83void bt_sock_reclassify_lock(struct sock *sk, int proto)
84{
85 BUG_ON(!sk);
86 BUG_ON(sock_owned_by_user(sk));
87
88 sock_lock_init_class_and_name(sk,
89 bt_slock_key_strings[proto], &bt_slock_key[proto],
90 bt_key_strings[proto], &bt_lock_key[proto]);
91}
92EXPORT_SYMBOL(bt_sock_reclassify_lock);
93
94int bt_sock_register(int proto, const struct net_proto_family *ops)
95{
96 int err = 0;
97
98 if (proto < 0 || proto >= BT_MAX_PROTO)
99 return -EINVAL;
100
101 write_lock(&bt_proto_lock);
102
103 if (bt_proto[proto])
104 err = -EEXIST;
105 else
106 bt_proto[proto] = ops;
107
108 write_unlock(&bt_proto_lock);
109
110 return err;
111}
112EXPORT_SYMBOL(bt_sock_register);
113
114int bt_sock_unregister(int proto)
115{
116 int err = 0;
117
118 if (proto < 0 || proto >= BT_MAX_PROTO)
119 return -EINVAL;
120
121 write_lock(&bt_proto_lock);
122
123 if (!bt_proto[proto])
124 err = -ENOENT;
125 else
126 bt_proto[proto] = NULL;
127
128 write_unlock(&bt_proto_lock);
129
130 return err;
131}
132EXPORT_SYMBOL(bt_sock_unregister);
133
134#ifdef CONFIG_ANDROID_PARANOID_NETWORK
135static inline int current_has_bt_admin(void)
136{
137 return (!current_euid() || in_egroup_p(AID_NET_BT_ADMIN));
138}
139
140static inline int current_has_bt(void)
141{
142 return (current_has_bt_admin() || in_egroup_p(AID_NET_BT));
143}
144# else
145static inline int current_has_bt_admin(void)
146{
147 return 1;
148}
149
150static inline int current_has_bt(void)
151{
152 return 1;
153}
154#endif
155
156static int bt_sock_create(struct net *net, struct socket *sock, int proto,
157 int kern)
158{
159 int err;
160
161 if (proto == BTPROTO_RFCOMM || proto == BTPROTO_SCO ||
162 proto == BTPROTO_L2CAP) {
163 if (!current_has_bt())
164 return -EPERM;
165 } else if (!current_has_bt_admin())
166 return -EPERM;
167
168 if (net != &init_net)
169 return -EAFNOSUPPORT;
170
171 if (proto < 0 || proto >= BT_MAX_PROTO)
172 return -EINVAL;
173
174 if (!bt_proto[proto])
175 request_module("bt-proto-%d", proto);
176
177 err = -EPROTONOSUPPORT;
178
179 read_lock(&bt_proto_lock);
180
181 if (bt_proto[proto] && try_module_get(bt_proto[proto]->owner)) {
182 err = bt_proto[proto]->create(net, sock, proto, kern);
183 if (!err)
184 bt_sock_reclassify_lock(sock->sk, proto);
185 module_put(bt_proto[proto]->owner);
186 }
187
188 read_unlock(&bt_proto_lock);
189
190 return err;
191}
192
193void bt_sock_link(struct bt_sock_list *l, struct sock *sk)
194{
195 write_lock(&l->lock);
196 sk_add_node(sk, &l->head);
197 write_unlock(&l->lock);
198}
199EXPORT_SYMBOL(bt_sock_link);
200
201void bt_sock_unlink(struct bt_sock_list *l, struct sock *sk)
202{
203 write_lock(&l->lock);
204 sk_del_node_init(sk);
205 write_unlock(&l->lock);
206}
207EXPORT_SYMBOL(bt_sock_unlink);
208
209void bt_accept_enqueue(struct sock *parent, struct sock *sk)
210{
211 BT_DBG("parent %p, sk %p", parent, sk);
212
213 sock_hold(sk);
214 list_add_tail(&bt_sk(sk)->accept_q, &bt_sk(parent)->accept_q);
215 bt_sk(sk)->parent = parent;
216 parent->sk_ack_backlog++;
217}
218EXPORT_SYMBOL(bt_accept_enqueue);
219
220void bt_accept_unlink(struct sock *sk)
221{
222 BT_DBG("sk %p state %d", sk, sk->sk_state);
223
224 list_del_init(&bt_sk(sk)->accept_q);
225 bt_sk(sk)->parent->sk_ack_backlog--;
226 bt_sk(sk)->parent = NULL;
227 sock_put(sk);
228}
229EXPORT_SYMBOL(bt_accept_unlink);
230
231struct sock *bt_accept_dequeue(struct sock *parent, struct socket *newsock)
232{
233 struct list_head *p, *n;
234 struct sock *sk;
235
236 BT_DBG("parent %p", parent);
237
238 list_for_each_safe(p, n, &bt_sk(parent)->accept_q) {
239 sk = (struct sock *) list_entry(p, struct bt_sock, accept_q);
240
241 lock_sock(sk);
242
243 /* FIXME: Is this check still needed */
244 if (sk->sk_state == BT_CLOSED) {
245 release_sock(sk);
246 bt_accept_unlink(sk);
247 continue;
248 }
249
250 if (sk->sk_state == BT_CONNECTED || !newsock ||
251 bt_sk(parent)->defer_setup) {
252 bt_accept_unlink(sk);
253 if (newsock)
254 sock_graft(sk, newsock);
255
256 release_sock(sk);
257 return sk;
258 }
259
260 release_sock(sk);
261 }
262
263 return NULL;
264}
265EXPORT_SYMBOL(bt_accept_dequeue);
266
267int bt_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
268 struct msghdr *msg, size_t len, int flags)
269{
270 int noblock = flags & MSG_DONTWAIT;
271 struct sock *sk = sock->sk;
272 struct sk_buff *skb;
273 size_t copied;
274 int err;
275
276 BT_DBG("sock %p sk %p len %zu", sock, sk, len);
277
278 if (flags & (MSG_OOB))
279 return -EOPNOTSUPP;
280
281 skb = skb_recv_datagram(sk, flags, noblock, &err);
282 if (!skb) {
283 if (sk->sk_shutdown & RCV_SHUTDOWN)
284 return 0;
285 return err;
286 }
287
288 copied = skb->len;
289 if (len < copied) {
290 msg->msg_flags |= MSG_TRUNC;
291 copied = len;
292 }
293
294 skb_reset_transport_header(skb);
295 err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
296 if (err == 0)
297 sock_recv_ts_and_drops(msg, sk, skb);
298
299 skb_free_datagram(sk, skb);
300
301 return err ? : copied;
302}
303EXPORT_SYMBOL(bt_sock_recvmsg);
304
305static long bt_sock_data_wait(struct sock *sk, long timeo)
306{
307 DECLARE_WAITQUEUE(wait, current);
308
309 add_wait_queue(sk_sleep(sk), &wait);
310 for (;;) {
311 set_current_state(TASK_INTERRUPTIBLE);
312
313 if (!skb_queue_empty(&sk->sk_receive_queue))
314 break;
315
316 if (sk->sk_err || (sk->sk_shutdown & RCV_SHUTDOWN))
317 break;
318
319 if (signal_pending(current) || !timeo)
320 break;
321
322 set_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags);
323 release_sock(sk);
324 timeo = schedule_timeout(timeo);
325 lock_sock(sk);
326 clear_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags);
327 }
328
329 __set_current_state(TASK_RUNNING);
330 remove_wait_queue(sk_sleep(sk), &wait);
331 return timeo;
332}
333
334int bt_sock_stream_recvmsg(struct kiocb *iocb, struct socket *sock,
335 struct msghdr *msg, size_t size, int flags)
336{
337 struct sock *sk = sock->sk;
338 int err = 0;
339 size_t target, copied = 0;
340 long timeo;
341
342 if (flags & MSG_OOB)
343 return -EOPNOTSUPP;
344
345 BT_DBG("sk %p size %zu", sk, size);
346
347 lock_sock(sk);
348
349 target = sock_rcvlowat(sk, flags & MSG_WAITALL, size);
350 timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
351
352 do {
353 struct sk_buff *skb;
354 int chunk;
355
356 skb = skb_dequeue(&sk->sk_receive_queue);
357 if (!skb) {
358 if (copied >= target)
359 break;
360
361 err = sock_error(sk);
362 if (err)
363 break;
364 if (sk->sk_shutdown & RCV_SHUTDOWN)
365 break;
366
367 err = -EAGAIN;
368 if (!timeo)
369 break;
370
371 timeo = bt_sock_data_wait(sk, timeo);
372
373 if (signal_pending(current)) {
374 err = sock_intr_errno(timeo);
375 goto out;
376 }
377 continue;
378 }
379
380 chunk = min_t(unsigned int, skb->len, size);
381 if (skb_copy_datagram_iovec(skb, 0, msg->msg_iov, chunk)) {
382 skb_queue_head(&sk->sk_receive_queue, skb);
383 if (!copied)
384 copied = -EFAULT;
385 break;
386 }
387 copied += chunk;
388 size -= chunk;
389
390 sock_recv_ts_and_drops(msg, sk, skb);
391
392 if (!(flags & MSG_PEEK)) {
393 int skb_len = skb_headlen(skb);
394
395 if (chunk <= skb_len) {
396 __skb_pull(skb, chunk);
397 } else {
398 struct sk_buff *frag;
399
400 __skb_pull(skb, skb_len);
401 chunk -= skb_len;
402
403 skb_walk_frags(skb, frag) {
404 if (chunk <= frag->len) {
405 /* Pulling partial data */
406 skb->len -= chunk;
407 skb->data_len -= chunk;
408 __skb_pull(frag, chunk);
409 break;
410 } else if (frag->len) {
411 /* Pulling all frag data */
412 chunk -= frag->len;
413 skb->len -= frag->len;
414 skb->data_len -= frag->len;
415 __skb_pull(frag, frag->len);
416 }
417 }
418 }
419
420 if (skb->len) {
421 skb_queue_head(&sk->sk_receive_queue, skb);
422 break;
423 }
424 kfree_skb(skb);
425
426 } else {
427 /* put message back and return */
428 skb_queue_head(&sk->sk_receive_queue, skb);
429 break;
430 }
431 } while (size);
432
433out:
434 release_sock(sk);
435 return copied ? : err;
436}
437EXPORT_SYMBOL(bt_sock_stream_recvmsg);
438
439static inline unsigned int bt_accept_poll(struct sock *parent)
440{
441 struct list_head *p, *n;
442 struct sock *sk;
443
444 list_for_each_safe(p, n, &bt_sk(parent)->accept_q) {
445 sk = (struct sock *) list_entry(p, struct bt_sock, accept_q);
446 if (sk->sk_state == BT_CONNECTED ||
447 (bt_sk(parent)->defer_setup &&
448 sk->sk_state == BT_CONNECT2))
449 return POLLIN | POLLRDNORM;
450 }
451
452 return 0;
453}
454
455unsigned int bt_sock_poll(struct file *file, struct socket *sock, poll_table *wait)
456{
457 struct sock *sk = sock->sk;
458 unsigned int mask = 0;
459
460 BT_DBG("sock %p, sk %p", sock, sk);
461
462 poll_wait(file, sk_sleep(sk), wait);
463
464 if (sk->sk_state == BT_LISTEN)
465 return bt_accept_poll(sk);
466
467 if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue))
468 mask |= POLLERR;
469
470 if (sk->sk_shutdown & RCV_SHUTDOWN)
471 mask |= POLLRDHUP | POLLIN | POLLRDNORM;
472
473 if (sk->sk_shutdown == SHUTDOWN_MASK)
474 mask |= POLLHUP;
475
476 if (!skb_queue_empty(&sk->sk_receive_queue))
477 mask |= POLLIN | POLLRDNORM;
478
479 if (sk->sk_state == BT_CLOSED)
480 mask |= POLLHUP;
481
482 if (sk->sk_state == BT_CONNECT ||
483 sk->sk_state == BT_CONNECT2 ||
484 sk->sk_state == BT_CONFIG)
485 return mask;
486
487 if (!bt_sk(sk)->suspended && sock_writeable(sk))
488 mask |= POLLOUT | POLLWRNORM | POLLWRBAND;
489 else
490 set_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags);
491
492 return mask;
493}
494EXPORT_SYMBOL(bt_sock_poll);
495
496int bt_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
497{
498 struct sock *sk = sock->sk;
499 struct sk_buff *skb;
500 long amount;
501 int err;
502
503 BT_DBG("sk %p cmd %x arg %lx", sk, cmd, arg);
504
505 switch (cmd) {
506 case TIOCOUTQ:
507 if (sk->sk_state == BT_LISTEN)
508 return -EINVAL;
509
510 amount = sk->sk_sndbuf - sk_wmem_alloc_get(sk);
511 if (amount < 0)
512 amount = 0;
513 err = put_user(amount, (int __user *) arg);
514 break;
515
516 case TIOCINQ:
517 if (sk->sk_state == BT_LISTEN)
518 return -EINVAL;
519
520 lock_sock(sk);
521 skb = skb_peek(&sk->sk_receive_queue);
522 amount = skb ? skb->len : 0;
523 release_sock(sk);
524 err = put_user(amount, (int __user *) arg);
525 break;
526
527 case SIOCGSTAMP:
528 err = sock_get_timestamp(sk, (struct timeval __user *) arg);
529 break;
530
531 case SIOCGSTAMPNS:
532 err = sock_get_timestampns(sk, (struct timespec __user *) arg);
533 break;
534
535 default:
536 err = -ENOIOCTLCMD;
537 break;
538 }
539
540 return err;
541}
542EXPORT_SYMBOL(bt_sock_ioctl);
543
544int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo)
545{
546 DECLARE_WAITQUEUE(wait, current);
547 int err = 0;
548
549 BT_DBG("sk %p", sk);
550
551 add_wait_queue(sk_sleep(sk), &wait);
552 set_current_state(TASK_INTERRUPTIBLE);
553 while (sk->sk_state != state) {
554 if (!timeo) {
555 err = -EINPROGRESS;
556 break;
557 }
558
559 if (signal_pending(current)) {
560 err = sock_intr_errno(timeo);
561 break;
562 }
563
564 release_sock(sk);
565 timeo = schedule_timeout(timeo);
566 lock_sock(sk);
567 set_current_state(TASK_INTERRUPTIBLE);
568
569 err = sock_error(sk);
570 if (err)
571 break;
572 }
573 __set_current_state(TASK_RUNNING);
574 remove_wait_queue(sk_sleep(sk), &wait);
575 return err;
576}
577EXPORT_SYMBOL(bt_sock_wait_state);
578
579static struct net_proto_family bt_sock_family_ops = {
580 .owner = THIS_MODULE,
581 .family = PF_BLUETOOTH,
582 .create = bt_sock_create,
583};
584
585static int __init bt_init(void)
586{
587 int err;
588
589 BT_INFO("Core ver %s", VERSION);
590
591 err = bt_sysfs_init();
592 if (err < 0)
593 return err;
594
595 err = sock_register(&bt_sock_family_ops);
596 if (err < 0) {
597 bt_sysfs_cleanup();
598 return err;
599 }
600
601 BT_INFO("HCI device and connection manager initialized");
602
603 err = hci_sock_init();
604 if (err < 0)
605 goto error;
606
607 err = l2cap_init();
608 if (err < 0)
609 goto sock_err;
610
611 err = sco_init();
612 if (err < 0) {
613 l2cap_exit();
614 goto sock_err;
615 }
616
617 return 0;
618
619sock_err:
620 hci_sock_cleanup();
621
622error:
623 sock_unregister(PF_BLUETOOTH);
624 bt_sysfs_cleanup();
625
626 return err;
627}
628
629static void __exit bt_exit(void)
630{
631
632 sco_exit();
633
634 l2cap_exit();
635
636 hci_sock_cleanup();
637
638 sock_unregister(PF_BLUETOOTH);
639
640 bt_sysfs_cleanup();
641}
642
643subsys_initcall(bt_init);
644module_exit(bt_exit);
645
646MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
647MODULE_DESCRIPTION("Bluetooth Core ver " VERSION);
648MODULE_VERSION(VERSION);
649MODULE_LICENSE("GPL");
650MODULE_ALIAS_NETPROTO(PF_BLUETOOTH);