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