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