bt-kernel-sock分析

kernel-net-bluetooth-l2capsock分析

kernel/net/bluetooth/l2cap_sock.c
    初始化: int __init l2cap_init_sockets(void)
            1. 协议注册
                 err = proto_register(&l2cap_proto, 0);
                    static struct proto l2cap_proto = {
                        .name        = "L2CAP",
                        .owner        = THIS_MODULE,
                        .obj_size    = sizeof(struct l2cap_pinfo)
                    };
            2. 创建socket
                 err = bt_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops);
                    A. 在static const struct net_proto_family *bt_proto[BT_MAX_PROTO];中保存
                        #define BT_MAX_PROTO    8    
                        /* Reserv for core and drivers use */
                        #define BT_SKB_RESERVE    8
                        #define BTPROTO_L2CAP    0
                        #define BTPROTO_HCI    1
                        #define BTPROTO_SCO    2
                        #define BTPROTO_RFCOMM    3
                        #define BTPROTO_BNEP    4
                        #define BTPROTO_CMTP    5
                        #define BTPROTO_HIDP    6
                        #define BTPROTO_AVDTP    7
                    B. 对应的操作接口
                    static const struct net_proto_family l2cap_sock_family_ops = {
                        .family    = PF_BLUETOOTH,
                        .owner    = THIS_MODULE,
                        .create    = l2cap_sock_create,
                    };
                    C. 创建socket接口
                    static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol, int kern);
                        sock->ops = &l2cap_sock_ops;
                        sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC); => 创建chan,并保存在全局对象chan_list中.
                        l2cap_sock_init(sk, NULL); => 完善chan
                        bt_sock_link(&l2cap_sk_list, sk); =>与procfs有关
                    D. socket所有的操作接口
                    static const struct proto_ops l2cap_sock_ops = {
                        .family        = PF_BLUETOOTH,
                        .owner        = THIS_MODULE,
                        .release    = l2cap_sock_release,
                        .bind        = l2cap_sock_bind,
                        .connect    = l2cap_sock_connect,
                        .listen        = l2cap_sock_listen,
                        .accept        = l2cap_sock_accept,
                        .getname    = l2cap_sock_getname,
                        .sendmsg    = l2cap_sock_sendmsg,
                        .recvmsg    = l2cap_sock_recvmsg,
                        .poll        = bt_sock_poll,
                        .ioctl        = bt_sock_ioctl,
                        .mmap        = sock_no_mmap,
                        .socketpair    = sock_no_socketpair,
                        .shutdown    = l2cap_sock_shutdown,
                        .setsockopt    = l2cap_sock_setsockopt,
                        .getsockopt    = l2cap_sock_getsockopt
                    };
            3. 创建procfs目录
                err = bt_procfs_init(&init_net, "l2cap", &l2cap_sk_list, NULL);
            4. 提示信息
                BT_INFO("L2CAP socket layer initialized");
    清理: void l2cap_cleanup_sockets(void)
            1. 清除procfs
                bt_procfs_cleanup(&init_net, "l2cap");
            2. 清除socket
                bt_sock_unregister(BTPROTO_L2CAP);
            3. 清除该协议
                proto_unregister(&l2cap_proto);

kernel-net-bluetooth-hcisock分析

kernel/net/bluetooth/hci_sock.c
    hci socket 创建过程
    初始化: int __init hci_sock_init(void)
        1. 协议注册
                 err = proto_register(&hci_sk_proto, 0);
                    static struct proto hci_sk_proto = {
                        .name        = "HCI",
                        .owner        = THIS_MODULE,
                        .obj_size    = sizeof(struct hci_pinfo)
                    };

        2. 创建socket
            err = bt_sock_register(BTPROTO_HCI, &hci_sock_family_ops);
            A. 保存到bt_proto(考l2capscok.stg)
            B. 对应的操作接口
            static const struct net_proto_family hci_sock_family_ops = {
                    .family    = PF_BLUETOOTH,
                    .owner    = THIS_MODULE,
                    .create    = hci_sock_create,
                };
            C. 创建socket接口
            static int hci_sock_create(struct net *net, struct socket *sock, int protocol, int kern);
                sock->ops = &hci_sock_ops;
                sk = sk_alloc(net, PF_BLUETOOTH, GFP_ATOMIC, &hci_sk_proto);
                sock_init_data(sock, sk); => 将sock和socket关联起来
                bt_sock_link(&hci_sk_list, sk); =>与procfs有关
            D. socket所有的操作接口
            static const struct proto_ops hci_sock_ops = {
                .family        = PF_BLUETOOTH,
                .owner        = THIS_MODULE,
                .release    = hci_sock_release,
                .bind        = hci_sock_bind,
                .getname    = hci_sock_getname,
                .sendmsg    = hci_sock_sendmsg,
                .recvmsg    = hci_sock_recvmsg,
                .ioctl        = hci_sock_ioctl,
                .poll        = datagram_poll,
                .listen        = sock_no_listen,
                .shutdown    = sock_no_shutdown,
                .setsockopt    = hci_sock_setsockopt,
                .getsockopt    = hci_sock_getsockopt,
                .connect    = sock_no_connect,
                .socketpair    = sock_no_socketpair,
                .accept        = sock_no_accept,
                .mmap        = sock_no_mmap
            };
        3. 创建procfs目录
            err = bt_procfs_init(&init_net, "hci", &hci_sk_list, NULL);
        4. 提示信息
            BT_INFO("HCI socket layer initialized");
    清理: void hci_sock_cleanup(void)
            1. 清除procfs
                bt_procfs_cleanup(&init_net, "hci");
            2. 清除socket
                bt_sock_unregister(BTPROTO_HCI);
            3. 清除该协议
                proto_unregister(&hci_sk_proto);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值