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.
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()
110 mgmt_connect_failed(hdev, &conn->dst, conn->type, in hci_connect_le_scan_cleanup()
111 conn->dst_type, status); in hci_connect_le_scan_cleanup()
118 params->explicit_connect = false; in hci_connect_le_scan_cleanup()
122 switch (params->auto_connect) { in hci_connect_le_scan_cleanup()
129 hci_pend_le_list_add(params, &hdev->pend_le_conns); in hci_connect_le_scan_cleanup()
132 hci_pend_le_list_add(params, &hdev->pend_le_reports); in hci_connect_le_scan_cleanup()
143 struct hci_dev *hdev = conn->hdev; in hci_conn_cleanup()
145 if (test_bit(HCI_CONN_PARAM_REMOVAL_PEND, &conn->flags)) in hci_conn_cleanup()
146 hci_conn_params_del(conn->hdev, &conn->dst, conn->dst_type); in hci_conn_cleanup()
148 if (test_and_clear_bit(HCI_CONN_FLUSH_KEY, &conn->flags)) in hci_conn_cleanup()
149 hci_remove_link_key(hdev, &conn->dst); in hci_conn_cleanup()
155 if (HCI_CONN_HANDLE_UNSET(conn->handle)) in hci_conn_cleanup()
156 ida_free(&hdev->unset_handle_ida, conn->handle); in hci_conn_cleanup()
158 if (conn->cleanup) in hci_conn_cleanup()
159 conn->cleanup(conn); in hci_conn_cleanup()
161 if (conn->type == SCO_LINK || conn->type == ESCO_LINK) { in hci_conn_cleanup()
162 switch (conn->setting & SCO_AIRMODE_MASK) { in hci_conn_cleanup()
165 if (hdev->notify) in hci_conn_cleanup()
166 hdev->notify(hdev, HCI_NOTIFY_DISABLE_SCO); in hci_conn_cleanup()
170 if (hdev->notify) in hci_conn_cleanup()
171 hdev->notify(hdev, HCI_NOTIFY_CONN_DEL); in hci_conn_cleanup()
174 debugfs_remove_recursive(conn->debugfs); in hci_conn_cleanup()
183 struct hci_dev *hdev = conn->hdev; in hci_acl_create_connection()
197 if (test_bit(HCI_INQUIRY, &hdev->flags)) { in hci_acl_create_connection()
201 conn->state = BT_CONNECT2; in hci_acl_create_connection()
206 conn->state = BT_CONNECT; in hci_acl_create_connection()
207 conn->out = true; in hci_acl_create_connection()
208 conn->role = HCI_ROLE_MASTER; in hci_acl_create_connection()
210 conn->attempt++; in hci_acl_create_connection()
212 conn->link_policy = hdev->link_policy; in hci_acl_create_connection()
215 bacpy(&cp.bdaddr, &conn->dst); in hci_acl_create_connection()
218 ie = hci_inquiry_cache_lookup(hdev, &conn->dst); in hci_acl_create_connection()
221 cp.pscan_rep_mode = ie->data.pscan_rep_mode; in hci_acl_create_connection()
222 cp.pscan_mode = ie->data.pscan_mode; in hci_acl_create_connection()
223 cp.clock_offset = ie->data.clock_offset | in hci_acl_create_connection()
227 memcpy(conn->dev_class, ie->data.dev_class, 3); in hci_acl_create_connection()
230 cp.pkt_type = cpu_to_le16(conn->pkt_type); in hci_acl_create_connection()
231 if (lmp_rswitch_capable(hdev) && !(hdev->link_mode & HCI_LM_MASTER)) in hci_acl_create_connection()
248 if (conn->type == ACL_LINK && conn->role == HCI_ROLE_MASTER && in hci_disconnect()
249 (conn->state == BT_CONNECTED || conn->state == BT_CONFIG)) { in hci_disconnect()
250 struct hci_dev *hdev = conn->hdev; in hci_disconnect()
253 clkoff_cp.handle = cpu_to_le16(conn->handle); in hci_disconnect()
263 struct hci_dev *hdev = conn->hdev; in hci_add_sco()
268 conn->state = BT_CONNECT; in hci_add_sco()
269 conn->out = true; in hci_add_sco()
271 conn->attempt++; in hci_add_sco()
274 cp.pkt_type = cpu_to_le16(conn->pkt_type); in hci_add_sco()
282 if (!conn->parent) in find_next_esco_param()
285 for (; conn->attempt <= size; conn->attempt++) { in find_next_esco_param()
286 if (lmp_esco_2m_capable(conn->parent) || in find_next_esco_param()
287 (esco_param[conn->attempt - 1].pkt_type & ESCO_2EV3)) in find_next_esco_param()
290 conn, conn->attempt); in find_next_esco_param()
293 return conn->attempt <= size; in find_next_esco_param()
302 err = hdev->get_codec_config_data(hdev, ESCO_LINK, codec, &vnd_len, in configure_datapath_sync()
309 err = -ENOMEM; in configure_datapath_sync()
313 err = hdev->get_data_path_id(hdev, &cmd->data_path_id); in configure_datapath_sync()
317 cmd->vnd_len = vnd_len; in configure_datapath_sync()
318 memcpy(cmd->vnd_data, vnd_data, vnd_len); in configure_datapath_sync()
320 cmd->direction = 0x00; in configure_datapath_sync()
324 cmd->direction = 0x01; in configure_datapath_sync()
338 struct hci_conn *conn = conn_handle->conn; in hci_enhanced_setup_sync()
339 __u16 handle = conn_handle->handle; in hci_enhanced_setup_sync()
347 /* for offload use case, codec needs to configured before opening SCO */ in hci_enhanced_setup_sync()
348 if (conn->codec.data_path) in hci_enhanced_setup_sync()
349 configure_datapath_sync(hdev, &conn->codec); in hci_enhanced_setup_sync()
351 conn->state = BT_CONNECT; in hci_enhanced_setup_sync()
352 conn->out = true; in hci_enhanced_setup_sync()
354 conn->attempt++; in hci_enhanced_setup_sync()
363 switch (conn->codec.id) { in hci_enhanced_setup_sync()
367 return -EINVAL; in hci_enhanced_setup_sync()
369 param = &esco_param_msbc[conn->attempt - 1]; in hci_enhanced_setup_sync()
384 cp.in_data_path = conn->codec.data_path; in hci_enhanced_setup_sync()
385 cp.out_data_path = conn->codec.data_path; in hci_enhanced_setup_sync()
394 param = &esco_param_msbc[conn->attempt - 1]; in hci_enhanced_setup_sync()
409 cp.in_data_path = conn->codec.data_path; in hci_enhanced_setup_sync()
410 cp.out_data_path = conn->codec.data_path; in hci_enhanced_setup_sync()
416 if (conn->parent && lmp_esco_capable(conn->parent)) { in hci_enhanced_setup_sync()
419 return -EINVAL; in hci_enhanced_setup_sync()
420 param = &esco_param_cvsd[conn->attempt - 1]; in hci_enhanced_setup_sync()
422 if (conn->attempt > ARRAY_SIZE(sco_param_cvsd)) in hci_enhanced_setup_sync()
423 return -EINVAL; in hci_enhanced_setup_sync()
424 param = &sco_param_cvsd[conn->attempt - 1]; in hci_enhanced_setup_sync()
440 cp.in_data_path = conn->codec.data_path; in hci_enhanced_setup_sync()
441 cp.out_data_path = conn->codec.data_path; in hci_enhanced_setup_sync()
446 return -EINVAL; in hci_enhanced_setup_sync()
449 cp.retrans_effort = param->retrans_effort; in hci_enhanced_setup_sync()
450 cp.pkt_type = __cpu_to_le16(param->pkt_type); in hci_enhanced_setup_sync()
451 cp.max_latency = __cpu_to_le16(param->max_latency); in hci_enhanced_setup_sync()
454 return -EIO; in hci_enhanced_setup_sync()
461 struct hci_dev *hdev = conn->hdev; in hci_setup_sync_conn()
467 conn->state = BT_CONNECT; in hci_setup_sync_conn()
468 conn->out = true; in hci_setup_sync_conn()
470 conn->attempt++; in hci_setup_sync_conn()
476 cp.voice_setting = cpu_to_le16(conn->setting); in hci_setup_sync_conn()
478 switch (conn->setting & SCO_AIRMODE_MASK) { in hci_setup_sync_conn()
483 param = &esco_param_msbc[conn->attempt - 1]; in hci_setup_sync_conn()
486 if (conn->parent && lmp_esco_capable(conn->parent)) { in hci_setup_sync_conn()
490 param = &esco_param_cvsd[conn->attempt - 1]; in hci_setup_sync_conn()
492 if (conn->attempt > ARRAY_SIZE(sco_param_cvsd)) in hci_setup_sync_conn()
494 param = &sco_param_cvsd[conn->attempt - 1]; in hci_setup_sync_conn()
501 cp.retrans_effort = param->retrans_effort; in hci_setup_sync_conn()
502 cp.pkt_type = __cpu_to_le16(param->pkt_type); in hci_setup_sync_conn()
503 cp.max_latency = __cpu_to_le16(param->max_latency); in hci_setup_sync_conn()
516 if (enhanced_sync_conn_capable(conn->hdev)) { in hci_setup_sync()
522 conn_handle->conn = conn; in hci_setup_sync()
523 conn_handle->handle = handle; in hci_setup_sync()
524 result = hci_cmd_sync_queue(conn->hdev, hci_enhanced_setup_sync, in hci_setup_sync()
538 struct hci_dev *hdev = conn->hdev; in hci_le_conn_update()
544 params = hci_conn_params_lookup(hdev, &conn->dst, conn->dst_type); in hci_le_conn_update()
546 params->conn_min_interval = min; in hci_le_conn_update()
547 params->conn_max_interval = max; in hci_le_conn_update()
548 params->conn_latency = latency; in hci_le_conn_update()
549 params->supervision_timeout = to_multiplier; in hci_le_conn_update()
555 cp.handle = cpu_to_le16(conn->handle); in hci_le_conn_update()
574 struct hci_dev *hdev = conn->hdev; in hci_le_start_enc()
581 cp.handle = cpu_to_le16(conn->handle); in hci_le_start_enc()
594 link = list_first_entry_or_null(&conn->link_list, struct hci_link, list); in hci_sco_setup()
595 if (!link || !link->conn) in hci_sco_setup()
601 if (lmp_esco_capable(conn->hdev)) in hci_sco_setup()
602 hci_setup_sync(link->conn, conn->handle); in hci_sco_setup()
604 hci_add_sco(link->conn, conn->handle); in hci_sco_setup()
606 hci_connect_cfm(link->conn, status); in hci_sco_setup()
607 hci_conn_del(link->conn); in hci_sco_setup()
615 int refcnt = atomic_read(&conn->refcnt); in hci_conn_timeout()
617 BT_DBG("hcon %p state %s", conn, state_to_string(conn->state)); in hci_conn_timeout()
639 struct hci_dev *hdev = conn->hdev; in hci_conn_idle()
641 BT_DBG("hcon %p mode %d", conn, conn->mode); in hci_conn_idle()
646 if (conn->mode != HCI_CM_ACTIVE || !(conn->link_policy & HCI_LP_SNIFF)) in hci_conn_idle()
651 cp.handle = cpu_to_le16(conn->handle); in hci_conn_idle()
658 if (!test_and_set_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags)) { in hci_conn_idle()
660 cp.handle = cpu_to_le16(conn->handle); in hci_conn_idle()
661 cp.max_interval = cpu_to_le16(hdev->sniff_max_interval); in hci_conn_idle()
662 cp.min_interval = cpu_to_le16(hdev->sniff_min_interval); in hci_conn_idle()
674 hci_send_cmd(conn->hdev, HCI_OP_USER_CONFIRM_REPLY, sizeof(conn->dst), in hci_conn_auto_accept()
675 &conn->dst); in hci_conn_auto_accept()
699 struct hci_dev *hdev = conn->hdev; in le_conn_timeout()
708 if (conn->role == HCI_ROLE_SLAVE) { in le_conn_timeout()
746 if (bacmp(&conn->dst, BDADDR_ANY)) in bis_list()
749 if (d->big != conn->iso_qos.bcast.big || d->bis == BT_ISO_QOS_BIS_UNSET || in bis_list()
750 d->bis != conn->iso_qos.bcast.bis) in bis_list()
753 d->count++; in bis_list()
760 bt_dev_dbg(hdev, "big 0x%2.2x bis 0x%2.2x", d->big, d->bis); in terminate_big_sync()
762 hci_remove_ext_adv_instance_sync(hdev, d->bis, NULL); in terminate_big_sync()
765 if (!d->big_term) in terminate_big_sync()
768 return hci_le_terminate_big_sync(hdev, d->big, in terminate_big_sync()
782 bt_dev_dbg(hdev, "big 0x%2.2x bis 0x%2.2x", conn->iso_qos.bcast.big, in hci_le_terminate_big()
783 conn->iso_qos.bcast.bis); in hci_le_terminate_big()
787 return -ENOMEM; in hci_le_terminate_big()
789 d->big = conn->iso_qos.bcast.big; in hci_le_terminate_big()
790 d->bis = conn->iso_qos.bcast.bis; in hci_le_terminate_big()
791 d->big_term = test_and_clear_bit(HCI_CONN_BIG_CREATED, &conn->flags); in hci_le_terminate_big()
805 bt_dev_dbg(hdev, "big 0x%2.2x sync_handle 0x%4.4x", d->big, in big_terminate_sync()
806 d->sync_handle); in big_terminate_sync()
808 if (d->big_sync_term) in big_terminate_sync()
809 hci_le_big_terminate_sync(hdev, d->big); in big_terminate_sync()
811 if (d->pa_sync_term) in big_terminate_sync()
812 return hci_le_pa_terminate_sync(hdev, d->sync_handle); in big_terminate_sync()
822 bt_dev_dbg(hdev, "big 0x%2.2x sync_handle 0x%4.4x", big, conn->sync_handle); in hci_le_big_terminate()
826 return -ENOMEM; in hci_le_big_terminate()
828 d->big = big; in hci_le_big_terminate()
829 d->sync_handle = conn->sync_handle; in hci_le_big_terminate()
830 d->pa_sync_term = test_and_clear_bit(HCI_CONN_PA_SYNC, &conn->flags); in hci_le_big_terminate()
831 d->big_sync_term = test_and_clear_bit(HCI_CONN_BIG_SYNC, &conn->flags); in hci_le_big_terminate()
849 struct hci_dev *hdev = conn->hdev; in bis_cleanup()
854 if (conn->role == HCI_ROLE_MASTER) { in bis_cleanup()
855 if (!test_and_clear_bit(HCI_CONN_PER_ADV, &conn->flags)) in bis_cleanup()
861 bis = hci_conn_hash_lookup_big(hdev, conn->iso_qos.bcast.big); in bis_cleanup()
868 conn->iso_qos.bcast.big); in bis_cleanup()
873 hci_le_big_terminate(hdev, conn->iso_qos.bcast.big, in bis_cleanup()
898 if (!bacmp(&conn->dst, BDADDR_ANY) || d->cig != conn->iso_qos.ucast.cig) in find_cis()
901 d->count++; in find_cis()
910 struct hci_dev *hdev = conn->hdev; in cis_cleanup()
913 if (conn->iso_qos.ucast.cig == BT_ISO_QOS_CIG_UNSET) in cis_cleanup()
917 d.cig = conn->iso_qos.ucast.cig; in cis_cleanup()
928 hci_le_remove_cig(hdev, conn->iso_qos.ucast.cig); in cis_cleanup()
933 return ida_alloc_range(&hdev->unset_handle_ida, HCI_CONN_HANDLE_MAX + 1, in hci_conn_hash_alloc_unset()
948 bacpy(&conn->dst, dst); in hci_conn_add()
949 bacpy(&conn->src, &hdev->bdaddr); in hci_conn_add()
950 conn->handle = handle; in hci_conn_add()
951 conn->hdev = hdev; in hci_conn_add()
952 conn->type = type; in hci_conn_add()
953 conn->role = role; in hci_conn_add()
954 conn->mode = HCI_CM_ACTIVE; in hci_conn_add()
955 conn->state = BT_OPEN; in hci_conn_add()
956 conn->auth_type = HCI_AT_GENERAL_BONDING; in hci_conn_add()
957 conn->io_capability = hdev->io_capability; in hci_conn_add()
958 conn->remote_auth = 0xff; in hci_conn_add()
959 conn->key_type = 0xff; in hci_conn_add()
960 conn->rssi = HCI_RSSI_INVALID; in hci_conn_add()
961 conn->tx_power = HCI_TX_POWER_INVALID; in hci_conn_add()
962 conn->max_tx_power = HCI_TX_POWER_INVALID; in hci_conn_add()
963 conn->sync_handle = HCI_SYNC_HANDLE_INVALID; in hci_conn_add()
965 set_bit(HCI_CONN_POWER_SAVE, &conn->flags); in hci_conn_add()
966 conn->disc_timeout = HCI_DISCONN_TIMEOUT; in hci_conn_add()
969 conn->auth_payload_timeout = DEFAULT_AUTH_PAYLOAD_TIMEOUT; in hci_conn_add()
971 if (conn->role == HCI_ROLE_MASTER) in hci_conn_add()
972 conn->out = true; in hci_conn_add()
976 conn->pkt_type = hdev->pkt_type & ACL_PTYPE_MASK; in hci_conn_add()
979 /* conn->src should reflect the local identity address */ in hci_conn_add()
980 hci_copy_identity_address(hdev, &conn->src, &conn->src_type); in hci_conn_add()
983 /* conn->src should reflect the local identity address */ in hci_conn_add()
984 hci_copy_identity_address(hdev, &conn->src, &conn->src_type); in hci_conn_add()
988 conn->cleanup = bis_cleanup; in hci_conn_add()
989 else if (conn->role == HCI_ROLE_MASTER) in hci_conn_add()
990 conn->cleanup = cis_cleanup; in hci_conn_add()
995 conn->pkt_type = (hdev->esco_type & SCO_ESCO_MASK) | in hci_conn_add()
996 (hdev->esco_type & EDR_ESCO_MASK); in hci_conn_add()
998 conn->pkt_type = hdev->pkt_type & SCO_PTYPE_MASK; in hci_conn_add()
1001 conn->pkt_type = hdev->esco_type & ~EDR_ESCO_MASK; in hci_conn_add()
1005 skb_queue_head_init(&conn->data_q); in hci_conn_add()
1007 INIT_LIST_HEAD(&conn->chan_list); in hci_conn_add()
1008 INIT_LIST_HEAD(&conn->link_list); in hci_conn_add()
1010 INIT_DELAYED_WORK(&conn->disc_work, hci_conn_timeout); in hci_conn_add()
1011 INIT_DELAYED_WORK(&conn->auto_accept_work, hci_conn_auto_accept); in hci_conn_add()
1012 INIT_DELAYED_WORK(&conn->idle_work, hci_conn_idle); in hci_conn_add()
1013 INIT_DELAYED_WORK(&conn->le_conn_timeout, le_conn_timeout); in hci_conn_add()
1015 atomic_set(&conn->refcnt, 0); in hci_conn_add()
1021 /* The SCO and eSCO connections will only be notified when their in hci_conn_add()
1025 if (conn->type != SCO_LINK && conn->type != ESCO_LINK) { in hci_conn_add()
1026 if (hdev->notify) in hci_conn_add()
1027 hdev->notify(hdev, HCI_NOTIFY_CONN_ADD); in hci_conn_add()
1054 /* Due to race, SCO/ISO conn might be not established yet at this point, in hci_conn_cleanup_child()
1058 switch (conn->type) { in hci_conn_cleanup_child()
1061 if (HCI_CONN_HANDLE_UNSET(conn->handle)) in hci_conn_cleanup_child()
1065 if (conn->state != BT_CONNECTED && in hci_conn_cleanup_child()
1066 !test_bit(HCI_CONN_CREATE_CIS, &conn->flags)) in hci_conn_cleanup_child()
1074 struct hci_dev *hdev = conn->hdev; in hci_conn_unlink()
1078 if (!conn->parent) { in hci_conn_unlink()
1081 list_for_each_entry_safe(link, t, &conn->link_list, list) { in hci_conn_unlink()
1082 struct hci_conn *child = link->conn; in hci_conn_unlink()
1091 if (!test_bit(HCI_UP, &hdev->flags)) in hci_conn_unlink()
1094 hci_conn_cleanup_child(child, conn->abort_reason); in hci_conn_unlink()
1100 if (!conn->link) in hci_conn_unlink()
1103 list_del_rcu(&conn->link->list); in hci_conn_unlink()
1106 hci_conn_drop(conn->parent); in hci_conn_unlink()
1107 hci_conn_put(conn->parent); in hci_conn_unlink()
1108 conn->parent = NULL; in hci_conn_unlink()
1110 kfree(conn->link); in hci_conn_unlink()
1111 conn->link = NULL; in hci_conn_unlink()
1116 struct hci_dev *hdev = conn->hdev; in hci_conn_del()
1118 BT_DBG("%s hcon %p handle %d", hdev->name, conn, conn->handle); in hci_conn_del()
1122 cancel_delayed_work_sync(&conn->disc_work); in hci_conn_del()
1123 cancel_delayed_work_sync(&conn->auto_accept_work); in hci_conn_del()
1124 cancel_delayed_work_sync(&conn->idle_work); in hci_conn_del()
1126 if (conn->type == ACL_LINK) { in hci_conn_del()
1128 hdev->acl_cnt += conn->sent; in hci_conn_del()
1129 } else if (conn->type == LE_LINK) { in hci_conn_del()
1130 cancel_delayed_work(&conn->le_conn_timeout); in hci_conn_del()
1132 if (hdev->le_pkts) in hci_conn_del()
1133 hdev->le_cnt += conn->sent; in hci_conn_del()
1135 hdev->acl_cnt += conn->sent; in hci_conn_del()
1138 if (conn->type == ISO_LINK) { in hci_conn_del()
1139 if (hdev->iso_pkts) in hci_conn_del()
1140 hdev->iso_cnt += conn->sent; in hci_conn_del()
1141 else if (hdev->le_pkts) in hci_conn_del()
1142 hdev->le_cnt += conn->sent; in hci_conn_del()
1144 hdev->acl_cnt += conn->sent; in hci_conn_del()
1148 skb_queue_purge(&conn->data_q); in hci_conn_del()
1163 BT_DBG("%pMR -> %pMR", src, dst); in hci_get_route()
1168 if (!test_bit(HCI_UP, &d->flags) || in hci_get_route()
1170 d->dev_type != HCI_PRIMARY) in hci_get_route()
1173 /* Simple routing: in hci_get_route()
1174 * No source address - find interface with bdaddr != dst in hci_get_route()
1175 * Source address - find interface with bdaddr == src in hci_get_route()
1185 bacpy(&id_addr, &d->bdaddr); in hci_get_route()
1194 /* Convert from HCI to three-value type */ in hci_get_route()
1205 if (bacmp(&d->bdaddr, dst)) { in hci_get_route()
1219 /* This function requires the caller holds hdev->lock */
1222 struct hci_dev *hdev = conn->hdev; in hci_le_conn_failed()
1232 /* This function requires the caller holds hdev->lock */
1235 struct hci_dev *hdev = conn->hdev; in hci_conn_failed()
1239 switch (conn->type) { in hci_conn_failed()
1244 mgmt_connect_failed(hdev, &conn->dst, conn->type, in hci_conn_failed()
1245 conn->dst_type, status); in hci_conn_failed()
1249 conn->state = BT_CLOSED; in hci_conn_failed()
1254 /* This function requires the caller holds hdev->lock */
1257 struct hci_dev *hdev = conn->hdev; in hci_conn_set_handle()
1261 if (conn->handle == handle) in hci_conn_set_handle()
1273 if (conn->abort_reason) in hci_conn_set_handle()
1274 return conn->abort_reason; in hci_conn_set_handle()
1276 if (HCI_CONN_HANDLE_UNSET(conn->handle)) in hci_conn_set_handle()
1277 ida_free(&hdev->unset_handle_ida, conn->handle); in hci_conn_set_handle()
1279 conn->handle = handle; in hci_conn_set_handle()
1307 flush_delayed_work(&conn->le_conn_timeout); in create_le_conn_complete()
1325 clear_bit(HCI_CONN_SCANNING, &conn->flags); in hci_connect_le_sync()
1326 conn->state = BT_CONNECT; in hci_connect_le_sync()
1342 return ERR_PTR(-ECONNREFUSED); in hci_connect_le()
1344 return ERR_PTR(-EOPNOTSUPP); in hci_connect_le()
1348 * time, we return -EBUSY if there is any connection attempt running. in hci_connect_le()
1351 return ERR_PTR(-EBUSY); in hci_connect_le()
1359 if (conn && !test_bit(HCI_CONN_SCANNING, &conn->flags)) { in hci_connect_le()
1360 return ERR_PTR(-EBUSY); in hci_connect_le()
1377 if (irk && bacmp(&irk->rpa, BDADDR_ANY)) { in hci_connect_le()
1378 dst = &irk->rpa; in hci_connect_le()
1384 bacpy(&conn->dst, dst); in hci_connect_le()
1388 return ERR_PTR(-ENOMEM); in hci_connect_le()
1390 conn->pending_sec_level = sec_level; in hci_connect_le()
1393 conn->dst_type = dst_type; in hci_connect_le()
1394 conn->sec_level = BT_SECURITY_LOW; in hci_connect_le()
1395 conn->conn_timeout = conn_timeout; in hci_connect_le()
1398 UINT_PTR(conn->handle), in hci_connect_le()
1416 if (conn->state != BT_CONNECTED) in is_connected()
1422 /* This function requires the caller holds hdev->lock */
1429 return -EISCONN; in hci_explicit_conn_params_set()
1435 return -ENOMEM; in hci_explicit_conn_params_set()
1441 params->auto_connect = HCI_AUTO_CONN_EXPLICIT; in hci_explicit_conn_params_set()
1445 if (params->auto_connect == HCI_AUTO_CONN_DISABLED || in hci_explicit_conn_params_set()
1446 params->auto_connect == HCI_AUTO_CONN_REPORT || in hci_explicit_conn_params_set()
1447 params->auto_connect == HCI_AUTO_CONN_EXPLICIT) { in hci_explicit_conn_params_set()
1449 hci_pend_le_list_add(params, &hdev->pend_le_conns); in hci_explicit_conn_params_set()
1452 params->explicit_connect = true; in hci_explicit_conn_params_set()
1455 params->auto_connect); in hci_explicit_conn_params_set()
1466 if (qos->bcast.big == BT_ISO_QOS_BIG_UNSET) { in qos_set_big()
1475 return -EADDRNOTAVAIL; in qos_set_big()
1478 qos->bcast.big = big; in qos_set_big()
1490 if (qos->bcast.bis == BT_ISO_QOS_BIS_UNSET) { in qos_set_bis()
1494 for (bis = 0x01; bis < hdev->le_num_of_adv_sets; in qos_set_bis()
1502 if (bis == hdev->le_num_of_adv_sets) in qos_set_bis()
1503 return -EADDRNOTAVAIL; in qos_set_bis()
1506 qos->bcast.bis = bis; in qos_set_bis()
1512 /* This function requires the caller holds hdev->lock */
1523 return ERR_PTR(-ECONNREFUSED); in hci_add_bis()
1524 return ERR_PTR(-EOPNOTSUPP); in hci_add_bis()
1536 conn = hci_conn_hash_lookup_per_adv_bis(hdev, dst, qos->bcast.big, in hci_add_bis()
1537 qos->bcast.big); in hci_add_bis()
1539 return ERR_PTR(-EADDRINUSE); in hci_add_bis()
1544 conn = hci_conn_hash_lookup_big(hdev, qos->bcast.big); in hci_add_bis()
1546 if (conn && (memcmp(qos, &conn->iso_qos, sizeof(*qos)) || in hci_add_bis()
1547 base_len != conn->le_per_adv_data_len || in hci_add_bis()
1548 memcmp(conn->le_per_adv_data, base, base_len))) in hci_add_bis()
1549 return ERR_PTR(-EADDRINUSE); in hci_add_bis()
1553 return ERR_PTR(-ENOMEM); in hci_add_bis()
1555 conn->state = BT_CONNECT; in hci_add_bis()
1561 /* This function requires the caller holds hdev->lock */
1572 return ERR_PTR(-ECONNREFUSED); in hci_connect_le_scan()
1574 return ERR_PTR(-EOPNOTSUPP); in hci_connect_le_scan()
1578 * established. To be able to handle these ATT messages, the user- in hci_connect_le_scan()
1588 if (conn->pending_sec_level < sec_level) in hci_connect_le_scan()
1589 conn->pending_sec_level = sec_level; in hci_connect_le_scan()
1597 return ERR_PTR(-ENOMEM); in hci_connect_le_scan()
1601 return ERR_PTR(-EBUSY); in hci_connect_le_scan()
1604 conn->state = BT_CONNECT; in hci_connect_le_scan()
1605 set_bit(HCI_CONN_SCANNING, &conn->flags); in hci_connect_le_scan()
1606 conn->dst_type = dst_type; in hci_connect_le_scan()
1607 conn->sec_level = BT_SECURITY_LOW; in hci_connect_le_scan()
1608 conn->pending_sec_level = sec_level; in hci_connect_le_scan()
1609 conn->conn_timeout = conn_timeout; in hci_connect_le_scan()
1610 conn->conn_reason = conn_reason; in hci_connect_le_scan()
1627 return ERR_PTR(-ECONNREFUSED); in hci_connect_acl()
1629 return ERR_PTR(-EOPNOTSUPP); in hci_connect_acl()
1633 * CVE-2020-26555 in hci_connect_acl()
1635 if (!bacmp(&hdev->bdaddr, dst)) { in hci_connect_acl()
1638 return ERR_PTR(-ECONNREFUSED); in hci_connect_acl()
1645 return ERR_PTR(-ENOMEM); in hci_connect_acl()
1650 acl->conn_reason = conn_reason; in hci_connect_acl()
1651 if (acl->state == BT_OPEN || acl->state == BT_CLOSED) { in hci_connect_acl()
1652 acl->sec_level = BT_SECURITY_LOW; in hci_connect_acl()
1653 acl->pending_sec_level = sec_level; in hci_connect_acl()
1654 acl->auth_type = auth_type; in hci_connect_acl()
1664 struct hci_dev *hdev = parent->hdev; in hci_conn_link()
1669 if (conn->link) in hci_conn_link()
1670 return conn->link; in hci_conn_link()
1672 if (conn->parent) in hci_conn_link()
1679 link->conn = hci_conn_hold(conn); in hci_conn_link()
1680 conn->link = link; in hci_conn_link()
1681 conn->parent = hci_conn_get(parent); in hci_conn_link()
1684 list_add_tail_rcu(&link->list, &parent->link_list); in hci_conn_link()
1693 struct hci_conn *sco; in hci_connect_sco() local
1701 sco = hci_conn_hash_lookup_ba(hdev, type, dst); in hci_connect_sco()
1702 if (!sco) { in hci_connect_sco()
1703 sco = hci_conn_add_unset(hdev, type, dst, HCI_ROLE_MASTER); in hci_connect_sco()
1704 if (!sco) { in hci_connect_sco()
1706 return ERR_PTR(-ENOMEM); in hci_connect_sco()
1710 link = hci_conn_link(acl, sco); in hci_connect_sco()
1713 hci_conn_drop(sco); in hci_connect_sco()
1714 return ERR_PTR(-ENOLINK); in hci_connect_sco()
1717 sco->setting = setting; in hci_connect_sco()
1718 sco->codec = *codec; in hci_connect_sco()
1720 if (acl->state == BT_CONNECTED && in hci_connect_sco()
1721 (sco->state == BT_OPEN || sco->state == BT_CLOSED)) { in hci_connect_sco()
1722 set_bit(HCI_CONN_POWER_SAVE, &acl->flags); in hci_connect_sco()
1725 if (test_bit(HCI_CONN_MODE_CHANGE_PEND, &acl->flags)) { in hci_connect_sco()
1726 /* defer SCO setup until mode change completed */ in hci_connect_sco()
1727 set_bit(HCI_CONN_SCO_SETUP_PEND, &acl->flags); in hci_connect_sco()
1728 return sco; in hci_connect_sco()
1734 return sco; in hci_connect_sco()
1739 struct hci_dev *hdev = conn->hdev; in hci_le_create_big()
1745 data.big = qos->bcast.big; in hci_le_create_big()
1746 data.bis = qos->bcast.bis; in hci_le_create_big()
1753 cp.handle = qos->bcast.big; in hci_le_create_big()
1754 cp.adv_handle = qos->bcast.bis; in hci_le_create_big()
1756 hci_cpu_to_le24(qos->bcast.out.interval, cp.bis.sdu_interval); in hci_le_create_big()
1757 cp.bis.sdu = cpu_to_le16(qos->bcast.out.sdu); in hci_le_create_big()
1758 cp.bis.latency = cpu_to_le16(qos->bcast.out.latency); in hci_le_create_big()
1759 cp.bis.rtn = qos->bcast.out.rtn; in hci_le_create_big()
1760 cp.bis.phy = qos->bcast.out.phy; in hci_le_create_big()
1761 cp.bis.packing = qos->bcast.packing; in hci_le_create_big()
1762 cp.bis.framing = qos->bcast.framing; in hci_le_create_big()
1763 cp.bis.encryption = qos->bcast.encryption; in hci_le_create_big()
1764 memcpy(cp.bis.bcode, qos->bcast.bcode, sizeof(cp.bis.bcode)); in hci_le_create_big()
1783 qos = &conn->iso_qos; in set_cig_params_sync()
1785 hci_cpu_to_le24(qos->ucast.out.interval, pdu.cp.c_interval); in set_cig_params_sync()
1786 hci_cpu_to_le24(qos->ucast.in.interval, pdu.cp.p_interval); in set_cig_params_sync()
1787 pdu.cp.sca = qos->ucast.sca; in set_cig_params_sync()
1788 pdu.cp.packing = qos->ucast.packing; in set_cig_params_sync()
1789 pdu.cp.framing = qos->ucast.framing; in set_cig_params_sync()
1790 pdu.cp.c_latency = cpu_to_le16(qos->ucast.out.latency); in set_cig_params_sync()
1791 pdu.cp.p_latency = cpu_to_le16(qos->ucast.in.latency); in set_cig_params_sync()
1805 qos = &conn->iso_qos; in set_cig_params_sync()
1808 cis->cis_id = cis_id; in set_cig_params_sync()
1809 cis->c_sdu = cpu_to_le16(conn->iso_qos.ucast.out.sdu); in set_cig_params_sync()
1810 cis->p_sdu = cpu_to_le16(conn->iso_qos.ucast.in.sdu); in set_cig_params_sync()
1811 cis->c_phy = qos->ucast.out.phy ? qos->ucast.out.phy : in set_cig_params_sync()
1812 qos->ucast.in.phy; in set_cig_params_sync()
1813 cis->p_phy = qos->ucast.in.phy ? qos->ucast.in.phy : in set_cig_params_sync()
1814 qos->ucast.out.phy; in set_cig_params_sync()
1815 cis->c_rtn = qos->ucast.out.rtn; in set_cig_params_sync()
1816 cis->p_rtn = qos->ucast.in.rtn; in set_cig_params_sync()
1830 struct hci_dev *hdev = conn->hdev; in hci_le_set_cig_params()
1836 if (qos->ucast.cig == BT_ISO_QOS_CIG_UNSET) { in hci_le_set_cig_params()
1855 qos->ucast.cig = data.cig; in hci_le_set_cig_params()
1858 if (qos->ucast.cis != BT_ISO_QOS_CIS_UNSET) { in hci_le_set_cig_params()
1859 if (hci_conn_hash_lookup_cis(hdev, NULL, 0, qos->ucast.cig, in hci_le_set_cig_params()
1860 qos->ucast.cis)) in hci_le_set_cig_params()
1866 for (data.cig = qos->ucast.cig, data.cis = 0x00; data.cis < 0xf0; in hci_le_set_cig_params()
1871 qos->ucast.cis = data.cis; in hci_le_set_cig_params()
1876 if (qos->ucast.cis == BT_ISO_QOS_CIS_UNSET) in hci_le_set_cig_params()
1881 UINT_PTR(qos->ucast.cig), NULL) < 0) in hci_le_set_cig_params()
1892 cis = hci_conn_hash_lookup_cis(hdev, dst, dst_type, qos->ucast.cig, in hci_bind_cis()
1893 qos->ucast.cis); in hci_bind_cis()
1897 return ERR_PTR(-ENOMEM); in hci_bind_cis()
1898 cis->cleanup = cis_cleanup; in hci_bind_cis()
1899 cis->dst_type = dst_type; in hci_bind_cis()
1900 cis->iso_qos.ucast.cig = BT_ISO_QOS_CIG_UNSET; in hci_bind_cis()
1901 cis->iso_qos.ucast.cis = BT_ISO_QOS_CIS_UNSET; in hci_bind_cis()
1904 if (cis->state == BT_CONNECTED) in hci_bind_cis()
1908 if (cis->state == BT_BOUND && in hci_bind_cis()
1909 !memcmp(&cis->iso_qos, qos, sizeof(*qos))) in hci_bind_cis()
1913 cis->le_tx_phy = qos->ucast.out.phy; in hci_bind_cis()
1914 cis->le_rx_phy = qos->ucast.in.phy; in hci_bind_cis()
1919 if (!qos->ucast.out.interval) in hci_bind_cis()
1920 qos->ucast.out.interval = qos->ucast.in.interval; in hci_bind_cis()
1925 if (!qos->ucast.in.interval) in hci_bind_cis()
1926 qos->ucast.in.interval = qos->ucast.out.interval; in hci_bind_cis()
1931 if (!qos->ucast.out.latency) in hci_bind_cis()
1932 qos->ucast.out.latency = qos->ucast.in.latency; in hci_bind_cis()
1937 if (!qos->ucast.in.latency) in hci_bind_cis()
1938 qos->ucast.in.latency = qos->ucast.out.latency; in hci_bind_cis()
1942 return ERR_PTR(-EINVAL); in hci_bind_cis()
1947 cis->iso_qos = *qos; in hci_bind_cis()
1948 cis->state = BT_BOUND; in hci_bind_cis()
1955 struct hci_dev *hdev = conn->hdev; in hci_iso_setup_path()
1960 if (conn->iso_qos.ucast.out.sdu) { in hci_iso_setup_path()
1961 cmd.handle = cpu_to_le16(conn->handle); in hci_iso_setup_path()
1971 if (conn->iso_qos.ucast.in.sdu) { in hci_iso_setup_path()
1972 cmd.handle = cpu_to_le16(conn->handle); in hci_iso_setup_path()
1987 if (conn->type != ISO_LINK || !bacmp(&conn->dst, BDADDR_ANY)) in hci_conn_check_create_cis()
1988 return -EINVAL; in hci_conn_check_create_cis()
1990 if (!conn->parent || conn->parent->state != BT_CONNECTED || in hci_conn_check_create_cis()
1991 conn->state != BT_CONNECT || HCI_CONN_HANDLE_UNSET(conn->handle)) in hci_conn_check_create_cis()
2009 list_for_each_entry_rcu(conn, &hdev->conn_hash.list, list) { in hci_le_create_cis_pending()
2010 if (test_bit(HCI_CONN_CREATE_CIS, &conn->flags)) { in hci_le_create_cis_pending()
2012 return -EBUSY; in hci_le_create_cis_pending()
2032 if (!qos->sdu && qos->phy) { in hci_iso_qos_setup()
2033 if (hdev->iso_mtu > 0) in hci_iso_qos_setup()
2034 qos->sdu = hdev->iso_mtu; in hci_iso_qos_setup()
2035 else if (hdev->le_mtu > 0) in hci_iso_qos_setup()
2036 qos->sdu = hdev->le_mtu; in hci_iso_qos_setup()
2038 qos->sdu = hdev->acl_mtu; in hci_iso_qos_setup()
2042 if (qos->phy == BT_ISO_PHY_ANY) in hci_iso_qos_setup()
2043 qos->phy = phy; in hci_iso_qos_setup()
2046 if (!qos->interval) in hci_iso_qos_setup()
2048 qos->interval = conn->le_conn_interval * 1250; in hci_iso_qos_setup()
2051 if (!qos->latency) in hci_iso_qos_setup()
2052 qos->latency = conn->le_conn_latency; in hci_iso_qos_setup()
2058 struct bt_iso_qos *qos = &conn->iso_qos; in create_big_sync()
2063 if (qos->bcast.out.phy == 0x02) in create_big_sync()
2067 interval = (qos->bcast.out.interval / 1250) * qos->bcast.sync_factor; in create_big_sync()
2069 if (qos->bcast.bis) in create_big_sync()
2072 err = hci_start_per_adv_sync(hdev, qos->bcast.bis, conn->le_per_adv_data_len, in create_big_sync()
2073 conn->le_per_adv_data, flags, interval, in create_big_sync()
2078 return hci_le_create_big(conn, &conn->iso_qos); in create_big_sync()
2114 return -EBUSY; in hci_pa_create_sync()
2119 return -ENOMEM; in hci_pa_create_sync()
2122 cp->options = qos->bcast.options; in hci_pa_create_sync()
2123 cp->sid = sid; in hci_pa_create_sync()
2124 cp->addr_type = dst_type; in hci_pa_create_sync()
2125 bacpy(&cp->addr, dst); in hci_pa_create_sync()
2126 cp->skip = cpu_to_le16(qos->bcast.skip); in hci_pa_create_sync()
2127 cp->sync_timeout = cpu_to_le16(qos->bcast.sync_timeout); in hci_pa_create_sync()
2128 cp->sync_cte_type = qos->bcast.sync_cte_type; in hci_pa_create_sync()
2145 return -EINVAL; in hci_le_big_create_sync()
2152 hcon->iso_qos.bcast.big = qos->bcast.big; in hci_le_big_create_sync()
2155 pdu.cp.handle = qos->bcast.big; in hci_le_big_create_sync()
2157 pdu.cp.encryption = qos->bcast.encryption; in hci_le_big_create_sync()
2158 memcpy(pdu.cp.bcode, qos->bcast.bcode, sizeof(pdu.cp.bcode)); in hci_le_big_create_sync()
2159 pdu.cp.mse = qos->bcast.mse; in hci_le_big_create_sync()
2160 pdu.cp.timeout = cpu_to_le16(qos->bcast.timeout); in hci_le_big_create_sync()
2198 conn->le_tx_phy = qos->bcast.out.phy; in hci_bind_bis()
2199 conn->le_tx_phy = qos->bcast.out.phy; in hci_bind_bis()
2203 memcpy(conn->le_per_adv_data, eir, sizeof(eir)); in hci_bind_bis()
2204 conn->le_per_adv_data_len = base_len; in hci_bind_bis()
2207 hci_iso_qos_setup(hdev, conn, &qos->bcast.out, in hci_bind_bis()
2208 conn->le_tx_phy ? conn->le_tx_phy : in hci_bind_bis()
2209 hdev->le_tx_def_phys); in hci_bind_bis()
2211 conn->iso_qos = *qos; in hci_bind_bis()
2212 conn->state = BT_BOUND; in hci_bind_bis()
2222 if (bacmp(&conn->dst, BDADDR_ANY)) in bis_mark_per_adv()
2225 if (d->big != conn->iso_qos.bcast.big || in bis_mark_per_adv()
2226 d->bis == BT_ISO_QOS_BIS_UNSET || in bis_mark_per_adv()
2227 d->bis != conn->iso_qos.bcast.bis) in bis_mark_per_adv()
2230 set_bit(HCI_CONN_PER_ADV, &conn->flags); in bis_mark_per_adv()
2245 data.big = qos->bcast.big; in hci_connect_bis()
2246 data.bis = qos->bcast.bis; in hci_connect_bis()
2286 hci_iso_qos_setup(hdev, le, &qos->ucast.out, in hci_connect_cis()
2287 le->le_tx_phy ? le->le_tx_phy : hdev->le_tx_def_phys); in hci_connect_cis()
2288 hci_iso_qos_setup(hdev, le, &qos->ucast.in, in hci_connect_cis()
2289 le->le_rx_phy ? le->le_rx_phy : hdev->le_rx_def_phys); in hci_connect_cis()
2301 return ERR_PTR(-ENOLINK); in hci_connect_cis()
2307 cis->state = BT_CONNECT; in hci_connect_cis()
2320 * Connections is used and the link is encrypted with AES-CCM in hci_conn_check_link_mode()
2321 * using a P-256 authenticated combination key. in hci_conn_check_link_mode()
2323 if (hci_dev_test_flag(conn->hdev, HCI_SC_ONLY)) { in hci_conn_check_link_mode()
2325 !test_bit(HCI_CONN_AES_CCM, &conn->flags) || in hci_conn_check_link_mode()
2326 conn->key_type != HCI_LK_AUTH_COMBINATION_P256) in hci_conn_check_link_mode()
2335 * 128-bit equivalent strength for link and encryption keys in hci_conn_check_link_mode()
2337 * SAFER+ not allowed, and P-192 not allowed; encryption key in hci_conn_check_link_mode()
2340 if (conn->sec_level == BT_SECURITY_FIPS && in hci_conn_check_link_mode()
2341 !test_bit(HCI_CONN_AES_CCM, &conn->flags)) { in hci_conn_check_link_mode()
2342 bt_dev_err(conn->hdev, in hci_conn_check_link_mode()
2343 "Invalid security: Missing AES-CCM usage"); in hci_conn_check_link_mode()
2348 !test_bit(HCI_CONN_ENCRYPT, &conn->flags)) in hci_conn_check_link_mode()
2359 if (conn->pending_sec_level > sec_level) in hci_conn_auth()
2360 sec_level = conn->pending_sec_level; in hci_conn_auth()
2362 if (sec_level > conn->sec_level) in hci_conn_auth()
2363 conn->pending_sec_level = sec_level; in hci_conn_auth()
2364 else if (test_bit(HCI_CONN_AUTH, &conn->flags)) in hci_conn_auth()
2368 auth_type |= (conn->auth_type & 0x01); in hci_conn_auth()
2370 conn->auth_type = auth_type; in hci_conn_auth()
2372 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) { in hci_conn_auth()
2375 cp.handle = cpu_to_le16(conn->handle); in hci_conn_auth()
2376 hci_send_cmd(conn->hdev, HCI_OP_AUTH_REQUESTED, in hci_conn_auth()
2382 if (!test_bit(HCI_CONN_ENCRYPT, &conn->flags)) in hci_conn_auth()
2383 set_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags); in hci_conn_auth()
2394 if (!test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags)) { in hci_conn_encrypt()
2396 cp.handle = cpu_to_le16(conn->handle); in hci_conn_encrypt()
2398 hci_send_cmd(conn->hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp), in hci_conn_encrypt()
2409 if (conn->type == LE_LINK) in hci_conn_security()
2422 if (!test_bit(HCI_CONN_AUTH, &conn->flags)) in hci_conn_security()
2425 switch (conn->key_type) { in hci_conn_security()
2454 if (sec_level <= BT_SECURITY_MEDIUM || conn->pin_length == 16) in hci_conn_security()
2462 if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags)) in hci_conn_security()
2466 set_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags); in hci_conn_security()
2472 if (test_bit(HCI_CONN_ENCRYPT, &conn->flags)) { in hci_conn_security()
2476 if (!conn->enc_key_size) in hci_conn_security()
2493 /* Accept if non-secure or higher security level is required */ in hci_conn_check_secure()
2498 if (conn->sec_level == BT_SECURITY_HIGH || in hci_conn_check_secure()
2499 conn->sec_level == BT_SECURITY_FIPS) in hci_conn_check_secure()
2512 if (role == conn->role) in hci_conn_switch_role()
2515 if (!test_and_set_bit(HCI_CONN_RSWITCH_PEND, &conn->flags)) { in hci_conn_switch_role()
2517 bacpy(&cp.bdaddr, &conn->dst); in hci_conn_switch_role()
2519 hci_send_cmd(conn->hdev, HCI_OP_SWITCH_ROLE, sizeof(cp), &cp); in hci_conn_switch_role()
2529 struct hci_dev *hdev = conn->hdev; in hci_conn_enter_active_mode()
2531 BT_DBG("hcon %p mode %d", conn, conn->mode); in hci_conn_enter_active_mode()
2533 if (conn->mode != HCI_CM_SNIFF) in hci_conn_enter_active_mode()
2536 if (!test_bit(HCI_CONN_POWER_SAVE, &conn->flags) && !force_active) in hci_conn_enter_active_mode()
2539 if (!test_and_set_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags)) { in hci_conn_enter_active_mode()
2541 cp.handle = cpu_to_le16(conn->handle); in hci_conn_enter_active_mode()
2546 if (hdev->idle_timeout > 0) in hci_conn_enter_active_mode()
2547 queue_delayed_work(hdev->workqueue, &conn->idle_work, in hci_conn_enter_active_mode()
2548 msecs_to_jiffies(hdev->idle_timeout)); in hci_conn_enter_active_mode()
2554 struct list_head *head = &hdev->conn_hash.list; in hci_conn_hash_flush()
2557 BT_DBG("hdev %s", hdev->name); in hci_conn_hash_flush()
2566 conn->state = BT_CLOSED; in hci_conn_hash_flush()
2577 BT_DBG("hdev %s", hdev->name); in hci_conn_check_pending()
2592 if (conn->role == HCI_ROLE_MASTER) in get_link_mode()
2595 if (test_bit(HCI_CONN_ENCRYPT, &conn->flags)) in get_link_mode()
2598 if (test_bit(HCI_CONN_AUTH, &conn->flags)) in get_link_mode()
2601 if (test_bit(HCI_CONN_SECURE, &conn->flags)) in get_link_mode()
2604 if (test_bit(HCI_CONN_FIPS, &conn->flags)) in get_link_mode()
2619 return -EFAULT; in hci_get_conn_list()
2622 return -EINVAL; in hci_get_conn_list()
2628 return -ENOMEM; in hci_get_conn_list()
2633 return -ENODEV; in hci_get_conn_list()
2636 ci = cl->conn_info; in hci_get_conn_list()
2639 list_for_each_entry(c, &hdev->conn_hash.list, list) { in hci_get_conn_list()
2640 bacpy(&(ci + n)->bdaddr, &c->dst); in hci_get_conn_list()
2641 (ci + n)->handle = c->handle; in hci_get_conn_list()
2642 (ci + n)->type = c->type; in hci_get_conn_list()
2643 (ci + n)->out = c->out; in hci_get_conn_list()
2644 (ci + n)->state = c->state; in hci_get_conn_list()
2645 (ci + n)->link_mode = get_link_mode(c); in hci_get_conn_list()
2651 cl->dev_id = hdev->id; in hci_get_conn_list()
2652 cl->conn_num = n; in hci_get_conn_list()
2660 return err ? -EFAULT : 0; in hci_get_conn_list()
2671 return -EFAULT; in hci_get_conn_info()
2676 bacpy(&ci.bdaddr, &conn->dst); in hci_get_conn_info()
2677 ci.handle = conn->handle; in hci_get_conn_info()
2678 ci.type = conn->type; in hci_get_conn_info()
2679 ci.out = conn->out; in hci_get_conn_info()
2680 ci.state = conn->state; in hci_get_conn_info()
2686 return -ENOENT; in hci_get_conn_info()
2688 return copy_to_user(ptr, &ci, sizeof(ci)) ? -EFAULT : 0; in hci_get_conn_info()
2697 return -EFAULT; in hci_get_auth_info()
2702 req.type = conn->auth_type; in hci_get_auth_info()
2706 return -ENOENT; in hci_get_auth_info()
2708 return copy_to_user(arg, &req, sizeof(req)) ? -EFAULT : 0; in hci_get_auth_info()
2713 struct hci_dev *hdev = conn->hdev; in hci_chan_create()
2716 BT_DBG("%s hcon %p", hdev->name, conn); in hci_chan_create()
2718 if (test_bit(HCI_CONN_DROP, &conn->flags)) { in hci_chan_create()
2727 chan->conn = hci_conn_get(conn); in hci_chan_create()
2728 skb_queue_head_init(&chan->data_q); in hci_chan_create()
2729 chan->state = BT_CONNECTED; in hci_chan_create()
2731 list_add_rcu(&chan->list, &conn->chan_list); in hci_chan_create()
2738 struct hci_conn *conn = chan->conn; in hci_chan_del()
2739 struct hci_dev *hdev = conn->hdev; in hci_chan_del()
2741 BT_DBG("%s hcon %p chan %p", hdev->name, conn, chan); in hci_chan_del()
2743 list_del_rcu(&chan->list); in hci_chan_del()
2748 set_bit(HCI_CONN_DROP, &conn->flags); in hci_chan_del()
2752 skb_queue_purge(&chan->data_q); in hci_chan_del()
2762 list_for_each_entry_safe(chan, n, &conn->chan_list, list) in hci_chan_list_flush()
2771 list_for_each_entry(hchan, &hcon->chan_list, list) { in __hci_chan_lookup_handle()
2772 if (hchan->handle == handle) in __hci_chan_lookup_handle()
2781 struct hci_conn_hash *h = &hdev->conn_hash; in hci_chan_lookup_handle()
2787 list_for_each_entry_rcu(hcon, &h->list, list) { in hci_chan_lookup_handle()
2806 switch (conn->type) { in hci_conn_get_phy()
2808 /* SCO logical transport (1 Mb/s): in hci_conn_get_phy()
2821 if (conn->pkt_type & (HCI_DM3 | HCI_DH3)) in hci_conn_get_phy()
2824 if (conn->pkt_type & (HCI_DM5 | HCI_DH5)) in hci_conn_get_phy()
2828 * 2-DH1, 2-DH3 and 2-DH5. in hci_conn_get_phy()
2830 if (!(conn->pkt_type & HCI_2DH1)) in hci_conn_get_phy()
2833 if (!(conn->pkt_type & HCI_2DH3)) in hci_conn_get_phy()
2836 if (!(conn->pkt_type & HCI_2DH5)) in hci_conn_get_phy()
2840 * 3-DH1, 3-DH3 and 3-DH5. in hci_conn_get_phy()
2842 if (!(conn->pkt_type & HCI_3DH1)) in hci_conn_get_phy()
2845 if (!(conn->pkt_type & HCI_3DH3)) in hci_conn_get_phy()
2848 if (!(conn->pkt_type & HCI_3DH5)) in hci_conn_get_phy()
2857 if (!(conn->pkt_type & (ESCO_EV4 | ESCO_EV5))) in hci_conn_get_phy()
2860 /* eSCO logical transport (2 Mb/s): 2-EV3, 2-EV5 */ in hci_conn_get_phy()
2861 if (!(conn->pkt_type & ESCO_2EV3)) in hci_conn_get_phy()
2864 if (!(conn->pkt_type & ESCO_2EV5)) in hci_conn_get_phy()
2867 /* eSCO logical transport (3 Mb/s): 3-EV3, 3-EV5 */ in hci_conn_get_phy()
2868 if (!(conn->pkt_type & ESCO_3EV3)) in hci_conn_get_phy()
2871 if (!(conn->pkt_type & ESCO_3EV5)) in hci_conn_get_phy()
2877 if (conn->le_tx_phy & HCI_LE_SET_PHY_1M) in hci_conn_get_phy()
2880 if (conn->le_rx_phy & HCI_LE_SET_PHY_1M) in hci_conn_get_phy()
2883 if (conn->le_tx_phy & HCI_LE_SET_PHY_2M) in hci_conn_get_phy()
2886 if (conn->le_rx_phy & HCI_LE_SET_PHY_2M) in hci_conn_get_phy()
2889 if (conn->le_tx_phy & HCI_LE_SET_PHY_CODED) in hci_conn_get_phy()
2892 if (conn->le_rx_phy & HCI_LE_SET_PHY_CODED) in hci_conn_get_phy()
2910 return hci_abort_conn_sync(hdev, conn, conn->abort_reason); in abort_conn_sync()
2915 struct hci_dev *hdev = conn->hdev; in hci_abort_conn()
2920 if (conn->abort_reason) in hci_abort_conn()
2923 bt_dev_dbg(hdev, "handle 0x%2.2x reason 0x%2.2x", conn->handle, reason); in hci_abort_conn()
2925 conn->abort_reason = reason; in hci_abort_conn()
2934 if (conn->state == BT_CONNECT && hdev->req_status == HCI_REQ_PEND) { in hci_abort_conn()
2935 switch (hci_skb_event(hdev->sent_cmd)) { in hci_abort_conn()
2944 return hci_cmd_sync_queue(hdev, abort_conn_sync, UINT_PTR(conn->handle), in hci_abort_conn()