Lines Matching +full:sco +full:- +full:routing
2 BlueZ - Bluetooth protocol stack for Linux
3 Copyright (c) 2000-2001, 2010, Code Aurora Forum. All rights reserved.
4 Copyright 2023-2024 NXP
70 /* This function requires the caller holds hdev->lock */
74 struct hci_dev *hdev = conn->hdev; in hci_connect_le_scan_cleanup()
79 bdaddr = &conn->dst; in hci_connect_le_scan_cleanup()
80 bdaddr_type = conn->dst_type; in hci_connect_le_scan_cleanup()
85 bdaddr = &irk->bdaddr; in hci_connect_le_scan_cleanup()
86 bdaddr_type = irk->addr_type; in hci_connect_le_scan_cleanup()
89 params = hci_pend_le_action_lookup(&hdev->pend_le_conns, bdaddr, in hci_connect_le_scan_cleanup()
94 if (params->conn) { in hci_connect_le_scan_cleanup()
95 hci_conn_drop(params->conn); in hci_connect_le_scan_cleanup()
96 hci_conn_put(params->conn); in hci_connect_le_scan_cleanup()
97 params->conn = NULL; in hci_connect_le_scan_cleanup()
100 if (!params->explicit_connect) in hci_connect_le_scan_cleanup()
117 params->explicit_connect = false; in hci_connect_le_scan_cleanup()
121 switch (params->auto_connect) { in hci_connect_le_scan_cleanup()
128 hci_pend_le_list_add(params, &hdev->pend_le_conns); in hci_connect_le_scan_cleanup()
131 hci_pend_le_list_add(params, &hdev->pend_le_reports); in hci_connect_le_scan_cleanup()
142 struct hci_dev *hdev = conn->hdev; in hci_conn_cleanup()
144 if (test_bit(HCI_CONN_PARAM_REMOVAL_PEND, &conn->flags)) in hci_conn_cleanup()
145 hci_conn_params_del(conn->hdev, &conn->dst, conn->dst_type); in hci_conn_cleanup()
147 if (test_and_clear_bit(HCI_CONN_FLUSH_KEY, &conn->flags)) in hci_conn_cleanup()
148 hci_remove_link_key(hdev, &conn->dst); in hci_conn_cleanup()
152 if (HCI_CONN_HANDLE_UNSET(conn->handle)) in hci_conn_cleanup()
153 ida_free(&hdev->unset_handle_ida, conn->handle); in hci_conn_cleanup()
155 if (conn->cleanup) in hci_conn_cleanup()
156 conn->cleanup(conn); in hci_conn_cleanup()
158 if (conn->type == SCO_LINK || conn->type == ESCO_LINK) { in hci_conn_cleanup()
159 switch (conn->setting & SCO_AIRMODE_MASK) { in hci_conn_cleanup()
162 if (hdev->notify) in hci_conn_cleanup()
163 hdev->notify(hdev, HCI_NOTIFY_DISABLE_SCO); in hci_conn_cleanup()
167 if (hdev->notify) in hci_conn_cleanup()
168 hdev->notify(hdev, HCI_NOTIFY_CONN_DEL); in hci_conn_cleanup()
171 debugfs_remove_recursive(conn->debugfs); in hci_conn_cleanup()
187 if (conn->type == ACL_LINK && conn->role == HCI_ROLE_MASTER && in hci_disconnect()
188 (conn->state == BT_CONNECTED || conn->state == BT_CONFIG)) { in hci_disconnect()
189 struct hci_dev *hdev = conn->hdev; in hci_disconnect()
192 clkoff_cp.handle = cpu_to_le16(conn->handle); in hci_disconnect()
202 struct hci_dev *hdev = conn->hdev; in hci_add_sco()
207 conn->state = BT_CONNECT; in hci_add_sco()
208 conn->out = true; in hci_add_sco()
210 conn->attempt++; in hci_add_sco()
213 cp.pkt_type = cpu_to_le16(conn->pkt_type); in hci_add_sco()
221 if (!conn->parent) in find_next_esco_param()
224 for (; conn->attempt <= size; conn->attempt++) { in find_next_esco_param()
225 if (lmp_esco_2m_capable(conn->parent) || in find_next_esco_param()
226 (esco_param[conn->attempt - 1].pkt_type & ESCO_2EV3)) in find_next_esco_param()
229 conn, conn->attempt); in find_next_esco_param()
232 return conn->attempt <= size; in find_next_esco_param()
245 if (!codec->data_path || !hdev->get_codec_config_data) in configure_datapath_sync()
248 err = hdev->get_codec_config_data(hdev, ESCO_LINK, codec, &vnd_len, in configure_datapath_sync()
255 err = -ENOMEM; in configure_datapath_sync()
259 err = hdev->get_data_path_id(hdev, &cmd->data_path_id); in configure_datapath_sync()
263 cmd->vnd_len = vnd_len; in configure_datapath_sync()
264 memcpy(cmd->vnd_data, vnd_data, vnd_len); in configure_datapath_sync()
266 cmd->direction = 0x00; in configure_datapath_sync()
270 cmd->direction = 0x01; in configure_datapath_sync()
284 struct hci_conn *conn = conn_handle->conn; in hci_enhanced_setup_sync()
285 __u16 handle = conn_handle->handle; in hci_enhanced_setup_sync()
292 return -ECANCELED; in hci_enhanced_setup_sync()
296 configure_datapath_sync(hdev, &conn->codec); in hci_enhanced_setup_sync()
298 conn->state = BT_CONNECT; in hci_enhanced_setup_sync()
299 conn->out = true; in hci_enhanced_setup_sync()
301 conn->attempt++; in hci_enhanced_setup_sync()
310 switch (conn->codec.id) { in hci_enhanced_setup_sync()
314 return -EINVAL; in hci_enhanced_setup_sync()
316 param = &esco_param_msbc[conn->attempt - 1]; in hci_enhanced_setup_sync()
331 cp.in_data_path = conn->codec.data_path; in hci_enhanced_setup_sync()
332 cp.out_data_path = conn->codec.data_path; in hci_enhanced_setup_sync()
340 return -EINVAL; in hci_enhanced_setup_sync()
342 param = &esco_param_msbc[conn->attempt - 1]; in hci_enhanced_setup_sync()
357 cp.in_data_path = conn->codec.data_path; in hci_enhanced_setup_sync()
358 cp.out_data_path = conn->codec.data_path; in hci_enhanced_setup_sync()
364 if (conn->parent && lmp_esco_capable(conn->parent)) { in hci_enhanced_setup_sync()
367 return -EINVAL; in hci_enhanced_setup_sync()
368 param = &esco_param_cvsd[conn->attempt - 1]; in hci_enhanced_setup_sync()
370 if (conn->attempt > ARRAY_SIZE(sco_param_cvsd)) in hci_enhanced_setup_sync()
371 return -EINVAL; in hci_enhanced_setup_sync()
372 param = &sco_param_cvsd[conn->attempt - 1]; in hci_enhanced_setup_sync()
388 cp.in_data_path = conn->codec.data_path; in hci_enhanced_setup_sync()
389 cp.out_data_path = conn->codec.data_path; in hci_enhanced_setup_sync()
394 return -EINVAL; in hci_enhanced_setup_sync()
397 cp.retrans_effort = param->retrans_effort; in hci_enhanced_setup_sync()
398 cp.pkt_type = __cpu_to_le16(param->pkt_type); in hci_enhanced_setup_sync()
399 cp.max_latency = __cpu_to_le16(param->max_latency); in hci_enhanced_setup_sync()
402 return -EIO; in hci_enhanced_setup_sync()
409 struct hci_dev *hdev = conn->hdev; in hci_setup_sync_conn()
415 conn->state = BT_CONNECT; in hci_setup_sync_conn()
416 conn->out = true; in hci_setup_sync_conn()
418 conn->attempt++; in hci_setup_sync_conn()
424 cp.voice_setting = cpu_to_le16(conn->setting); in hci_setup_sync_conn()
426 switch (conn->setting & SCO_AIRMODE_MASK) { in hci_setup_sync_conn()
431 param = &esco_param_msbc[conn->attempt - 1]; in hci_setup_sync_conn()
434 if (conn->parent && lmp_esco_capable(conn->parent)) { in hci_setup_sync_conn()
438 param = &esco_param_cvsd[conn->attempt - 1]; in hci_setup_sync_conn()
440 if (conn->attempt > ARRAY_SIZE(sco_param_cvsd)) in hci_setup_sync_conn()
442 param = &sco_param_cvsd[conn->attempt - 1]; in hci_setup_sync_conn()
449 cp.retrans_effort = param->retrans_effort; in hci_setup_sync_conn()
450 cp.pkt_type = __cpu_to_le16(param->pkt_type); in hci_setup_sync_conn()
451 cp.max_latency = __cpu_to_le16(param->max_latency); in hci_setup_sync_conn()
464 if (enhanced_sync_conn_capable(conn->hdev)) { in hci_setup_sync()
470 conn_handle->conn = conn; in hci_setup_sync()
471 conn_handle->handle = handle; in hci_setup_sync()
472 result = hci_cmd_sync_queue(conn->hdev, hci_enhanced_setup_sync, in hci_setup_sync()
486 struct hci_dev *hdev = conn->hdev; in hci_le_conn_update()
492 params = hci_conn_params_lookup(hdev, &conn->dst, conn->dst_type); in hci_le_conn_update()
494 params->conn_min_interval = min; in hci_le_conn_update()
495 params->conn_max_interval = max; in hci_le_conn_update()
496 params->conn_latency = latency; in hci_le_conn_update()
497 params->supervision_timeout = to_multiplier; in hci_le_conn_update()
503 cp.handle = cpu_to_le16(conn->handle); in hci_le_conn_update()
522 struct hci_dev *hdev = conn->hdev; in hci_le_start_enc()
529 cp.handle = cpu_to_le16(conn->handle); in hci_le_start_enc()
542 link = list_first_entry_or_null(&conn->link_list, struct hci_link, list); in hci_sco_setup()
543 if (!link || !link->conn) in hci_sco_setup()
549 if (lmp_esco_capable(conn->hdev)) in hci_sco_setup()
550 hci_setup_sync(link->conn, conn->handle); in hci_sco_setup()
552 hci_add_sco(link->conn, conn->handle); in hci_sco_setup()
554 hci_connect_cfm(link->conn, status); in hci_sco_setup()
555 hci_conn_del(link->conn); in hci_sco_setup()
563 int refcnt = atomic_read(&conn->refcnt); in hci_conn_timeout()
565 BT_DBG("hcon %p state %s", conn, state_to_string(conn->state)); in hci_conn_timeout()
587 struct hci_dev *hdev = conn->hdev; in hci_conn_idle()
589 BT_DBG("hcon %p mode %d", conn, conn->mode); in hci_conn_idle()
594 if (conn->mode != HCI_CM_ACTIVE || !(conn->link_policy & HCI_LP_SNIFF)) in hci_conn_idle()
599 cp.handle = cpu_to_le16(conn->handle); in hci_conn_idle()
606 if (!test_and_set_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags)) { in hci_conn_idle()
608 cp.handle = cpu_to_le16(conn->handle); in hci_conn_idle()
609 cp.max_interval = cpu_to_le16(hdev->sniff_max_interval); in hci_conn_idle()
610 cp.min_interval = cpu_to_le16(hdev->sniff_min_interval); in hci_conn_idle()
622 hci_send_cmd(conn->hdev, HCI_OP_USER_CONFIRM_REPLY, sizeof(conn->dst), in hci_conn_auto_accept()
623 &conn->dst); in hci_conn_auto_accept()
647 struct hci_dev *hdev = conn->hdev; in le_conn_timeout()
656 if (conn->role == HCI_ROLE_SLAVE) { in le_conn_timeout()
689 if (bacmp(&conn->dst, BDADDR_ANY)) in bis_list()
692 if (d->big != conn->iso_qos.bcast.big || d->bis == BT_ISO_QOS_BIS_UNSET || in bis_list()
693 d->bis != conn->iso_qos.bcast.bis) in bis_list()
696 d->count++; in bis_list()
703 bt_dev_dbg(hdev, "big 0x%2.2x bis 0x%2.2x", d->big, d->bis); in terminate_big_sync()
705 hci_disable_per_advertising_sync(hdev, d->bis); in terminate_big_sync()
706 hci_remove_ext_adv_instance_sync(hdev, d->bis, NULL); in terminate_big_sync()
709 if (!d->big_term) in terminate_big_sync()
712 return hci_le_terminate_big_sync(hdev, d->big, in terminate_big_sync()
726 bt_dev_dbg(hdev, "big 0x%2.2x bis 0x%2.2x", conn->iso_qos.bcast.big, in hci_le_terminate_big()
727 conn->iso_qos.bcast.bis); in hci_le_terminate_big()
731 return -ENOMEM; in hci_le_terminate_big()
733 d->big = conn->iso_qos.bcast.big; in hci_le_terminate_big()
734 d->bis = conn->iso_qos.bcast.bis; in hci_le_terminate_big()
735 d->big_term = test_and_clear_bit(HCI_CONN_BIG_CREATED, &conn->flags); in hci_le_terminate_big()
749 bt_dev_dbg(hdev, "big 0x%2.2x sync_handle 0x%4.4x", d->big, in big_terminate_sync()
750 d->sync_handle); in big_terminate_sync()
752 if (d->big_sync_term) in big_terminate_sync()
753 hci_le_big_terminate_sync(hdev, d->big); in big_terminate_sync()
755 if (d->pa_sync_term) in big_terminate_sync()
756 return hci_le_pa_terminate_sync(hdev, d->sync_handle); in big_terminate_sync()
766 if (d->big != conn->iso_qos.bcast.big) in find_bis()
769 d->count++; in find_bis()
777 bt_dev_dbg(hdev, "big 0x%2.2x sync_handle 0x%4.4x", big, conn->sync_handle); in hci_le_big_terminate()
781 return -ENOMEM; in hci_le_big_terminate()
783 d->big = big; in hci_le_big_terminate()
784 d->sync_handle = conn->sync_handle; in hci_le_big_terminate()
786 if (test_and_clear_bit(HCI_CONN_PA_SYNC, &conn->flags)) { in hci_le_big_terminate()
790 if (!d->count) in hci_le_big_terminate()
791 d->pa_sync_term = true; in hci_le_big_terminate()
793 d->count = 0; in hci_le_big_terminate()
796 if (test_and_clear_bit(HCI_CONN_BIG_SYNC, &conn->flags)) { in hci_le_big_terminate()
800 if (!d->count) in hci_le_big_terminate()
801 d->big_sync_term = true; in hci_le_big_terminate()
820 struct hci_dev *hdev = conn->hdev; in bis_cleanup()
825 if (conn->role == HCI_ROLE_MASTER) { in bis_cleanup()
826 if (!test_and_clear_bit(HCI_CONN_PER_ADV, &conn->flags)) in bis_cleanup()
833 conn->iso_qos.bcast.big, in bis_cleanup()
840 conn->iso_qos.bcast.big, in bis_cleanup()
848 hci_le_big_terminate(hdev, conn->iso_qos.bcast.big, in bis_cleanup()
873 if (!bacmp(&conn->dst, BDADDR_ANY) || d->cig != conn->iso_qos.ucast.cig) in find_cis()
876 d->count++; in find_cis()
885 struct hci_dev *hdev = conn->hdev; in cis_cleanup()
888 if (conn->iso_qos.ucast.cig == BT_ISO_QOS_CIG_UNSET) in cis_cleanup()
892 d.cig = conn->iso_qos.ucast.cig; in cis_cleanup()
905 hci_le_remove_cig(hdev, conn->iso_qos.ucast.cig); in cis_cleanup()
910 return ida_alloc_range(&hdev->unset_handle_ida, HCI_CONN_HANDLE_MAX + 1, in hci_conn_hash_alloc_unset()
921 if (!hdev->acl_mtu) in __hci_conn_add()
922 return ERR_PTR(-ECONNREFUSED); in __hci_conn_add()
927 if (!hdev->iso_mtu) in __hci_conn_add()
928 return ERR_PTR(-ECONNREFUSED); in __hci_conn_add()
931 if (hdev->le_mtu && hdev->le_mtu < HCI_MIN_LE_MTU) in __hci_conn_add()
932 return ERR_PTR(-ECONNREFUSED); in __hci_conn_add()
933 if (!hdev->le_mtu && hdev->acl_mtu < HCI_MIN_LE_MTU) in __hci_conn_add()
934 return ERR_PTR(-ECONNREFUSED); in __hci_conn_add()
938 if (!hdev->sco_pkts) in __hci_conn_add()
939 /* Controller does not support SCO or eSCO over HCI */ in __hci_conn_add()
940 return ERR_PTR(-ECONNREFUSED); in __hci_conn_add()
943 return ERR_PTR(-ECONNREFUSED); in __hci_conn_add()
950 return ERR_PTR(-ENOMEM); in __hci_conn_add()
952 bacpy(&conn->dst, dst); in __hci_conn_add()
953 bacpy(&conn->src, &hdev->bdaddr); in __hci_conn_add()
954 conn->handle = handle; in __hci_conn_add()
955 conn->hdev = hdev; in __hci_conn_add()
956 conn->type = type; in __hci_conn_add()
957 conn->role = role; in __hci_conn_add()
958 conn->mode = HCI_CM_ACTIVE; in __hci_conn_add()
959 conn->state = BT_OPEN; in __hci_conn_add()
960 conn->auth_type = HCI_AT_GENERAL_BONDING; in __hci_conn_add()
961 conn->io_capability = hdev->io_capability; in __hci_conn_add()
962 conn->remote_auth = 0xff; in __hci_conn_add()
963 conn->key_type = 0xff; in __hci_conn_add()
964 conn->rssi = HCI_RSSI_INVALID; in __hci_conn_add()
965 conn->tx_power = HCI_TX_POWER_INVALID; in __hci_conn_add()
966 conn->max_tx_power = HCI_TX_POWER_INVALID; in __hci_conn_add()
967 conn->sync_handle = HCI_SYNC_HANDLE_INVALID; in __hci_conn_add()
968 conn->sid = HCI_SID_INVALID; in __hci_conn_add()
970 set_bit(HCI_CONN_POWER_SAVE, &conn->flags); in __hci_conn_add()
971 conn->disc_timeout = HCI_DISCONN_TIMEOUT; in __hci_conn_add()
974 conn->auth_payload_timeout = DEFAULT_AUTH_PAYLOAD_TIMEOUT; in __hci_conn_add()
976 if (conn->role == HCI_ROLE_MASTER) in __hci_conn_add()
977 conn->out = true; in __hci_conn_add()
981 conn->pkt_type = hdev->pkt_type & ACL_PTYPE_MASK; in __hci_conn_add()
982 conn->mtu = hdev->acl_mtu; in __hci_conn_add()
985 /* conn->src should reflect the local identity address */ in __hci_conn_add()
986 hci_copy_identity_address(hdev, &conn->src, &conn->src_type); in __hci_conn_add()
987 conn->mtu = hdev->le_mtu ? hdev->le_mtu : hdev->acl_mtu; in __hci_conn_add()
992 /* conn->src should reflect the local identity address */ in __hci_conn_add()
993 hci_copy_identity_address(hdev, &conn->src, &conn->src_type); in __hci_conn_add()
997 conn->cleanup = bis_cleanup; in __hci_conn_add()
998 else if (conn->role == HCI_ROLE_MASTER) in __hci_conn_add()
999 conn->cleanup = cis_cleanup; in __hci_conn_add()
1001 conn->mtu = hdev->iso_mtu ? hdev->iso_mtu : in __hci_conn_add()
1002 hdev->le_mtu ? hdev->le_mtu : hdev->acl_mtu; in __hci_conn_add()
1006 conn->pkt_type = (hdev->esco_type & SCO_ESCO_MASK) | in __hci_conn_add()
1007 (hdev->esco_type & EDR_ESCO_MASK); in __hci_conn_add()
1009 conn->pkt_type = hdev->pkt_type & SCO_PTYPE_MASK; in __hci_conn_add()
1011 conn->mtu = hdev->sco_mtu; in __hci_conn_add()
1014 conn->pkt_type = hdev->esco_type & ~EDR_ESCO_MASK; in __hci_conn_add()
1015 conn->mtu = hdev->sco_mtu; in __hci_conn_add()
1019 skb_queue_head_init(&conn->data_q); in __hci_conn_add()
1020 skb_queue_head_init(&conn->tx_q.queue); in __hci_conn_add()
1022 INIT_LIST_HEAD(&conn->chan_list); in __hci_conn_add()
1023 INIT_LIST_HEAD(&conn->link_list); in __hci_conn_add()
1025 INIT_DELAYED_WORK(&conn->disc_work, hci_conn_timeout); in __hci_conn_add()
1026 INIT_DELAYED_WORK(&conn->auto_accept_work, hci_conn_auto_accept); in __hci_conn_add()
1027 INIT_DELAYED_WORK(&conn->idle_work, hci_conn_idle); in __hci_conn_add()
1028 INIT_DELAYED_WORK(&conn->le_conn_timeout, le_conn_timeout); in __hci_conn_add()
1030 atomic_set(&conn->refcnt, 0); in __hci_conn_add()
1036 /* The SCO and eSCO connections will only be notified when their in __hci_conn_add()
1040 if (conn->type != SCO_LINK && conn->type != ESCO_LINK) { in __hci_conn_add()
1041 if (hdev->notify) in __hci_conn_add()
1042 hdev->notify(hdev, HCI_NOTIFY_CONN_ADD); in __hci_conn_add()
1058 return ERR_PTR(-ECONNREFUSED); in hci_conn_add_unset()
1067 return ERR_PTR(-EINVAL); in hci_conn_add()
1077 /* Due to race, SCO/ISO conn might be not established yet at this point, in hci_conn_cleanup_child()
1081 switch (conn->type) { in hci_conn_cleanup_child()
1084 if (HCI_CONN_HANDLE_UNSET(conn->handle)) in hci_conn_cleanup_child()
1090 if ((conn->state != BT_CONNECTED && in hci_conn_cleanup_child()
1091 !test_bit(HCI_CONN_CREATE_CIS, &conn->flags)) || in hci_conn_cleanup_child()
1092 test_bit(HCI_CONN_BIG_CREATED, &conn->flags)) in hci_conn_cleanup_child()
1100 struct hci_dev *hdev = conn->hdev; in hci_conn_unlink()
1104 if (!conn->parent) { in hci_conn_unlink()
1107 list_for_each_entry_safe(link, t, &conn->link_list, list) { in hci_conn_unlink()
1108 struct hci_conn *child = link->conn; in hci_conn_unlink()
1117 if (!test_bit(HCI_UP, &hdev->flags)) in hci_conn_unlink()
1120 hci_conn_cleanup_child(child, conn->abort_reason); in hci_conn_unlink()
1126 if (!conn->link) in hci_conn_unlink()
1129 list_del_rcu(&conn->link->list); in hci_conn_unlink()
1132 hci_conn_drop(conn->parent); in hci_conn_unlink()
1133 hci_conn_put(conn->parent); in hci_conn_unlink()
1134 conn->parent = NULL; in hci_conn_unlink()
1136 kfree(conn->link); in hci_conn_unlink()
1137 conn->link = NULL; in hci_conn_unlink()
1142 struct hci_dev *hdev = conn->hdev; in hci_conn_del()
1144 BT_DBG("%s hcon %p handle %d", hdev->name, conn, conn->handle); in hci_conn_del()
1148 disable_delayed_work_sync(&conn->disc_work); in hci_conn_del()
1149 disable_delayed_work_sync(&conn->auto_accept_work); in hci_conn_del()
1150 disable_delayed_work_sync(&conn->idle_work); in hci_conn_del()
1159 * - In case there are no connection, or if restoring the buffers in hci_conn_del()
1162 * - Otherwise restore just the buffers considered in transit for the in hci_conn_del()
1165 switch (conn->type) { in hci_conn_del()
1168 hdev->acl_cnt + conn->sent > hdev->acl_pkts) in hci_conn_del()
1169 hdev->acl_cnt = hdev->acl_pkts; in hci_conn_del()
1171 hdev->acl_cnt += conn->sent; in hci_conn_del()
1174 cancel_delayed_work(&conn->le_conn_timeout); in hci_conn_del()
1176 if (hdev->le_pkts) { in hci_conn_del()
1178 hdev->le_cnt + conn->sent > hdev->le_pkts) in hci_conn_del()
1179 hdev->le_cnt = hdev->le_pkts; in hci_conn_del()
1181 hdev->le_cnt += conn->sent; in hci_conn_del()
1185 hdev->acl_cnt + conn->sent > hdev->acl_pkts) in hci_conn_del()
1186 hdev->acl_cnt = hdev->acl_pkts; in hci_conn_del()
1188 hdev->acl_cnt += conn->sent; in hci_conn_del()
1195 hdev->iso_cnt + conn->sent > hdev->iso_pkts) in hci_conn_del()
1196 hdev->iso_cnt = hdev->iso_pkts; in hci_conn_del()
1198 hdev->iso_cnt += conn->sent; in hci_conn_del()
1202 skb_queue_purge(&conn->data_q); in hci_conn_del()
1203 skb_queue_purge(&conn->tx_q.queue); in hci_conn_del()
1221 BT_DBG("%pMR -> %pMR", src, dst); in hci_get_route()
1226 if (!test_bit(HCI_UP, &d->flags) || in hci_get_route()
1230 /* Simple routing: in hci_get_route()
1231 * No source address - find interface with bdaddr != dst in hci_get_route()
1232 * Source address - find interface with bdaddr == src in hci_get_route()
1242 bacpy(&id_addr, &d->bdaddr); in hci_get_route()
1251 /* Convert from HCI to three-value type */ in hci_get_route()
1262 if (bacmp(&d->bdaddr, dst)) { in hci_get_route()
1276 /* This function requires the caller holds hdev->lock */
1279 struct hci_dev *hdev = conn->hdev; in hci_le_conn_failed()
1289 /* This function requires the caller holds hdev->lock */
1292 struct hci_dev *hdev = conn->hdev; in hci_conn_failed()
1296 switch (conn->type) { in hci_conn_failed()
1308 test_and_clear_bit(HCI_CONN_BIG_SYNC_FAILED, &conn->flags); in hci_conn_failed()
1309 test_and_clear_bit(HCI_CONN_PA_SYNC_FAILED, &conn->flags); in hci_conn_failed()
1311 conn->state = BT_CLOSED; in hci_conn_failed()
1316 /* This function requires the caller holds hdev->lock */
1319 struct hci_dev *hdev = conn->hdev; in hci_conn_set_handle()
1323 if (conn->handle == handle) in hci_conn_set_handle()
1335 if (conn->abort_reason) in hci_conn_set_handle()
1336 return conn->abort_reason; in hci_conn_set_handle()
1338 if (HCI_CONN_HANDLE_UNSET(conn->handle)) in hci_conn_set_handle()
1339 ida_free(&hdev->unset_handle_ida, conn->handle); in hci_conn_set_handle()
1341 conn->handle = handle; in hci_conn_set_handle()
1357 return ERR_PTR(-ECONNREFUSED); in hci_connect_le()
1359 return ERR_PTR(-EOPNOTSUPP); in hci_connect_le()
1363 * time, we return -EBUSY if there is any connection attempt running. in hci_connect_le()
1366 return ERR_PTR(-EBUSY); in hci_connect_le()
1374 if (conn && !test_bit(HCI_CONN_SCANNING, &conn->flags)) { in hci_connect_le()
1375 return ERR_PTR(-EBUSY); in hci_connect_le()
1392 if (irk && bacmp(&irk->rpa, BDADDR_ANY)) { in hci_connect_le()
1393 dst = &irk->rpa; in hci_connect_le()
1399 bacpy(&conn->dst, dst); in hci_connect_le()
1405 conn->pending_sec_level = sec_level; in hci_connect_le()
1408 conn->dst_type = dst_type; in hci_connect_le()
1409 conn->sec_level = BT_SECURITY_LOW; in hci_connect_le()
1410 conn->conn_timeout = conn_timeout; in hci_connect_le()
1411 conn->le_adv_phy = phy; in hci_connect_le()
1412 conn->le_adv_sec_phy = sec_phy; in hci_connect_le()
1431 if (conn->state != BT_CONNECTED) in is_connected()
1437 /* This function requires the caller holds hdev->lock */
1444 return -EISCONN; in hci_explicit_conn_params_set()
1450 return -ENOMEM; in hci_explicit_conn_params_set()
1456 params->auto_connect = HCI_AUTO_CONN_EXPLICIT; in hci_explicit_conn_params_set()
1460 if (params->auto_connect == HCI_AUTO_CONN_DISABLED || in hci_explicit_conn_params_set()
1461 params->auto_connect == HCI_AUTO_CONN_REPORT || in hci_explicit_conn_params_set()
1462 params->auto_connect == HCI_AUTO_CONN_EXPLICIT) { in hci_explicit_conn_params_set()
1464 hci_pend_le_list_add(params, &hdev->pend_le_conns); in hci_explicit_conn_params_set()
1467 params->explicit_connect = true; in hci_explicit_conn_params_set()
1470 params->auto_connect); in hci_explicit_conn_params_set()
1481 if (qos->bcast.big == BT_ISO_QOS_BIG_UNSET) { in qos_set_big()
1490 return -EADDRNOTAVAIL; in qos_set_big()
1493 qos->bcast.big = big; in qos_set_big()
1505 if (qos->bcast.bis == BT_ISO_QOS_BIS_UNSET) { in qos_set_bis()
1506 if (qos->bcast.big != BT_ISO_QOS_BIG_UNSET) { in qos_set_bis()
1507 conn = hci_conn_hash_lookup_big(hdev, qos->bcast.big); in qos_set_bis()
1513 qos->bcast.bis = conn->iso_qos.bcast.bis; in qos_set_bis()
1521 for (bis = 0x01; bis < hdev->le_num_of_adv_sets; in qos_set_bis()
1529 if (bis == hdev->le_num_of_adv_sets) in qos_set_bis()
1530 return -EADDRNOTAVAIL; in qos_set_bis()
1533 qos->bcast.bis = bis; in qos_set_bis()
1539 /* This function requires the caller holds hdev->lock */
1550 return ERR_PTR(-ECONNREFUSED); in hci_add_bis()
1551 return ERR_PTR(-EOPNOTSUPP); in hci_add_bis()
1563 conn = hci_conn_hash_lookup_per_adv_bis(hdev, dst, qos->bcast.big, in hci_add_bis()
1564 qos->bcast.big); in hci_add_bis()
1566 return ERR_PTR(-EADDRINUSE); in hci_add_bis()
1571 conn = hci_conn_hash_lookup_big(hdev, qos->bcast.big); in hci_add_bis()
1573 if (conn && (memcmp(qos, &conn->iso_qos, sizeof(*qos)) || in hci_add_bis()
1574 base_len != conn->le_per_adv_data_len || in hci_add_bis()
1575 memcmp(conn->le_per_adv_data, base, base_len))) in hci_add_bis()
1576 return ERR_PTR(-EADDRINUSE); in hci_add_bis()
1582 conn->state = BT_CONNECT; in hci_add_bis()
1583 conn->sid = sid; in hci_add_bis()
1584 conn->conn_timeout = timeout; in hci_add_bis()
1590 /* This function requires the caller holds hdev->lock */
1601 return ERR_PTR(-ECONNREFUSED); in hci_connect_le_scan()
1603 return ERR_PTR(-EOPNOTSUPP); in hci_connect_le_scan()
1607 * established. To be able to handle these ATT messages, the user- in hci_connect_le_scan()
1617 if (conn->pending_sec_level < sec_level) in hci_connect_le_scan()
1618 conn->pending_sec_level = sec_level; in hci_connect_le_scan()
1630 return ERR_PTR(-EBUSY); in hci_connect_le_scan()
1633 conn->state = BT_CONNECT; in hci_connect_le_scan()
1634 set_bit(HCI_CONN_SCANNING, &conn->flags); in hci_connect_le_scan()
1635 conn->dst_type = dst_type; in hci_connect_le_scan()
1636 conn->sec_level = BT_SECURITY_LOW; in hci_connect_le_scan()
1637 conn->pending_sec_level = sec_level; in hci_connect_le_scan()
1638 conn->conn_timeout = conn_timeout; in hci_connect_le_scan()
1639 conn->conn_reason = conn_reason; in hci_connect_le_scan()
1656 return ERR_PTR(-ECONNREFUSED); in hci_connect_acl()
1658 return ERR_PTR(-EOPNOTSUPP); in hci_connect_acl()
1662 * CVE-2020-26555 in hci_connect_acl()
1664 if (!bacmp(&hdev->bdaddr, dst)) { in hci_connect_acl()
1667 return ERR_PTR(-ECONNREFUSED); in hci_connect_acl()
1679 acl->conn_reason = conn_reason; in hci_connect_acl()
1680 if (acl->state == BT_OPEN || acl->state == BT_CLOSED) { in hci_connect_acl()
1683 acl->sec_level = BT_SECURITY_LOW; in hci_connect_acl()
1684 acl->pending_sec_level = sec_level; in hci_connect_acl()
1685 acl->auth_type = auth_type; in hci_connect_acl()
1686 acl->conn_timeout = timeout; in hci_connect_acl()
1701 struct hci_dev *hdev = parent->hdev; in hci_conn_link()
1706 if (conn->link) in hci_conn_link()
1707 return conn->link; in hci_conn_link()
1709 if (conn->parent) in hci_conn_link()
1716 link->conn = hci_conn_hold(conn); in hci_conn_link()
1717 conn->link = link; in hci_conn_link()
1718 conn->parent = hci_conn_get(parent); in hci_conn_link()
1721 list_add_tail_rcu(&link->list, &parent->link_list); in hci_conn_link()
1731 struct hci_conn *sco; in hci_connect_sco() local
1739 sco = hci_conn_hash_lookup_ba(hdev, type, dst); in hci_connect_sco()
1740 if (!sco) { in hci_connect_sco()
1741 sco = hci_conn_add_unset(hdev, type, dst, HCI_ROLE_MASTER); in hci_connect_sco()
1742 if (IS_ERR(sco)) { in hci_connect_sco()
1744 return sco; in hci_connect_sco()
1748 link = hci_conn_link(acl, sco); in hci_connect_sco()
1751 hci_conn_drop(sco); in hci_connect_sco()
1752 return ERR_PTR(-ENOLINK); in hci_connect_sco()
1755 sco->setting = setting; in hci_connect_sco()
1756 sco->codec = *codec; in hci_connect_sco()
1758 if (acl->state == BT_CONNECTED && in hci_connect_sco()
1759 (sco->state == BT_OPEN || sco->state == BT_CLOSED)) { in hci_connect_sco()
1760 set_bit(HCI_CONN_POWER_SAVE, &acl->flags); in hci_connect_sco()
1763 if (test_bit(HCI_CONN_MODE_CHANGE_PEND, &acl->flags)) { in hci_connect_sco()
1764 /* defer SCO setup until mode change completed */ in hci_connect_sco()
1765 set_bit(HCI_CONN_SCO_SETUP_PEND, &acl->flags); in hci_connect_sco()
1766 return sco; in hci_connect_sco()
1772 return sco; in hci_connect_sco()
1777 struct hci_dev *hdev = conn->hdev; in hci_le_create_big()
1783 data.big = qos->bcast.big; in hci_le_create_big()
1784 data.bis = qos->bcast.bis; in hci_le_create_big()
1791 cp.handle = qos->bcast.big; in hci_le_create_big()
1792 cp.adv_handle = qos->bcast.bis; in hci_le_create_big()
1794 hci_cpu_to_le24(qos->bcast.out.interval, cp.bis.sdu_interval); in hci_le_create_big()
1795 cp.bis.sdu = cpu_to_le16(qos->bcast.out.sdu); in hci_le_create_big()
1796 cp.bis.latency = cpu_to_le16(qos->bcast.out.latency); in hci_le_create_big()
1797 cp.bis.rtn = qos->bcast.out.rtn; in hci_le_create_big()
1798 cp.bis.phy = qos->bcast.out.phy; in hci_le_create_big()
1799 cp.bis.packing = qos->bcast.packing; in hci_le_create_big()
1800 cp.bis.framing = qos->bcast.framing; in hci_le_create_big()
1801 cp.bis.encryption = qos->bcast.encryption; in hci_le_create_big()
1802 memcpy(cp.bis.bcode, qos->bcast.bcode, sizeof(cp.bis.bcode)); in hci_le_create_big()
1820 qos = &conn->iso_qos; in set_cig_params_sync()
1821 pdu->cig_id = cig_id; in set_cig_params_sync()
1822 hci_cpu_to_le24(qos->ucast.out.interval, pdu->c_interval); in set_cig_params_sync()
1823 hci_cpu_to_le24(qos->ucast.in.interval, pdu->p_interval); in set_cig_params_sync()
1824 pdu->sca = qos->ucast.sca; in set_cig_params_sync()
1825 pdu->packing = qos->ucast.packing; in set_cig_params_sync()
1826 pdu->framing = qos->ucast.framing; in set_cig_params_sync()
1827 pdu->c_latency = cpu_to_le16(qos->ucast.out.latency); in set_cig_params_sync()
1828 pdu->p_latency = cpu_to_le16(qos->ucast.in.latency); in set_cig_params_sync()
1835 aux_num_cis < pdu->num_cis; cis_id++) { in set_cig_params_sync()
1842 qos = &conn->iso_qos; in set_cig_params_sync()
1844 cis = &pdu->cis[aux_num_cis++]; in set_cig_params_sync()
1845 cis->cis_id = cis_id; in set_cig_params_sync()
1846 cis->c_sdu = cpu_to_le16(conn->iso_qos.ucast.out.sdu); in set_cig_params_sync()
1847 cis->p_sdu = cpu_to_le16(conn->iso_qos.ucast.in.sdu); in set_cig_params_sync()
1848 cis->c_phy = qos->ucast.out.phy ? qos->ucast.out.phy : in set_cig_params_sync()
1849 qos->ucast.in.phy; in set_cig_params_sync()
1850 cis->p_phy = qos->ucast.in.phy ? qos->ucast.in.phy : in set_cig_params_sync()
1851 qos->ucast.out.phy; in set_cig_params_sync()
1852 cis->c_rtn = qos->ucast.out.rtn; in set_cig_params_sync()
1853 cis->p_rtn = qos->ucast.in.rtn; in set_cig_params_sync()
1855 pdu->num_cis = aux_num_cis; in set_cig_params_sync()
1857 if (!pdu->num_cis) in set_cig_params_sync()
1861 struct_size(pdu, cis, pdu->num_cis), in set_cig_params_sync()
1867 struct hci_dev *hdev = conn->hdev; in hci_le_set_cig_params()
1873 if (qos->ucast.cig == BT_ISO_QOS_CIG_UNSET) { in hci_le_set_cig_params()
1892 qos->ucast.cig = data.cig; in hci_le_set_cig_params()
1895 if (qos->ucast.cis != BT_ISO_QOS_CIS_UNSET) { in hci_le_set_cig_params()
1896 if (hci_conn_hash_lookup_cis(hdev, NULL, 0, qos->ucast.cig, in hci_le_set_cig_params()
1897 qos->ucast.cis)) in hci_le_set_cig_params()
1903 for (data.cig = qos->ucast.cig, data.cis = 0x00; data.cis < 0xf0; in hci_le_set_cig_params()
1908 qos->ucast.cis = data.cis; in hci_le_set_cig_params()
1913 if (qos->ucast.cis == BT_ISO_QOS_CIS_UNSET) in hci_le_set_cig_params()
1918 UINT_PTR(qos->ucast.cig), NULL) < 0) in hci_le_set_cig_params()
1930 cis = hci_conn_hash_lookup_cis(hdev, dst, dst_type, qos->ucast.cig, in hci_bind_cis()
1931 qos->ucast.cis); in hci_bind_cis()
1937 cis->cleanup = cis_cleanup; in hci_bind_cis()
1938 cis->dst_type = dst_type; in hci_bind_cis()
1939 cis->iso_qos.ucast.cig = BT_ISO_QOS_CIG_UNSET; in hci_bind_cis()
1940 cis->iso_qos.ucast.cis = BT_ISO_QOS_CIS_UNSET; in hci_bind_cis()
1941 cis->conn_timeout = timeout; in hci_bind_cis()
1944 if (cis->state == BT_CONNECTED) in hci_bind_cis()
1948 if (cis->state == BT_BOUND && in hci_bind_cis()
1949 !memcmp(&cis->iso_qos, qos, sizeof(*qos))) in hci_bind_cis()
1953 cis->le_tx_phy = qos->ucast.out.phy; in hci_bind_cis()
1954 cis->le_rx_phy = qos->ucast.in.phy; in hci_bind_cis()
1959 if (!qos->ucast.out.interval) in hci_bind_cis()
1960 qos->ucast.out.interval = qos->ucast.in.interval; in hci_bind_cis()
1965 if (!qos->ucast.in.interval) in hci_bind_cis()
1966 qos->ucast.in.interval = qos->ucast.out.interval; in hci_bind_cis()
1971 if (!qos->ucast.out.latency) in hci_bind_cis()
1972 qos->ucast.out.latency = qos->ucast.in.latency; in hci_bind_cis()
1977 if (!qos->ucast.in.latency) in hci_bind_cis()
1978 qos->ucast.in.latency = qos->ucast.out.latency; in hci_bind_cis()
1982 return ERR_PTR(-EINVAL); in hci_bind_cis()
1987 cis->iso_qos = *qos; in hci_bind_cis()
1988 cis->state = BT_BOUND; in hci_bind_cis()
1995 struct hci_dev *hdev = conn->hdev; in hci_iso_setup_path()
2000 if (conn->iso_qos.ucast.out.sdu) { in hci_iso_setup_path()
2001 cmd.handle = cpu_to_le16(conn->handle); in hci_iso_setup_path()
2011 if (conn->iso_qos.ucast.in.sdu) { in hci_iso_setup_path()
2012 cmd.handle = cpu_to_le16(conn->handle); in hci_iso_setup_path()
2027 if (conn->type != CIS_LINK) in hci_conn_check_create_cis()
2028 return -EINVAL; in hci_conn_check_create_cis()
2030 if (!conn->parent || conn->parent->state != BT_CONNECTED || in hci_conn_check_create_cis()
2031 conn->state != BT_CONNECT || HCI_CONN_HANDLE_UNSET(conn->handle)) in hci_conn_check_create_cis()
2049 list_for_each_entry_rcu(conn, &hdev->conn_hash.list, list) { in hci_le_create_cis_pending()
2050 if (test_bit(HCI_CONN_CREATE_CIS, &conn->flags)) { in hci_le_create_cis_pending()
2052 return -EBUSY; in hci_le_create_cis_pending()
2072 if (!qos->sdu && qos->phy) in hci_iso_qos_setup()
2073 qos->sdu = conn->mtu; in hci_iso_qos_setup()
2076 if (qos->phy == BT_ISO_PHY_ANY) in hci_iso_qos_setup()
2077 qos->phy = phy; in hci_iso_qos_setup()
2080 if (!qos->interval) in hci_iso_qos_setup()
2082 qos->interval = conn->le_conn_interval * 1250; in hci_iso_qos_setup()
2085 if (!qos->latency) in hci_iso_qos_setup()
2086 qos->latency = conn->le_conn_latency; in hci_iso_qos_setup()
2092 struct bt_iso_qos *qos = &conn->iso_qos; in create_big_sync()
2097 if (qos->bcast.out.phy == 0x02) in create_big_sync()
2101 interval = (qos->bcast.out.interval / 1250) * qos->bcast.sync_factor; in create_big_sync()
2103 if (qos->bcast.bis) in create_big_sync()
2106 err = hci_start_per_adv_sync(hdev, qos->bcast.bis, conn->sid, in create_big_sync()
2107 conn->le_per_adv_data_len, in create_big_sync()
2108 conn->le_per_adv_data, flags, interval, in create_big_sync()
2113 return hci_le_create_big(conn, &conn->iso_qos); in create_big_sync()
2128 conn->iso_qos = *qos; in hci_pa_create_sync()
2129 conn->dst_type = dst_type; in hci_pa_create_sync()
2130 conn->sid = sid; in hci_pa_create_sync()
2131 conn->state = BT_LISTEN; in hci_pa_create_sync()
2132 conn->conn_timeout = msecs_to_jiffies(qos->bcast.sync_timeout * 10); in hci_pa_create_sync()
2148 return -EINVAL; in hci_conn_big_create_sync()
2156 hcon->iso_qos = *qos; in hci_conn_big_create_sync()
2158 hcon->num_bis = num_bis; in hci_conn_big_create_sync()
2159 memcpy(hcon->bis, bis, num_bis); in hci_conn_big_create_sync()
2160 hcon->conn_timeout = msecs_to_jiffies(qos->bcast.timeout * 10); in hci_conn_big_create_sync()
2189 conn = hci_conn_hash_lookup_big_state(hdev, qos->bcast.big, BT_OPEN, in hci_bind_bis()
2192 memcpy(qos, &conn->iso_qos, sizeof(*qos)); in hci_bind_bis()
2193 conn->state = BT_CONNECTED; in hci_bind_bis()
2207 conn->le_tx_phy = qos->bcast.out.phy; in hci_bind_bis()
2208 conn->le_tx_phy = qos->bcast.out.phy; in hci_bind_bis()
2212 memcpy(conn->le_per_adv_data, eir, sizeof(eir)); in hci_bind_bis()
2213 conn->le_per_adv_data_len = base_len; in hci_bind_bis()
2216 hci_iso_qos_setup(hdev, conn, &qos->bcast.out, in hci_bind_bis()
2217 conn->le_tx_phy ? conn->le_tx_phy : in hci_bind_bis()
2218 hdev->le_tx_def_phys); in hci_bind_bis()
2220 conn->iso_qos = *qos; in hci_bind_bis()
2221 conn->state = BT_BOUND; in hci_bind_bis()
2225 conn->iso_qos.bcast.big); in hci_bind_bis()
2230 return ERR_PTR(-ENOLINK); in hci_bind_bis()
2241 if (bacmp(&conn->dst, BDADDR_ANY)) in bis_mark_per_adv()
2244 if (d->big != conn->iso_qos.bcast.big || in bis_mark_per_adv()
2245 d->bis == BT_ISO_QOS_BIS_UNSET || in bis_mark_per_adv()
2246 d->bis != conn->iso_qos.bcast.bis) in bis_mark_per_adv()
2249 set_bit(HCI_CONN_PER_ADV, &conn->flags); in bis_mark_per_adv()
2265 if (conn->state == BT_CONNECTED) in hci_connect_bis()
2271 if (conn->sid == HCI_SID_INVALID) { in hci_connect_bis()
2276 conn->sid = sid; in hci_connect_bis()
2282 data.big = qos->bcast.big; in hci_connect_bis()
2283 data.bis = qos->bcast.bis; in hci_connect_bis()
2324 hci_iso_qos_setup(hdev, le, &qos->ucast.out, in hci_connect_cis()
2325 le->le_tx_phy ? le->le_tx_phy : hdev->le_tx_def_phys); in hci_connect_cis()
2326 hci_iso_qos_setup(hdev, le, &qos->ucast.in, in hci_connect_cis()
2327 le->le_rx_phy ? le->le_rx_phy : hdev->le_rx_def_phys); in hci_connect_cis()
2339 return ERR_PTR(-ENOLINK); in hci_connect_cis()
2342 cis->state = BT_CONNECT; in hci_connect_cis()
2355 * Connections is used and the link is encrypted with AES-CCM in hci_conn_check_link_mode()
2356 * using a P-256 authenticated combination key. in hci_conn_check_link_mode()
2358 if (hci_dev_test_flag(conn->hdev, HCI_SC_ONLY)) { in hci_conn_check_link_mode()
2360 !test_bit(HCI_CONN_AES_CCM, &conn->flags) || in hci_conn_check_link_mode()
2361 conn->key_type != HCI_LK_AUTH_COMBINATION_P256) in hci_conn_check_link_mode()
2370 * 128-bit equivalent strength for link and encryption keys in hci_conn_check_link_mode()
2372 * SAFER+ not allowed, and P-192 not allowed; encryption key in hci_conn_check_link_mode()
2375 if (conn->sec_level == BT_SECURITY_FIPS && in hci_conn_check_link_mode()
2376 !test_bit(HCI_CONN_AES_CCM, &conn->flags)) { in hci_conn_check_link_mode()
2377 bt_dev_err(conn->hdev, in hci_conn_check_link_mode()
2378 "Invalid security: Missing AES-CCM usage"); in hci_conn_check_link_mode()
2383 !test_bit(HCI_CONN_ENCRYPT, &conn->flags)) in hci_conn_check_link_mode()
2394 if (conn->pending_sec_level > sec_level) in hci_conn_auth()
2395 sec_level = conn->pending_sec_level; in hci_conn_auth()
2397 if (sec_level > conn->sec_level) in hci_conn_auth()
2398 conn->pending_sec_level = sec_level; in hci_conn_auth()
2399 else if (test_bit(HCI_CONN_AUTH, &conn->flags)) in hci_conn_auth()
2403 auth_type |= (conn->auth_type & 0x01); in hci_conn_auth()
2405 conn->auth_type = auth_type; in hci_conn_auth()
2407 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) { in hci_conn_auth()
2410 cp.handle = cpu_to_le16(conn->handle); in hci_conn_auth()
2411 hci_send_cmd(conn->hdev, HCI_OP_AUTH_REQUESTED, in hci_conn_auth()
2417 if (!test_bit(HCI_CONN_ENCRYPT, &conn->flags)) in hci_conn_auth()
2418 set_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags); in hci_conn_auth()
2429 if (!test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags)) { in hci_conn_encrypt()
2431 cp.handle = cpu_to_le16(conn->handle); in hci_conn_encrypt()
2433 hci_send_cmd(conn->hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp), in hci_conn_encrypt()
2444 if (conn->type == LE_LINK) in hci_conn_security()
2457 if (!test_bit(HCI_CONN_AUTH, &conn->flags)) in hci_conn_security()
2460 switch (conn->key_type) { in hci_conn_security()
2489 if (sec_level <= BT_SECURITY_MEDIUM || conn->pin_length == 16) in hci_conn_security()
2497 if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags)) in hci_conn_security()
2501 set_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags); in hci_conn_security()
2507 if (test_bit(HCI_CONN_ENCRYPT, &conn->flags)) { in hci_conn_security()
2511 if (!conn->enc_key_size) in hci_conn_security()
2528 /* Accept if non-secure or higher security level is required */ in hci_conn_check_secure()
2533 if (conn->sec_level == BT_SECURITY_HIGH || in hci_conn_check_secure()
2534 conn->sec_level == BT_SECURITY_FIPS) in hci_conn_check_secure()
2547 if (role == conn->role) in hci_conn_switch_role()
2550 if (!test_and_set_bit(HCI_CONN_RSWITCH_PEND, &conn->flags)) { in hci_conn_switch_role()
2552 bacpy(&cp.bdaddr, &conn->dst); in hci_conn_switch_role()
2554 hci_send_cmd(conn->hdev, HCI_OP_SWITCH_ROLE, sizeof(cp), &cp); in hci_conn_switch_role()
2564 struct hci_dev *hdev = conn->hdev; in hci_conn_enter_active_mode()
2566 BT_DBG("hcon %p mode %d", conn, conn->mode); in hci_conn_enter_active_mode()
2568 if (conn->mode != HCI_CM_SNIFF) in hci_conn_enter_active_mode()
2571 if (!test_bit(HCI_CONN_POWER_SAVE, &conn->flags) && !force_active) in hci_conn_enter_active_mode()
2574 if (!test_and_set_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags)) { in hci_conn_enter_active_mode()
2576 cp.handle = cpu_to_le16(conn->handle); in hci_conn_enter_active_mode()
2581 if (hdev->idle_timeout > 0) in hci_conn_enter_active_mode()
2582 queue_delayed_work(hdev->workqueue, &conn->idle_work, in hci_conn_enter_active_mode()
2583 msecs_to_jiffies(hdev->idle_timeout)); in hci_conn_enter_active_mode()
2589 struct list_head *head = &hdev->conn_hash.list; in hci_conn_hash_flush()
2592 BT_DBG("hdev %s", hdev->name); in hci_conn_hash_flush()
2601 conn->state = BT_CLOSED; in hci_conn_hash_flush()
2611 if (conn->role == HCI_ROLE_MASTER) in get_link_mode()
2614 if (test_bit(HCI_CONN_ENCRYPT, &conn->flags)) in get_link_mode()
2617 if (test_bit(HCI_CONN_AUTH, &conn->flags)) in get_link_mode()
2620 if (test_bit(HCI_CONN_SECURE, &conn->flags)) in get_link_mode()
2623 if (test_bit(HCI_CONN_FIPS, &conn->flags)) in get_link_mode()
2638 return -EFAULT; in hci_get_conn_list()
2641 return -EINVAL; in hci_get_conn_list()
2647 return -ENOMEM; in hci_get_conn_list()
2652 return -ENODEV; in hci_get_conn_list()
2655 ci = cl->conn_info; in hci_get_conn_list()
2658 list_for_each_entry(c, &hdev->conn_hash.list, list) { in hci_get_conn_list()
2659 bacpy(&(ci + n)->bdaddr, &c->dst); in hci_get_conn_list()
2660 (ci + n)->handle = c->handle; in hci_get_conn_list()
2661 (ci + n)->type = c->type; in hci_get_conn_list()
2662 (ci + n)->out = c->out; in hci_get_conn_list()
2663 (ci + n)->state = c->state; in hci_get_conn_list()
2664 (ci + n)->link_mode = get_link_mode(c); in hci_get_conn_list()
2670 cl->dev_id = hdev->id; in hci_get_conn_list()
2671 cl->conn_num = n; in hci_get_conn_list()
2679 return err ? -EFAULT : 0; in hci_get_conn_list()
2690 return -EFAULT; in hci_get_conn_info()
2695 bacpy(&ci.bdaddr, &conn->dst); in hci_get_conn_info()
2696 ci.handle = conn->handle; in hci_get_conn_info()
2697 ci.type = conn->type; in hci_get_conn_info()
2698 ci.out = conn->out; in hci_get_conn_info()
2699 ci.state = conn->state; in hci_get_conn_info()
2705 return -ENOENT; in hci_get_conn_info()
2707 return copy_to_user(ptr, &ci, sizeof(ci)) ? -EFAULT : 0; in hci_get_conn_info()
2716 return -EFAULT; in hci_get_auth_info()
2721 req.type = conn->auth_type; in hci_get_auth_info()
2725 return -ENOENT; in hci_get_auth_info()
2727 return copy_to_user(arg, &req, sizeof(req)) ? -EFAULT : 0; in hci_get_auth_info()
2732 struct hci_dev *hdev = conn->hdev; in hci_chan_create()
2735 BT_DBG("%s hcon %p", hdev->name, conn); in hci_chan_create()
2737 if (test_bit(HCI_CONN_DROP, &conn->flags)) { in hci_chan_create()
2746 chan->conn = hci_conn_get(conn); in hci_chan_create()
2747 skb_queue_head_init(&chan->data_q); in hci_chan_create()
2748 chan->state = BT_CONNECTED; in hci_chan_create()
2750 list_add_rcu(&chan->list, &conn->chan_list); in hci_chan_create()
2757 struct hci_conn *conn = chan->conn; in hci_chan_del()
2758 struct hci_dev *hdev = conn->hdev; in hci_chan_del()
2760 BT_DBG("%s hcon %p chan %p", hdev->name, conn, chan); in hci_chan_del()
2762 list_del_rcu(&chan->list); in hci_chan_del()
2767 set_bit(HCI_CONN_DROP, &conn->flags); in hci_chan_del()
2771 skb_queue_purge(&chan->data_q); in hci_chan_del()
2781 list_for_each_entry_safe(chan, n, &conn->chan_list, list) in hci_chan_list_flush()
2790 list_for_each_entry(hchan, &hcon->chan_list, list) { in __hci_chan_lookup_handle()
2791 if (hchan->handle == handle) in __hci_chan_lookup_handle()
2800 struct hci_conn_hash *h = &hdev->conn_hash; in hci_chan_lookup_handle()
2806 list_for_each_entry_rcu(hcon, &h->list, list) { in hci_chan_lookup_handle()
2825 switch (conn->type) { in hci_conn_get_phy()
2827 /* SCO logical transport (1 Mb/s): in hci_conn_get_phy()
2840 if (conn->pkt_type & (HCI_DM3 | HCI_DH3)) in hci_conn_get_phy()
2843 if (conn->pkt_type & (HCI_DM5 | HCI_DH5)) in hci_conn_get_phy()
2847 * 2-DH1, 2-DH3 and 2-DH5. in hci_conn_get_phy()
2849 if (!(conn->pkt_type & HCI_2DH1)) in hci_conn_get_phy()
2852 if (!(conn->pkt_type & HCI_2DH3)) in hci_conn_get_phy()
2855 if (!(conn->pkt_type & HCI_2DH5)) in hci_conn_get_phy()
2859 * 3-DH1, 3-DH3 and 3-DH5. in hci_conn_get_phy()
2861 if (!(conn->pkt_type & HCI_3DH1)) in hci_conn_get_phy()
2864 if (!(conn->pkt_type & HCI_3DH3)) in hci_conn_get_phy()
2867 if (!(conn->pkt_type & HCI_3DH5)) in hci_conn_get_phy()
2876 if (!(conn->pkt_type & (ESCO_EV4 | ESCO_EV5))) in hci_conn_get_phy()
2879 /* eSCO logical transport (2 Mb/s): 2-EV3, 2-EV5 */ in hci_conn_get_phy()
2880 if (!(conn->pkt_type & ESCO_2EV3)) in hci_conn_get_phy()
2883 if (!(conn->pkt_type & ESCO_2EV5)) in hci_conn_get_phy()
2886 /* eSCO logical transport (3 Mb/s): 3-EV3, 3-EV5 */ in hci_conn_get_phy()
2887 if (!(conn->pkt_type & ESCO_3EV3)) in hci_conn_get_phy()
2890 if (!(conn->pkt_type & ESCO_3EV5)) in hci_conn_get_phy()
2896 if (conn->le_tx_phy & HCI_LE_SET_PHY_1M) in hci_conn_get_phy()
2899 if (conn->le_rx_phy & HCI_LE_SET_PHY_1M) in hci_conn_get_phy()
2902 if (conn->le_tx_phy & HCI_LE_SET_PHY_2M) in hci_conn_get_phy()
2905 if (conn->le_rx_phy & HCI_LE_SET_PHY_2M) in hci_conn_get_phy()
2908 if (conn->le_tx_phy & HCI_LE_SET_PHY_CODED) in hci_conn_get_phy()
2911 if (conn->le_rx_phy & HCI_LE_SET_PHY_CODED) in hci_conn_get_phy()
2925 return -ECANCELED; in abort_conn_sync()
2927 return hci_abort_conn_sync(hdev, conn, conn->abort_reason); in abort_conn_sync()
2932 struct hci_dev *hdev = conn->hdev; in hci_abort_conn()
2937 if (conn->abort_reason) in hci_abort_conn()
2940 bt_dev_dbg(hdev, "handle 0x%2.2x reason 0x%2.2x", conn->handle, reason); in hci_abort_conn()
2942 conn->abort_reason = reason; in hci_abort_conn()
2951 if (conn->state == BT_CONNECT && hdev->req_status == HCI_REQ_PEND) { in hci_abort_conn()
2952 switch (hci_skb_event(hdev->sent_cmd)) { in hci_abort_conn()
2975 struct sock *sk = skb ? skb->sk : NULL; in hci_setup_tx_timestamp()
2990 sock_tx_timestamp(sk, sockc, &skb_shinfo(skb)->tx_flags); in hci_setup_tx_timestamp()
2992 if (sk->sk_type == SOCK_STREAM) in hci_setup_tx_timestamp()
2993 key = atomic_add_return(key_offset, &sk->sk_tskey); in hci_setup_tx_timestamp()
2995 if (sockc->tsflags & SOF_TIMESTAMPING_OPT_ID && in hci_setup_tx_timestamp()
2996 sockc->tsflags & SOF_TIMESTAMPING_TX_RECORD_MASK) { in hci_setup_tx_timestamp()
2997 if (sockc->tsflags & SOCKCM_FLAG_TS_OPT_ID) { in hci_setup_tx_timestamp()
2998 skb_shinfo(skb)->tskey = sockc->ts_opt_id; in hci_setup_tx_timestamp()
3000 if (sk->sk_type != SOCK_STREAM) in hci_setup_tx_timestamp()
3001 key = atomic_inc_return(&sk->sk_tskey); in hci_setup_tx_timestamp()
3002 skb_shinfo(skb)->tskey = key - 1; in hci_setup_tx_timestamp()
3009 struct tx_queue *comp = &conn->tx_q; in hci_conn_tx_queue()
3013 if (skb_shinfo(skb)->tx_flags & SKBTX_SW_TSTAMP) in hci_conn_tx_queue()
3014 __skb_tstamp_tx(skb, NULL, NULL, skb->sk, SCM_TSTAMP_SND); in hci_conn_tx_queue()
3019 * TODO: SCO support without flowctl (needs to be done in drivers) in hci_conn_tx_queue()
3021 switch (conn->type) { in hci_conn_tx_queue()
3030 if (!hci_dev_test_flag(conn->hdev, HCI_SCO_FLOWCTL)) in hci_conn_tx_queue()
3037 if (skb->sk && (skb_shinfo(skb)->tx_flags & SKBTX_COMPLETION_TSTAMP)) in hci_conn_tx_queue()
3041 if (!track && !comp->tracked) { in hci_conn_tx_queue()
3042 comp->extra++; in hci_conn_tx_queue()
3051 comp->tracked++; in hci_conn_tx_queue()
3058 skb_queue_tail(&comp->queue, skb); in hci_conn_tx_queue()
3065 comp->tracked = 0; in hci_conn_tx_queue()
3066 comp->extra += skb_queue_len(&comp->queue) + 1; in hci_conn_tx_queue()
3067 skb_queue_purge(&comp->queue); in hci_conn_tx_queue()
3072 struct tx_queue *comp = &conn->tx_q; in hci_conn_tx_dequeue()
3079 if (comp->extra && (comp->tracked || skb_queue_empty(&comp->queue))) { in hci_conn_tx_dequeue()
3080 comp->extra--; in hci_conn_tx_dequeue()
3084 skb = skb_dequeue(&comp->queue); in hci_conn_tx_dequeue()
3088 if (skb->sk) { in hci_conn_tx_dequeue()
3089 comp->tracked--; in hci_conn_tx_dequeue()
3090 __skb_tstamp_tx(skb, NULL, NULL, skb->sk, in hci_conn_tx_dequeue()
3099 if (conn->type == ACL_LINK) { in hci_conn_key_enc_size()
3102 key = hci_find_link_key(conn->hdev, &conn->dst); in hci_conn_key_enc_size()
3106 return &key->pin_len; in hci_conn_key_enc_size()
3107 } else if (conn->type == LE_LINK) { in hci_conn_key_enc_size()
3110 ltk = hci_find_ltk(conn->hdev, &conn->dst, conn->dst_type, in hci_conn_key_enc_size()
3111 conn->role); in hci_conn_key_enc_size()
3115 return <k->enc_size; in hci_conn_key_enc_size()
3128 return -ENODEV; in hci_ethtool_ts_info()
3130 info->so_timestamping = in hci_ethtool_ts_info()
3133 info->phc_index = -1; in hci_ethtool_ts_info()
3134 info->tx_types = BIT(HWTSTAMP_TX_OFF); in hci_ethtool_ts_info()
3135 info->rx_filters = BIT(HWTSTAMP_FILTER_NONE); in hci_ethtool_ts_info()
3140 info->so_timestamping |= SOF_TIMESTAMPING_TX_SOFTWARE; in hci_ethtool_ts_info()
3141 info->so_timestamping |= SOF_TIMESTAMPING_TX_COMPLETION; in hci_ethtool_ts_info()
3144 info->so_timestamping |= SOF_TIMESTAMPING_TX_SOFTWARE; in hci_ethtool_ts_info()
3146 info->so_timestamping |= SOF_TIMESTAMPING_TX_COMPLETION; in hci_ethtool_ts_info()