defconfig: exynos9610: Re-add dropped Wi-Fi AP options lost
[GitHub/LineageOS/android_kernel_motorola_exynos9610.git] / net / bluetooth / af_bluetooth.c
CommitLineData
8e87d142 1/*
1da177e4
LT
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
8e87d142
YH
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
1da177e4
LT
18 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
8e87d142
YH
20 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
1da177e4
LT
22 SOFTWARE IS DISCLAIMED.
23*/
24
25/* Bluetooth address family and sockets. */
26
1da177e4 27#include <linux/module.h>
ffcecac6 28#include <linux/debugfs.h>
9e8305b3 29#include <linux/stringify.h>
174cd4b1
IM
30#include <linux/sched/signal.h>
31
3241ad82 32#include <asm/ioctls.h>
1da177e4
LT
33
34#include <net/bluetooth/bluetooth.h>
256a06c8 35#include <linux/proc_fs.h>
1da177e4 36
e64c97b5 37#include "leds.h"
ee485290
MH
38#include "selftest.h"
39
1da177e4
LT
40/* Bluetooth sockets */
41#define BT_MAX_PROTO 8
ec1b4cf7 42static const struct net_proto_family *bt_proto[BT_MAX_PROTO];
db7aa1c2 43static DEFINE_RWLOCK(bt_proto_lock);
68845cb2 44
68845cb2 45static struct lock_class_key bt_lock_key[BT_MAX_PROTO];
36cbd3dc 46static const char *const bt_key_strings[BT_MAX_PROTO] = {
68845cb2
DY
47 "sk_lock-AF_BLUETOOTH-BTPROTO_L2CAP",
48 "sk_lock-AF_BLUETOOTH-BTPROTO_HCI",
49 "sk_lock-AF_BLUETOOTH-BTPROTO_SCO",
50 "sk_lock-AF_BLUETOOTH-BTPROTO_RFCOMM",
51 "sk_lock-AF_BLUETOOTH-BTPROTO_BNEP",
52 "sk_lock-AF_BLUETOOTH-BTPROTO_CMTP",
53 "sk_lock-AF_BLUETOOTH-BTPROTO_HIDP",
54 "sk_lock-AF_BLUETOOTH-BTPROTO_AVDTP",
55};
56
db7aa1c2 57static struct lock_class_key bt_slock_key[BT_MAX_PROTO];
36cbd3dc 58static const char *const bt_slock_key_strings[BT_MAX_PROTO] = {
68845cb2
DY
59 "slock-AF_BLUETOOTH-BTPROTO_L2CAP",
60 "slock-AF_BLUETOOTH-BTPROTO_HCI",
61 "slock-AF_BLUETOOTH-BTPROTO_SCO",
62 "slock-AF_BLUETOOTH-BTPROTO_RFCOMM",
63 "slock-AF_BLUETOOTH-BTPROTO_BNEP",
64 "slock-AF_BLUETOOTH-BTPROTO_CMTP",
65 "slock-AF_BLUETOOTH-BTPROTO_HIDP",
66 "slock-AF_BLUETOOTH-BTPROTO_AVDTP",
67};
db7aa1c2 68
b5a30dda 69void bt_sock_reclassify_lock(struct sock *sk, int proto)
db7aa1c2 70{
b5a30dda 71 BUG_ON(!sk);
fafc4e1e 72 BUG_ON(!sock_allow_reclassification(sk));
db7aa1c2
MH
73
74 sock_lock_init_class_and_name(sk,
75 bt_slock_key_strings[proto], &bt_slock_key[proto],
76 bt_key_strings[proto], &bt_lock_key[proto]);
77}
b5a30dda 78EXPORT_SYMBOL(bt_sock_reclassify_lock);
1da177e4 79
ec1b4cf7 80int bt_sock_register(int proto, const struct net_proto_family *ops)
1da177e4 81{
74da626a
MH
82 int err = 0;
83
1da177e4
LT
84 if (proto < 0 || proto >= BT_MAX_PROTO)
85 return -EINVAL;
86
74da626a
MH
87 write_lock(&bt_proto_lock);
88
1da177e4 89 if (bt_proto[proto])
74da626a
MH
90 err = -EEXIST;
91 else
92 bt_proto[proto] = ops;
93
94 write_unlock(&bt_proto_lock);
1da177e4 95
74da626a 96 return err;
1da177e4
LT
97}
98EXPORT_SYMBOL(bt_sock_register);
99
be9f97f0 100void bt_sock_unregister(int proto)
1da177e4
LT
101{
102 if (proto < 0 || proto >= BT_MAX_PROTO)
be9f97f0 103 return;
1da177e4 104
74da626a 105 write_lock(&bt_proto_lock);
be9f97f0 106 bt_proto[proto] = NULL;
74da626a 107 write_unlock(&bt_proto_lock);
1da177e4
LT
108}
109EXPORT_SYMBOL(bt_sock_unregister);
110
7bafcbf5
RL
111#ifdef CONFIG_PARANOID_NETWORK
112static inline int current_has_bt_admin(void)
113{
114 return !current_euid();
115}
116
117static inline int current_has_bt(void)
118{
119 return current_has_bt_admin();
120}
121# else
122static inline int current_has_bt_admin(void)
123{
124 return 1;
125}
126
127static inline int current_has_bt(void)
128{
129 return 1;
130}
131#endif
132
3f378b68
EP
133static int bt_sock_create(struct net *net, struct socket *sock, int proto,
134 int kern)
1da177e4 135{
74da626a 136 int err;
1da177e4 137
7bafcbf5
RL
138 if (proto == BTPROTO_RFCOMM || proto == BTPROTO_SCO ||
139 proto == BTPROTO_L2CAP) {
140 if (!current_has_bt())
141 return -EPERM;
142 } else if (!current_has_bt_admin())
143 return -EPERM;
144
1b8d7ae4
EB
145 if (net != &init_net)
146 return -EAFNOSUPPORT;
147
1da177e4
LT
148 if (proto < 0 || proto >= BT_MAX_PROTO)
149 return -EINVAL;
150
95a5afca 151 if (!bt_proto[proto])
1da177e4 152 request_module("bt-proto-%d", proto);
74da626a 153
1da177e4 154 err = -EPROTONOSUPPORT;
74da626a
MH
155
156 read_lock(&bt_proto_lock);
157
1da177e4 158 if (bt_proto[proto] && try_module_get(bt_proto[proto]->owner)) {
3f378b68 159 err = bt_proto[proto]->create(net, sock, proto, kern);
b5a30dda
OP
160 if (!err)
161 bt_sock_reclassify_lock(sock->sk, proto);
1da177e4
LT
162 module_put(bt_proto[proto]->owner);
163 }
74da626a
MH
164
165 read_unlock(&bt_proto_lock);
166
8e87d142 167 return err;
1da177e4
LT
168}
169
170void bt_sock_link(struct bt_sock_list *l, struct sock *sk)
171{
94f5bfb8 172 write_lock(&l->lock);
1da177e4 173 sk_add_node(sk, &l->head);
94f5bfb8 174 write_unlock(&l->lock);
1da177e4
LT
175}
176EXPORT_SYMBOL(bt_sock_link);
177
178void bt_sock_unlink(struct bt_sock_list *l, struct sock *sk)
179{
94f5bfb8 180 write_lock(&l->lock);
1da177e4 181 sk_del_node_init(sk);
94f5bfb8 182 write_unlock(&l->lock);
1da177e4
LT
183}
184EXPORT_SYMBOL(bt_sock_unlink);
185
82c73d48 186void bt_accept_enqueue(struct sock *parent, struct sock *sk, bool bh)
1da177e4
LT
187{
188 BT_DBG("parent %p, sk %p", parent, sk);
189
190 sock_hold(sk);
82c73d48
MK
191
192 if (bh)
193 bh_lock_sock_nested(sk);
194 else
195 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
196
1da177e4
LT
197 list_add_tail(&bt_sk(sk)->accept_q, &bt_sk(parent)->accept_q);
198 bt_sk(sk)->parent = parent;
82c73d48
MK
199
200 if (bh)
201 bh_unlock_sock(sk);
202 else
203 release_sock(sk);
204
1da177e4
LT
205 parent->sk_ack_backlog++;
206}
207EXPORT_SYMBOL(bt_accept_enqueue);
208
27bfbc21
DJ
209/* Calling function must hold the sk lock.
210 * bt_sk(sk)->parent must be non-NULL meaning sk is in the parent list.
211 */
1da177e4
LT
212void bt_accept_unlink(struct sock *sk)
213{
214 BT_DBG("sk %p state %d", sk, sk->sk_state);
215
216 list_del_init(&bt_sk(sk)->accept_q);
217 bt_sk(sk)->parent->sk_ack_backlog--;
218 bt_sk(sk)->parent = NULL;
219 sock_put(sk);
220}
221EXPORT_SYMBOL(bt_accept_unlink);
222
223struct sock *bt_accept_dequeue(struct sock *parent, struct socket *newsock)
224{
7eb7404f 225 struct bt_sock *s, *n;
1da177e4
LT
226 struct sock *sk;
227
228 BT_DBG("parent %p", parent);
229
27bfbc21 230restart:
7eb7404f
GT
231 list_for_each_entry_safe(s, n, &bt_sk(parent)->accept_q, accept_q) {
232 sk = (struct sock *)s;
1da177e4 233
27bfbc21
DJ
234 /* Prevent early freeing of sk due to unlink and sock_kill */
235 sock_hold(sk);
8a154a8f 236 lock_sock(sk);
1da177e4 237
27bfbc21
DJ
238 /* Check sk has not already been unlinked via
239 * bt_accept_unlink() due to serialisation caused by sk locking
240 */
241 if (!bt_sk(sk)->parent) {
242 BT_DBG("sk %p, already unlinked", sk);
243 release_sock(sk);
244 sock_put(sk);
245
246 /* Restart the loop as sk is no longer in the list
247 * and also avoid a potential infinite loop because
248 * list_for_each_entry_safe() is not thread safe.
249 */
250 goto restart;
251 }
252
253 /* sk is safely in the parent list so reduce reference count */
254 sock_put(sk);
255
1da177e4
LT
256 /* FIXME: Is this check still needed */
257 if (sk->sk_state == BT_CLOSED) {
1da177e4 258 bt_accept_unlink(sk);
1a11ec89 259 release_sock(sk);
1da177e4
LT
260 continue;
261 }
262
c4f912e1 263 if (sk->sk_state == BT_CONNECTED || !newsock ||
d060991f 264 test_bit(BT_SK_DEFER_SETUP, &bt_sk(parent)->flags)) {
1da177e4
LT
265 bt_accept_unlink(sk);
266 if (newsock)
267 sock_graft(sk, newsock);
d37f50e1 268
8a154a8f 269 release_sock(sk);
1da177e4
LT
270 return sk;
271 }
272
8a154a8f 273 release_sock(sk);
1da177e4 274 }
d37f50e1 275
1da177e4
LT
276 return NULL;
277}
278EXPORT_SYMBOL(bt_accept_dequeue);
279
1b784140
YX
280int bt_sock_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
281 int flags)
1da177e4
LT
282{
283 int noblock = flags & MSG_DONTWAIT;
284 struct sock *sk = sock->sk;
285 struct sk_buff *skb;
286 size_t copied;
b5f34f94 287 size_t skblen;
1da177e4
LT
288 int err;
289
a418b893 290 BT_DBG("sock %p sk %p len %zu", sock, sk, len);
1da177e4 291
d94a6104 292 if (flags & MSG_OOB)
1da177e4
LT
293 return -EOPNOTSUPP;
294
5a08ecce
AE
295 skb = skb_recv_datagram(sk, flags, noblock, &err);
296 if (!skb) {
f3d33426 297 if (sk->sk_shutdown & RCV_SHUTDOWN)
1da177e4 298 return 0;
f3d33426 299
1da177e4
LT
300 return err;
301 }
302
b5f34f94 303 skblen = skb->len;
1da177e4
LT
304 copied = skb->len;
305 if (len < copied) {
306 msg->msg_flags |= MSG_TRUNC;
307 copied = len;
308 }
309
badff6d0 310 skb_reset_transport_header(skb);
51f3d02b 311 err = skb_copy_datagram_msg(skb, 0, msg, copied);
d9763698 312 if (err == 0) {
3b885787 313 sock_recv_ts_and_drops(msg, sk, skb);
1da177e4 314
9dcbc313 315 if (msg->msg_name && bt_sk(sk)->skb_msg_name)
d9763698
MH
316 bt_sk(sk)->skb_msg_name(skb, msg->msg_name,
317 &msg->msg_namelen);
d9763698
MH
318 }
319
1da177e4
LT
320 skb_free_datagram(sk, skb);
321
90a56f72 322 if (flags & MSG_TRUNC)
b5f34f94
DK
323 copied = skblen;
324
1da177e4
LT
325 return err ? : copied;
326}
327EXPORT_SYMBOL(bt_sock_recvmsg);
328
796c86ee
MM
329static long bt_sock_data_wait(struct sock *sk, long timeo)
330{
331 DECLARE_WAITQUEUE(wait, current);
332
333 add_wait_queue(sk_sleep(sk), &wait);
334 for (;;) {
335 set_current_state(TASK_INTERRUPTIBLE);
336
337 if (!skb_queue_empty(&sk->sk_receive_queue))
338 break;
339
340 if (sk->sk_err || (sk->sk_shutdown & RCV_SHUTDOWN))
341 break;
342
343 if (signal_pending(current) || !timeo)
344 break;
345
9cd3e072 346 sk_set_bit(SOCKWQ_ASYNC_WAITDATA, sk);
796c86ee
MM
347 release_sock(sk);
348 timeo = schedule_timeout(timeo);
349 lock_sock(sk);
9cd3e072 350 sk_clear_bit(SOCKWQ_ASYNC_WAITDATA, sk);
796c86ee
MM
351 }
352
353 __set_current_state(TASK_RUNNING);
354 remove_wait_queue(sk_sleep(sk), &wait);
355 return timeo;
356}
357
1b784140
YX
358int bt_sock_stream_recvmsg(struct socket *sock, struct msghdr *msg,
359 size_t size, int flags)
796c86ee
MM
360{
361 struct sock *sk = sock->sk;
362 int err = 0;
363 size_t target, copied = 0;
364 long timeo;
365
366 if (flags & MSG_OOB)
367 return -EOPNOTSUPP;
368
796c86ee
MM
369 BT_DBG("sk %p size %zu", sk, size);
370
371 lock_sock(sk);
372
373 target = sock_rcvlowat(sk, flags & MSG_WAITALL, size);
374 timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
375
376 do {
377 struct sk_buff *skb;
378 int chunk;
379
380 skb = skb_dequeue(&sk->sk_receive_queue);
381 if (!skb) {
382 if (copied >= target)
383 break;
384
5a08ecce
AE
385 err = sock_error(sk);
386 if (err)
796c86ee
MM
387 break;
388 if (sk->sk_shutdown & RCV_SHUTDOWN)
389 break;
390
391 err = -EAGAIN;
392 if (!timeo)
393 break;
394
395 timeo = bt_sock_data_wait(sk, timeo);
396
397 if (signal_pending(current)) {
398 err = sock_intr_errno(timeo);
399 goto out;
400 }
401 continue;
402 }
403
404 chunk = min_t(unsigned int, skb->len, size);
51f3d02b 405 if (skb_copy_datagram_msg(skb, 0, msg, chunk)) {
796c86ee
MM
406 skb_queue_head(&sk->sk_receive_queue, skb);
407 if (!copied)
408 copied = -EFAULT;
409 break;
410 }
411 copied += chunk;
412 size -= chunk;
413
414 sock_recv_ts_and_drops(msg, sk, skb);
415
416 if (!(flags & MSG_PEEK)) {
5b668eb3
MM
417 int skb_len = skb_headlen(skb);
418
419 if (chunk <= skb_len) {
420 __skb_pull(skb, chunk);
421 } else {
422 struct sk_buff *frag;
423
424 __skb_pull(skb, skb_len);
425 chunk -= skb_len;
426
427 skb_walk_frags(skb, frag) {
428 if (chunk <= frag->len) {
429 /* Pulling partial data */
430 skb->len -= chunk;
431 skb->data_len -= chunk;
432 __skb_pull(frag, chunk);
433 break;
434 } else if (frag->len) {
435 /* Pulling all frag data */
436 chunk -= frag->len;
437 skb->len -= frag->len;
438 skb->data_len -= frag->len;
439 __skb_pull(frag, frag->len);
440 }
441 }
442 }
443
796c86ee
MM
444 if (skb->len) {
445 skb_queue_head(&sk->sk_receive_queue, skb);
446 break;
447 }
448 kfree_skb(skb);
449
450 } else {
451 /* put message back and return */
452 skb_queue_head(&sk->sk_receive_queue, skb);
453 break;
454 }
455 } while (size);
456
457out:
458 release_sock(sk);
459 return copied ? : err;
460}
461EXPORT_SYMBOL(bt_sock_stream_recvmsg);
462
1da177e4
LT
463static inline unsigned int bt_accept_poll(struct sock *parent)
464{
7eb7404f 465 struct bt_sock *s, *n;
1da177e4
LT
466 struct sock *sk;
467
7eb7404f
GT
468 list_for_each_entry_safe(s, n, &bt_sk(parent)->accept_q, accept_q) {
469 sk = (struct sock *)s;
d5f2d2be 470 if (sk->sk_state == BT_CONNECTED ||
c5daa683
GP
471 (test_bit(BT_SK_DEFER_SETUP, &bt_sk(parent)->flags) &&
472 sk->sk_state == BT_CONNECT2))
1da177e4
LT
473 return POLLIN | POLLRDNORM;
474 }
475
476 return 0;
477}
478
8fc9ced3
GP
479unsigned int bt_sock_poll(struct file *file, struct socket *sock,
480 poll_table *wait)
1da177e4
LT
481{
482 struct sock *sk = sock->sk;
483 unsigned int mask = 0;
484
485 BT_DBG("sock %p, sk %p", sock, sk);
486
aa395145 487 poll_wait(file, sk_sleep(sk), wait);
1da177e4
LT
488
489 if (sk->sk_state == BT_LISTEN)
490 return bt_accept_poll(sk);
491
492 if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue))
7d4c04fc 493 mask |= POLLERR |
8facd5fb 494 (sock_flag(sk, SOCK_SELECT_ERR_QUEUE) ? POLLPRI : 0);
1da177e4 495
f348d70a 496 if (sk->sk_shutdown & RCV_SHUTDOWN)
db40980f 497 mask |= POLLRDHUP | POLLIN | POLLRDNORM;
f348d70a 498
1da177e4
LT
499 if (sk->sk_shutdown == SHUTDOWN_MASK)
500 mask |= POLLHUP;
501
db40980f 502 if (!skb_queue_empty(&sk->sk_receive_queue))
1da177e4
LT
503 mask |= POLLIN | POLLRDNORM;
504
505 if (sk->sk_state == BT_CLOSED)
506 mask |= POLLHUP;
507
508 if (sk->sk_state == BT_CONNECT ||
509 sk->sk_state == BT_CONNECT2 ||
510 sk->sk_state == BT_CONFIG)
511 return mask;
512
c5daa683 513 if (!test_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags) && sock_writeable(sk))
1da177e4
LT
514 mask |= POLLOUT | POLLWRNORM | POLLWRBAND;
515 else
9cd3e072 516 sk_set_bit(SOCKWQ_ASYNC_NOSPACE, sk);
1da177e4
LT
517
518 return mask;
519}
520EXPORT_SYMBOL(bt_sock_poll);
521
3241ad82
MH
522int bt_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
523{
524 struct sock *sk = sock->sk;
43cbeee9
MH
525 struct sk_buff *skb;
526 long amount;
3241ad82
MH
527 int err;
528
529 BT_DBG("sk %p cmd %x arg %lx", sk, cmd, arg);
530
531 switch (cmd) {
43cbeee9
MH
532 case TIOCOUTQ:
533 if (sk->sk_state == BT_LISTEN)
534 return -EINVAL;
535
31e6d363 536 amount = sk->sk_sndbuf - sk_wmem_alloc_get(sk);
43cbeee9
MH
537 if (amount < 0)
538 amount = 0;
539 err = put_user(amount, (int __user *) arg);
540 break;
541
542 case TIOCINQ:
543 if (sk->sk_state == BT_LISTEN)
544 return -EINVAL;
545
546 lock_sock(sk);
547 skb = skb_peek(&sk->sk_receive_queue);
548 amount = skb ? skb->len : 0;
549 release_sock(sk);
550 err = put_user(amount, (int __user *) arg);
551 break;
552
3241ad82
MH
553 case SIOCGSTAMP:
554 err = sock_get_timestamp(sk, (struct timeval __user *) arg);
555 break;
556
557 case SIOCGSTAMPNS:
558 err = sock_get_timestampns(sk, (struct timespec __user *) arg);
559 break;
560
561 default:
562 err = -ENOIOCTLCMD;
563 break;
564 }
565
566 return err;
567}
568EXPORT_SYMBOL(bt_sock_ioctl);
569
0fba96f9 570/* This function expects the sk lock to be held when called */
1da177e4
LT
571int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo)
572{
573 DECLARE_WAITQUEUE(wait, current);
574 int err = 0;
575
576 BT_DBG("sk %p", sk);
577
aa395145 578 add_wait_queue(sk_sleep(sk), &wait);
9be4e3fb 579 set_current_state(TASK_INTERRUPTIBLE);
1da177e4 580 while (sk->sk_state != state) {
1da177e4 581 if (!timeo) {
b4c612a4 582 err = -EINPROGRESS;
1da177e4
LT
583 break;
584 }
585
586 if (signal_pending(current)) {
587 err = sock_intr_errno(timeo);
588 break;
589 }
590
591 release_sock(sk);
592 timeo = schedule_timeout(timeo);
593 lock_sock(sk);
9be4e3fb 594 set_current_state(TASK_INTERRUPTIBLE);
1da177e4 595
c1cbe4b7
BL
596 err = sock_error(sk);
597 if (err)
1da177e4 598 break;
1da177e4 599 }
9be4e3fb 600 __set_current_state(TASK_RUNNING);
aa395145 601 remove_wait_queue(sk_sleep(sk), &wait);
1da177e4
LT
602 return err;
603}
604EXPORT_SYMBOL(bt_sock_wait_state);
605
e793dcf0
JH
606/* This function expects the sk lock to be held when called */
607int bt_sock_wait_ready(struct sock *sk, unsigned long flags)
608{
609 DECLARE_WAITQUEUE(wait, current);
610 unsigned long timeo;
611 int err = 0;
612
613 BT_DBG("sk %p", sk);
614
615 timeo = sock_sndtimeo(sk, flags & O_NONBLOCK);
616
617 add_wait_queue(sk_sleep(sk), &wait);
618 set_current_state(TASK_INTERRUPTIBLE);
619 while (test_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags)) {
620 if (!timeo) {
621 err = -EAGAIN;
622 break;
623 }
624
625 if (signal_pending(current)) {
626 err = sock_intr_errno(timeo);
627 break;
628 }
629
630 release_sock(sk);
631 timeo = schedule_timeout(timeo);
632 lock_sock(sk);
633 set_current_state(TASK_INTERRUPTIBLE);
634
635 err = sock_error(sk);
636 if (err)
637 break;
638 }
639 __set_current_state(TASK_RUNNING);
640 remove_wait_queue(sk_sleep(sk), &wait);
641
642 return err;
643}
644EXPORT_SYMBOL(bt_sock_wait_ready);
645
256a06c8
MY
646#ifdef CONFIG_PROC_FS
647struct bt_seq_state {
648 struct bt_sock_list *l;
649};
650
651static void *bt_seq_start(struct seq_file *seq, loff_t *pos)
652 __acquires(seq->private->l->lock)
653{
654 struct bt_seq_state *s = seq->private;
655 struct bt_sock_list *l = s->l;
656
657 read_lock(&l->lock);
658 return seq_hlist_start_head(&l->head, *pos);
659}
660
661static void *bt_seq_next(struct seq_file *seq, void *v, loff_t *pos)
662{
663 struct bt_seq_state *s = seq->private;
664 struct bt_sock_list *l = s->l;
665
666 return seq_hlist_next(v, &l->head, pos);
667}
668
669static void bt_seq_stop(struct seq_file *seq, void *v)
670 __releases(seq->private->l->lock)
671{
672 struct bt_seq_state *s = seq->private;
673 struct bt_sock_list *l = s->l;
674
675 read_unlock(&l->lock);
676}
677
678static int bt_seq_show(struct seq_file *seq, void *v)
679{
256a06c8
MY
680 struct bt_seq_state *s = seq->private;
681 struct bt_sock_list *l = s->l;
256a06c8
MY
682
683 if (v == SEQ_START_TOKEN) {
c5605755 684 seq_puts(seq ,"sk RefCnt Rmem Wmem User Inode Parent");
256a06c8
MY
685
686 if (l->custom_seq_show) {
687 seq_putc(seq, ' ');
688 l->custom_seq_show(seq, v);
689 }
690
691 seq_putc(seq, '\n');
692 } else {
09d5d4aa
AE
693 struct sock *sk = sk_entry(v);
694 struct bt_sock *bt = bt_sk(sk);
256a06c8 695
7028a886 696 seq_printf(seq,
5f6cd79f 697 "%pK %-6d %-6u %-6u %-6u %-6lu %-6lu",
256a06c8 698 sk,
41c6d650 699 refcount_read(&sk->sk_refcnt),
256a06c8
MY
700 sk_rmem_alloc_get(sk),
701 sk_wmem_alloc_get(sk),
1bbb3095 702 from_kuid(seq_user_ns(seq), sock_i_uid(sk)),
256a06c8 703 sock_i_ino(sk),
256a06c8
MY
704 bt->parent? sock_i_ino(bt->parent): 0LU);
705
706 if (l->custom_seq_show) {
707 seq_putc(seq, ' ');
708 l->custom_seq_show(seq, v);
709 }
710
711 seq_putc(seq, '\n');
712 }
713 return 0;
714}
715
26b0f4e2 716static const struct seq_operations bt_seq_ops = {
256a06c8
MY
717 .start = bt_seq_start,
718 .next = bt_seq_next,
719 .stop = bt_seq_stop,
720 .show = bt_seq_show,
721};
722
723static int bt_seq_open(struct inode *inode, struct file *file)
724{
725 struct bt_sock_list *sk_list;
726 struct bt_seq_state *s;
727
d9dda78b 728 sk_list = PDE_DATA(inode);
256a06c8
MY
729 s = __seq_open_private(file, &bt_seq_ops,
730 sizeof(struct bt_seq_state));
31f47073 731 if (!s)
256a06c8
MY
732 return -ENOMEM;
733
734 s->l = sk_list;
735 return 0;
736}
737
14805359
AV
738static const struct file_operations bt_fops = {
739 .open = bt_seq_open,
740 .read = seq_read,
741 .llseek = seq_lseek,
742 .release = seq_release_private
743};
744
b0316615 745int bt_procfs_init(struct net *net, const char *name,
f37590bd 746 struct bt_sock_list *sk_list,
256a06c8
MY
747 int (* seq_show)(struct seq_file *, void *))
748{
256a06c8
MY
749 sk_list->custom_seq_show = seq_show;
750
4d006263 751 if (!proc_create_data(name, 0, net->proc_net, &bt_fops, sk_list))
256a06c8 752 return -ENOMEM;
256a06c8
MY
753 return 0;
754}
755
756void bt_procfs_cleanup(struct net *net, const char *name)
757{
ece31ffd 758 remove_proc_entry(name, net->proc_net);
256a06c8
MY
759}
760#else
b0316615 761int bt_procfs_init(struct net *net, const char *name,
f37590bd 762 struct bt_sock_list *sk_list,
256a06c8
MY
763 int (* seq_show)(struct seq_file *, void *))
764{
765 return 0;
766}
767
768void bt_procfs_cleanup(struct net *net, const char *name)
769{
770}
771#endif
772EXPORT_SYMBOL(bt_procfs_init);
773EXPORT_SYMBOL(bt_procfs_cleanup);
774
173e7837 775static const struct net_proto_family bt_sock_family_ops = {
1da177e4
LT
776 .owner = THIS_MODULE,
777 .family = PF_BLUETOOTH,
778 .create = bt_sock_create,
779};
780
ffcecac6
MH
781struct dentry *bt_debugfs;
782EXPORT_SYMBOL_GPL(bt_debugfs);
783
9e8305b3
MH
784#define VERSION __stringify(BT_SUBSYS_VERSION) "." \
785 __stringify(BT_SUBSYS_REVISION)
786
1da177e4
LT
787static int __init bt_init(void)
788{
27d35284
MH
789 int err;
790
b4772ef8 791 sock_skb_cb_check_size(sizeof(struct bt_skb_cb));
7cb9d20f 792
9e8305b3 793 BT_INFO("Core ver %s", VERSION);
1da177e4 794
ee485290
MH
795 err = bt_selftest();
796 if (err < 0)
797 return err;
798
ffcecac6
MH
799 bt_debugfs = debugfs_create_dir("bluetooth", NULL);
800
e64c97b5
MH
801 bt_leds_init();
802
27d35284
MH
803 err = bt_sysfs_init();
804 if (err < 0)
805 return err;
1da177e4 806
27d35284
MH
807 err = sock_register(&bt_sock_family_ops);
808 if (err < 0) {
809 bt_sysfs_cleanup();
810 return err;
811 }
1da177e4 812
27d35284 813 BT_INFO("HCI device and connection manager initialized");
1da177e4 814
64274518
GP
815 err = hci_sock_init();
816 if (err < 0)
817 goto error;
818
819 err = l2cap_init();
0ed54dad 820 if (err < 0)
64274518 821 goto sock_err;
64274518
GP
822
823 err = sco_init();
824 if (err < 0) {
825 l2cap_exit();
826 goto sock_err;
827 }
1da177e4 828
6d785aa3
JH
829 err = mgmt_init();
830 if (err < 0) {
831 sco_exit();
832 l2cap_exit();
833 goto sock_err;
834 }
835
1da177e4 836 return 0;
64274518
GP
837
838sock_err:
839 hci_sock_cleanup();
840
841error:
842 sock_unregister(PF_BLUETOOTH);
843 bt_sysfs_cleanup();
844
845 return err;
1da177e4
LT
846}
847
848static void __exit bt_exit(void)
849{
6d785aa3
JH
850 mgmt_exit();
851
64274518
GP
852 sco_exit();
853
854 l2cap_exit();
855
1da177e4
LT
856 hci_sock_cleanup();
857
1da177e4 858 sock_unregister(PF_BLUETOOTH);
27d35284
MH
859
860 bt_sysfs_cleanup();
ffcecac6 861
e64c97b5
MH
862 bt_leds_cleanup();
863
ffcecac6 864 debugfs_remove_recursive(bt_debugfs);
1da177e4
LT
865}
866
867subsys_initcall(bt_init);
868module_exit(bt_exit);
869
63fbd24e 870MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
9e8305b3
MH
871MODULE_DESCRIPTION("Bluetooth Core ver " VERSION);
872MODULE_VERSION(VERSION);
1da177e4
LT
873MODULE_LICENSE("GPL");
874MODULE_ALIAS_NETPROTO(PF_BLUETOOTH);