bt-kernel-sock分析

本文解析了Linux内核中kernel/net/bluetooth/l2cap_sock.c和kernel/net/bluetooth/hci_sock.c文件,详细介绍了L2CAP和HCI协议的socket初始化过程,包括协议注册、socket创建、操作接口定义及procfs目录的创建,同时涵盖了清理步骤和关键函数实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);

The manual page at http://dev.mysql.com/doc/mysql/en/crashing.html contains information that should help you find out what is causing the crash. 2025-03-09 13:57:47+08:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 9.2.0-1.el9 started. 2025-03-09 13:57:48+08:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' 2025-03-09 13:57:48+08:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 9.2.0-1.el9 started. '/var/lib/mysql/mysql.sock' -> '/var/run/mysqld/mysqld.sock' 2025-03-09T05:57:48.531353Z 0 [System] [MY-015015] [Server] MySQL Server - start. 2025-03-09T05:57:48.796751Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 9.2.0) starting as process 1 2025-03-09T05:57:48.830566Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. 2025-03-09T05:57:50.751653Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. 2025-03-09T05:57:51.358634Z 1 [ERROR] [MY-010520] [Server] Invalid (old?) table or database name 'hm-item' 2025-03-09T05:57:51Z UTC - mysqld got signal 11 ; Signal SIGSEGV (Address not mapped to object) at address 0x0 Most likely, you have hit a bug, but this error can also be caused by malfunctioning hardware. BuildID[sha1]=6e45d3c3fff42426a19918d101b1be25b8ec7297 Thread pointer: 0x7b6d2b0 Attempting backtrace. You can use the following information to find out where mysqld died. If you see no messages after this, something went terribly wrong... stack_bottom = 7f73c1411b10 thread_stack 0x100000 #0 0xc84d30 <unknown> #1 0x7f73ce20f72f <unknown> #2 0x1950243 <unknown> #3 0x19a4793 <unknown> #4 0x16fd7bb <unknown> #5 0x153a34a <unknown> #6 0x154e9ca <unknown> #7 0xd2cc07 <unknown> #8 0x1cf6501 <unknown> #9 0x7f73ce25ad31 <unknown> #10 0x7f73ce2df0b3 <unknown> #11 0xffffffffffffffff <unknown> Trying to get some variables. Some pointers may be invalid and cause the dump to abort. Query (0): Connection ID (thread ID): 1 Status: NOT_KILLED The manual page at http://dev.mysql.com/doc/mysql/en/cras
最新发布
03-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值