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