cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

af_bluetooth.c (17511B)


      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
     42static const struct net_proto_family *bt_proto[BT_MAX_PROTO];
     43static DEFINE_RWLOCK(bt_proto_lock);
     44
     45static struct lock_class_key bt_lock_key[BT_MAX_PROTO];
     46static 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
     57static struct lock_class_key bt_slock_key[BT_MAX_PROTO];
     58static 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
     69void 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}
     78EXPORT_SYMBOL(bt_sock_reclassify_lock);
     79
     80int 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}
     98EXPORT_SYMBOL(bt_sock_register);
     99
    100void 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}
    109EXPORT_SYMBOL(bt_sock_unregister);
    110
    111static 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
    141void 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}
    147EXPORT_SYMBOL(bt_sock_link);
    148
    149void 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}
    155EXPORT_SYMBOL(bt_sock_unlink);
    156
    157void 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}
    178EXPORT_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 */
    183void 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}
    192EXPORT_SYMBOL(bt_accept_unlink);
    193
    194struct 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
    201restart:
    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}
    249EXPORT_SYMBOL(bt_accept_dequeue);
    250
    251int bt_sock_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
    252		    int flags)
    253{
    254	struct sock *sk = sock->sk;
    255	struct sk_buff *skb;
    256	size_t copied;
    257	size_t skblen;
    258	int err;
    259
    260	BT_DBG("sock %p sk %p len %zu", sock, sk, len);
    261
    262	if (flags & MSG_OOB)
    263		return -EOPNOTSUPP;
    264
    265	skb = skb_recv_datagram(sk, flags, &err);
    266	if (!skb) {
    267		if (sk->sk_shutdown & RCV_SHUTDOWN)
    268			return 0;
    269
    270		return err;
    271	}
    272
    273	skblen = skb->len;
    274	copied = skb->len;
    275	if (len < copied) {
    276		msg->msg_flags |= MSG_TRUNC;
    277		copied = len;
    278	}
    279
    280	skb_reset_transport_header(skb);
    281	err = skb_copy_datagram_msg(skb, 0, msg, copied);
    282	if (err == 0) {
    283		sock_recv_cmsgs(msg, sk, skb);
    284
    285		if (msg->msg_name && bt_sk(sk)->skb_msg_name)
    286			bt_sk(sk)->skb_msg_name(skb, msg->msg_name,
    287						&msg->msg_namelen);
    288
    289		if (bt_sk(sk)->skb_put_cmsg)
    290			bt_sk(sk)->skb_put_cmsg(skb, msg, sk);
    291	}
    292
    293	skb_free_datagram(sk, skb);
    294
    295	if (flags & MSG_TRUNC)
    296		copied = skblen;
    297
    298	return err ? : copied;
    299}
    300EXPORT_SYMBOL(bt_sock_recvmsg);
    301
    302static long bt_sock_data_wait(struct sock *sk, long timeo)
    303{
    304	DECLARE_WAITQUEUE(wait, current);
    305
    306	add_wait_queue(sk_sleep(sk), &wait);
    307	for (;;) {
    308		set_current_state(TASK_INTERRUPTIBLE);
    309
    310		if (!skb_queue_empty(&sk->sk_receive_queue))
    311			break;
    312
    313		if (sk->sk_err || (sk->sk_shutdown & RCV_SHUTDOWN))
    314			break;
    315
    316		if (signal_pending(current) || !timeo)
    317			break;
    318
    319		sk_set_bit(SOCKWQ_ASYNC_WAITDATA, sk);
    320		release_sock(sk);
    321		timeo = schedule_timeout(timeo);
    322		lock_sock(sk);
    323		sk_clear_bit(SOCKWQ_ASYNC_WAITDATA, sk);
    324	}
    325
    326	__set_current_state(TASK_RUNNING);
    327	remove_wait_queue(sk_sleep(sk), &wait);
    328	return timeo;
    329}
    330
    331int bt_sock_stream_recvmsg(struct socket *sock, struct msghdr *msg,
    332			   size_t size, int flags)
    333{
    334	struct sock *sk = sock->sk;
    335	int err = 0;
    336	size_t target, copied = 0;
    337	long timeo;
    338
    339	if (flags & MSG_OOB)
    340		return -EOPNOTSUPP;
    341
    342	BT_DBG("sk %p size %zu", sk, size);
    343
    344	lock_sock(sk);
    345
    346	target = sock_rcvlowat(sk, flags & MSG_WAITALL, size);
    347	timeo  = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
    348
    349	do {
    350		struct sk_buff *skb;
    351		int chunk;
    352
    353		skb = skb_dequeue(&sk->sk_receive_queue);
    354		if (!skb) {
    355			if (copied >= target)
    356				break;
    357
    358			err = sock_error(sk);
    359			if (err)
    360				break;
    361			if (sk->sk_shutdown & RCV_SHUTDOWN)
    362				break;
    363
    364			err = -EAGAIN;
    365			if (!timeo)
    366				break;
    367
    368			timeo = bt_sock_data_wait(sk, timeo);
    369
    370			if (signal_pending(current)) {
    371				err = sock_intr_errno(timeo);
    372				goto out;
    373			}
    374			continue;
    375		}
    376
    377		chunk = min_t(unsigned int, skb->len, size);
    378		if (skb_copy_datagram_msg(skb, 0, msg, chunk)) {
    379			skb_queue_head(&sk->sk_receive_queue, skb);
    380			if (!copied)
    381				copied = -EFAULT;
    382			break;
    383		}
    384		copied += chunk;
    385		size   -= chunk;
    386
    387		sock_recv_cmsgs(msg, sk, skb);
    388
    389		if (!(flags & MSG_PEEK)) {
    390			int skb_len = skb_headlen(skb);
    391
    392			if (chunk <= skb_len) {
    393				__skb_pull(skb, chunk);
    394			} else {
    395				struct sk_buff *frag;
    396
    397				__skb_pull(skb, skb_len);
    398				chunk -= skb_len;
    399
    400				skb_walk_frags(skb, frag) {
    401					if (chunk <= frag->len) {
    402						/* Pulling partial data */
    403						skb->len -= chunk;
    404						skb->data_len -= chunk;
    405						__skb_pull(frag, chunk);
    406						break;
    407					} else if (frag->len) {
    408						/* Pulling all frag data */
    409						chunk -= frag->len;
    410						skb->len -= frag->len;
    411						skb->data_len -= frag->len;
    412						__skb_pull(frag, frag->len);
    413					}
    414				}
    415			}
    416
    417			if (skb->len) {
    418				skb_queue_head(&sk->sk_receive_queue, skb);
    419				break;
    420			}
    421			kfree_skb(skb);
    422
    423		} else {
    424			/* put message back and return */
    425			skb_queue_head(&sk->sk_receive_queue, skb);
    426			break;
    427		}
    428	} while (size);
    429
    430out:
    431	release_sock(sk);
    432	return copied ? : err;
    433}
    434EXPORT_SYMBOL(bt_sock_stream_recvmsg);
    435
    436static inline __poll_t bt_accept_poll(struct sock *parent)
    437{
    438	struct bt_sock *s, *n;
    439	struct sock *sk;
    440
    441	list_for_each_entry_safe(s, n, &bt_sk(parent)->accept_q, accept_q) {
    442		sk = (struct sock *)s;
    443		if (sk->sk_state == BT_CONNECTED ||
    444		    (test_bit(BT_SK_DEFER_SETUP, &bt_sk(parent)->flags) &&
    445		     sk->sk_state == BT_CONNECT2))
    446			return EPOLLIN | EPOLLRDNORM;
    447	}
    448
    449	return 0;
    450}
    451
    452__poll_t bt_sock_poll(struct file *file, struct socket *sock,
    453		      poll_table *wait)
    454{
    455	struct sock *sk = sock->sk;
    456	__poll_t mask = 0;
    457
    458	poll_wait(file, sk_sleep(sk), wait);
    459
    460	if (sk->sk_state == BT_LISTEN)
    461		return bt_accept_poll(sk);
    462
    463	if (sk->sk_err || !skb_queue_empty_lockless(&sk->sk_error_queue))
    464		mask |= EPOLLERR |
    465			(sock_flag(sk, SOCK_SELECT_ERR_QUEUE) ? EPOLLPRI : 0);
    466
    467	if (sk->sk_shutdown & RCV_SHUTDOWN)
    468		mask |= EPOLLRDHUP | EPOLLIN | EPOLLRDNORM;
    469
    470	if (sk->sk_shutdown == SHUTDOWN_MASK)
    471		mask |= EPOLLHUP;
    472
    473	if (!skb_queue_empty_lockless(&sk->sk_receive_queue))
    474		mask |= EPOLLIN | EPOLLRDNORM;
    475
    476	if (sk->sk_state == BT_CLOSED)
    477		mask |= EPOLLHUP;
    478
    479	if (sk->sk_state == BT_CONNECT ||
    480	    sk->sk_state == BT_CONNECT2 ||
    481	    sk->sk_state == BT_CONFIG)
    482		return mask;
    483
    484	if (!test_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags) && sock_writeable(sk))
    485		mask |= EPOLLOUT | EPOLLWRNORM | EPOLLWRBAND;
    486	else
    487		sk_set_bit(SOCKWQ_ASYNC_NOSPACE, sk);
    488
    489	return mask;
    490}
    491EXPORT_SYMBOL(bt_sock_poll);
    492
    493int bt_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
    494{
    495	struct sock *sk = sock->sk;
    496	struct sk_buff *skb;
    497	long amount;
    498	int err;
    499
    500	BT_DBG("sk %p cmd %x arg %lx", sk, cmd, arg);
    501
    502	switch (cmd) {
    503	case TIOCOUTQ:
    504		if (sk->sk_state == BT_LISTEN)
    505			return -EINVAL;
    506
    507		amount = sk->sk_sndbuf - sk_wmem_alloc_get(sk);
    508		if (amount < 0)
    509			amount = 0;
    510		err = put_user(amount, (int __user *)arg);
    511		break;
    512
    513	case TIOCINQ:
    514		if (sk->sk_state == BT_LISTEN)
    515			return -EINVAL;
    516
    517		lock_sock(sk);
    518		skb = skb_peek(&sk->sk_receive_queue);
    519		amount = skb ? skb->len : 0;
    520		release_sock(sk);
    521		err = put_user(amount, (int __user *)arg);
    522		break;
    523
    524	default:
    525		err = -ENOIOCTLCMD;
    526		break;
    527	}
    528
    529	return err;
    530}
    531EXPORT_SYMBOL(bt_sock_ioctl);
    532
    533/* This function expects the sk lock to be held when called */
    534int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo)
    535{
    536	DECLARE_WAITQUEUE(wait, current);
    537	int err = 0;
    538
    539	BT_DBG("sk %p", sk);
    540
    541	add_wait_queue(sk_sleep(sk), &wait);
    542	set_current_state(TASK_INTERRUPTIBLE);
    543	while (sk->sk_state != state) {
    544		if (!timeo) {
    545			err = -EINPROGRESS;
    546			break;
    547		}
    548
    549		if (signal_pending(current)) {
    550			err = sock_intr_errno(timeo);
    551			break;
    552		}
    553
    554		release_sock(sk);
    555		timeo = schedule_timeout(timeo);
    556		lock_sock(sk);
    557		set_current_state(TASK_INTERRUPTIBLE);
    558
    559		err = sock_error(sk);
    560		if (err)
    561			break;
    562	}
    563	__set_current_state(TASK_RUNNING);
    564	remove_wait_queue(sk_sleep(sk), &wait);
    565	return err;
    566}
    567EXPORT_SYMBOL(bt_sock_wait_state);
    568
    569/* This function expects the sk lock to be held when called */
    570int bt_sock_wait_ready(struct sock *sk, unsigned int msg_flags)
    571{
    572	DECLARE_WAITQUEUE(wait, current);
    573	unsigned long timeo;
    574	int err = 0;
    575
    576	BT_DBG("sk %p", sk);
    577
    578	timeo = sock_sndtimeo(sk, !!(msg_flags & MSG_DONTWAIT));
    579
    580	add_wait_queue(sk_sleep(sk), &wait);
    581	set_current_state(TASK_INTERRUPTIBLE);
    582	while (test_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags)) {
    583		if (!timeo) {
    584			err = -EAGAIN;
    585			break;
    586		}
    587
    588		if (signal_pending(current)) {
    589			err = sock_intr_errno(timeo);
    590			break;
    591		}
    592
    593		release_sock(sk);
    594		timeo = schedule_timeout(timeo);
    595		lock_sock(sk);
    596		set_current_state(TASK_INTERRUPTIBLE);
    597
    598		err = sock_error(sk);
    599		if (err)
    600			break;
    601	}
    602	__set_current_state(TASK_RUNNING);
    603	remove_wait_queue(sk_sleep(sk), &wait);
    604
    605	return err;
    606}
    607EXPORT_SYMBOL(bt_sock_wait_ready);
    608
    609#ifdef CONFIG_PROC_FS
    610static void *bt_seq_start(struct seq_file *seq, loff_t *pos)
    611	__acquires(seq->private->l->lock)
    612{
    613	struct bt_sock_list *l = pde_data(file_inode(seq->file));
    614
    615	read_lock(&l->lock);
    616	return seq_hlist_start_head(&l->head, *pos);
    617}
    618
    619static void *bt_seq_next(struct seq_file *seq, void *v, loff_t *pos)
    620{
    621	struct bt_sock_list *l = pde_data(file_inode(seq->file));
    622
    623	return seq_hlist_next(v, &l->head, pos);
    624}
    625
    626static void bt_seq_stop(struct seq_file *seq, void *v)
    627	__releases(seq->private->l->lock)
    628{
    629	struct bt_sock_list *l = pde_data(file_inode(seq->file));
    630
    631	read_unlock(&l->lock);
    632}
    633
    634static int bt_seq_show(struct seq_file *seq, void *v)
    635{
    636	struct bt_sock_list *l = pde_data(file_inode(seq->file));
    637
    638	if (v == SEQ_START_TOKEN) {
    639		seq_puts(seq, "sk               RefCnt Rmem   Wmem   User   Inode  Parent");
    640
    641		if (l->custom_seq_show) {
    642			seq_putc(seq, ' ');
    643			l->custom_seq_show(seq, v);
    644		}
    645
    646		seq_putc(seq, '\n');
    647	} else {
    648		struct sock *sk = sk_entry(v);
    649		struct bt_sock *bt = bt_sk(sk);
    650
    651		seq_printf(seq,
    652			   "%pK %-6d %-6u %-6u %-6u %-6lu %-6lu",
    653			   sk,
    654			   refcount_read(&sk->sk_refcnt),
    655			   sk_rmem_alloc_get(sk),
    656			   sk_wmem_alloc_get(sk),
    657			   from_kuid(seq_user_ns(seq), sock_i_uid(sk)),
    658			   sock_i_ino(sk),
    659			   bt->parent ? sock_i_ino(bt->parent) : 0LU);
    660
    661		if (l->custom_seq_show) {
    662			seq_putc(seq, ' ');
    663			l->custom_seq_show(seq, v);
    664		}
    665
    666		seq_putc(seq, '\n');
    667	}
    668	return 0;
    669}
    670
    671static const struct seq_operations bt_seq_ops = {
    672	.start = bt_seq_start,
    673	.next  = bt_seq_next,
    674	.stop  = bt_seq_stop,
    675	.show  = bt_seq_show,
    676};
    677
    678int bt_procfs_init(struct net *net, const char *name,
    679		   struct bt_sock_list *sk_list,
    680		   int (*seq_show)(struct seq_file *, void *))
    681{
    682	sk_list->custom_seq_show = seq_show;
    683
    684	if (!proc_create_seq_data(name, 0, net->proc_net, &bt_seq_ops, sk_list))
    685		return -ENOMEM;
    686	return 0;
    687}
    688
    689void bt_procfs_cleanup(struct net *net, const char *name)
    690{
    691	remove_proc_entry(name, net->proc_net);
    692}
    693#else
    694int bt_procfs_init(struct net *net, const char *name,
    695		   struct bt_sock_list *sk_list,
    696		   int (*seq_show)(struct seq_file *, void *))
    697{
    698	return 0;
    699}
    700
    701void bt_procfs_cleanup(struct net *net, const char *name)
    702{
    703}
    704#endif
    705EXPORT_SYMBOL(bt_procfs_init);
    706EXPORT_SYMBOL(bt_procfs_cleanup);
    707
    708static const struct net_proto_family bt_sock_family_ops = {
    709	.owner	= THIS_MODULE,
    710	.family	= PF_BLUETOOTH,
    711	.create	= bt_sock_create,
    712};
    713
    714struct dentry *bt_debugfs;
    715EXPORT_SYMBOL_GPL(bt_debugfs);
    716
    717#define VERSION __stringify(BT_SUBSYS_VERSION) "." \
    718		__stringify(BT_SUBSYS_REVISION)
    719
    720static int __init bt_init(void)
    721{
    722	int err;
    723
    724	sock_skb_cb_check_size(sizeof(struct bt_skb_cb));
    725
    726	BT_INFO("Core ver %s", VERSION);
    727
    728	err = bt_selftest();
    729	if (err < 0)
    730		return err;
    731
    732	bt_debugfs = debugfs_create_dir("bluetooth", NULL);
    733
    734	bt_leds_init();
    735
    736	err = bt_sysfs_init();
    737	if (err < 0)
    738		return err;
    739
    740	err = sock_register(&bt_sock_family_ops);
    741	if (err)
    742		goto cleanup_sysfs;
    743
    744	BT_INFO("HCI device and connection manager initialized");
    745
    746	err = hci_sock_init();
    747	if (err)
    748		goto unregister_socket;
    749
    750	err = l2cap_init();
    751	if (err)
    752		goto cleanup_socket;
    753
    754	err = sco_init();
    755	if (err)
    756		goto cleanup_cap;
    757
    758	err = mgmt_init();
    759	if (err)
    760		goto cleanup_sco;
    761
    762	return 0;
    763
    764cleanup_sco:
    765	sco_exit();
    766cleanup_cap:
    767	l2cap_exit();
    768cleanup_socket:
    769	hci_sock_cleanup();
    770unregister_socket:
    771	sock_unregister(PF_BLUETOOTH);
    772cleanup_sysfs:
    773	bt_sysfs_cleanup();
    774	return err;
    775}
    776
    777static void __exit bt_exit(void)
    778{
    779	mgmt_exit();
    780
    781	sco_exit();
    782
    783	l2cap_exit();
    784
    785	hci_sock_cleanup();
    786
    787	sock_unregister(PF_BLUETOOTH);
    788
    789	bt_sysfs_cleanup();
    790
    791	bt_leds_cleanup();
    792
    793	debugfs_remove_recursive(bt_debugfs);
    794}
    795
    796subsys_initcall(bt_init);
    797module_exit(bt_exit);
    798
    799MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
    800MODULE_DESCRIPTION("Bluetooth Core ver " VERSION);
    801MODULE_VERSION(VERSION);
    802MODULE_LICENSE("GPL");
    803MODULE_ALIAS_NETPROTO(PF_BLUETOOTH);