0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027 #include <linux/module.h>
0028 #include <linux/debugfs.h>
0029 #include <linux/stringify.h>
0030 #include <linux/sched/signal.h>
0031
0032 #include <asm/ioctls.h>
0033
0034 #include <net/bluetooth/bluetooth.h>
0035 #include <linux/proc_fs.h>
0036
0037 #include "leds.h"
0038 #include "selftest.h"
0039
0040
0041 #define BT_MAX_PROTO (BTPROTO_LAST + 1)
0042 static const struct net_proto_family *bt_proto[BT_MAX_PROTO];
0043 static DEFINE_RWLOCK(bt_proto_lock);
0044
0045 static struct lock_class_key bt_lock_key[BT_MAX_PROTO];
0046 static const char *const bt_key_strings[BT_MAX_PROTO] = {
0047 "sk_lock-AF_BLUETOOTH-BTPROTO_L2CAP",
0048 "sk_lock-AF_BLUETOOTH-BTPROTO_HCI",
0049 "sk_lock-AF_BLUETOOTH-BTPROTO_SCO",
0050 "sk_lock-AF_BLUETOOTH-BTPROTO_RFCOMM",
0051 "sk_lock-AF_BLUETOOTH-BTPROTO_BNEP",
0052 "sk_lock-AF_BLUETOOTH-BTPROTO_CMTP",
0053 "sk_lock-AF_BLUETOOTH-BTPROTO_HIDP",
0054 "sk_lock-AF_BLUETOOTH-BTPROTO_AVDTP",
0055 "sk_lock-AF_BLUETOOTH-BTPROTO_ISO",
0056 };
0057
0058 static struct lock_class_key bt_slock_key[BT_MAX_PROTO];
0059 static const char *const bt_slock_key_strings[BT_MAX_PROTO] = {
0060 "slock-AF_BLUETOOTH-BTPROTO_L2CAP",
0061 "slock-AF_BLUETOOTH-BTPROTO_HCI",
0062 "slock-AF_BLUETOOTH-BTPROTO_SCO",
0063 "slock-AF_BLUETOOTH-BTPROTO_RFCOMM",
0064 "slock-AF_BLUETOOTH-BTPROTO_BNEP",
0065 "slock-AF_BLUETOOTH-BTPROTO_CMTP",
0066 "slock-AF_BLUETOOTH-BTPROTO_HIDP",
0067 "slock-AF_BLUETOOTH-BTPROTO_AVDTP",
0068 "slock-AF_BLUETOOTH-BTPROTO_ISO",
0069 };
0070
0071 void bt_sock_reclassify_lock(struct sock *sk, int proto)
0072 {
0073 BUG_ON(!sk);
0074 BUG_ON(!sock_allow_reclassification(sk));
0075
0076 sock_lock_init_class_and_name(sk,
0077 bt_slock_key_strings[proto], &bt_slock_key[proto],
0078 bt_key_strings[proto], &bt_lock_key[proto]);
0079 }
0080 EXPORT_SYMBOL(bt_sock_reclassify_lock);
0081
0082 int bt_sock_register(int proto, const struct net_proto_family *ops)
0083 {
0084 int err = 0;
0085
0086 if (proto < 0 || proto >= BT_MAX_PROTO)
0087 return -EINVAL;
0088
0089 write_lock(&bt_proto_lock);
0090
0091 if (bt_proto[proto])
0092 err = -EEXIST;
0093 else
0094 bt_proto[proto] = ops;
0095
0096 write_unlock(&bt_proto_lock);
0097
0098 return err;
0099 }
0100 EXPORT_SYMBOL(bt_sock_register);
0101
0102 void bt_sock_unregister(int proto)
0103 {
0104 if (proto < 0 || proto >= BT_MAX_PROTO)
0105 return;
0106
0107 write_lock(&bt_proto_lock);
0108 bt_proto[proto] = NULL;
0109 write_unlock(&bt_proto_lock);
0110 }
0111 EXPORT_SYMBOL(bt_sock_unregister);
0112
0113 static int bt_sock_create(struct net *net, struct socket *sock, int proto,
0114 int kern)
0115 {
0116 int err;
0117
0118 if (net != &init_net)
0119 return -EAFNOSUPPORT;
0120
0121 if (proto < 0 || proto >= BT_MAX_PROTO)
0122 return -EINVAL;
0123
0124 if (!bt_proto[proto])
0125 request_module("bt-proto-%d", proto);
0126
0127 err = -EPROTONOSUPPORT;
0128
0129 read_lock(&bt_proto_lock);
0130
0131 if (bt_proto[proto] && try_module_get(bt_proto[proto]->owner)) {
0132 err = bt_proto[proto]->create(net, sock, proto, kern);
0133 if (!err)
0134 bt_sock_reclassify_lock(sock->sk, proto);
0135 module_put(bt_proto[proto]->owner);
0136 }
0137
0138 read_unlock(&bt_proto_lock);
0139
0140 return err;
0141 }
0142
0143 void bt_sock_link(struct bt_sock_list *l, struct sock *sk)
0144 {
0145 write_lock(&l->lock);
0146 sk_add_node(sk, &l->head);
0147 write_unlock(&l->lock);
0148 }
0149 EXPORT_SYMBOL(bt_sock_link);
0150
0151 void bt_sock_unlink(struct bt_sock_list *l, struct sock *sk)
0152 {
0153 write_lock(&l->lock);
0154 sk_del_node_init(sk);
0155 write_unlock(&l->lock);
0156 }
0157 EXPORT_SYMBOL(bt_sock_unlink);
0158
0159 void bt_accept_enqueue(struct sock *parent, struct sock *sk, bool bh)
0160 {
0161 BT_DBG("parent %p, sk %p", parent, sk);
0162
0163 sock_hold(sk);
0164
0165 if (bh)
0166 bh_lock_sock_nested(sk);
0167 else
0168 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
0169
0170 list_add_tail(&bt_sk(sk)->accept_q, &bt_sk(parent)->accept_q);
0171 bt_sk(sk)->parent = parent;
0172
0173 if (bh)
0174 bh_unlock_sock(sk);
0175 else
0176 release_sock(sk);
0177
0178 sk_acceptq_added(parent);
0179 }
0180 EXPORT_SYMBOL(bt_accept_enqueue);
0181
0182
0183
0184
0185 void bt_accept_unlink(struct sock *sk)
0186 {
0187 BT_DBG("sk %p state %d", sk, sk->sk_state);
0188
0189 list_del_init(&bt_sk(sk)->accept_q);
0190 sk_acceptq_removed(bt_sk(sk)->parent);
0191 bt_sk(sk)->parent = NULL;
0192 sock_put(sk);
0193 }
0194 EXPORT_SYMBOL(bt_accept_unlink);
0195
0196 struct sock *bt_accept_dequeue(struct sock *parent, struct socket *newsock)
0197 {
0198 struct bt_sock *s, *n;
0199 struct sock *sk;
0200
0201 BT_DBG("parent %p", parent);
0202
0203 restart:
0204 list_for_each_entry_safe(s, n, &bt_sk(parent)->accept_q, accept_q) {
0205 sk = (struct sock *)s;
0206
0207
0208 sock_hold(sk);
0209 lock_sock(sk);
0210
0211
0212
0213
0214 if (!bt_sk(sk)->parent) {
0215 BT_DBG("sk %p, already unlinked", sk);
0216 release_sock(sk);
0217 sock_put(sk);
0218
0219
0220
0221
0222
0223 goto restart;
0224 }
0225
0226
0227 sock_put(sk);
0228
0229
0230 if (sk->sk_state == BT_CLOSED) {
0231 bt_accept_unlink(sk);
0232 release_sock(sk);
0233 continue;
0234 }
0235
0236 if (sk->sk_state == BT_CONNECTED || !newsock ||
0237 test_bit(BT_SK_DEFER_SETUP, &bt_sk(parent)->flags)) {
0238 bt_accept_unlink(sk);
0239 if (newsock)
0240 sock_graft(sk, newsock);
0241
0242 release_sock(sk);
0243 return sk;
0244 }
0245
0246 release_sock(sk);
0247 }
0248
0249 return NULL;
0250 }
0251 EXPORT_SYMBOL(bt_accept_dequeue);
0252
0253 int bt_sock_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
0254 int flags)
0255 {
0256 struct sock *sk = sock->sk;
0257 struct sk_buff *skb;
0258 size_t copied;
0259 size_t skblen;
0260 int err;
0261
0262 BT_DBG("sock %p sk %p len %zu", sock, sk, len);
0263
0264 if (flags & MSG_OOB)
0265 return -EOPNOTSUPP;
0266
0267 skb = skb_recv_datagram(sk, flags, &err);
0268 if (!skb) {
0269 if (sk->sk_shutdown & RCV_SHUTDOWN)
0270 return 0;
0271
0272 return err;
0273 }
0274
0275 skblen = skb->len;
0276 copied = skb->len;
0277 if (len < copied) {
0278 msg->msg_flags |= MSG_TRUNC;
0279 copied = len;
0280 }
0281
0282 skb_reset_transport_header(skb);
0283 err = skb_copy_datagram_msg(skb, 0, msg, copied);
0284 if (err == 0) {
0285 sock_recv_cmsgs(msg, sk, skb);
0286
0287 if (msg->msg_name && bt_sk(sk)->skb_msg_name)
0288 bt_sk(sk)->skb_msg_name(skb, msg->msg_name,
0289 &msg->msg_namelen);
0290
0291 if (bt_sk(sk)->skb_put_cmsg)
0292 bt_sk(sk)->skb_put_cmsg(skb, msg, sk);
0293 }
0294
0295 skb_free_datagram(sk, skb);
0296
0297 if (flags & MSG_TRUNC)
0298 copied = skblen;
0299
0300 return err ? : copied;
0301 }
0302 EXPORT_SYMBOL(bt_sock_recvmsg);
0303
0304 static long bt_sock_data_wait(struct sock *sk, long timeo)
0305 {
0306 DECLARE_WAITQUEUE(wait, current);
0307
0308 add_wait_queue(sk_sleep(sk), &wait);
0309 for (;;) {
0310 set_current_state(TASK_INTERRUPTIBLE);
0311
0312 if (!skb_queue_empty(&sk->sk_receive_queue))
0313 break;
0314
0315 if (sk->sk_err || (sk->sk_shutdown & RCV_SHUTDOWN))
0316 break;
0317
0318 if (signal_pending(current) || !timeo)
0319 break;
0320
0321 sk_set_bit(SOCKWQ_ASYNC_WAITDATA, sk);
0322 release_sock(sk);
0323 timeo = schedule_timeout(timeo);
0324 lock_sock(sk);
0325 sk_clear_bit(SOCKWQ_ASYNC_WAITDATA, sk);
0326 }
0327
0328 __set_current_state(TASK_RUNNING);
0329 remove_wait_queue(sk_sleep(sk), &wait);
0330 return timeo;
0331 }
0332
0333 int bt_sock_stream_recvmsg(struct socket *sock, struct msghdr *msg,
0334 size_t size, int flags)
0335 {
0336 struct sock *sk = sock->sk;
0337 int err = 0;
0338 size_t target, copied = 0;
0339 long timeo;
0340
0341 if (flags & MSG_OOB)
0342 return -EOPNOTSUPP;
0343
0344 BT_DBG("sk %p size %zu", sk, size);
0345
0346 lock_sock(sk);
0347
0348 target = sock_rcvlowat(sk, flags & MSG_WAITALL, size);
0349 timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
0350
0351 do {
0352 struct sk_buff *skb;
0353 int chunk;
0354
0355 skb = skb_dequeue(&sk->sk_receive_queue);
0356 if (!skb) {
0357 if (copied >= target)
0358 break;
0359
0360 err = sock_error(sk);
0361 if (err)
0362 break;
0363 if (sk->sk_shutdown & RCV_SHUTDOWN)
0364 break;
0365
0366 err = -EAGAIN;
0367 if (!timeo)
0368 break;
0369
0370 timeo = bt_sock_data_wait(sk, timeo);
0371
0372 if (signal_pending(current)) {
0373 err = sock_intr_errno(timeo);
0374 goto out;
0375 }
0376 continue;
0377 }
0378
0379 chunk = min_t(unsigned int, skb->len, size);
0380 if (skb_copy_datagram_msg(skb, 0, msg, chunk)) {
0381 skb_queue_head(&sk->sk_receive_queue, skb);
0382 if (!copied)
0383 copied = -EFAULT;
0384 break;
0385 }
0386 copied += chunk;
0387 size -= chunk;
0388
0389 sock_recv_cmsgs(msg, sk, skb);
0390
0391 if (!(flags & MSG_PEEK)) {
0392 int skb_len = skb_headlen(skb);
0393
0394 if (chunk <= skb_len) {
0395 __skb_pull(skb, chunk);
0396 } else {
0397 struct sk_buff *frag;
0398
0399 __skb_pull(skb, skb_len);
0400 chunk -= skb_len;
0401
0402 skb_walk_frags(skb, frag) {
0403 if (chunk <= frag->len) {
0404
0405 skb->len -= chunk;
0406 skb->data_len -= chunk;
0407 __skb_pull(frag, chunk);
0408 break;
0409 } else if (frag->len) {
0410
0411 chunk -= frag->len;
0412 skb->len -= frag->len;
0413 skb->data_len -= frag->len;
0414 __skb_pull(frag, frag->len);
0415 }
0416 }
0417 }
0418
0419 if (skb->len) {
0420 skb_queue_head(&sk->sk_receive_queue, skb);
0421 break;
0422 }
0423 kfree_skb(skb);
0424
0425 } else {
0426
0427 skb_queue_head(&sk->sk_receive_queue, skb);
0428 break;
0429 }
0430 } while (size);
0431
0432 out:
0433 release_sock(sk);
0434 return copied ? : err;
0435 }
0436 EXPORT_SYMBOL(bt_sock_stream_recvmsg);
0437
0438 static inline __poll_t bt_accept_poll(struct sock *parent)
0439 {
0440 struct bt_sock *s, *n;
0441 struct sock *sk;
0442
0443 list_for_each_entry_safe(s, n, &bt_sk(parent)->accept_q, accept_q) {
0444 sk = (struct sock *)s;
0445 if (sk->sk_state == BT_CONNECTED ||
0446 (test_bit(BT_SK_DEFER_SETUP, &bt_sk(parent)->flags) &&
0447 sk->sk_state == BT_CONNECT2))
0448 return EPOLLIN | EPOLLRDNORM;
0449 }
0450
0451 return 0;
0452 }
0453
0454 __poll_t bt_sock_poll(struct file *file, struct socket *sock,
0455 poll_table *wait)
0456 {
0457 struct sock *sk = sock->sk;
0458 __poll_t mask = 0;
0459
0460 poll_wait(file, sk_sleep(sk), wait);
0461
0462 if (sk->sk_state == BT_LISTEN)
0463 return bt_accept_poll(sk);
0464
0465 if (sk->sk_err || !skb_queue_empty_lockless(&sk->sk_error_queue))
0466 mask |= EPOLLERR |
0467 (sock_flag(sk, SOCK_SELECT_ERR_QUEUE) ? EPOLLPRI : 0);
0468
0469 if (sk->sk_shutdown & RCV_SHUTDOWN)
0470 mask |= EPOLLRDHUP | EPOLLIN | EPOLLRDNORM;
0471
0472 if (sk->sk_shutdown == SHUTDOWN_MASK)
0473 mask |= EPOLLHUP;
0474
0475 if (!skb_queue_empty_lockless(&sk->sk_receive_queue))
0476 mask |= EPOLLIN | EPOLLRDNORM;
0477
0478 if (sk->sk_state == BT_CLOSED)
0479 mask |= EPOLLHUP;
0480
0481 if (sk->sk_state == BT_CONNECT ||
0482 sk->sk_state == BT_CONNECT2 ||
0483 sk->sk_state == BT_CONFIG)
0484 return mask;
0485
0486 if (!test_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags) && sock_writeable(sk))
0487 mask |= EPOLLOUT | EPOLLWRNORM | EPOLLWRBAND;
0488 else
0489 sk_set_bit(SOCKWQ_ASYNC_NOSPACE, sk);
0490
0491 return mask;
0492 }
0493 EXPORT_SYMBOL(bt_sock_poll);
0494
0495 int bt_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
0496 {
0497 struct sock *sk = sock->sk;
0498 struct sk_buff *skb;
0499 long amount;
0500 int err;
0501
0502 BT_DBG("sk %p cmd %x arg %lx", sk, cmd, arg);
0503
0504 switch (cmd) {
0505 case TIOCOUTQ:
0506 if (sk->sk_state == BT_LISTEN)
0507 return -EINVAL;
0508
0509 amount = sk->sk_sndbuf - sk_wmem_alloc_get(sk);
0510 if (amount < 0)
0511 amount = 0;
0512 err = put_user(amount, (int __user *)arg);
0513 break;
0514
0515 case TIOCINQ:
0516 if (sk->sk_state == BT_LISTEN)
0517 return -EINVAL;
0518
0519 lock_sock(sk);
0520 skb = skb_peek(&sk->sk_receive_queue);
0521 amount = skb ? skb->len : 0;
0522 release_sock(sk);
0523 err = put_user(amount, (int __user *)arg);
0524 break;
0525
0526 default:
0527 err = -ENOIOCTLCMD;
0528 break;
0529 }
0530
0531 return err;
0532 }
0533 EXPORT_SYMBOL(bt_sock_ioctl);
0534
0535
0536 int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo)
0537 {
0538 DECLARE_WAITQUEUE(wait, current);
0539 int err = 0;
0540
0541 BT_DBG("sk %p", sk);
0542
0543 add_wait_queue(sk_sleep(sk), &wait);
0544 set_current_state(TASK_INTERRUPTIBLE);
0545 while (sk->sk_state != state) {
0546 if (!timeo) {
0547 err = -EINPROGRESS;
0548 break;
0549 }
0550
0551 if (signal_pending(current)) {
0552 err = sock_intr_errno(timeo);
0553 break;
0554 }
0555
0556 release_sock(sk);
0557 timeo = schedule_timeout(timeo);
0558 lock_sock(sk);
0559 set_current_state(TASK_INTERRUPTIBLE);
0560
0561 err = sock_error(sk);
0562 if (err)
0563 break;
0564 }
0565 __set_current_state(TASK_RUNNING);
0566 remove_wait_queue(sk_sleep(sk), &wait);
0567 return err;
0568 }
0569 EXPORT_SYMBOL(bt_sock_wait_state);
0570
0571
0572 int bt_sock_wait_ready(struct sock *sk, unsigned int msg_flags)
0573 {
0574 DECLARE_WAITQUEUE(wait, current);
0575 unsigned long timeo;
0576 int err = 0;
0577
0578 BT_DBG("sk %p", sk);
0579
0580 timeo = sock_sndtimeo(sk, !!(msg_flags & MSG_DONTWAIT));
0581
0582 add_wait_queue(sk_sleep(sk), &wait);
0583 set_current_state(TASK_INTERRUPTIBLE);
0584 while (test_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags)) {
0585 if (!timeo) {
0586 err = -EAGAIN;
0587 break;
0588 }
0589
0590 if (signal_pending(current)) {
0591 err = sock_intr_errno(timeo);
0592 break;
0593 }
0594
0595 release_sock(sk);
0596 timeo = schedule_timeout(timeo);
0597 lock_sock(sk);
0598 set_current_state(TASK_INTERRUPTIBLE);
0599
0600 err = sock_error(sk);
0601 if (err)
0602 break;
0603 }
0604 __set_current_state(TASK_RUNNING);
0605 remove_wait_queue(sk_sleep(sk), &wait);
0606
0607 return err;
0608 }
0609 EXPORT_SYMBOL(bt_sock_wait_ready);
0610
0611 #ifdef CONFIG_PROC_FS
0612 static void *bt_seq_start(struct seq_file *seq, loff_t *pos)
0613 __acquires(seq->private->l->lock)
0614 {
0615 struct bt_sock_list *l = pde_data(file_inode(seq->file));
0616
0617 read_lock(&l->lock);
0618 return seq_hlist_start_head(&l->head, *pos);
0619 }
0620
0621 static void *bt_seq_next(struct seq_file *seq, void *v, loff_t *pos)
0622 {
0623 struct bt_sock_list *l = pde_data(file_inode(seq->file));
0624
0625 return seq_hlist_next(v, &l->head, pos);
0626 }
0627
0628 static void bt_seq_stop(struct seq_file *seq, void *v)
0629 __releases(seq->private->l->lock)
0630 {
0631 struct bt_sock_list *l = pde_data(file_inode(seq->file));
0632
0633 read_unlock(&l->lock);
0634 }
0635
0636 static int bt_seq_show(struct seq_file *seq, void *v)
0637 {
0638 struct bt_sock_list *l = pde_data(file_inode(seq->file));
0639
0640 if (v == SEQ_START_TOKEN) {
0641 seq_puts(seq, "sk RefCnt Rmem Wmem User Inode Parent");
0642
0643 if (l->custom_seq_show) {
0644 seq_putc(seq, ' ');
0645 l->custom_seq_show(seq, v);
0646 }
0647
0648 seq_putc(seq, '\n');
0649 } else {
0650 struct sock *sk = sk_entry(v);
0651 struct bt_sock *bt = bt_sk(sk);
0652
0653 seq_printf(seq,
0654 "%pK %-6d %-6u %-6u %-6u %-6lu %-6lu",
0655 sk,
0656 refcount_read(&sk->sk_refcnt),
0657 sk_rmem_alloc_get(sk),
0658 sk_wmem_alloc_get(sk),
0659 from_kuid(seq_user_ns(seq), sock_i_uid(sk)),
0660 sock_i_ino(sk),
0661 bt->parent ? sock_i_ino(bt->parent) : 0LU);
0662
0663 if (l->custom_seq_show) {
0664 seq_putc(seq, ' ');
0665 l->custom_seq_show(seq, v);
0666 }
0667
0668 seq_putc(seq, '\n');
0669 }
0670 return 0;
0671 }
0672
0673 static const struct seq_operations bt_seq_ops = {
0674 .start = bt_seq_start,
0675 .next = bt_seq_next,
0676 .stop = bt_seq_stop,
0677 .show = bt_seq_show,
0678 };
0679
0680 int bt_procfs_init(struct net *net, const char *name,
0681 struct bt_sock_list *sk_list,
0682 int (*seq_show)(struct seq_file *, void *))
0683 {
0684 sk_list->custom_seq_show = seq_show;
0685
0686 if (!proc_create_seq_data(name, 0, net->proc_net, &bt_seq_ops, sk_list))
0687 return -ENOMEM;
0688 return 0;
0689 }
0690
0691 void bt_procfs_cleanup(struct net *net, const char *name)
0692 {
0693 remove_proc_entry(name, net->proc_net);
0694 }
0695 #else
0696 int bt_procfs_init(struct net *net, const char *name,
0697 struct bt_sock_list *sk_list,
0698 int (*seq_show)(struct seq_file *, void *))
0699 {
0700 return 0;
0701 }
0702
0703 void bt_procfs_cleanup(struct net *net, const char *name)
0704 {
0705 }
0706 #endif
0707 EXPORT_SYMBOL(bt_procfs_init);
0708 EXPORT_SYMBOL(bt_procfs_cleanup);
0709
0710 static const struct net_proto_family bt_sock_family_ops = {
0711 .owner = THIS_MODULE,
0712 .family = PF_BLUETOOTH,
0713 .create = bt_sock_create,
0714 };
0715
0716 struct dentry *bt_debugfs;
0717 EXPORT_SYMBOL_GPL(bt_debugfs);
0718
0719 #define VERSION __stringify(BT_SUBSYS_VERSION) "." \
0720 __stringify(BT_SUBSYS_REVISION)
0721
0722 static int __init bt_init(void)
0723 {
0724 int err;
0725
0726 sock_skb_cb_check_size(sizeof(struct bt_skb_cb));
0727
0728 BT_INFO("Core ver %s", VERSION);
0729
0730 err = bt_selftest();
0731 if (err < 0)
0732 return err;
0733
0734 bt_debugfs = debugfs_create_dir("bluetooth", NULL);
0735
0736 bt_leds_init();
0737
0738 err = bt_sysfs_init();
0739 if (err < 0)
0740 return err;
0741
0742 err = sock_register(&bt_sock_family_ops);
0743 if (err)
0744 goto cleanup_sysfs;
0745
0746 BT_INFO("HCI device and connection manager initialized");
0747
0748 err = hci_sock_init();
0749 if (err)
0750 goto unregister_socket;
0751
0752 err = l2cap_init();
0753 if (err)
0754 goto cleanup_socket;
0755
0756 err = sco_init();
0757 if (err)
0758 goto cleanup_cap;
0759
0760 err = mgmt_init();
0761 if (err)
0762 goto cleanup_sco;
0763
0764 return 0;
0765
0766 cleanup_sco:
0767 sco_exit();
0768 cleanup_cap:
0769 l2cap_exit();
0770 cleanup_socket:
0771 hci_sock_cleanup();
0772 unregister_socket:
0773 sock_unregister(PF_BLUETOOTH);
0774 cleanup_sysfs:
0775 bt_sysfs_cleanup();
0776 return err;
0777 }
0778
0779 static void __exit bt_exit(void)
0780 {
0781 mgmt_exit();
0782
0783 sco_exit();
0784
0785 l2cap_exit();
0786
0787 hci_sock_cleanup();
0788
0789 sock_unregister(PF_BLUETOOTH);
0790
0791 bt_sysfs_cleanup();
0792
0793 bt_leds_cleanup();
0794
0795 debugfs_remove_recursive(bt_debugfs);
0796 }
0797
0798 subsys_initcall(bt_init);
0799 module_exit(bt_exit);
0800
0801 MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
0802 MODULE_DESCRIPTION("Bluetooth Core ver " VERSION);
0803 MODULE_VERSION(VERSION);
0804 MODULE_LICENSE("GPL");
0805 MODULE_ALIAS_NETPROTO(PF_BLUETOOTH);