导图社区 linux net中bluetooth 部分流程代码
subsys_initcall(bt_init);net,linux net中bluetooth 部分流程代码,主要是是bt部分的初始化
编辑于2018-11-28 09:29:43subsys_initcall(bt_init); net/bluetooth/af_bluetooth.c
bt_init
sock_skb_cb_check_size(sizeof(struct bt_skb_cb));
err = bt_selftest();
return run_selftest(); net/bluetooth/selftest.c
err = test_ecdh(); ECDH一种加密算法
err = bt_selftest_smp(); 其他的算法加密,具体检查项展开比较复杂
bt_debugfs = debugfs_create_dir("bluetooth", NULL); 在/sys/kernel/debug下建立bluetooth 目录
err = bt_sysfs_init();
bt_class = class_create(THIS_MODULE, "bluetooth"); net/bluetooth/hci_sysfs.c
err = sock_register(&bt_sock_family_ops); net/sock.c
.create = bt_sock_create,
err = hci_sock_init();
err = proto_register(&hci_sk_proto, 0); net/bluetooth/hci_sock.c
err = bt_sock_register(BTPROTO_HCI, &hci_sock_family_ops);
.create = hci_sock_create,
sock->ops = &hci_sock_ops;
.release = hci_sock_release,
.mmap = sock_no_mmap
.getname = hci_sock_getname,
.sendmsg = hci_sock_sendmsg,
.recvmsg = hci_sock_recvmsg,
.ioctl = hci_sock_ioctl,
.poll = datagram_poll,
.bind = hci_sock_bind,
.shutdown = sock_no_shutdown,
.setsockopt = hci_sock_setsockopt,
.getsockopt = hci_sock_getsockopt,
.connect = sock_no_connect,
.socketpair = sock_no_socketpair,
.accept = sock_no_accept,
.listen = sock_no_listen,
sock_init_data(sock, sk);
init_timer(&sk->sk_timer);
sock_set_flag(sk, SOCK_ZAPPED);
rwlock_init(&sk->sk_callback_lock);
lockdep_set_class_and_name(&sk->sk_callback_lock, af_callback_keys + sk->sk_family, af_family_clock_key_strings[sk->sk_family]);
sk->sk_state_change = sock_def_wakeup; net/core/sock.c
sk->sk_data_ready = sock_def_readable;
sk->sk_write_space = sock_def_write_space;
sk->sk_error_report = sock_def_error_report;
sk->sk_destruct = sock_def_destruct;
smp_wmb();
sock_reset_flag(sk, SOCK_ZAPPED);
bt_sock_link(&hci_sk_list, sk);
sk_add_node(sk, &l->head);
err = bt_procfs_init(&init_net, "hci", &hci_sk_list, NULL);
err = l2cap_init();
err = l2cap_init_sockets(); net/bluetooth/l2cap_core.c
err = proto_register(&l2cap_proto, 0); net/bluetooth/i2cap_sock.c
err = bt_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops);
.create = l2cap_sock_create,
sock->ops = &l2cap_sock_ops;
.release = l2cap_sock_release,
.getsockopt = l2cap_sock_getsockopt
.connect = l2cap_sock_connect,
.listen = l2cap_sock_listen,
.accept = l2cap_sock_accept,
.getname = l2cap_sock_getname,
.sendmsg = l2cap_sock_sendmsg,
.bind = l2cap_sock_bind,
.poll = bt_sock_poll,
.ioctl = bt_sock_ioctl,
.mmap = sock_no_mmap,
.socketpair = sock_no_socketpair,
.shutdown = l2cap_sock_shutdown,
.setsockopt = l2cap_sock_setsockopt,
.recvmsg = l2cap_sock_recvmsg,
sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC, kern);
sk = sk_alloc(net, PF_BLUETOOTH, prio, &l2cap_proto, kern);
sock_init_data(sock, sk);
sock_reset_flag(sk, SOCK_ZAPPED);
chan = l2cap_chan_create();
l2cap_chan_hold(chan);
l2cap_pi(sk)->chan = chan;
l2cap_sock_init(sk, NULL);
bt_sock_link(&l2cap_sk_list, sk);
sk_add_node(sk, &l->head);
err = bt_procfs_init(&init_net, "l2cap", &l2cap_sk_list, NULL);
hci_register_cb(&l2cap_cb);
.connect_cfm = l2cap_connect_cfm,
.disconn_cfm = l2cap_disconn_cfm,
.security_cfm = l2cap_security_cfm,
l2cap_debugfs = debugfs_create_file("l2cap", 0444, bt_debugfs, NULL, &l2cap_debugfs_fops);
err = sco_init();
err = proto_register(&sco_proto, 0); net/bluetooth/sco.c
err = bt_sock_register(BTPROTO_SCO, &sco_sock_family_ops);
.create = sco_sock_create,
sock->ops = &sco_sock_ops;
.release = sco_sock_release,
.getsockopt = sco_sock_getsockopt
.connect = sco_sock_connect,
.listen = sco_sock_listen,
.accept = sco_sock_accept,
.getname = sco_sock_getname,
.sendmsg = sco_sock_sendmsg,
.bind = sco_sock_bind,
.poll = bt_sock_poll,
.ioctl = bt_sock_ioctl,
.mmap = sock_no_mmap,
.socketpair = sock_no_socketpair,
.shutdown = sco_sock_shutdown,
.setsockopt = sco_sock_setsockopt,
.recvmsg = sco_sock_recvmsg,
sk = sco_sock_alloc(net, sock, protocol, GFP_ATOMIC, kern);
sock_init_data(sock, sk);
sock_reset_flag(sk, SOCK_ZAPPED);
setup_timer(&sk->sk_timer, sco_sock_timeout, (unsigned long)sk);
bt_sock_link(&sco_sk_list, sk);
sk_add_node(sk, &l->head);
sco_sock_init(sk, NULL);
security_sk_clone(parent, sk);
err = bt_procfs_init(&init_net, "sco", &sco_sk_list, NULL);
hci_register_cb(&sco_cb);
.connect_cfm = sco_connect_cfm,
.disconn_cfm = sco_disconn_cfm,
sco_debugfs = debugfs_create_file("sco", 0444, bt_debugfs, NULL, &sco_debugfs_fops);
err = mgmt_init();
return hci_mgmt_chan_register(&chan); net/bluetooth/mgmt.c
.handlers = mgmt_handlers, 注册mgmt相关操作句柄
.hdev_init = mgmt_init_hdev,
hci_dev_test_and_set_flag(hdev, HCI_MGMT)
INIT_DELAYED_WORK(&hdev->service_cache, service_cache_off);
hci_req_init(&req, hdev);
hci_dev_lock(hdev);
update_eir(&req);
update_class(&req);
hci_dev_unlock(hdev);
hci_req_run(&req, NULL);
INIT_DELAYED_WORK(&hdev->rpa_expired, rpa_expired);
hci_dev_set_flag(hdev, HCI_RPA_EXPIRED);
hci_req_init(&req, hdev);
enable_advertising(&req);
hci_dev_clear_flag(hdev, HCI_LE_ADV);
instance = get_current_adv_instance(hdev);
flags = get_adv_instance_flags(hdev, instance);
hci_req_run(&req, NULL);
hci_dev_clear_flag(hdev, HCI_BONDABLE);