linux/net/bluetooth/af_bluetooth.c
<<
>>
Prefs
   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        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}
 301EXPORT_SYMBOL(bt_sock_recvmsg);
 302
 303static 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
 332int 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
 431out:
 432        release_sock(sk);
 433        return copied ? : err;
 434}
 435EXPORT_SYMBOL(bt_sock_stream_recvmsg);
 436
 437static 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
 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}
 492EXPORT_SYMBOL(bt_sock_poll);
 493
 494int 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}
 532EXPORT_SYMBOL(bt_sock_ioctl);
 533
 534/* This function expects the sk lock to be held when called */
 535int 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}
 568EXPORT_SYMBOL(bt_sock_wait_state);
 569
 570/* This function expects the sk lock to be held when called */
 571int 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}
 608EXPORT_SYMBOL(bt_sock_wait_ready);
 609
 610#ifdef CONFIG_PROC_FS
 611static 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
 620static 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
 627static 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
 635static 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
 672static 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
 679int 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
 690void bt_procfs_cleanup(struct net *net, const char *name)
 691{
 692        remove_proc_entry(name, net->proc_net);
 693}
 694#else
 695int 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
 702void bt_procfs_cleanup(struct net *net, const char *name)
 703{
 704}
 705#endif
 706EXPORT_SYMBOL(bt_procfs_init);
 707EXPORT_SYMBOL(bt_procfs_cleanup);
 708
 709static const struct net_proto_family bt_sock_family_ops = {
 710        .owner  = THIS_MODULE,
 711        .family = PF_BLUETOOTH,
 712        .create = bt_sock_create,
 713};
 714
 715struct dentry *bt_debugfs;
 716EXPORT_SYMBOL_GPL(bt_debugfs);
 717
 718#define VERSION __stringify(BT_SUBSYS_VERSION) "." \
 719                __stringify(BT_SUBSYS_REVISION)
 720
 721static 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
 765cleanup_sco:
 766        sco_exit();
 767cleanup_cap:
 768        l2cap_exit();
 769cleanup_socket:
 770        hci_sock_cleanup();
 771unregister_socket:
 772        sock_unregister(PF_BLUETOOTH);
 773cleanup_sysfs:
 774        bt_sysfs_cleanup();
 775        return err;
 776}
 777
 778static 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
 797subsys_initcall(bt_init);
 798module_exit(bt_exit);
 799
 800MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
 801MODULE_DESCRIPTION("Bluetooth Core ver " VERSION);
 802MODULE_VERSION(VERSION);
 803MODULE_LICENSE("GPL");
 804MODULE_ALIAS_NETPROTO(PF_BLUETOOTH);
 805