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