Lines Matching +full:unlock +full:- +full:keys
2 BlueZ - Bluetooth protocol stack for Linux
5 Copyright (C) 2011-2012 Intel Corporation
291 case -EPERM: in mgmt_errno_status()
293 case -EINVAL: in mgmt_errno_status()
295 case -EOPNOTSUPP: in mgmt_errno_status()
297 case -EBUSY: in mgmt_errno_status()
299 case -ETIMEDOUT: in mgmt_errno_status()
301 case -ENOMEM: in mgmt_errno_status()
303 case -EISCONN: in mgmt_errno_status()
305 case -ENOTCONN: in mgmt_errno_status()
362 rp->version = MGMT_VERSION; in mgmt_fill_version_info()
363 rp->revision = cpu_to_le16(MGMT_REVISION); in mgmt_fill_version_info()
401 return -ENOMEM; in read_commands()
403 rp->num_commands = cpu_to_le16(num_commands); in read_commands()
404 rp->num_events = cpu_to_le16(num_events); in read_commands()
407 __le16 *opcode = rp->opcodes; in read_commands()
415 __le16 *opcode = rp->opcodes; in read_commands()
454 return -ENOMEM; in read_index_list()
464 /* Devices marked as raw-only are neither configured in read_index_list()
467 if (test_bit(HCI_QUIRK_RAW_DEVICE, &d->quirks)) in read_index_list()
471 rp->index[count++] = cpu_to_le16(d->id); in read_index_list()
472 bt_dev_dbg(hdev, "Added hci%u", d->id); in read_index_list()
476 rp->num_controllers = cpu_to_le16(count); in read_index_list()
512 return -ENOMEM; in read_unconf_index_list()
522 /* Devices marked as raw-only are neither configured in read_unconf_index_list()
525 if (test_bit(HCI_QUIRK_RAW_DEVICE, &d->quirks)) in read_unconf_index_list()
529 rp->index[count++] = cpu_to_le16(d->id); in read_unconf_index_list()
530 bt_dev_dbg(hdev, "Added hci%u", d->id); in read_unconf_index_list()
534 rp->num_controllers = cpu_to_le16(count); in read_unconf_index_list()
566 return -ENOMEM; in read_ext_index_list()
576 /* Devices marked as raw-only are neither configured in read_ext_index_list()
579 if (test_bit(HCI_QUIRK_RAW_DEVICE, &d->quirks)) in read_ext_index_list()
583 rp->entry[count].type = 0x01; in read_ext_index_list()
585 rp->entry[count].type = 0x00; in read_ext_index_list()
587 rp->entry[count].bus = d->bus; in read_ext_index_list()
588 rp->entry[count++].index = cpu_to_le16(d->id); in read_ext_index_list()
589 bt_dev_dbg(hdev, "Added hci%u", d->id); in read_ext_index_list()
592 rp->num_controllers = cpu_to_le16(count); in read_ext_index_list()
615 if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) && in is_configured()
619 if ((test_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks) || in is_configured()
620 test_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks)) && in is_configured()
621 !bacmp(&hdev->public_addr, BDADDR_ANY)) in is_configured()
631 if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) && in get_missing_options()
635 if ((test_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks) || in get_missing_options()
636 test_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks)) && in get_missing_options()
637 !bacmp(&hdev->public_addr, BDADDR_ANY)) in get_missing_options()
655 return mgmt_cmd_complete(sk, hdev->id, opcode, 0, &options, in send_options_rsp()
670 rp.manufacturer = cpu_to_le16(hdev->manufacturer); in read_config_info()
672 if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks)) in read_config_info()
675 if (hdev->set_bdaddr) in read_config_info()
683 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_CONFIG_INFO, 0, in read_config_info()
694 if (hdev->features[0][0] & LMP_3SLOT) in get_supported_phys()
697 if (hdev->features[0][0] & LMP_5SLOT) in get_supported_phys()
725 if (hdev->le_features[1] & HCI_LE_PHY_2M) { in get_supported_phys()
730 if (hdev->le_features[1] & HCI_LE_PHY_CODED) { in get_supported_phys()
746 if (hdev->pkt_type & (HCI_DM3 | HCI_DH3)) in get_selected_phys()
749 if (hdev->pkt_type & (HCI_DM5 | HCI_DH5)) in get_selected_phys()
753 if (!(hdev->pkt_type & HCI_2DH1)) in get_selected_phys()
757 !(hdev->pkt_type & HCI_2DH3)) in get_selected_phys()
761 !(hdev->pkt_type & HCI_2DH5)) in get_selected_phys()
765 if (!(hdev->pkt_type & HCI_3DH1)) in get_selected_phys()
769 !(hdev->pkt_type & HCI_3DH3)) in get_selected_phys()
773 !(hdev->pkt_type & HCI_3DH5)) in get_selected_phys()
780 if (hdev->le_tx_def_phys & HCI_LE_SET_PHY_1M) in get_selected_phys()
783 if (hdev->le_rx_def_phys & HCI_LE_SET_PHY_1M) in get_selected_phys()
786 if (hdev->le_tx_def_phys & HCI_LE_SET_PHY_2M) in get_selected_phys()
789 if (hdev->le_rx_def_phys & HCI_LE_SET_PHY_2M) in get_selected_phys()
792 if (hdev->le_tx_def_phys & HCI_LE_SET_PHY_CODED) in get_selected_phys()
795 if (hdev->le_rx_def_phys & HCI_LE_SET_PHY_CODED) in get_selected_phys()
819 if (hdev->hci_ver >= BLUETOOTH_VER_1_2) in get_supported_settings()
832 &hdev->quirks)) in get_supported_settings()
844 if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) || in get_supported_settings()
845 hdev->set_bdaddr) in get_supported_settings()
910 * For single mode LE only controllers and dual-mode controllers in get_current_settings()
916 !bacmp(&hdev->bdaddr, BDADDR_ANY)) { in get_current_settings()
917 if (bacmp(&hdev->static_addr, BDADDR_ANY)) in get_current_settings()
953 struct mgmt_mode *cp = cmd->param; in mgmt_get_adv_discov_flags()
954 if (cp->val == 0x01) in mgmt_get_adv_discov_flags()
956 else if (cp->val == 0x02) in mgmt_get_adv_discov_flags()
977 struct mgmt_mode *cp = cmd->param; in mgmt_get_connectable()
979 return cp->val; in mgmt_get_connectable()
1011 return hci_start_ext_adv_sync(hdev, hdev->cur_adv_instance); in rpa_expired_sync()
1049 hdev->discov_timeout = 0; in discov_off()
1063 u8 handle = mesh_tx->handle; in mesh_send_complete()
1077 if (list_empty(&hdev->adv_instances)) in mesh_send_done_sync()
1123 INIT_DELAYED_WORK(&hdev->discov_off, discov_off); in mgmt_init_hdev()
1124 INIT_DELAYED_WORK(&hdev->service_cache, service_cache_off); in mgmt_init_hdev()
1125 INIT_DELAYED_WORK(&hdev->rpa_expired, rpa_expired); in mgmt_init_hdev()
1126 INIT_DELAYED_WORK(&hdev->mesh_send_done, mesh_send_done); in mgmt_init_hdev()
1128 /* Non-mgmt controlled devices get this bit set in mgmt_init_hdev()
1130 * for mgmt we require user-space to explicitly enable in mgmt_init_hdev()
1149 bacpy(&rp.bdaddr, &hdev->bdaddr); in read_controller_info()
1151 rp.version = hdev->hci_ver; in read_controller_info()
1152 rp.manufacturer = cpu_to_le16(hdev->manufacturer); in read_controller_info()
1157 memcpy(rp.dev_class, hdev->dev_class, 3); in read_controller_info()
1159 memcpy(rp.name, hdev->dev_name, sizeof(hdev->dev_name)); in read_controller_info()
1160 memcpy(rp.short_name, hdev->short_name, sizeof(hdev->short_name)); in read_controller_info()
1164 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_INFO, 0, &rp, in read_controller_info()
1175 hdev->dev_class, 3); in append_eir_data_to_buf()
1179 hdev->appearance); in append_eir_data_to_buf()
1181 name_len = strnlen(hdev->dev_name, sizeof(hdev->dev_name)); in append_eir_data_to_buf()
1183 hdev->dev_name, name_len); in append_eir_data_to_buf()
1185 name_len = strnlen(hdev->short_name, sizeof(hdev->short_name)); in append_eir_data_to_buf()
1187 hdev->short_name, name_len); in append_eir_data_to_buf()
1205 bacpy(&rp->bdaddr, &hdev->bdaddr); in read_ext_controller_info()
1207 rp->version = hdev->hci_ver; in read_ext_controller_info()
1208 rp->manufacturer = cpu_to_le16(hdev->manufacturer); in read_ext_controller_info()
1210 rp->supported_settings = cpu_to_le32(get_supported_settings(hdev)); in read_ext_controller_info()
1211 rp->current_settings = cpu_to_le32(get_current_settings(hdev)); in read_ext_controller_info()
1214 eir_len = append_eir_data_to_buf(hdev, rp->eir); in read_ext_controller_info()
1215 rp->eir_len = cpu_to_le16(eir_len); in read_ext_controller_info()
1228 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_EXT_INFO, 0, rp, in read_ext_controller_info()
1240 eir_len = append_eir_data_to_buf(hdev, ev->eir); in ext_info_changed()
1241 ev->eir_len = cpu_to_le16(eir_len); in ext_info_changed()
1252 return mgmt_cmd_complete(sk, hdev->id, opcode, 0, &settings, in send_settings_rsp()
1277 if (hdev->adv_instance_timeout) { in cancel_adv_timeout()
1278 hdev->adv_instance_timeout = 0; in cancel_adv_timeout()
1279 cancel_delayed_work(&hdev->adv_instance_expire); in cancel_adv_timeout()
1283 /* This function requires the caller holds hdev->lock */
1288 list_for_each_entry(p, &hdev->le_conn_params, list) { in restart_le_actions()
1294 switch (p->auto_connect) { in restart_le_actions()
1297 hci_pend_le_list_add(p, &hdev->pend_le_conns); in restart_le_actions()
1300 hci_pend_le_list_add(p, &hdev->pend_le_reports); in restart_le_actions()
1322 if (err == -ECANCELED || in mgmt_set_powered_complete()
1326 cp = cmd->param; in mgmt_set_powered_complete()
1331 if (cp->val) { in mgmt_set_powered_complete()
1338 send_settings_rsp(cmd->sk, cmd->opcode, hdev); in mgmt_set_powered_complete()
1341 * to hdev->power_off work which does call hci_dev_do_close. in mgmt_set_powered_complete()
1343 if (cp->val) in mgmt_set_powered_complete()
1344 new_settings(hdev, cmd->sk); in mgmt_set_powered_complete()
1346 mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_POWERED, in mgmt_set_powered_complete()
1360 return -ECANCELED; in set_powered_sync()
1362 cp = cmd->param; in set_powered_sync()
1364 BT_DBG("%s", hdev->name); in set_powered_sync()
1366 return hci_set_powered_sync(hdev, cp->val); in set_powered_sync()
1378 if (cp->val != 0x00 && cp->val != 0x01) in set_powered()
1379 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED, in set_powered()
1385 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED, in set_powered()
1390 if (!!cp->val == hdev_is_powered(hdev)) { in set_powered()
1397 err = -ENOMEM; in set_powered()
1402 if (cp->val == 0x00) { in set_powered()
1403 hci_cmd_sync_cancel_sync(hdev, -EHOSTDOWN); in set_powered()
1435 send_settings_rsp(cmd->sk, cmd->opcode, match->hdev); in settings_rsp()
1437 if (match->sk == NULL) { in settings_rsp()
1438 match->sk = cmd->sk; in settings_rsp()
1439 sock_hold(match->sk); in settings_rsp()
1447 mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, *status); in cmd_status_rsp()
1457 hci_cmd_sync_dequeue(match->hdev, NULL, cmd, NULL); in cmd_complete_rsp()
1459 if (cmd->cmd_complete) { in cmd_complete_rsp()
1460 cmd->cmd_complete(cmd, match->mgmt_status); in cmd_complete_rsp()
1469 return mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, status, in generic_cmd_complete()
1470 cmd->param, cmd->param_len); in generic_cmd_complete()
1475 return mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, status, in addr_cmd_complete()
1476 cmd->param, sizeof(struct mgmt_addr_info)); in addr_cmd_complete()
1507 if (err == -ECANCELED || in mgmt_set_discoverable_complete()
1515 mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_err); in mgmt_set_discoverable_complete()
1521 hdev->discov_timeout > 0) { in mgmt_set_discoverable_complete()
1522 int to = msecs_to_jiffies(hdev->discov_timeout * 1000); in mgmt_set_discoverable_complete()
1523 queue_delayed_work(hdev->req_workqueue, &hdev->discov_off, to); in mgmt_set_discoverable_complete()
1526 send_settings_rsp(cmd->sk, MGMT_OP_SET_DISCOVERABLE, hdev); in mgmt_set_discoverable_complete()
1527 new_settings(hdev, cmd->sk); in mgmt_set_discoverable_complete()
1536 BT_DBG("%s", hdev->name); in set_discoverable_sync()
1553 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1556 if (cp->val != 0x00 && cp->val != 0x01 && cp->val != 0x02) in set_discoverable()
1557 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1560 timeout = __le16_to_cpu(cp->timeout); in set_discoverable()
1565 if ((cp->val == 0x00 && timeout > 0) || in set_discoverable()
1566 (cp->val == 0x02 && timeout == 0)) in set_discoverable()
1567 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1573 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1580 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1586 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1591 if (hdev->advertising_paused) { in set_discoverable()
1592 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1604 if (!!cp->val != hci_dev_test_flag(hdev, HCI_DISCOVERABLE)) { in set_discoverable()
1623 if (!!cp->val == hci_dev_test_flag(hdev, HCI_DISCOVERABLE) && in set_discoverable()
1624 (cp->val == 0x02) == hci_dev_test_flag(hdev, in set_discoverable()
1626 cancel_delayed_work(&hdev->discov_off); in set_discoverable()
1627 hdev->discov_timeout = timeout; in set_discoverable()
1629 if (cp->val && hdev->discov_timeout > 0) { in set_discoverable()
1630 int to = msecs_to_jiffies(hdev->discov_timeout * 1000); in set_discoverable()
1631 queue_delayed_work(hdev->req_workqueue, in set_discoverable()
1632 &hdev->discov_off, to); in set_discoverable()
1641 err = -ENOMEM; in set_discoverable()
1649 cancel_delayed_work(&hdev->discov_off); in set_discoverable()
1650 hdev->discov_timeout = timeout; in set_discoverable()
1652 if (cp->val) in set_discoverable()
1658 if (cp->val == 0x02) in set_discoverable()
1682 if (err == -ECANCELED || in mgmt_set_connectable_complete()
1690 mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_err); in mgmt_set_connectable_complete()
1694 send_settings_rsp(cmd->sk, MGMT_OP_SET_CONNECTABLE, hdev); in mgmt_set_connectable_complete()
1695 new_settings(hdev, cmd->sk); in mgmt_set_connectable_complete()
1735 BT_DBG("%s", hdev->name); in set_connectable_sync()
1751 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE, in set_connectable()
1754 if (cp->val != 0x00 && cp->val != 0x01) in set_connectable()
1755 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE, in set_connectable()
1761 err = set_connectable_update_settings(hdev, sk, cp->val); in set_connectable()
1767 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE, in set_connectable()
1774 err = -ENOMEM; in set_connectable()
1778 if (cp->val) { in set_connectable()
1781 if (hdev->discov_timeout > 0) in set_connectable()
1782 cancel_delayed_work(&hdev->discov_off); in set_connectable()
1809 if (cp->val != 0x00 && cp->val != 0x01) in set_bondable()
1810 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BONDABLE, in set_bondable()
1815 if (cp->val) in set_bondable()
1822 goto unlock; in set_bondable()
1833 unlock: in set_bondable()
1850 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY, in set_link_security()
1853 if (cp->val != 0x00 && cp->val != 0x01) in set_link_security()
1854 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY, in set_link_security()
1862 if (!!cp->val != hci_dev_test_flag(hdev, HCI_LINK_SECURITY)) { in set_link_security()
1878 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY, in set_link_security()
1883 val = !!cp->val; in set_link_security()
1885 if (test_bit(HCI_AUTH, &hdev->flags) == val) { in set_link_security()
1892 err = -ENOMEM; in set_link_security()
1911 struct mgmt_mode *cp = cmd->param; in set_ssp_complete()
1912 u8 enable = cp->val; in set_ssp_complete()
1916 if (err == -ECANCELED || cmd != pending_find(MGMT_OP_SET_SSP, hdev)) in set_ssp_complete()
1952 struct mgmt_mode *cp = cmd->param; in set_ssp_sync()
1956 if (cp->val) in set_ssp_sync()
1959 err = hci_write_ssp_mode_sync(hdev, cp->val); in set_ssp_sync()
1978 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP, status); in set_ssp()
1981 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP, in set_ssp()
1984 if (cp->val != 0x00 && cp->val != 0x01) in set_ssp()
1985 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP, in set_ssp()
1993 if (cp->val) { in set_ssp()
2012 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP, in set_ssp()
2017 if (!!cp->val == hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) { in set_ssp()
2024 err = -ENOMEM; in set_ssp()
2030 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP, in set_ssp()
2046 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, in set_hs()
2074 struct mgmt_mode *cp = cmd->param; in set_le_sync()
2075 u8 val = !!cp->val; in set_le_sync()
2085 hci_remove_ext_adv_instance_sync(hdev, 0, cmd->sk); in set_le_sync()
2119 struct sock *sk = cmd->sk; in set_mesh_complete()
2128 mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_MESH_RECEIVER, 0, NULL, 0); in set_mesh_complete()
2134 struct mgmt_cp_set_mesh *cp = cmd->param; in set_mesh_sync()
2135 size_t len = cmd->param_len; in set_mesh_sync()
2137 memset(hdev->mesh_ad_types, 0, sizeof(hdev->mesh_ad_types)); in set_mesh_sync()
2139 if (cp->enable) in set_mesh_sync()
2144 hdev->le_scan_interval = __le16_to_cpu(cp->period); in set_mesh_sync()
2145 hdev->le_scan_window = __le16_to_cpu(cp->window); in set_mesh_sync()
2147 len -= sizeof(*cp); in set_mesh_sync()
2150 if (len <= sizeof(hdev->mesh_ad_types)) in set_mesh_sync()
2151 memcpy(hdev->mesh_ad_types, cp->ad_types, len); in set_mesh_sync()
2168 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_MESH_RECEIVER, in set_mesh()
2171 if (cp->enable != 0x00 && cp->enable != 0x01) in set_mesh()
2172 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_MESH_RECEIVER, in set_mesh()
2176 period = __le16_to_cpu(cp->period); in set_mesh()
2179 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_MESH_RECEIVER, in set_mesh()
2182 window = __le16_to_cpu(cp->window); in set_mesh()
2185 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_MESH_RECEIVER, in set_mesh()
2189 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_MESH_RECEIVER, in set_mesh()
2196 err = -ENOMEM; in set_mesh()
2202 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_MESH_RECEIVER, in set_mesh()
2216 struct mgmt_cp_mesh_send *send = (void *)mesh_tx->param; in mesh_send_start_complete()
2229 mesh_send_interval = msecs_to_jiffies((send->cnt) * 25); in mesh_send_start_complete()
2230 queue_delayed_work(hdev->req_workqueue, &hdev->mesh_send_done, in mesh_send_start_complete()
2237 struct mgmt_cp_mesh_send *send = (void *)mesh_tx->param; in mesh_send_sync()
2239 u8 instance = hdev->le_num_of_adv_sets + 1; in mesh_send_sync()
2243 if (hdev->le_num_of_adv_sets <= hdev->adv_instance_cnt) in mesh_send_sync()
2247 duration = send->cnt * INTERVAL_TO_MS(hdev->le_adv_max_interval); in mesh_send_sync()
2249 send->adv_data_len, send->adv_data, in mesh_send_sync()
2253 hdev->le_adv_min_interval, in mesh_send_sync()
2254 hdev->le_adv_max_interval, in mesh_send_sync()
2255 mesh_tx->handle); in mesh_send_sync()
2258 mesh_tx->instance = instance; in mesh_send_sync()
2262 if (hdev->cur_adv_instance == instance) { in mesh_send_sync()
2272 instance = next_instance->instance; in mesh_send_sync()
2275 } else if (hdev->adv_instance_timeout) { in mesh_send_sync()
2292 if (rp->used_handles >= rp->max_handles) in send_count()
2295 rp->handles[rp->used_handles++] = mesh_tx->handle; in send_count()
2305 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_MESH_READ_FEATURES, in mesh_features()
2309 rp.index = cpu_to_le16(hdev->id); in mesh_features()
2318 mgmt_cmd_complete(sk, hdev->id, MGMT_OP_MESH_READ_FEATURES, 0, &rp, in mesh_features()
2319 rp.used_handles + sizeof(rp) - MESH_HANDLES_MAX); in mesh_features()
2328 struct mgmt_cp_mesh_send_cancel *cancel = (void *)cmd->param; in send_cancel()
2331 if (!cancel->handle) { in send_cancel()
2333 mesh_tx = mgmt_mesh_next(hdev, cmd->sk); in send_cancel()
2339 mesh_tx = mgmt_mesh_find(hdev, cancel->handle); in send_cancel()
2341 if (mesh_tx && mesh_tx->sk == cmd->sk) in send_cancel()
2345 mgmt_cmd_complete(cmd->sk, hdev->id, MGMT_OP_MESH_SEND_CANCEL, in send_cancel()
2360 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_MESH_SEND_CANCEL, in mesh_send_cancel()
2364 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_MESH_SEND_CANCEL, in mesh_send_cancel()
2370 err = -ENOMEM; in mesh_send_cancel()
2375 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_MESH_SEND_CANCEL, in mesh_send_cancel()
2396 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_MESH_SEND, in mesh_send()
2401 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_MESH_SEND, in mesh_send()
2412 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_MESH_SEND, in mesh_send()
2421 err = -ENOMEM; in mesh_send()
2428 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_MESH_SEND, in mesh_send()
2438 mgmt_cmd_complete(sk, hdev->id, MGMT_OP_MESH_SEND, 0, in mesh_send()
2439 &mesh_tx->handle, 1); in mesh_send()
2457 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE, in set_le()
2460 if (cp->val != 0x00 && cp->val != 0x01) in set_le()
2461 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE, in set_le()
2464 /* Bluetooth single mode LE only controllers or dual-mode in set_le()
2474 if (cp->val == 0x01) in set_le()
2477 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE, in set_le()
2483 val = !!cp->val; in set_le()
2501 goto unlock; in set_le()
2506 goto unlock; in set_le()
2511 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE, in set_le()
2513 goto unlock; in set_le()
2518 err = -ENOMEM; in set_le()
2524 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE, in set_le()
2531 unlock: in set_le()
2546 list_for_each_entry(cmd, &hdev->mgmt_pending, list) { in pending_eir_or_class()
2547 switch (cmd->opcode) { in pending_eir_or_class()
2584 mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, in mgmt_class_complete()
2585 mgmt_status(err), hdev->dev_class, 3); in mgmt_class_complete()
2613 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_UUID, in add_uuid()
2620 err = -ENOMEM; in add_uuid()
2624 memcpy(uuid->uuid, cp->uuid, 16); in add_uuid()
2625 uuid->svc_hint = cp->svc_hint; in add_uuid()
2626 uuid->size = get_uuid_size(cp->uuid); in add_uuid()
2628 list_add_tail(&uuid->list, &hdev->uuids); in add_uuid()
2632 err = -ENOMEM; in add_uuid()
2657 queue_delayed_work(hdev->workqueue, &hdev->service_cache, in enable_service_cache()
2692 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID, in remove_uuid()
2694 goto unlock; in remove_uuid()
2697 if (memcmp(cp->uuid, bt_uuid_any, 16) == 0) { in remove_uuid()
2701 err = mgmt_cmd_complete(sk, hdev->id, in remove_uuid()
2703 0, hdev->dev_class, 3); in remove_uuid()
2704 goto unlock; in remove_uuid()
2712 list_for_each_entry_safe(match, tmp, &hdev->uuids, list) { in remove_uuid()
2713 if (memcmp(match->uuid, cp->uuid, 16) != 0) in remove_uuid()
2716 list_del(&match->list); in remove_uuid()
2722 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID, in remove_uuid()
2724 goto unlock; in remove_uuid()
2730 err = -ENOMEM; in remove_uuid()
2731 goto unlock; in remove_uuid()
2742 unlock: in remove_uuid()
2752 cancel_delayed_work_sync(&hdev->service_cache); in set_class_sync()
2772 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, in set_dev_class()
2778 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, in set_dev_class()
2780 goto unlock; in set_dev_class()
2783 if ((cp->minor & 0x03) != 0 || (cp->major & 0xe0) != 0) { in set_dev_class()
2784 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, in set_dev_class()
2786 goto unlock; in set_dev_class()
2789 hdev->major_class = cp->major; in set_dev_class()
2790 hdev->minor_class = cp->minor; in set_dev_class()
2793 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0, in set_dev_class()
2794 hdev->dev_class, 3); in set_dev_class()
2795 goto unlock; in set_dev_class()
2800 err = -ENOMEM; in set_dev_class()
2801 goto unlock; in set_dev_class()
2812 unlock: in set_dev_class()
2821 const u16 max_key_count = ((U16_MAX - sizeof(*cp)) / in load_link_keys()
2830 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, in load_link_keys()
2833 key_count = __le16_to_cpu(cp->key_count); in load_link_keys()
2837 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, in load_link_keys()
2841 expected_len = struct_size(cp, keys, key_count); in load_link_keys()
2845 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, in load_link_keys()
2849 if (cp->debug_keys != 0x00 && cp->debug_keys != 0x01) in load_link_keys()
2850 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, in load_link_keys()
2853 bt_dev_dbg(hdev, "debug_keys %u key_count %u", cp->debug_keys, in load_link_keys()
2860 if (cp->debug_keys) in load_link_keys()
2870 struct mgmt_link_key_info *key = &cp->keys[i]; in load_link_keys()
2874 key->val)) { in load_link_keys()
2876 &key->addr.bdaddr); in load_link_keys()
2880 if (key->addr.type != BDADDR_BREDR) { in load_link_keys()
2883 key->addr.type, &key->addr.bdaddr); in load_link_keys()
2887 if (key->type > 0x08) { in load_link_keys()
2889 key->type, &key->addr.bdaddr); in load_link_keys()
2893 /* Always ignore debug keys and require a new pairing if in load_link_keys()
2896 if (key->type == HCI_LK_DEBUG_COMBINATION) in load_link_keys()
2899 hci_add_link_key(hdev, NULL, &key->addr.bdaddr, key->val, in load_link_keys()
2900 key->type, key->pin_len, NULL); in load_link_keys()
2903 mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, 0, NULL, 0); in load_link_keys()
2925 struct mgmt_cp_unpair_device *cp = cmd->param; in unpair_device_complete()
2928 device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, cmd->sk); in unpair_device_complete()
2930 cmd->cmd_complete(cmd, err); in unpair_device_complete()
2937 struct mgmt_cp_unpair_device *cp = cmd->param; in unpair_device_sync()
2940 if (cp->addr.type == BDADDR_BREDR) in unpair_device_sync()
2942 &cp->addr.bdaddr); in unpair_device_sync()
2944 conn = hci_conn_hash_lookup_le(hdev, &cp->addr.bdaddr, in unpair_device_sync()
2945 le_addr_type(cp->addr.type)); in unpair_device_sync()
2970 bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr); in unpair_device()
2971 rp.addr.type = cp->addr.type; in unpair_device()
2973 if (!bdaddr_type_is_valid(cp->addr.type)) in unpair_device()
2974 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, in unpair_device()
2978 if (cp->disconnect != 0x00 && cp->disconnect != 0x01) in unpair_device()
2979 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, in unpair_device()
2986 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, in unpair_device()
2989 goto unlock; in unpair_device()
2992 if (cp->addr.type == BDADDR_BREDR) { in unpair_device()
3000 if (cp->disconnect) in unpair_device()
3002 &cp->addr.bdaddr); in unpair_device()
3006 err = hci_remove_link_key(hdev, &cp->addr.bdaddr); in unpair_device()
3008 err = mgmt_cmd_complete(sk, hdev->id, in unpair_device()
3012 goto unlock; in unpair_device()
3019 addr_type = le_addr_type(cp->addr.type); in unpair_device()
3022 err = smp_cancel_and_remove_pairing(hdev, &cp->addr.bdaddr, addr_type); in unpair_device()
3024 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, in unpair_device()
3027 goto unlock; in unpair_device()
3030 conn = hci_conn_hash_lookup_le(hdev, &cp->addr.bdaddr, addr_type); in unpair_device()
3032 hci_conn_params_del(hdev, &cp->addr.bdaddr, addr_type); in unpair_device()
3040 set_bit(HCI_CONN_PARAM_REMOVAL_PEND, &conn->flags); in unpair_device()
3042 /* Disable auto-connection parameters if present */ in unpair_device()
3043 params = hci_conn_params_lookup(hdev, &cp->addr.bdaddr, addr_type); in unpair_device()
3045 if (params->explicit_connect) in unpair_device()
3046 params->auto_connect = HCI_AUTO_CONN_EXPLICIT; in unpair_device()
3048 params->auto_connect = HCI_AUTO_CONN_DISABLED; in unpair_device()
3054 if (!cp->disconnect) in unpair_device()
3062 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, 0, in unpair_device()
3064 device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, sk); in unpair_device()
3065 goto unlock; in unpair_device()
3071 err = -ENOMEM; in unpair_device()
3072 goto unlock; in unpair_device()
3075 cmd->cmd_complete = addr_cmd_complete; in unpair_device()
3082 unlock: in unpair_device()
3091 cmd->cmd_complete(cmd, mgmt_status(err)); in disconnect_complete()
3098 struct mgmt_cp_disconnect *cp = cmd->param; in disconnect_sync()
3101 if (cp->addr.type == BDADDR_BREDR) in disconnect_sync()
3103 &cp->addr.bdaddr); in disconnect_sync()
3105 conn = hci_conn_hash_lookup_le(hdev, &cp->addr.bdaddr, in disconnect_sync()
3106 le_addr_type(cp->addr.type)); in disconnect_sync()
3109 return -ENOTCONN; in disconnect_sync()
3130 bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr); in disconnect()
3131 rp.addr.type = cp->addr.type; in disconnect()
3133 if (!bdaddr_type_is_valid(cp->addr.type)) in disconnect()
3134 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT, in disconnect()
3140 if (!test_bit(HCI_UP, &hdev->flags)) { in disconnect()
3141 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT, in disconnect()
3149 err = -ENOMEM; in disconnect()
3153 cmd->cmd_complete = generic_cmd_complete; in disconnect()
3198 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_GET_CONNECTIONS, in get_connections()
3200 goto unlock; in get_connections()
3204 list_for_each_entry(c, &hdev->conn_hash.list, list) { in get_connections()
3205 if (test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags)) in get_connections()
3211 err = -ENOMEM; in get_connections()
3212 goto unlock; in get_connections()
3216 list_for_each_entry(c, &hdev->conn_hash.list, list) { in get_connections()
3217 if (!test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags)) in get_connections()
3219 bacpy(&rp->addr[i].bdaddr, &c->dst); in get_connections()
3220 rp->addr[i].type = link_to_bdaddr(c->type, c->dst_type); in get_connections()
3221 if (c->type == SCO_LINK || c->type == ESCO_LINK) in get_connections()
3226 rp->conn_count = cpu_to_le16(i); in get_connections()
3229 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONNECTIONS, 0, rp, in get_connections()
3234 unlock: in get_connections()
3248 return -ENOMEM; in send_pin_code_neg_reply()
3250 cmd->cmd_complete = addr_cmd_complete; in send_pin_code_neg_reply()
3253 sizeof(cp->addr.bdaddr), &cp->addr.bdaddr); in send_pin_code_neg_reply()
3274 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY, in pin_code_reply()
3279 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->addr.bdaddr); in pin_code_reply()
3281 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY, in pin_code_reply()
3286 if (conn->pending_sec_level == BT_SECURITY_HIGH && cp->pin_len != 16) { in pin_code_reply()
3289 memcpy(&ncp.addr, &cp->addr, sizeof(ncp.addr)); in pin_code_reply()
3295 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY, in pin_code_reply()
3303 err = -ENOMEM; in pin_code_reply()
3307 cmd->cmd_complete = addr_cmd_complete; in pin_code_reply()
3309 bacpy(&reply.bdaddr, &cp->addr.bdaddr); in pin_code_reply()
3310 reply.pin_len = cp->pin_len; in pin_code_reply()
3311 memcpy(reply.pin_code, cp->pin_code, sizeof(reply.pin_code)); in pin_code_reply()
3329 if (cp->io_capability > SMP_IO_KEYBOARD_DISPLAY) in set_io_capability()
3330 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_IO_CAPABILITY, in set_io_capability()
3335 hdev->io_capability = cp->io_capability; in set_io_capability()
3337 bt_dev_dbg(hdev, "IO capability set to 0x%02x", hdev->io_capability); in set_io_capability()
3341 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_IO_CAPABILITY, 0, in set_io_capability()
3347 struct hci_dev *hdev = conn->hdev; in find_pairing()
3350 list_for_each_entry(cmd, &hdev->mgmt_pending, list) { in find_pairing()
3351 if (cmd->opcode != MGMT_OP_PAIR_DEVICE) in find_pairing()
3354 if (cmd->user_data != conn) in find_pairing()
3366 struct hci_conn *conn = cmd->user_data; in pairing_complete()
3369 bacpy(&rp.addr.bdaddr, &conn->dst); in pairing_complete()
3370 rp.addr.type = link_to_bdaddr(conn->type, conn->dst_type); in pairing_complete()
3372 err = mgmt_cmd_complete(cmd->sk, cmd->hdev->id, MGMT_OP_PAIR_DEVICE, in pairing_complete()
3376 conn->connect_cfm_cb = NULL; in pairing_complete()
3377 conn->security_cfm_cb = NULL; in pairing_complete()
3378 conn->disconn_cfm_cb = NULL; in pairing_complete()
3385 clear_bit(HCI_CONN_PARAM_REMOVAL_PEND, &conn->flags); in pairing_complete()
3399 cmd->cmd_complete(cmd, status); in mgmt_smp_complete()
3416 cmd->cmd_complete(cmd, mgmt_status(status)); in pairing_complete_cb()
3435 cmd->cmd_complete(cmd, mgmt_status(status)); in le_pairing_complete_cb()
3452 bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr); in pair_device()
3453 rp.addr.type = cp->addr.type; in pair_device()
3455 if (!bdaddr_type_is_valid(cp->addr.type)) in pair_device()
3456 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE, in pair_device()
3460 if (cp->io_cap > SMP_IO_KEYBOARD_DISPLAY) in pair_device()
3461 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE, in pair_device()
3468 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE, in pair_device()
3471 goto unlock; in pair_device()
3474 if (hci_bdaddr_is_paired(hdev, &cp->addr.bdaddr, cp->addr.type)) { in pair_device()
3475 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE, in pair_device()
3478 goto unlock; in pair_device()
3484 if (cp->addr.type == BDADDR_BREDR) { in pair_device()
3485 conn = hci_connect_acl(hdev, &cp->addr.bdaddr, sec_level, in pair_device()
3488 u8 addr_type = le_addr_type(cp->addr.type); in pair_device()
3500 p = hci_conn_params_add(hdev, &cp->addr.bdaddr, addr_type); in pair_device()
3502 err = -EIO; in pair_device()
3503 goto unlock; in pair_device()
3506 if (p->auto_connect == HCI_AUTO_CONN_EXPLICIT) in pair_device()
3507 p->auto_connect = HCI_AUTO_CONN_DISABLED; in pair_device()
3509 conn = hci_connect_le_scan(hdev, &cp->addr.bdaddr, addr_type, in pair_device()
3517 if (PTR_ERR(conn) == -EBUSY) in pair_device()
3519 else if (PTR_ERR(conn) == -EOPNOTSUPP) in pair_device()
3521 else if (PTR_ERR(conn) == -ECONNREFUSED) in pair_device()
3526 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE, in pair_device()
3528 goto unlock; in pair_device()
3531 if (conn->connect_cfm_cb) { in pair_device()
3533 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE, in pair_device()
3535 goto unlock; in pair_device()
3540 err = -ENOMEM; in pair_device()
3542 goto unlock; in pair_device()
3545 cmd->cmd_complete = pairing_complete; in pair_device()
3548 if (cp->addr.type == BDADDR_BREDR) { in pair_device()
3549 conn->connect_cfm_cb = pairing_complete_cb; in pair_device()
3550 conn->security_cfm_cb = pairing_complete_cb; in pair_device()
3551 conn->disconn_cfm_cb = pairing_complete_cb; in pair_device()
3553 conn->connect_cfm_cb = le_pairing_complete_cb; in pair_device()
3554 conn->security_cfm_cb = le_pairing_complete_cb; in pair_device()
3555 conn->disconn_cfm_cb = le_pairing_complete_cb; in pair_device()
3558 conn->io_capability = cp->io_cap; in pair_device()
3559 cmd->user_data = hci_conn_get(conn); in pair_device()
3561 if ((conn->state == BT_CONNECTED || conn->state == BT_CONFIG) && in pair_device()
3563 cmd->cmd_complete(cmd, 0); in pair_device()
3569 unlock: in pair_device()
3587 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, in cancel_pair_device()
3589 goto unlock; in cancel_pair_device()
3594 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, in cancel_pair_device()
3596 goto unlock; in cancel_pair_device()
3599 conn = cmd->user_data; in cancel_pair_device()
3601 if (bacmp(&addr->bdaddr, &conn->dst) != 0) { in cancel_pair_device()
3602 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, in cancel_pair_device()
3604 goto unlock; in cancel_pair_device()
3607 cmd->cmd_complete(cmd, MGMT_STATUS_CANCELLED); in cancel_pair_device()
3610 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, 0, in cancel_pair_device()
3617 if (addr->type == BDADDR_BREDR) in cancel_pair_device()
3618 hci_remove_link_key(hdev, &addr->bdaddr); in cancel_pair_device()
3620 smp_cancel_and_remove_pairing(hdev, &addr->bdaddr, in cancel_pair_device()
3621 le_addr_type(addr->type)); in cancel_pair_device()
3623 if (conn->conn_reason == CONN_REASON_PAIR_DEVICE) in cancel_pair_device()
3626 unlock: in cancel_pair_device()
3642 err = mgmt_cmd_complete(sk, hdev->id, mgmt_op, in user_pairing_resp()
3648 if (addr->type == BDADDR_BREDR) in user_pairing_resp()
3649 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &addr->bdaddr); in user_pairing_resp()
3651 conn = hci_conn_hash_lookup_le(hdev, &addr->bdaddr, in user_pairing_resp()
3652 le_addr_type(addr->type)); in user_pairing_resp()
3655 err = mgmt_cmd_complete(sk, hdev->id, mgmt_op, in user_pairing_resp()
3661 if (addr->type == BDADDR_LE_PUBLIC || addr->type == BDADDR_LE_RANDOM) { in user_pairing_resp()
3664 err = mgmt_cmd_complete(sk, hdev->id, mgmt_op, in user_pairing_resp()
3668 err = mgmt_cmd_complete(sk, hdev->id, mgmt_op, in user_pairing_resp()
3677 err = -ENOMEM; in user_pairing_resp()
3681 cmd->cmd_complete = addr_cmd_complete; in user_pairing_resp()
3687 bacpy(&cp.bdaddr, &addr->bdaddr); in user_pairing_resp()
3691 err = hci_send_cmd(hdev, hci_op, sizeof(addr->bdaddr), in user_pairing_resp()
3692 &addr->bdaddr); in user_pairing_resp()
3709 return user_pairing_resp(sk, hdev, &cp->addr, in pin_code_neg_reply()
3722 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_USER_CONFIRM_REPLY, in user_confirm_reply()
3725 return user_pairing_resp(sk, hdev, &cp->addr, in user_confirm_reply()
3737 return user_pairing_resp(sk, hdev, &cp->addr, in user_confirm_neg_reply()
3749 return user_pairing_resp(sk, hdev, &cp->addr, in user_passkey_reply()
3751 HCI_OP_USER_PASSKEY_REPLY, cp->passkey); in user_passkey_reply()
3761 return user_pairing_resp(sk, hdev, &cp->addr, in user_passkey_neg_reply()
3770 adv_instance = hci_find_adv_instance(hdev, hdev->cur_adv_instance); in adv_expire_sync()
3775 if (!(adv_instance->flags & flags)) in adv_expire_sync()
3780 adv_instance = hci_get_next_instance(hdev, adv_instance->instance); in adv_expire_sync()
3784 hci_schedule_adv_instance_sync(hdev, adv_instance->instance, true); in adv_expire_sync()
3797 struct mgmt_cp_set_local_name *cp = cmd->param; in set_name_complete()
3802 if (err == -ECANCELED || in set_name_complete()
3807 mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, in set_name_complete()
3810 mgmt_cmd_complete(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0, in set_name_complete()
3831 hci_update_scan_rsp_data_sync(hdev, hdev->cur_adv_instance); in set_name_sync()
3850 if (!memcmp(hdev->dev_name, cp->name, sizeof(hdev->dev_name)) && in set_local_name()
3851 !memcmp(hdev->short_name, cp->short_name, in set_local_name()
3852 sizeof(hdev->short_name))) { in set_local_name()
3853 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0, in set_local_name()
3858 memcpy(hdev->short_name, cp->short_name, sizeof(hdev->short_name)); in set_local_name()
3861 memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name)); in set_local_name()
3863 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0, in set_local_name()
3877 err = -ENOMEM; in set_local_name()
3883 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, in set_local_name()
3892 memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name)); in set_local_name()
3914 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_APPEARANCE, in set_appearance()
3917 appearance = le16_to_cpu(cp->appearance); in set_appearance()
3921 if (hdev->appearance != appearance) { in set_appearance()
3922 hdev->appearance = appearance; in set_appearance()
3931 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_APPEARANCE, 0, NULL, in set_appearance()
3956 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_PHY_CONFIGURATION, 0, in get_phy_configuration()
3975 struct sk_buff *skb = cmd->skb; in set_default_phy_complete()
3978 if (err == -ECANCELED || in set_default_phy_complete()
3988 status = mgmt_status(skb->data[0]); in set_default_phy_complete()
3994 mgmt_cmd_status(cmd->sk, hdev->id, in set_default_phy_complete()
3997 mgmt_cmd_complete(cmd->sk, hdev->id, in set_default_phy_complete()
4001 mgmt_phy_configuration_changed(hdev, cmd->sk); in set_default_phy_complete()
4013 struct mgmt_cp_set_phy_configuration *cp = cmd->param; in set_default_phy_sync()
4015 u32 selected_phys = __le32_to_cpu(cp->selected_phys); in set_default_phy_sync()
4043 cmd->skb = __hci_cmd_sync(hdev, HCI_OP_LE_SET_DEFAULT_PHY, in set_default_phy_sync()
4063 selected_phys = __le32_to_cpu(cp->selected_phys); in set_phy_configuration()
4066 return mgmt_cmd_status(sk, hdev->id, in set_phy_configuration()
4073 return mgmt_cmd_status(sk, hdev->id, in set_phy_configuration()
4078 return mgmt_cmd_complete(sk, hdev->id, in set_phy_configuration()
4085 err = mgmt_cmd_status(sk, hdev->id, in set_phy_configuration()
4088 goto unlock; in set_phy_configuration()
4092 err = mgmt_cmd_status(sk, hdev->id, in set_phy_configuration()
4095 goto unlock; in set_phy_configuration()
4138 if (pkt_type != hdev->pkt_type) { in set_phy_configuration()
4139 hdev->pkt_type = pkt_type; in set_phy_configuration()
4148 err = mgmt_cmd_complete(sk, hdev->id, in set_phy_configuration()
4152 goto unlock; in set_phy_configuration()
4158 err = -ENOMEM; in set_phy_configuration()
4164 err = mgmt_cmd_status(sk, hdev->id, in set_phy_configuration()
4172 unlock: in set_phy_configuration()
4182 struct mgmt_cp_set_blocked_keys *keys = data; in set_blocked_keys() local
4183 const u16 max_key_count = ((U16_MAX - sizeof(*keys)) / in set_blocked_keys()
4190 key_count = __le16_to_cpu(keys->key_count); in set_blocked_keys()
4193 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BLOCKED_KEYS, in set_blocked_keys()
4197 expected_len = struct_size(keys, keys, key_count); in set_blocked_keys()
4201 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BLOCKED_KEYS, in set_blocked_keys()
4217 b->type = keys->keys[i].type; in set_blocked_keys()
4218 memcpy(b->val, keys->keys[i].val, sizeof(b->val)); in set_blocked_keys()
4219 list_add_rcu(&b->list, &hdev->blocked_keys); in set_blocked_keys()
4223 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_BLOCKED_KEYS, in set_blocked_keys()
4236 if (!test_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED, &hdev->quirks)) in set_wideband_speech()
4237 return mgmt_cmd_status(sk, hdev->id, in set_wideband_speech()
4241 if (cp->val != 0x00 && cp->val != 0x01) in set_wideband_speech()
4242 return mgmt_cmd_status(sk, hdev->id, in set_wideband_speech()
4249 !!cp->val != hci_dev_test_flag(hdev, in set_wideband_speech()
4251 err = mgmt_cmd_status(sk, hdev->id, in set_wideband_speech()
4254 goto unlock; in set_wideband_speech()
4257 if (cp->val) in set_wideband_speech()
4266 goto unlock; in set_wideband_speech()
4271 unlock: in set_wideband_speech()
4297 if ((hdev->commands[41] & 0x08) || msft_curve_validity(hdev)) in read_controller_cap()
4305 if (hdev->commands[20] & 0x10) in read_controller_cap()
4310 cap_len = eir_append_data(rp->cap, cap_len, MGMT_CAP_SEC_FLAGS, in read_controller_cap()
4316 if (hdev->commands[41] & 0x08) in read_controller_cap()
4317 cap_len = eir_append_le16(rp->cap, cap_len, in read_controller_cap()
4319 hdev->max_enc_key_size); in read_controller_cap()
4321 cap_len = eir_append_le16(rp->cap, cap_len, in read_controller_cap()
4328 if (hdev->commands[38] & 0x80) { in read_controller_cap()
4329 memcpy(&tx_power_range[0], &hdev->min_le_tx_power, 1); in read_controller_cap()
4330 memcpy(&tx_power_range[1], &hdev->max_le_tx_power, 1); in read_controller_cap()
4331 cap_len = eir_append_data(rp->cap, cap_len, MGMT_CAP_LE_TX_PWR, in read_controller_cap()
4335 rp->cap_len = cpu_to_le16(cap_len); in read_controller_cap()
4339 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_CONTROLLER_CAP, 0, in read_controller_cap()
4344 /* d4992530-b9ec-469f-ab01-6c481c47da1c */
4351 /* 330859bc-7506-492d-9370-9a6f0614037f */
4357 /* a6695ace-ee7f-4fb9-881a-5fac66c629af */
4363 /* 671b10b5-42c0-4696-9227-eb28d1b049d6 */
4369 /* 15c0a148-c273-11ea-b3de-0242ac130004 */
4375 /* 6fbaf188-05e0-496a-9885-d6ddfdb4e03e */
4381 /* 2ce463d7-7a03-4d8d-bf05-5f24e8f36e76 */
4399 len = sizeof(*rp) + (sizeof(rp->features[0]) * 7); in read_exp_features_info()
4402 return -ENOMEM; in read_exp_features_info()
4408 memcpy(rp->features[idx].uuid, debug_uuid, 16); in read_exp_features_info()
4409 rp->features[idx].flags = cpu_to_le32(flags); in read_exp_features_info()
4420 memcpy(rp->features[idx].uuid, le_simultaneous_roles_uuid, 16); in read_exp_features_info()
4421 rp->features[idx].flags = cpu_to_le32(flags); in read_exp_features_info()
4431 memcpy(rp->features[idx].uuid, rpa_resolution_uuid, 16); in read_exp_features_info()
4432 rp->features[idx].flags = cpu_to_le32(flags); in read_exp_features_info()
4437 hdev->set_quality_report)) { in read_exp_features_info()
4443 memcpy(rp->features[idx].uuid, quality_report_uuid, 16); in read_exp_features_info()
4444 rp->features[idx].flags = cpu_to_le32(flags); in read_exp_features_info()
4448 if (hdev && hdev->get_data_path_id) { in read_exp_features_info()
4454 memcpy(rp->features[idx].uuid, offload_codecs_uuid, 16); in read_exp_features_info()
4455 rp->features[idx].flags = cpu_to_le32(flags); in read_exp_features_info()
4461 memcpy(rp->features[idx].uuid, iso_socket_uuid, 16); in read_exp_features_info()
4462 rp->features[idx].flags = cpu_to_le32(flags); in read_exp_features_info()
4472 memcpy(rp->features[idx].uuid, mgmt_mesh_uuid, 16); in read_exp_features_info()
4473 rp->features[idx].flags = cpu_to_le32(flags); in read_exp_features_info()
4477 rp->feature_count = cpu_to_le16(idx); in read_exp_features_info()
4484 status = mgmt_cmd_complete(sk, hdev ? hdev->id : MGMT_INDEX_NONE, in read_exp_features_info()
4503 hdev->conn_flags |= HCI_CONN_FLAG_DEVICE_PRIVACY; in exp_ll_privacy_feature_changed()
4505 hdev->conn_flags &= ~HCI_CONN_FLAG_DEVICE_PRIVACY; in exp_ll_privacy_feature_changed()
4565 return mgmt_cmd_complete(sk, hdev ? hdev->id : MGMT_INDEX_NONE, in set_zero_key_func()
4579 /* Command requires to use the non-controller index */ in set_debug_func()
4581 return mgmt_cmd_status(sk, hdev->id, in set_debug_func()
4592 if (cp->param[0] != 0x00 && cp->param[0] != 0x01) in set_debug_func()
4597 val = !!cp->param[0]; in set_debug_func()
4632 return mgmt_cmd_status(sk, hdev->id, in set_mgmt_mesh_func()
4637 if (cp->param[0] != 0x00 && cp->param[0] != 0x01) in set_mgmt_mesh_func()
4638 return mgmt_cmd_status(sk, hdev->id, in set_mgmt_mesh_func()
4642 val = !!cp->param[0]; in set_mgmt_mesh_func()
4658 err = mgmt_cmd_complete(sk, hdev->id, in set_mgmt_mesh_func()
4685 return mgmt_cmd_status(sk, hdev->id, in set_rpa_resolution_func()
4691 return mgmt_cmd_status(sk, hdev->id, in set_rpa_resolution_func()
4696 if (cp->param[0] != 0x00 && cp->param[0] != 0x01) in set_rpa_resolution_func()
4697 return mgmt_cmd_status(sk, hdev->id, in set_rpa_resolution_func()
4701 val = !!cp->param[0]; in set_rpa_resolution_func()
4723 err = mgmt_cmd_complete(sk, hdev->id, in set_rpa_resolution_func()
4749 return mgmt_cmd_status(sk, hdev->id, in set_quality_report_func()
4754 if (cp->param[0] != 0x00 && cp->param[0] != 0x01) in set_quality_report_func()
4755 return mgmt_cmd_status(sk, hdev->id, in set_quality_report_func()
4761 val = !!cp->param[0]; in set_quality_report_func()
4764 if (!aosp_has_quality_report(hdev) && !hdev->set_quality_report) { in set_quality_report_func()
4765 err = mgmt_cmd_status(sk, hdev->id, in set_quality_report_func()
4772 if (hdev->set_quality_report) in set_quality_report_func()
4773 err = hdev->set_quality_report(hdev, val); in set_quality_report_func()
4778 err = mgmt_cmd_status(sk, hdev->id, in set_quality_report_func()
4796 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_EXP_FEATURE, 0, in set_quality_report_func()
4823 return mgmt_cmd_status(sk, hdev->id, in set_offload_codec_func()
4828 if (cp->param[0] != 0x00 && cp->param[0] != 0x01) in set_offload_codec_func()
4829 return mgmt_cmd_status(sk, hdev->id, in set_offload_codec_func()
4833 val = !!cp->param[0]; in set_offload_codec_func()
4836 if (!hdev->get_data_path_id) { in set_offload_codec_func()
4837 return mgmt_cmd_status(sk, hdev->id, in set_offload_codec_func()
4855 err = mgmt_cmd_complete(sk, hdev->id, in set_offload_codec_func()
4881 return mgmt_cmd_status(sk, hdev->id, in set_le_simultaneous_roles_func()
4886 if (cp->param[0] != 0x00 && cp->param[0] != 0x01) in set_le_simultaneous_roles_func()
4887 return mgmt_cmd_status(sk, hdev->id, in set_le_simultaneous_roles_func()
4891 val = !!cp->param[0]; in set_le_simultaneous_roles_func()
4895 return mgmt_cmd_status(sk, hdev->id, in set_le_simultaneous_roles_func()
4913 err = mgmt_cmd_complete(sk, hdev->id, in set_le_simultaneous_roles_func()
4931 /* Command requires to use the non-controller index */ in set_iso_socket_func()
4933 return mgmt_cmd_status(sk, hdev->id, in set_iso_socket_func()
4944 if (cp->param[0] != 0x00 && cp->param[0] != 0x01) in set_iso_socket_func()
4949 val = cp->param[0] ? true : false; in set_iso_socket_func()
5005 if (!memcmp(cp->uuid, exp_features[i].uuid, 16)) in set_exp_feature()
5009 return mgmt_cmd_status(sk, hdev ? hdev->id : MGMT_INDEX_NONE, in set_exp_feature()
5017 u32 flags = hdev->conn_flags; in get_params_flags()
5024 hci_find_irk_by_addr(hdev, ¶ms->addr, params->addr_type)) in get_params_flags()
5042 &cp->addr.bdaddr, cp->addr.type); in get_device_flags()
5046 supported_flags = hdev->conn_flags; in get_device_flags()
5050 if (cp->addr.type == BDADDR_BREDR) { in get_device_flags()
5051 br_params = hci_bdaddr_list_lookup_with_flags(&hdev->accept_list, in get_device_flags()
5052 &cp->addr.bdaddr, in get_device_flags()
5053 cp->addr.type); in get_device_flags()
5057 current_flags = br_params->flags; in get_device_flags()
5059 params = hci_conn_params_lookup(hdev, &cp->addr.bdaddr, in get_device_flags()
5060 le_addr_type(cp->addr.type)); in get_device_flags()
5065 current_flags = params->flags; in get_device_flags()
5068 bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr); in get_device_flags()
5069 rp.addr.type = cp->addr.type; in get_device_flags()
5078 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_DEVICE_FLAGS, status, in get_device_flags()
5104 u32 current_flags = __le32_to_cpu(cp->current_flags); in set_device_flags()
5107 &cp->addr.bdaddr, cp->addr.type, current_flags); in set_device_flags()
5110 supported_flags = hdev->conn_flags; in set_device_flags()
5120 if (cp->addr.type == BDADDR_BREDR) { in set_device_flags()
5121 br_params = hci_bdaddr_list_lookup_with_flags(&hdev->accept_list, in set_device_flags()
5122 &cp->addr.bdaddr, in set_device_flags()
5123 cp->addr.type); in set_device_flags()
5126 br_params->flags = current_flags; in set_device_flags()
5130 &cp->addr.bdaddr, cp->addr.type); in set_device_flags()
5133 goto unlock; in set_device_flags()
5136 params = hci_conn_params_lookup(hdev, &cp->addr.bdaddr, in set_device_flags()
5137 le_addr_type(cp->addr.type)); in set_device_flags()
5140 &cp->addr.bdaddr, le_addr_type(cp->addr.type)); in set_device_flags()
5141 goto unlock; in set_device_flags()
5149 goto unlock; in set_device_flags()
5152 WRITE_ONCE(params->flags, current_flags); in set_device_flags()
5158 if (params->flags & HCI_CONN_FLAG_DEVICE_PRIVACY) in set_device_flags()
5161 unlock: in set_device_flags()
5166 device_flags_changed(sk, hdev, &cp->addr.bdaddr, cp->addr.type, in set_device_flags()
5169 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_DEVICE_FLAGS, status, in set_device_flags()
5170 &cp->addr, sizeof(cp->addr)); in set_device_flags()
5205 BT_DBG("request for %s", hdev->name); in read_adv_mon_features()
5212 idr_for_each_entry(&hdev->adv_monitors_idr, monitor, handle) in read_adv_mon_features()
5213 handles[num_handles++] = monitor->handle; in read_adv_mon_features()
5220 return -ENOMEM; in read_adv_mon_features()
5225 rp->supported_features = cpu_to_le32(supported); in read_adv_mon_features()
5226 rp->enabled_features = cpu_to_le32(enabled); in read_adv_mon_features()
5227 rp->max_num_handles = cpu_to_le16(HCI_MAX_ADV_MONITOR_NUM_HANDLES); in read_adv_mon_features()
5228 rp->max_num_patterns = HCI_MAX_ADV_MONITOR_NUM_PATTERNS; in read_adv_mon_features()
5229 rp->num_handles = cpu_to_le16(num_handles); in read_adv_mon_features()
5231 memcpy(&rp->handles, &handles, (num_handles * sizeof(u16))); in read_adv_mon_features()
5233 err = mgmt_cmd_complete(sk, hdev->id, in read_adv_mon_features()
5247 struct adv_monitor *monitor = cmd->user_data; in mgmt_add_adv_patterns_monitor_complete()
5251 rp.monitor_handle = cpu_to_le16(monitor->handle); in mgmt_add_adv_patterns_monitor_complete()
5254 mgmt_adv_monitor_added(cmd->sk, hdev, monitor->handle); in mgmt_add_adv_patterns_monitor_complete()
5255 hdev->adv_monitors_cnt++; in mgmt_add_adv_patterns_monitor_complete()
5256 if (monitor->state == ADV_MONITOR_STATE_NOT_REGISTERED) in mgmt_add_adv_patterns_monitor_complete()
5257 monitor->state = ADV_MONITOR_STATE_REGISTERED; in mgmt_add_adv_patterns_monitor_complete()
5261 mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, in mgmt_add_adv_patterns_monitor_complete()
5273 struct adv_monitor *monitor = cmd->user_data; in mgmt_add_adv_patterns_monitor_sync()
5288 goto unlock; in __add_adv_patterns_monitor()
5294 goto unlock; in __add_adv_patterns_monitor()
5300 goto unlock; in __add_adv_patterns_monitor()
5303 cmd->user_data = m; in __add_adv_patterns_monitor()
5307 if (err == -ENOMEM) in __add_adv_patterns_monitor()
5312 goto unlock; in __add_adv_patterns_monitor()
5319 unlock: in __add_adv_patterns_monitor()
5322 return mgmt_cmd_status(sk, hdev->id, op, status); in __add_adv_patterns_monitor()
5329 m->rssi.low_threshold = rssi->low_threshold; in parse_adv_monitor_rssi()
5330 m->rssi.low_threshold_timeout = in parse_adv_monitor_rssi()
5331 __le16_to_cpu(rssi->low_threshold_timeout); in parse_adv_monitor_rssi()
5332 m->rssi.high_threshold = rssi->high_threshold; in parse_adv_monitor_rssi()
5333 m->rssi.high_threshold_timeout = in parse_adv_monitor_rssi()
5334 __le16_to_cpu(rssi->high_threshold_timeout); in parse_adv_monitor_rssi()
5335 m->rssi.sampling_period = rssi->sampling_period; in parse_adv_monitor_rssi()
5342 m->rssi.low_threshold = -127; in parse_adv_monitor_rssi()
5343 m->rssi.low_threshold_timeout = 60; in parse_adv_monitor_rssi()
5344 m->rssi.high_threshold = -127; in parse_adv_monitor_rssi()
5345 m->rssi.high_threshold_timeout = 0; in parse_adv_monitor_rssi()
5346 m->rssi.sampling_period = 0; in parse_adv_monitor_rssi()
5369 p->ad_type = patterns[i].ad_type; in parse_adv_monitor_pattern()
5370 p->offset = patterns[i].offset; in parse_adv_monitor_pattern()
5371 p->length = patterns[i].length; in parse_adv_monitor_pattern()
5372 memcpy(p->value, patterns[i].value, p->length); in parse_adv_monitor_pattern()
5374 INIT_LIST_HEAD(&p->list); in parse_adv_monitor_pattern()
5375 list_add(&p->list, &m->patterns); in parse_adv_monitor_pattern()
5389 BT_DBG("request for %s", hdev->name); in add_adv_patterns_monitor()
5396 expected_size += cp->pattern_count * sizeof(struct mgmt_adv_pattern); in add_adv_patterns_monitor()
5408 INIT_LIST_HEAD(&m->patterns); in add_adv_patterns_monitor()
5411 status = parse_adv_monitor_pattern(m, cp->pattern_count, cp->patterns); in add_adv_patterns_monitor()
5426 BT_DBG("request for %s", hdev->name); in add_adv_patterns_monitor_rssi()
5433 expected_size += cp->pattern_count * sizeof(struct mgmt_adv_pattern); in add_adv_patterns_monitor_rssi()
5445 INIT_LIST_HEAD(&m->patterns); in add_adv_patterns_monitor_rssi()
5447 parse_adv_monitor_rssi(m, &cp->rssi); in add_adv_patterns_monitor_rssi()
5448 status = parse_adv_monitor_pattern(m, cp->pattern_count, cp->patterns); in add_adv_patterns_monitor_rssi()
5462 if (status == -ECANCELED) in mgmt_remove_adv_monitor_complete()
5467 cp = cmd->param; in mgmt_remove_adv_monitor_complete()
5469 rp.monitor_handle = cp->monitor_handle; in mgmt_remove_adv_monitor_complete()
5472 mgmt_adv_monitor_removed(cmd->sk, hdev, cp->monitor_handle); in mgmt_remove_adv_monitor_complete()
5476 mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, in mgmt_remove_adv_monitor_complete()
5488 struct mgmt_cp_remove_adv_monitor *cp = cmd->param; in mgmt_remove_adv_monitor_sync()
5489 u16 handle = __le16_to_cpu(cp->monitor_handle); in mgmt_remove_adv_monitor_sync()
5509 goto unlock; in remove_adv_monitor()
5515 goto unlock; in remove_adv_monitor()
5524 if (err == -ENOMEM) in remove_adv_monitor()
5529 goto unlock; in remove_adv_monitor()
5536 unlock: in remove_adv_monitor()
5538 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_ADV_MONITOR, in remove_adv_monitor()
5547 struct sk_buff *skb = cmd->skb; in read_local_oob_data_complete()
5556 status = mgmt_status(skb->data[0]); in read_local_oob_data_complete()
5562 mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA, status); in read_local_oob_data_complete()
5569 struct hci_rp_read_local_oob_data *rp = (void *) skb->data; in read_local_oob_data_complete()
5571 if (skb->len < sizeof(*rp)) { in read_local_oob_data_complete()
5572 mgmt_cmd_status(cmd->sk, hdev->id, in read_local_oob_data_complete()
5578 memcpy(mgmt_rp.hash192, rp->hash, sizeof(rp->hash)); in read_local_oob_data_complete()
5579 memcpy(mgmt_rp.rand192, rp->rand, sizeof(rp->rand)); in read_local_oob_data_complete()
5581 rp_size -= sizeof(mgmt_rp.hash256) + sizeof(mgmt_rp.rand256); in read_local_oob_data_complete()
5583 struct hci_rp_read_local_oob_ext_data *rp = (void *) skb->data; in read_local_oob_data_complete()
5585 if (skb->len < sizeof(*rp)) { in read_local_oob_data_complete()
5586 mgmt_cmd_status(cmd->sk, hdev->id, in read_local_oob_data_complete()
5592 memcpy(mgmt_rp.hash192, rp->hash192, sizeof(rp->hash192)); in read_local_oob_data_complete()
5593 memcpy(mgmt_rp.rand192, rp->rand192, sizeof(rp->rand192)); in read_local_oob_data_complete()
5595 memcpy(mgmt_rp.hash256, rp->hash256, sizeof(rp->hash256)); in read_local_oob_data_complete()
5596 memcpy(mgmt_rp.rand256, rp->rand256, sizeof(rp->rand256)); in read_local_oob_data_complete()
5599 mgmt_cmd_complete(cmd->sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA, in read_local_oob_data_complete()
5614 cmd->skb = hci_read_local_oob_data_sync(hdev, true, cmd->sk); in read_local_oob_data_sync()
5616 cmd->skb = hci_read_local_oob_data_sync(hdev, false, cmd->sk); in read_local_oob_data_sync()
5618 if (IS_ERR(cmd->skb)) in read_local_oob_data_sync()
5619 return PTR_ERR(cmd->skb); in read_local_oob_data_sync()
5635 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA, in read_local_oob_data()
5637 goto unlock; in read_local_oob_data()
5641 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA, in read_local_oob_data()
5643 goto unlock; in read_local_oob_data()
5648 err = -ENOMEM; in read_local_oob_data()
5654 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA, in read_local_oob_data()
5661 unlock: in read_local_oob_data()
5674 if (!bdaddr_type_is_valid(addr->type)) in add_remote_oob_data()
5675 return mgmt_cmd_complete(sk, hdev->id, in add_remote_oob_data()
5686 if (cp->addr.type != BDADDR_BREDR) { in add_remote_oob_data()
5687 err = mgmt_cmd_complete(sk, hdev->id, in add_remote_oob_data()
5690 &cp->addr, sizeof(cp->addr)); in add_remote_oob_data()
5691 goto unlock; in add_remote_oob_data()
5694 err = hci_add_remote_oob_data(hdev, &cp->addr.bdaddr, in add_remote_oob_data()
5695 cp->addr.type, cp->hash, in add_remote_oob_data()
5696 cp->rand, NULL, NULL); in add_remote_oob_data()
5702 err = mgmt_cmd_complete(sk, hdev->id, in add_remote_oob_data()
5704 &cp->addr, sizeof(cp->addr)); in add_remote_oob_data()
5710 if (bdaddr_type_is_le(cp->addr.type)) { in add_remote_oob_data()
5711 /* Enforce zero-valued 192-bit parameters as in add_remote_oob_data()
5714 if (memcmp(cp->rand192, ZERO_KEY, 16) || in add_remote_oob_data()
5715 memcmp(cp->hash192, ZERO_KEY, 16)) { in add_remote_oob_data()
5716 err = mgmt_cmd_complete(sk, hdev->id, in add_remote_oob_data()
5720 goto unlock; in add_remote_oob_data()
5726 /* In case one of the P-192 values is set to zero, in add_remote_oob_data()
5727 * then just disable OOB data for P-192. in add_remote_oob_data()
5729 if (!memcmp(cp->rand192, ZERO_KEY, 16) || in add_remote_oob_data()
5730 !memcmp(cp->hash192, ZERO_KEY, 16)) { in add_remote_oob_data()
5734 rand192 = cp->rand192; in add_remote_oob_data()
5735 hash192 = cp->hash192; in add_remote_oob_data()
5739 /* In case one of the P-256 values is set to zero, then just in add_remote_oob_data()
5740 * disable OOB data for P-256. in add_remote_oob_data()
5742 if (!memcmp(cp->rand256, ZERO_KEY, 16) || in add_remote_oob_data()
5743 !memcmp(cp->hash256, ZERO_KEY, 16)) { in add_remote_oob_data()
5747 rand256 = cp->rand256; in add_remote_oob_data()
5748 hash256 = cp->hash256; in add_remote_oob_data()
5751 err = hci_add_remote_oob_data(hdev, &cp->addr.bdaddr, in add_remote_oob_data()
5752 cp->addr.type, hash192, rand192, in add_remote_oob_data()
5759 err = mgmt_cmd_complete(sk, hdev->id, in add_remote_oob_data()
5761 status, &cp->addr, sizeof(cp->addr)); in add_remote_oob_data()
5765 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_REMOTE_OOB_DATA, in add_remote_oob_data()
5769 unlock: in add_remote_oob_data()
5783 if (cp->addr.type != BDADDR_BREDR) in remove_remote_oob_data()
5784 return mgmt_cmd_complete(sk, hdev->id, in remove_remote_oob_data()
5787 &cp->addr, sizeof(cp->addr)); in remove_remote_oob_data()
5791 if (!bacmp(&cp->addr.bdaddr, BDADDR_ANY)) { in remove_remote_oob_data()
5797 err = hci_remove_remote_oob_data(hdev, &cp->addr.bdaddr, cp->addr.type); in remove_remote_oob_data()
5804 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_REMOTE_OOB_DATA, in remove_remote_oob_data()
5805 status, &cp->addr, sizeof(cp->addr)); in remove_remote_oob_data()
5827 cmd->cmd_complete(cmd, mgmt_status(status)); in mgmt_start_discovery_complete()
5867 if (err == -ECANCELED) in start_discovery_complete()
5875 mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_status(err), in start_discovery_complete()
5876 cmd->param, 1); in start_discovery_complete()
5901 err = mgmt_cmd_complete(sk, hdev->id, op, in start_discovery_internal()
5903 &cp->type, sizeof(cp->type)); in start_discovery_internal()
5907 if (hdev->discovery.state != DISCOVERY_STOPPED || in start_discovery_internal()
5909 err = mgmt_cmd_complete(sk, hdev->id, op, MGMT_STATUS_BUSY, in start_discovery_internal()
5910 &cp->type, sizeof(cp->type)); in start_discovery_internal()
5914 if (!discovery_type_is_valid(hdev, cp->type, &status)) { in start_discovery_internal()
5915 err = mgmt_cmd_complete(sk, hdev->id, op, status, in start_discovery_internal()
5916 &cp->type, sizeof(cp->type)); in start_discovery_internal()
5921 if (hdev->discovery_paused) { in start_discovery_internal()
5922 err = mgmt_cmd_complete(sk, hdev->id, op, MGMT_STATUS_BUSY, in start_discovery_internal()
5923 &cp->type, sizeof(cp->type)); in start_discovery_internal()
5932 hdev->discovery.type = cp->type; in start_discovery_internal()
5933 hdev->discovery.report_invalid_rssi = false; in start_discovery_internal()
5935 hdev->discovery.limited = true; in start_discovery_internal()
5937 hdev->discovery.limited = false; in start_discovery_internal()
5941 err = -ENOMEM; in start_discovery_internal()
5979 const u16 max_uuid_count = ((U16_MAX - sizeof(*cp)) / 16); in start_service_discovery()
5989 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
5992 &cp->type, sizeof(cp->type)); in start_service_discovery()
5996 if (hdev->discovery.state != DISCOVERY_STOPPED || in start_service_discovery()
5998 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
6000 MGMT_STATUS_BUSY, &cp->type, in start_service_discovery()
6001 sizeof(cp->type)); in start_service_discovery()
6005 if (hdev->discovery_paused) { in start_service_discovery()
6006 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
6008 MGMT_STATUS_BUSY, &cp->type, in start_service_discovery()
6009 sizeof(cp->type)); in start_service_discovery()
6013 uuid_count = __le16_to_cpu(cp->uuid_count); in start_service_discovery()
6017 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
6019 MGMT_STATUS_INVALID_PARAMS, &cp->type, in start_service_discovery()
6020 sizeof(cp->type)); in start_service_discovery()
6028 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
6030 MGMT_STATUS_INVALID_PARAMS, &cp->type, in start_service_discovery()
6031 sizeof(cp->type)); in start_service_discovery()
6035 if (!discovery_type_is_valid(hdev, cp->type, &status)) { in start_service_discovery()
6036 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
6038 status, &cp->type, sizeof(cp->type)); in start_service_discovery()
6045 err = -ENOMEM; in start_service_discovery()
6054 hdev->discovery.result_filtering = true; in start_service_discovery()
6055 hdev->discovery.type = cp->type; in start_service_discovery()
6056 hdev->discovery.rssi = cp->rssi; in start_service_discovery()
6057 hdev->discovery.uuid_count = uuid_count; in start_service_discovery()
6060 hdev->discovery.uuids = kmemdup(cp->uuids, uuid_count * 16, in start_service_discovery()
6062 if (!hdev->discovery.uuids) { in start_service_discovery()
6063 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
6066 &cp->type, sizeof(cp->type)); in start_service_discovery()
6096 cmd->cmd_complete(cmd, mgmt_status(status)); in mgmt_stop_discovery_complete()
6107 if (err == -ECANCELED || in stop_discovery_complete()
6113 mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_status(err), in stop_discovery_complete()
6114 cmd->param, 1); in stop_discovery_complete()
6138 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY, in stop_discovery()
6139 MGMT_STATUS_REJECTED, &mgmt_cp->type, in stop_discovery()
6140 sizeof(mgmt_cp->type)); in stop_discovery()
6141 goto unlock; in stop_discovery()
6144 if (hdev->discovery.type != mgmt_cp->type) { in stop_discovery()
6145 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY, in stop_discovery()
6147 &mgmt_cp->type, sizeof(mgmt_cp->type)); in stop_discovery()
6148 goto unlock; in stop_discovery()
6153 err = -ENOMEM; in stop_discovery()
6154 goto unlock; in stop_discovery()
6161 goto unlock; in stop_discovery()
6166 unlock: in stop_discovery()
6183 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME, in confirm_name()
6184 MGMT_STATUS_FAILED, &cp->addr, in confirm_name()
6185 sizeof(cp->addr)); in confirm_name()
6189 e = hci_inquiry_cache_lookup_unknown(hdev, &cp->addr.bdaddr); in confirm_name()
6191 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME, in confirm_name()
6192 MGMT_STATUS_INVALID_PARAMS, &cp->addr, in confirm_name()
6193 sizeof(cp->addr)); in confirm_name()
6197 if (cp->name_known) { in confirm_name()
6198 e->name_state = NAME_KNOWN; in confirm_name()
6199 list_del(&e->list); in confirm_name()
6201 e->name_state = NAME_NEEDED; in confirm_name()
6205 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME, 0, in confirm_name()
6206 &cp->addr, sizeof(cp->addr)); in confirm_name()
6222 if (!bdaddr_type_is_valid(cp->addr.type)) in block_device()
6223 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE, in block_device()
6225 &cp->addr, sizeof(cp->addr)); in block_device()
6229 err = hci_bdaddr_list_add(&hdev->reject_list, &cp->addr.bdaddr, in block_device()
6230 cp->addr.type); in block_device()
6236 mgmt_event(MGMT_EV_DEVICE_BLOCKED, hdev, &cp->addr, sizeof(cp->addr), in block_device()
6241 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE, status, in block_device()
6242 &cp->addr, sizeof(cp->addr)); in block_device()
6258 if (!bdaddr_type_is_valid(cp->addr.type)) in unblock_device()
6259 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE, in unblock_device()
6261 &cp->addr, sizeof(cp->addr)); in unblock_device()
6265 err = hci_bdaddr_list_del(&hdev->reject_list, &cp->addr.bdaddr, in unblock_device()
6266 cp->addr.type); in unblock_device()
6272 mgmt_event(MGMT_EV_DEVICE_UNBLOCKED, hdev, &cp->addr, sizeof(cp->addr), in unblock_device()
6277 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE, status, in unblock_device()
6278 &cp->addr, sizeof(cp->addr)); in unblock_device()
6299 source = __le16_to_cpu(cp->source); in set_device_id()
6302 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEVICE_ID, in set_device_id()
6307 hdev->devid_source = source; in set_device_id()
6308 hdev->devid_vendor = __le16_to_cpu(cp->vendor); in set_device_id()
6309 hdev->devid_product = __le16_to_cpu(cp->product); in set_device_id()
6310 hdev->devid_version = __le16_to_cpu(cp->version); in set_device_id()
6312 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_DEVICE_ID, 0, in set_device_id()
6325 bt_dev_err(hdev, "failed to re-configure advertising %d", err); in enable_advertising_instance()
6357 * set up earlier, then re-enable multi-instance advertising. in set_advertising_complete()
6360 list_empty(&hdev->adv_instances)) in set_advertising_complete()
6363 instance = hdev->cur_adv_instance; in set_advertising_complete()
6365 adv_instance = list_first_entry_or_null(&hdev->adv_instances, in set_advertising_complete()
6370 instance = adv_instance->instance; in set_advertising_complete()
6381 struct mgmt_mode *cp = cmd->param; in set_adv_sync()
6382 u8 val = !!cp->val; in set_adv_sync()
6384 if (cp->val == 0x02) in set_adv_sync()
6396 hdev->cur_adv_instance = 0x00; in set_adv_sync()
6424 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING, in set_advertising()
6427 if (cp->val != 0x00 && cp->val != 0x01 && cp->val != 0x02) in set_advertising()
6428 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING, in set_advertising()
6431 if (hdev->advertising_paused) in set_advertising()
6432 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING, in set_advertising()
6437 val = !!cp->val; in set_advertising()
6446 (cp->val == 0x02) == hci_dev_test_flag(hdev, HCI_ADVERTISING_CONNECTABLE)) || in set_advertising()
6450 hdev->le_scan_type == LE_SCAN_ACTIVE)) { in set_advertising()
6453 if (cp->val) { in set_advertising()
6454 hdev->cur_adv_instance = 0x00; in set_advertising()
6456 if (cp->val == 0x02) in set_advertising()
6467 goto unlock; in set_advertising()
6472 goto unlock; in set_advertising()
6477 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING, in set_advertising()
6479 goto unlock; in set_advertising()
6484 err = -ENOMEM; in set_advertising()
6492 unlock: in set_advertising()
6506 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_STATIC_ADDRESS, in set_static_address()
6510 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_STATIC_ADDRESS, in set_static_address()
6513 if (bacmp(&cp->bdaddr, BDADDR_ANY)) { in set_static_address()
6514 if (!bacmp(&cp->bdaddr, BDADDR_NONE)) in set_static_address()
6515 return mgmt_cmd_status(sk, hdev->id, in set_static_address()
6520 if ((cp->bdaddr.b[5] & 0xc0) != 0xc0) in set_static_address()
6521 return mgmt_cmd_status(sk, hdev->id, in set_static_address()
6528 bacpy(&hdev->static_addr, &cp->bdaddr); in set_static_address()
6532 goto unlock; in set_static_address()
6536 unlock: in set_static_address()
6551 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, in set_scan_params()
6555 interval = __le16_to_cpu(cp->interval); in set_scan_params()
6558 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, in set_scan_params()
6561 window = __le16_to_cpu(cp->window); in set_scan_params()
6564 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, in set_scan_params()
6568 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, in set_scan_params()
6573 hdev->le_scan_interval = interval; in set_scan_params()
6574 hdev->le_scan_window = window; in set_scan_params()
6576 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, 0, in set_scan_params()
6583 hdev->discovery.state == DISCOVERY_STOPPED) in set_scan_params()
6598 mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE, in fast_connectable_complete()
6601 struct mgmt_mode *cp = cmd->param; in fast_connectable_complete()
6603 if (cp->val) in fast_connectable_complete()
6608 send_settings_rsp(cmd->sk, MGMT_OP_SET_FAST_CONNECTABLE, hdev); in fast_connectable_complete()
6609 new_settings(hdev, cmd->sk); in fast_connectable_complete()
6618 struct mgmt_mode *cp = cmd->param; in write_fast_connectable_sync()
6620 return hci_write_fast_connectable_sync(hdev, cp->val); in write_fast_connectable_sync()
6633 hdev->hci_ver < BLUETOOTH_VER_1_2) in set_fast_connectable()
6634 return mgmt_cmd_status(sk, hdev->id, in set_fast_connectable()
6638 if (cp->val != 0x00 && cp->val != 0x01) in set_fast_connectable()
6639 return mgmt_cmd_status(sk, hdev->id, in set_fast_connectable()
6645 if (!!cp->val == hci_dev_test_flag(hdev, HCI_FAST_CONNECTABLE)) { in set_fast_connectable()
6647 goto unlock; in set_fast_connectable()
6654 goto unlock; in set_fast_connectable()
6660 err = -ENOMEM; in set_fast_connectable()
6666 mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE, in set_fast_connectable()
6673 unlock: in set_fast_connectable()
6693 mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_err); in set_bredr_complete()
6695 send_settings_rsp(cmd->sk, MGMT_OP_SET_BREDR, hdev); in set_bredr_complete()
6696 new_settings(hdev, cmd->sk); in set_bredr_complete()
6715 status = hci_update_adv_data_sync(hdev, hdev->cur_adv_instance); in set_bredr_sync()
6729 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, in set_bredr()
6733 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, in set_bredr()
6736 if (cp->val != 0x00 && cp->val != 0x01) in set_bredr()
6737 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, in set_bredr()
6742 if (cp->val == hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) { in set_bredr()
6744 goto unlock; in set_bredr()
6748 if (!cp->val) { in set_bredr()
6759 goto unlock; in set_bredr()
6762 goto unlock; in set_bredr()
6766 if (!cp->val) { in set_bredr()
6767 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, in set_bredr()
6769 goto unlock; in set_bredr()
6771 /* When configuring a dual-mode controller to operate in set_bredr()
6775 * Dual-mode controllers shall operate with the public in set_bredr()
6786 (bacmp(&hdev->static_addr, BDADDR_ANY) || in set_bredr()
6788 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, in set_bredr()
6790 goto unlock; in set_bredr()
6796 err = -ENOMEM; in set_bredr()
6802 mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, in set_bredr()
6807 goto unlock; in set_bredr()
6815 unlock: in set_bredr()
6830 mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_err); in set_secure_conn_complete()
6834 cp = cmd->param; in set_secure_conn_complete()
6836 switch (cp->val) { in set_secure_conn_complete()
6851 send_settings_rsp(cmd->sk, cmd->opcode, hdev); in set_secure_conn_complete()
6852 new_settings(hdev, cmd->sk); in set_secure_conn_complete()
6861 struct mgmt_mode *cp = cmd->param; in set_secure_conn_sync()
6862 u8 val = !!cp->val; in set_secure_conn_sync()
6882 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN, in set_secure_conn()
6888 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN, in set_secure_conn()
6891 if (cp->val != 0x00 && cp->val != 0x01 && cp->val != 0x02) in set_secure_conn()
6892 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN, in set_secure_conn()
6901 if (cp->val) { in set_secure_conn()
6904 if (cp->val == 0x02) in set_secure_conn()
6924 val = !!cp->val; in set_secure_conn()
6927 (cp->val == 0x02) == hci_dev_test_flag(hdev, HCI_SC_ONLY)) { in set_secure_conn()
6934 err = -ENOMEM; in set_secure_conn()
6940 mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN, in set_secure_conn()
6960 if (cp->val != 0x00 && cp->val != 0x01 && cp->val != 0x02) in set_debug_keys()
6961 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEBUG_KEYS, in set_debug_keys()
6966 if (cp->val) in set_debug_keys()
6972 if (cp->val == 0x02) in set_debug_keys()
6981 u8 mode = (cp->val == 0x02) ? 0x01 : 0x00; in set_debug_keys()
6988 goto unlock; in set_debug_keys()
6993 unlock: in set_debug_keys()
7008 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PRIVACY, in set_privacy()
7011 if (cp->privacy != 0x00 && cp->privacy != 0x01 && cp->privacy != 0x02) in set_privacy()
7012 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PRIVACY, in set_privacy()
7016 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PRIVACY, in set_privacy()
7026 if (cp->privacy) { in set_privacy()
7028 memcpy(hdev->irk, cp->irk, sizeof(hdev->irk)); in set_privacy()
7031 if (cp->privacy == 0x02) in set_privacy()
7037 memset(hdev->irk, 0, sizeof(hdev->irk)); in set_privacy()
7045 goto unlock; in set_privacy()
7050 unlock: in set_privacy()
7057 switch (irk->addr.type) { in irk_is_valid()
7063 if ((irk->addr.bdaddr.b[5] & 0xc0) != 0xc0) in irk_is_valid()
7075 const u16 max_irk_count = ((U16_MAX - sizeof(*cp)) / in load_irks()
7083 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_IRKS, in load_irks()
7086 irk_count = __le16_to_cpu(cp->irk_count); in load_irks()
7090 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_IRKS, in load_irks()
7098 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_IRKS, in load_irks()
7105 struct mgmt_irk_info *key = &cp->irks[i]; in load_irks()
7108 return mgmt_cmd_status(sk, hdev->id, in load_irks()
7118 struct mgmt_irk_info *irk = &cp->irks[i]; in load_irks()
7122 irk->val)) { in load_irks()
7124 &irk->addr.bdaddr); in load_irks()
7128 hci_add_irk(hdev, &irk->addr.bdaddr, in load_irks()
7129 le_addr_type(irk->addr.type), irk->val, in load_irks()
7135 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_IRKS, 0, NULL, 0); in load_irks()
7144 if (key->initiator != 0x00 && key->initiator != 0x01) in ltk_is_valid()
7147 switch (key->addr.type) { in ltk_is_valid()
7153 if ((key->addr.bdaddr.b[5] & 0xc0) != 0xc0) in ltk_is_valid()
7165 const u16 max_key_count = ((U16_MAX - sizeof(*cp)) / in load_long_term_keys()
7173 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, in load_long_term_keys()
7176 key_count = __le16_to_cpu(cp->key_count); in load_long_term_keys()
7180 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, in load_long_term_keys()
7184 expected_len = struct_size(cp, keys, key_count); in load_long_term_keys()
7188 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, in load_long_term_keys()
7199 struct mgmt_ltk_info *key = &cp->keys[i]; in load_long_term_keys()
7204 key->val)) { in load_long_term_keys()
7206 &key->addr.bdaddr); in load_long_term_keys()
7212 &key->addr.bdaddr); in load_long_term_keys()
7216 switch (key->type) { in load_long_term_keys()
7219 type = key->initiator ? SMP_LTK : SMP_LTK_RESPONDER; in load_long_term_keys()
7223 type = key->initiator ? SMP_LTK : SMP_LTK_RESPONDER; in load_long_term_keys()
7241 hci_add_ltk(hdev, &key->addr.bdaddr, in load_long_term_keys()
7242 le_addr_type(key->addr.type), type, authenticated, in load_long_term_keys()
7243 key->val, key->enc_size, key->ediv, key->rand); in load_long_term_keys()
7246 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, 0, in load_long_term_keys()
7257 struct hci_conn *conn = cmd->user_data; in get_conn_info_complete()
7258 struct mgmt_cp_get_conn_info *cp = cmd->param; in get_conn_info_complete()
7264 memcpy(&rp.addr, &cp->addr, sizeof(rp.addr)); in get_conn_info_complete()
7268 rp.rssi = conn->rssi; in get_conn_info_complete()
7269 rp.tx_power = conn->tx_power; in get_conn_info_complete()
7270 rp.max_tx_power = conn->max_tx_power; in get_conn_info_complete()
7277 mgmt_cmd_complete(cmd->sk, cmd->hdev->id, MGMT_OP_GET_CONN_INFO, status, in get_conn_info_complete()
7286 struct mgmt_cp_get_conn_info *cp = cmd->param; in get_conn_info_sync()
7292 if (cp->addr.type == BDADDR_BREDR) in get_conn_info_sync()
7294 &cp->addr.bdaddr); in get_conn_info_sync()
7296 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->addr.bdaddr); in get_conn_info_sync()
7298 if (!conn || conn->state != BT_CONNECTED) in get_conn_info_sync()
7301 cmd->user_data = conn; in get_conn_info_sync()
7302 handle = cpu_to_le16(conn->handle); in get_conn_info_sync()
7310 if (!err && (!bdaddr_type_is_le(cp->addr.type) || in get_conn_info_sync()
7311 conn->tx_power == HCI_TX_POWER_INVALID)) in get_conn_info_sync()
7315 if (!err && conn->max_tx_power == HCI_TX_POWER_INVALID) in get_conn_info_sync()
7333 bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr); in get_conn_info()
7334 rp.addr.type = cp->addr.type; in get_conn_info()
7336 if (!bdaddr_type_is_valid(cp->addr.type)) in get_conn_info()
7337 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO, in get_conn_info()
7344 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO, in get_conn_info()
7347 goto unlock; in get_conn_info()
7350 if (cp->addr.type == BDADDR_BREDR) in get_conn_info()
7352 &cp->addr.bdaddr); in get_conn_info()
7354 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->addr.bdaddr); in get_conn_info()
7356 if (!conn || conn->state != BT_CONNECTED) { in get_conn_info()
7357 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO, in get_conn_info()
7360 goto unlock; in get_conn_info()
7366 conn_info_age = get_random_u32_inclusive(hdev->conn_info_min_age, in get_conn_info()
7367 hdev->conn_info_max_age - 1); in get_conn_info()
7372 if (time_after(jiffies, conn->conn_info_timestamp + in get_conn_info()
7374 !conn->conn_info_timestamp) { in get_conn_info()
7380 err = -ENOMEM; in get_conn_info()
7387 mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO, in get_conn_info()
7393 goto unlock; in get_conn_info()
7396 conn->conn_info_timestamp = jiffies; in get_conn_info()
7399 rp.rssi = conn->rssi; in get_conn_info()
7400 rp.tx_power = conn->tx_power; in get_conn_info()
7401 rp.max_tx_power = conn->max_tx_power; in get_conn_info()
7403 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO, in get_conn_info()
7407 unlock: in get_conn_info()
7415 struct mgmt_cp_get_clock_info *cp = cmd->param; in get_clock_info_complete()
7417 struct hci_conn *conn = cmd->user_data; in get_clock_info_complete()
7423 bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr); in get_clock_info_complete()
7424 rp.addr.type = cp->addr.type; in get_clock_info_complete()
7429 rp.local_clock = cpu_to_le32(hdev->clock); in get_clock_info_complete()
7432 rp.piconet_clock = cpu_to_le32(conn->clock); in get_clock_info_complete()
7433 rp.accuracy = cpu_to_le16(conn->clock_accuracy); in get_clock_info_complete()
7437 mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, status, &rp, in get_clock_info_complete()
7446 struct mgmt_cp_get_clock_info *cp = cmd->param; in get_clock_info_sync()
7454 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->addr.bdaddr); in get_clock_info_sync()
7455 if (!conn || conn->state != BT_CONNECTED) in get_clock_info_sync()
7458 cmd->user_data = conn; in get_clock_info_sync()
7459 hci_cp.handle = cpu_to_le16(conn->handle); in get_clock_info_sync()
7477 bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr); in get_clock_info()
7478 rp.addr.type = cp->addr.type; in get_clock_info()
7480 if (cp->addr.type != BDADDR_BREDR) in get_clock_info()
7481 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CLOCK_INFO, in get_clock_info()
7488 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CLOCK_INFO, in get_clock_info()
7491 goto unlock; in get_clock_info()
7494 if (bacmp(&cp->addr.bdaddr, BDADDR_ANY)) { in get_clock_info()
7496 &cp->addr.bdaddr); in get_clock_info()
7497 if (!conn || conn->state != BT_CONNECTED) { in get_clock_info()
7498 err = mgmt_cmd_complete(sk, hdev->id, in get_clock_info()
7502 goto unlock; in get_clock_info()
7510 err = -ENOMEM; in get_clock_info()
7516 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CLOCK_INFO, in get_clock_info()
7524 unlock: in get_clock_info()
7537 if (conn->dst_type != type) in is_connected()
7540 if (conn->state != BT_CONNECTED) in is_connected()
7546 /* This function requires the caller holds hdev->lock */
7554 return -EIO; in hci_conn_params_set()
7556 if (params->auto_connect == auto_connect) in hci_conn_params_set()
7567 if (params->explicit_connect) in hci_conn_params_set()
7568 hci_pend_le_list_add(params, &hdev->pend_le_conns); in hci_conn_params_set()
7571 if (params->explicit_connect) in hci_conn_params_set()
7572 hci_pend_le_list_add(params, &hdev->pend_le_conns); in hci_conn_params_set()
7574 hci_pend_le_list_add(params, &hdev->pend_le_reports); in hci_conn_params_set()
7579 hci_pend_le_list_add(params, &hdev->pend_le_conns); in hci_conn_params_set()
7583 params->auto_connect = auto_connect; in hci_conn_params_set()
7606 struct mgmt_cp_add_device *cp = cmd->param; in add_device_complete()
7611 params = hci_conn_params_lookup(hdev, &cp->addr.bdaddr, in add_device_complete()
7612 le_addr_type(cp->addr.type)); in add_device_complete()
7614 device_added(cmd->sk, hdev, &cp->addr.bdaddr, cp->addr.type, in add_device_complete()
7615 cp->action); in add_device_complete()
7616 device_flags_changed(NULL, hdev, &cp->addr.bdaddr, in add_device_complete()
7617 cp->addr.type, hdev->conn_flags, in add_device_complete()
7618 params ? params->flags : 0); in add_device_complete()
7621 mgmt_cmd_complete(cmd->sk, hdev->id, MGMT_OP_ADD_DEVICE, in add_device_complete()
7622 mgmt_status(err), &cp->addr, sizeof(cp->addr)); in add_device_complete()
7644 if (!bdaddr_type_is_valid(cp->addr.type) || in add_device()
7645 !bacmp(&cp->addr.bdaddr, BDADDR_ANY)) in add_device()
7646 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE, in add_device()
7648 &cp->addr, sizeof(cp->addr)); in add_device()
7650 if (cp->action != 0x00 && cp->action != 0x01 && cp->action != 0x02) in add_device()
7651 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE, in add_device()
7653 &cp->addr, sizeof(cp->addr)); in add_device()
7657 if (cp->addr.type == BDADDR_BREDR) { in add_device()
7659 if (cp->action != 0x01) { in add_device()
7660 err = mgmt_cmd_complete(sk, hdev->id, in add_device()
7663 &cp->addr, sizeof(cp->addr)); in add_device()
7664 goto unlock; in add_device()
7667 err = hci_bdaddr_list_add_with_flags(&hdev->accept_list, in add_device()
7668 &cp->addr.bdaddr, in add_device()
7669 cp->addr.type, 0); in add_device()
7671 goto unlock; in add_device()
7678 addr_type = le_addr_type(cp->addr.type); in add_device()
7680 if (cp->action == 0x02) in add_device()
7682 else if (cp->action == 0x01) in add_device()
7692 if (!hci_is_identity_address(&cp->addr.bdaddr, addr_type)) { in add_device()
7693 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE, in add_device()
7695 &cp->addr, sizeof(cp->addr)); in add_device()
7696 goto unlock; in add_device()
7702 if (hci_conn_params_set(hdev, &cp->addr.bdaddr, addr_type, in add_device()
7704 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE, in add_device()
7705 MGMT_STATUS_FAILED, &cp->addr, in add_device()
7706 sizeof(cp->addr)); in add_device()
7707 goto unlock; in add_device()
7709 params = hci_conn_params_lookup(hdev, &cp->addr.bdaddr, in add_device()
7712 current_flags = params->flags; in add_device()
7717 err = -ENOMEM; in add_device()
7718 goto unlock; in add_device()
7724 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE, in add_device()
7725 MGMT_STATUS_FAILED, &cp->addr, in add_device()
7726 sizeof(cp->addr)); in add_device()
7730 goto unlock; in add_device()
7733 device_added(sk, hdev, &cp->addr.bdaddr, cp->addr.type, cp->action); in add_device()
7734 supported_flags = hdev->conn_flags; in add_device()
7735 device_flags_changed(NULL, hdev, &cp->addr.bdaddr, cp->addr.type, in add_device()
7738 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE, in add_device()
7739 MGMT_STATUS_SUCCESS, &cp->addr, in add_device()
7740 sizeof(cp->addr)); in add_device()
7742 unlock: in add_device()
7773 if (bacmp(&cp->addr.bdaddr, BDADDR_ANY)) { in remove_device()
7777 if (!bdaddr_type_is_valid(cp->addr.type)) { in remove_device()
7778 err = mgmt_cmd_complete(sk, hdev->id, in remove_device()
7781 &cp->addr, sizeof(cp->addr)); in remove_device()
7782 goto unlock; in remove_device()
7785 if (cp->addr.type == BDADDR_BREDR) { in remove_device()
7786 err = hci_bdaddr_list_del(&hdev->accept_list, in remove_device()
7787 &cp->addr.bdaddr, in remove_device()
7788 cp->addr.type); in remove_device()
7790 err = mgmt_cmd_complete(sk, hdev->id, in remove_device()
7793 &cp->addr, in remove_device()
7794 sizeof(cp->addr)); in remove_device()
7795 goto unlock; in remove_device()
7800 device_removed(sk, hdev, &cp->addr.bdaddr, in remove_device()
7801 cp->addr.type); in remove_device()
7805 addr_type = le_addr_type(cp->addr.type); in remove_device()
7812 if (!hci_is_identity_address(&cp->addr.bdaddr, addr_type)) { in remove_device()
7813 err = mgmt_cmd_complete(sk, hdev->id, in remove_device()
7816 &cp->addr, sizeof(cp->addr)); in remove_device()
7817 goto unlock; in remove_device()
7820 params = hci_conn_params_lookup(hdev, &cp->addr.bdaddr, in remove_device()
7823 err = mgmt_cmd_complete(sk, hdev->id, in remove_device()
7826 &cp->addr, sizeof(cp->addr)); in remove_device()
7827 goto unlock; in remove_device()
7830 if (params->auto_connect == HCI_AUTO_CONN_DISABLED || in remove_device()
7831 params->auto_connect == HCI_AUTO_CONN_EXPLICIT) { in remove_device()
7832 err = mgmt_cmd_complete(sk, hdev->id, in remove_device()
7835 &cp->addr, sizeof(cp->addr)); in remove_device()
7836 goto unlock; in remove_device()
7841 device_removed(sk, hdev, &cp->addr.bdaddr, cp->addr.type); in remove_device()
7846 if (cp->addr.type) { in remove_device()
7847 err = mgmt_cmd_complete(sk, hdev->id, in remove_device()
7850 &cp->addr, sizeof(cp->addr)); in remove_device()
7851 goto unlock; in remove_device()
7854 list_for_each_entry_safe(b, btmp, &hdev->accept_list, list) { in remove_device()
7855 device_removed(sk, hdev, &b->bdaddr, b->bdaddr_type); in remove_device()
7856 list_del(&b->list); in remove_device()
7862 list_for_each_entry_safe(p, tmp, &hdev->le_conn_params, list) { in remove_device()
7863 if (p->auto_connect == HCI_AUTO_CONN_DISABLED) in remove_device()
7865 device_removed(sk, hdev, &p->addr, p->addr_type); in remove_device()
7866 if (p->explicit_connect) { in remove_device()
7867 p->auto_connect = HCI_AUTO_CONN_EXPLICIT; in remove_device()
7879 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_DEVICE, in remove_device()
7880 MGMT_STATUS_SUCCESS, &cp->addr, in remove_device()
7881 sizeof(cp->addr)); in remove_device()
7882 unlock: in remove_device()
7891 const u16 max_param_count = ((U16_MAX - sizeof(*cp)) / in load_conn_param()
7897 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM, in load_conn_param()
7900 param_count = __le16_to_cpu(cp->param_count); in load_conn_param()
7904 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM, in load_conn_param()
7912 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM, in load_conn_param()
7923 struct mgmt_conn_param *param = &cp->params[i]; in load_conn_param()
7928 bt_dev_dbg(hdev, "Adding %pMR (type %u)", ¶m->addr.bdaddr, in load_conn_param()
7929 param->addr.type); in load_conn_param()
7931 if (param->addr.type == BDADDR_LE_PUBLIC) { in load_conn_param()
7933 } else if (param->addr.type == BDADDR_LE_RANDOM) { in load_conn_param()
7940 min = le16_to_cpu(param->min_interval); in load_conn_param()
7941 max = le16_to_cpu(param->max_interval); in load_conn_param()
7942 latency = le16_to_cpu(param->latency); in load_conn_param()
7943 timeout = le16_to_cpu(param->timeout); in load_conn_param()
7953 hci_param = hci_conn_params_add(hdev, ¶m->addr.bdaddr, in load_conn_param()
7960 hci_param->conn_min_interval = min; in load_conn_param()
7961 hci_param->conn_max_interval = max; in load_conn_param()
7962 hci_param->conn_latency = latency; in load_conn_param()
7963 hci_param->supervision_timeout = timeout; in load_conn_param()
7968 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM, 0, in load_conn_param()
7982 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_EXTERNAL_CONFIG, in set_external_config()
7985 if (cp->config != 0x00 && cp->config != 0x01) in set_external_config()
7986 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_EXTERNAL_CONFIG, in set_external_config()
7989 if (!test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks)) in set_external_config()
7990 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_EXTERNAL_CONFIG, in set_external_config()
7995 if (cp->config) in set_external_config()
8002 goto unlock; in set_external_config()
8005 goto unlock; in set_external_config()
8016 queue_work(hdev->req_workqueue, &hdev->power_on); in set_external_config()
8018 set_bit(HCI_RAW, &hdev->flags); in set_external_config()
8023 unlock: in set_external_config()
8038 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PUBLIC_ADDRESS, in set_public_address()
8041 if (!bacmp(&cp->bdaddr, BDADDR_ANY)) in set_public_address()
8042 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PUBLIC_ADDRESS, in set_public_address()
8045 if (!hdev->set_bdaddr) in set_public_address()
8046 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PUBLIC_ADDRESS, in set_public_address()
8051 changed = !!bacmp(&hdev->public_addr, &cp->bdaddr); in set_public_address()
8052 bacpy(&hdev->public_addr, &cp->bdaddr); in set_public_address()
8056 goto unlock; in set_public_address()
8059 goto unlock; in set_public_address()
8072 queue_work(hdev->req_workqueue, &hdev->power_on); in set_public_address()
8075 unlock: in set_public_address()
8087 struct sk_buff *skb = cmd->skb; in read_local_oob_ext_data_complete()
8091 if (err == -ECANCELED || in read_local_oob_ext_data_complete()
8101 status = mgmt_status(skb->data[0]); in read_local_oob_ext_data_complete()
8106 mgmt_cp = cmd->param; in read_local_oob_ext_data_complete()
8119 if (skb->len != sizeof(*rp)) { in read_local_oob_ext_data_complete()
8124 rp = (void *)skb->data; in read_local_oob_ext_data_complete()
8127 h192 = rp->hash; in read_local_oob_ext_data_complete()
8128 r192 = rp->rand; in read_local_oob_ext_data_complete()
8135 if (skb->len != sizeof(*rp)) { in read_local_oob_ext_data_complete()
8140 rp = (void *)skb->data; in read_local_oob_ext_data_complete()
8148 h192 = rp->hash192; in read_local_oob_ext_data_complete()
8149 r192 = rp->rand192; in read_local_oob_ext_data_complete()
8152 h256 = rp->hash256; in read_local_oob_ext_data_complete()
8153 r256 = rp->rand256; in read_local_oob_ext_data_complete()
8164 eir_len = eir_append_data(mgmt_rp->eir, 0, EIR_CLASS_OF_DEV, in read_local_oob_ext_data_complete()
8165 hdev->dev_class, 3); in read_local_oob_ext_data_complete()
8168 eir_len = eir_append_data(mgmt_rp->eir, eir_len, in read_local_oob_ext_data_complete()
8170 eir_len = eir_append_data(mgmt_rp->eir, eir_len, in read_local_oob_ext_data_complete()
8175 eir_len = eir_append_data(mgmt_rp->eir, eir_len, in read_local_oob_ext_data_complete()
8177 eir_len = eir_append_data(mgmt_rp->eir, eir_len, in read_local_oob_ext_data_complete()
8182 mgmt_rp->type = mgmt_cp->type; in read_local_oob_ext_data_complete()
8183 mgmt_rp->eir_len = cpu_to_le16(eir_len); in read_local_oob_ext_data_complete()
8185 err = mgmt_cmd_complete(cmd->sk, hdev->id, in read_local_oob_ext_data_complete()
8191 hci_sock_set_flag(cmd->sk, HCI_MGMT_OOB_DATA_EVENTS); in read_local_oob_ext_data_complete()
8195 HCI_MGMT_OOB_DATA_EVENTS, cmd->sk); in read_local_oob_ext_data_complete()
8213 return -ENOMEM; in read_local_ssp_oob_req()
8239 switch (cp->type) { in read_local_oob_ext_data()
8267 return -ENOMEM; in read_local_oob_ext_data()
8280 switch (cp->type) { in read_local_oob_ext_data()
8291 eir_len = eir_append_data(rp->eir, eir_len, in read_local_oob_ext_data()
8293 hdev->dev_class, 3); in read_local_oob_ext_data()
8307 * local out-of-band data when privacy is in use. in read_local_oob_ext_data()
8321 !bacmp(&hdev->bdaddr, BDADDR_ANY) || in read_local_oob_ext_data()
8323 bacmp(&hdev->static_addr, BDADDR_ANY))) { in read_local_oob_ext_data()
8324 memcpy(addr, &hdev->static_addr, 6); in read_local_oob_ext_data()
8327 memcpy(addr, &hdev->bdaddr, 6); in read_local_oob_ext_data()
8331 eir_len = eir_append_data(rp->eir, eir_len, EIR_LE_BDADDR, in read_local_oob_ext_data()
8339 eir_len = eir_append_data(rp->eir, eir_len, EIR_LE_ROLE, in read_local_oob_ext_data()
8343 eir_len = eir_append_data(rp->eir, eir_len, in read_local_oob_ext_data()
8347 eir_len = eir_append_data(rp->eir, eir_len, in read_local_oob_ext_data()
8357 eir_len = eir_append_data(rp->eir, eir_len, EIR_FLAGS, in read_local_oob_ext_data()
8369 rp->type = cp->type; in read_local_oob_ext_data()
8370 rp->eir_len = cpu_to_le16(eir_len); in read_local_oob_ext_data()
8372 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_EXT_DATA, in read_local_oob_ext_data()
8406 if (hdev->adv_tx_power != HCI_TX_POWER_INVALID || ext_adv_capable(hdev)) in get_supported_adv_flags()
8437 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_ADV_FEATURES, in read_adv_features()
8442 rp_len = sizeof(*rp) + hdev->adv_instance_cnt; in read_adv_features()
8446 return -ENOMEM; in read_adv_features()
8451 rp->supported_flags = cpu_to_le32(supported_flags); in read_adv_features()
8452 rp->max_adv_data_len = max_adv_len(hdev); in read_adv_features()
8453 rp->max_scan_rsp_len = max_adv_len(hdev); in read_adv_features()
8454 rp->max_instances = hdev->le_num_of_adv_sets; in read_adv_features()
8455 rp->num_instances = hdev->adv_instance_cnt; in read_adv_features()
8457 instance = rp->instance; in read_adv_features()
8458 list_for_each_entry(adv_instance, &hdev->adv_instances, list) { in read_adv_features()
8459 /* Only instances 1-le_num_of_adv_sets are externally visible */ in read_adv_features()
8460 if (adv_instance->instance <= hdev->adv_instance_cnt) { in read_adv_features()
8461 *instance = adv_instance->instance; in read_adv_features()
8464 rp->num_instances--; in read_adv_features()
8465 rp_len--; in read_adv_features()
8471 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_ADV_FEATURES, in read_adv_features()
8495 max_len -= 3; in tlv_data_max_len()
8498 max_len -= 3; in tlv_data_max_len()
8501 max_len -= calculate_name_len(hdev); in tlv_data_max_len()
8504 max_len -= 4; in tlv_data_max_len()
8587 ((phy_flags && (phy_flags ^ (phy_flags & -phy_flags))))) in requested_adv_flags_are_valid()
8607 list_for_each_entry_safe(adv, n, &hdev->adv_instances, list) { in add_adv_complete()
8610 if (!adv->pending) in add_adv_complete()
8614 adv->pending = false; in add_adv_complete()
8618 instance = adv->instance; in add_adv_complete()
8620 if (hdev->cur_adv_instance == instance) in add_adv_complete()
8633 struct mgmt_cp_add_advertising *cp = cmd->param; in add_advertising_complete()
8638 rp.instance = cp->instance; in add_advertising_complete()
8641 mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, in add_advertising_complete()
8644 mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, in add_advertising_complete()
8647 add_adv_complete(hdev, cmd->sk, cp->instance, err); in add_advertising_complete()
8655 struct mgmt_cp_add_advertising *cp = cmd->param; in add_advertising_sync()
8657 return hci_schedule_adv_instance_sync(hdev, cp->instance, true); in add_advertising_sync()
8678 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
8681 if (cp->instance < 1 || cp->instance > hdev->le_num_of_adv_sets) in add_advertising()
8682 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
8685 if (data_len != sizeof(*cp) + cp->adv_data_len + cp->scan_rsp_len) in add_advertising()
8686 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
8689 flags = __le32_to_cpu(cp->flags); in add_advertising()
8690 timeout = __le16_to_cpu(cp->timeout); in add_advertising()
8691 duration = __le16_to_cpu(cp->duration); in add_advertising()
8694 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
8700 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
8702 goto unlock; in add_advertising()
8706 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
8708 goto unlock; in add_advertising()
8711 if (!tlv_data_is_valid(hdev, flags, cp->data, cp->adv_data_len, true) || in add_advertising()
8712 !tlv_data_is_valid(hdev, flags, cp->data + cp->adv_data_len, in add_advertising()
8713 cp->scan_rsp_len, false)) { in add_advertising()
8714 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
8716 goto unlock; in add_advertising()
8719 prev_instance_cnt = hdev->adv_instance_cnt; in add_advertising()
8721 adv = hci_add_adv_instance(hdev, cp->instance, flags, in add_advertising()
8722 cp->adv_data_len, cp->data, in add_advertising()
8723 cp->scan_rsp_len, in add_advertising()
8724 cp->data + cp->adv_data_len, in add_advertising()
8727 hdev->le_adv_min_interval, in add_advertising()
8728 hdev->le_adv_max_interval, 0); in add_advertising()
8730 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
8732 goto unlock; in add_advertising()
8738 if (hdev->adv_instance_cnt > prev_instance_cnt) in add_advertising()
8739 mgmt_advertising_added(sk, hdev, cp->instance); in add_advertising()
8741 if (hdev->cur_adv_instance == cp->instance) { in add_advertising()
8749 next_instance = hci_get_next_instance(hdev, cp->instance); in add_advertising()
8751 schedule_instance = next_instance->instance; in add_advertising()
8752 } else if (!hdev->adv_instance_timeout) { in add_advertising()
8756 schedule_instance = cp->instance; in add_advertising()
8766 rp.instance = cp->instance; in add_advertising()
8767 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
8769 goto unlock; in add_advertising()
8778 err = -ENOMEM; in add_advertising()
8779 goto unlock; in add_advertising()
8782 cp->instance = schedule_instance; in add_advertising()
8789 unlock: in add_advertising()
8799 struct mgmt_cp_add_ext_adv_params *cp = cmd->param; in add_ext_adv_params_complete()
8804 BT_DBG("%s", hdev->name); in add_ext_adv_params_complete()
8808 adv = hci_find_adv_instance(hdev, cp->instance); in add_ext_adv_params_complete()
8810 goto unlock; in add_ext_adv_params_complete()
8812 rp.instance = cp->instance; in add_ext_adv_params_complete()
8813 rp.tx_power = adv->tx_power; in add_ext_adv_params_complete()
8818 flags = __le32_to_cpu(cp->flags); in add_ext_adv_params_complete()
8827 if (!adv->pending) in add_ext_adv_params_complete()
8828 mgmt_advertising_removed(cmd->sk, hdev, cp->instance); in add_ext_adv_params_complete()
8830 hci_remove_adv_instance(hdev, cp->instance); in add_ext_adv_params_complete()
8832 mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, in add_ext_adv_params_complete()
8835 mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, in add_ext_adv_params_complete()
8839 unlock: in add_ext_adv_params_complete()
8849 struct mgmt_cp_add_ext_adv_params *cp = cmd->param; in add_ext_adv_params_sync()
8851 return hci_setup_ext_adv_instance_sync(hdev, cp->instance); in add_ext_adv_params_sync()
8867 BT_DBG("%s", hdev->name); in add_ext_adv_params()
8871 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_EXT_ADV_PARAMS, in add_ext_adv_params()
8874 if (cp->instance < 1 || cp->instance > hdev->le_num_of_adv_sets) in add_ext_adv_params()
8875 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_EXT_ADV_PARAMS, in add_ext_adv_params()
8885 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_EXT_ADV_PARAMS, in add_ext_adv_params()
8888 flags = __le32_to_cpu(cp->flags); in add_ext_adv_params()
8891 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_EXT_ADV_PARAMS, in add_ext_adv_params()
8898 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_EXT_ADV_PARAMS, in add_ext_adv_params()
8900 goto unlock; in add_ext_adv_params()
8904 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_EXT_ADV_PARAMS, in add_ext_adv_params()
8906 goto unlock; in add_ext_adv_params()
8911 __le16_to_cpu(cp->timeout) : 0; in add_ext_adv_params()
8914 __le16_to_cpu(cp->duration) : in add_ext_adv_params()
8915 hdev->def_multi_adv_rotation_duration; in add_ext_adv_params()
8918 __le32_to_cpu(cp->min_interval) : in add_ext_adv_params()
8919 hdev->le_adv_min_interval; in add_ext_adv_params()
8922 __le32_to_cpu(cp->max_interval) : in add_ext_adv_params()
8923 hdev->le_adv_max_interval; in add_ext_adv_params()
8926 cp->tx_power : in add_ext_adv_params()
8930 adv = hci_add_adv_instance(hdev, cp->instance, flags, 0, NULL, 0, NULL, in add_ext_adv_params()
8935 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_EXT_ADV_PARAMS, in add_ext_adv_params()
8937 goto unlock; in add_ext_adv_params()
8945 err = -ENOMEM; in add_ext_adv_params()
8946 hci_remove_adv_instance(hdev, cp->instance); in add_ext_adv_params()
8947 goto unlock; in add_ext_adv_params()
8955 rp.instance = cp->instance; in add_ext_adv_params()
8959 err = mgmt_cmd_complete(sk, hdev->id, in add_ext_adv_params()
8964 unlock: in add_ext_adv_params()
8973 struct mgmt_cp_add_ext_adv_data *cp = cmd->param; in add_ext_adv_data_complete()
8976 add_adv_complete(hdev, cmd->sk, cp->instance, err); in add_ext_adv_data_complete()
8980 rp.instance = cp->instance; in add_ext_adv_data_complete()
8983 mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, in add_ext_adv_data_complete()
8986 mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, in add_ext_adv_data_complete()
8995 struct mgmt_cp_add_ext_adv_data *cp = cmd->param; in add_ext_adv_data_sync()
8999 err = hci_update_adv_data_sync(hdev, cp->instance); in add_ext_adv_data_sync()
9003 err = hci_update_scan_rsp_data_sync(hdev, cp->instance); in add_ext_adv_data_sync()
9007 return hci_enable_ext_advertising_sync(hdev, cp->instance); in add_ext_adv_data_sync()
9010 return hci_schedule_adv_instance_sync(hdev, cp->instance, true); in add_ext_adv_data_sync()
9024 BT_DBG("%s", hdev->name); in add_ext_adv_data()
9028 adv_instance = hci_find_adv_instance(hdev, cp->instance); in add_ext_adv_data()
9031 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_EXT_ADV_DATA, in add_ext_adv_data()
9033 goto unlock; in add_ext_adv_data()
9038 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_EXT_ADV_DATA, in add_ext_adv_data()
9044 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_EXT_ADV_DATA, in add_ext_adv_data()
9050 if (!tlv_data_is_valid(hdev, adv_instance->flags, cp->data, in add_ext_adv_data()
9051 cp->adv_data_len, true) || in add_ext_adv_data()
9052 !tlv_data_is_valid(hdev, adv_instance->flags, cp->data + in add_ext_adv_data()
9053 cp->adv_data_len, cp->scan_rsp_len, false)) { in add_ext_adv_data()
9054 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_EXT_ADV_DATA, in add_ext_adv_data()
9060 hci_set_adv_instance_data(hdev, cp->instance, cp->adv_data_len, in add_ext_adv_data()
9061 cp->data, cp->scan_rsp_len, in add_ext_adv_data()
9062 cp->data + cp->adv_data_len); in add_ext_adv_data()
9065 if (hdev->cur_adv_instance == cp->instance) { in add_ext_adv_data()
9074 next_instance = hci_get_next_instance(hdev, cp->instance); in add_ext_adv_data()
9076 schedule_instance = next_instance->instance; in add_ext_adv_data()
9077 } else if (!hdev->adv_instance_timeout) { in add_ext_adv_data()
9081 schedule_instance = cp->instance; in add_ext_adv_data()
9089 if (adv_instance->pending) { in add_ext_adv_data()
9090 mgmt_advertising_added(sk, hdev, cp->instance); in add_ext_adv_data()
9091 adv_instance->pending = false; in add_ext_adv_data()
9093 rp.instance = cp->instance; in add_ext_adv_data()
9094 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_EXT_ADV_DATA, in add_ext_adv_data()
9096 goto unlock; in add_ext_adv_data()
9102 err = -ENOMEM; in add_ext_adv_data()
9118 if (adv_instance->pending) in add_ext_adv_data()
9119 mgmt_advertising_added(sk, hdev, cp->instance); in add_ext_adv_data()
9121 goto unlock; in add_ext_adv_data()
9124 hci_remove_adv_instance(hdev, cp->instance); in add_ext_adv_data()
9126 unlock: in add_ext_adv_data()
9136 struct mgmt_cp_remove_advertising *cp = cmd->param; in remove_advertising_complete()
9142 rp.instance = cp->instance; in remove_advertising_complete()
9145 mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, in remove_advertising_complete()
9148 mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, in remove_advertising_complete()
9157 struct mgmt_cp_remove_advertising *cp = cmd->param; in remove_advertising_sync()
9160 err = hci_remove_advertising_sync(hdev, cmd->sk, cp->instance, true); in remove_advertising_sync()
9164 if (list_empty(&hdev->adv_instances)) in remove_advertising_sync()
9181 if (cp->instance && !hci_find_adv_instance(hdev, cp->instance)) { in remove_advertising()
9182 err = mgmt_cmd_status(sk, hdev->id, in remove_advertising()
9185 goto unlock; in remove_advertising()
9189 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_ADVERTISING, in remove_advertising()
9191 goto unlock; in remove_advertising()
9194 if (list_empty(&hdev->adv_instances)) { in remove_advertising()
9195 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_ADVERTISING, in remove_advertising()
9197 goto unlock; in remove_advertising()
9203 err = -ENOMEM; in remove_advertising()
9204 goto unlock; in remove_advertising()
9212 unlock: in remove_advertising()
9228 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_GET_ADV_SIZE_INFO, in get_adv_size_info()
9231 if (cp->instance < 1 || cp->instance > hdev->le_num_of_adv_sets) in get_adv_size_info()
9232 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_GET_ADV_SIZE_INFO, in get_adv_size_info()
9235 flags = __le32_to_cpu(cp->flags); in get_adv_size_info()
9242 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_GET_ADV_SIZE_INFO, in get_adv_size_info()
9245 rp.instance = cp->instance; in get_adv_size_info()
9246 rp.flags = cp->flags; in get_adv_size_info()
9250 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_ADV_SIZE_INFO, in get_adv_size_info()
9392 if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks)) in mgmt_index_added()
9405 ev.bus = hdev->bus; in mgmt_index_added()
9416 if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks)) in mgmt_index_removed()
9431 ev.bus = hdev->bus; in mgmt_index_removed()
9439 cancel_delayed_work_sync(&hdev->discov_off); in mgmt_index_removed()
9440 cancel_delayed_work_sync(&hdev->service_cache); in mgmt_index_removed()
9441 cancel_delayed_work_sync(&hdev->rpa_expired); in mgmt_index_removed()
9490 if (memcmp(hdev->dev_class, zero_cod, sizeof(zero_cod)) != 0) { in __mgmt_power_off()
9512 if (err == -ERFKILL) in mgmt_set_powered_failed()
9517 mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_POWERED, status); in mgmt_set_powered_failed()
9530 bacpy(&ev.key.addr.bdaddr, &key->bdaddr); in mgmt_new_link_key()
9532 ev.key.type = key->type; in mgmt_new_link_key()
9533 memcpy(ev.key.val, key->val, HCI_LINK_KEY_SIZE); in mgmt_new_link_key()
9534 ev.key.pin_len = key->pin_len; in mgmt_new_link_key()
9541 switch (ltk->type) { in mgmt_ltk_type()
9544 if (ltk->authenticated) in mgmt_ltk_type()
9548 if (ltk->authenticated) in mgmt_ltk_type()
9564 /* Devices using resolvable or non-resolvable random addresses in mgmt_new_ltk()
9566 * to store long term keys. Their addresses will change the in mgmt_new_ltk()
9571 * identity is known, the long term keys are internally in mgmt_new_ltk()
9575 if (key->bdaddr_type == ADDR_LE_DEV_RANDOM && in mgmt_new_ltk()
9576 (key->bdaddr.b[5] & 0xc0) != 0xc0) in mgmt_new_ltk()
9581 bacpy(&ev.key.addr.bdaddr, &key->bdaddr); in mgmt_new_ltk()
9582 ev.key.addr.type = link_to_bdaddr(LE_LINK, key->bdaddr_type); in mgmt_new_ltk()
9584 ev.key.enc_size = key->enc_size; in mgmt_new_ltk()
9585 ev.key.ediv = key->ediv; in mgmt_new_ltk()
9586 ev.key.rand = key->rand; in mgmt_new_ltk()
9588 if (key->type == SMP_LTK) in mgmt_new_ltk()
9594 memcpy(ev.key.val, key->val, key->enc_size); in mgmt_new_ltk()
9595 memset(ev.key.val + key->enc_size, 0, in mgmt_new_ltk()
9596 sizeof(ev.key.val) - key->enc_size); in mgmt_new_ltk()
9609 bacpy(&ev.rpa, &irk->rpa); in mgmt_new_irk()
9610 bacpy(&ev.irk.addr.bdaddr, &irk->bdaddr); in mgmt_new_irk()
9611 ev.irk.addr.type = link_to_bdaddr(LE_LINK, irk->addr_type); in mgmt_new_irk()
9612 memcpy(ev.irk.val, irk->val, sizeof(irk->val)); in mgmt_new_irk()
9624 /* Devices using resolvable or non-resolvable random addresses in mgmt_new_csrk()
9626 * to store signature resolving keys. Their addresses will change in mgmt_new_csrk()
9633 if (csrk->bdaddr_type == ADDR_LE_DEV_RANDOM && in mgmt_new_csrk()
9634 (csrk->bdaddr.b[5] & 0xc0) != 0xc0) in mgmt_new_csrk()
9639 bacpy(&ev.key.addr.bdaddr, &csrk->bdaddr); in mgmt_new_csrk()
9640 ev.key.addr.type = link_to_bdaddr(LE_LINK, csrk->bdaddr_type); in mgmt_new_csrk()
9641 ev.key.type = csrk->type; in mgmt_new_csrk()
9642 memcpy(ev.key.val, csrk->val, sizeof(csrk->val)); in mgmt_new_csrk()
9676 if (test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) in mgmt_device_connected()
9680 if (conn->le_adv_data_len > 0) in mgmt_device_connected()
9682 sizeof(*ev) + conn->le_adv_data_len); in mgmt_device_connected()
9686 eir_precalc_len(sizeof(conn->dev_class))); in mgmt_device_connected()
9692 bacpy(&ev->addr.bdaddr, &conn->dst); in mgmt_device_connected()
9693 ev->addr.type = link_to_bdaddr(conn->type, conn->dst_type); in mgmt_device_connected()
9695 if (conn->out) in mgmt_device_connected()
9698 ev->flags = __cpu_to_le32(flags); in mgmt_device_connected()
9704 if (conn->le_adv_data_len > 0) { in mgmt_device_connected()
9705 skb_put_data(skb, conn->le_adv_data, conn->le_adv_data_len); in mgmt_device_connected()
9706 eir_len = conn->le_adv_data_len; in mgmt_device_connected()
9711 if (memcmp(conn->dev_class, "\0\0\0", sizeof(conn->dev_class))) in mgmt_device_connected()
9713 conn->dev_class, sizeof(conn->dev_class)); in mgmt_device_connected()
9716 ev->eir_len = cpu_to_le16(eir_len); in mgmt_device_connected()
9724 struct mgmt_cp_unpair_device *cp = cmd->param; in unpair_device_rsp()
9726 device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, cmd->sk); in unpair_device_rsp()
9728 cmd->cmd_complete(cmd, 0); in unpair_device_rsp()
9740 cp = cmd->param; in mgmt_powering_down()
9741 if (!cp->val) in mgmt_powering_down()
9765 if (hdev->suspended) in mgmt_device_disconnected()
9788 cp = cmd->param; in mgmt_disconnect_failed()
9790 if (bacmp(bdaddr, &cp->addr.bdaddr)) in mgmt_disconnect_failed()
9793 if (cp->addr.type != bdaddr_type) in mgmt_disconnect_failed()
9796 cmd->cmd_complete(cmd, mgmt_status(status)); in mgmt_disconnect_failed()
9804 if (test_and_clear_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) { in mgmt_connect_failed()
9805 mgmt_device_disconnected(hdev, &conn->dst, conn->type, in mgmt_connect_failed()
9806 conn->dst_type, status, true); in mgmt_connect_failed()
9810 bacpy(&ev.addr.bdaddr, &conn->dst); in mgmt_connect_failed()
9811 ev.addr.type = link_to_bdaddr(conn->type, conn->dst_type); in mgmt_connect_failed()
9837 cmd->cmd_complete(cmd, mgmt_status(status)); in mgmt_pin_code_reply_complete()
9850 cmd->cmd_complete(cmd, mgmt_status(status)); in mgmt_pin_code_neg_reply_complete()
9893 return -ENOENT; in user_pairing_resp_complete()
9895 cmd->cmd_complete(cmd, mgmt_status(status)); in user_pairing_resp_complete()
9953 bacpy(&ev.addr.bdaddr, &conn->dst); in mgmt_auth_failed()
9954 ev.addr.type = link_to_bdaddr(conn->type, conn->dst_type); in mgmt_auth_failed()
9959 mgmt_event(MGMT_EV_AUTH_FAILED, conn->hdev, &ev, sizeof(ev), in mgmt_auth_failed()
9960 cmd ? cmd->sk : NULL); in mgmt_auth_failed()
9963 cmd->cmd_complete(cmd, status); in mgmt_auth_failed()
9980 if (test_bit(HCI_AUTH, &hdev->flags)) in mgmt_auth_enable_complete()
9999 if (match->sk == NULL) { in sk_lookup()
10000 match->sk = cmd->sk; in sk_lookup()
10001 sock_hold(match->sk); in sk_lookup()
10037 memcpy(ev.short_name, hdev->short_name, HCI_MAX_SHORT_NAME_LENGTH); in mgmt_set_local_name_complete()
10041 memcpy(hdev->dev_name, name, sizeof(hdev->dev_name)); in mgmt_set_local_name_complete()
10051 HCI_MGMT_LOCAL_NAME_EVENTS, cmd ? cmd->sk : NULL); in mgmt_set_local_name_complete()
10052 ext_info_changed(hdev, cmd ? cmd->sk : NULL); in mgmt_set_local_name_complete()
10079 if (eir_len - parsed < field_len + 1) in eir_has_uuids()
10129 hdev->discovery.scan_start + in restart_le_scan()
10130 hdev->discovery.scan_duration)) in restart_le_scan()
10133 queue_delayed_work(hdev->req_workqueue, &hdev->le_scan_restart, in restart_le_scan()
10149 if (hdev->discovery.rssi != HCI_RSSI_INVALID && in is_filter_match()
10151 (rssi < hdev->discovery.rssi && in is_filter_match()
10152 !test_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks)))) in is_filter_match()
10155 if (hdev->discovery.uuid_count != 0) { in is_filter_match()
10159 if (!eir_has_uuids(eir, eir_len, hdev->discovery.uuid_count, in is_filter_match()
10160 hdev->discovery.uuids) && in is_filter_match()
10162 hdev->discovery.uuid_count, in is_filter_match()
10163 hdev->discovery.uuids)) in is_filter_match()
10170 if (test_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks)) { in is_filter_match()
10174 if (hdev->discovery.rssi != HCI_RSSI_INVALID && in is_filter_match()
10175 rssi < hdev->discovery.rssi) in is_filter_match()
10207 advmon_skb_len = (sizeof(struct mgmt_ev_adv_monitor_device_found) - in mgmt_send_adv_monitor_device_found()
10208 sizeof(struct mgmt_ev_device_found)) + skb->len; in mgmt_send_adv_monitor_device_found()
10220 skb_put_data(advmon_skb, skb->data, skb->len); in mgmt_send_adv_monitor_device_found()
10249 if (report_device && !hdev->advmon_pend_notify) { in mgmt_adv_monitor_device_found()
10254 hdev->advmon_pend_notify = false; in mgmt_adv_monitor_device_found()
10256 list_for_each_entry_safe(dev, tmp, &hdev->monitored_devices, list) { in mgmt_adv_monitor_device_found()
10257 if (!bacmp(&dev->bdaddr, bdaddr)) { in mgmt_adv_monitor_device_found()
10260 if (!dev->notified) { in mgmt_adv_monitor_device_found()
10263 dev->handle); in mgmt_adv_monitor_device_found()
10265 dev->notified = true; in mgmt_adv_monitor_device_found()
10269 if (!dev->notified) in mgmt_adv_monitor_device_found()
10270 hdev->advmon_pend_notify = true; in mgmt_adv_monitor_device_found()
10298 if (!hdev->mesh_ad_types[0]) in mesh_device_found()
10304 for (j = 0; j < sizeof(hdev->mesh_ad_types); j++) { in mesh_device_found()
10305 if (!hdev->mesh_ad_types[j]) in mesh_device_found()
10308 if (hdev->mesh_ad_types[j] == eir[i + 1]) in mesh_device_found()
10316 for (j = 0; j < sizeof(hdev->mesh_ad_types); j++) { in mesh_device_found()
10317 if (!hdev->mesh_ad_types[j]) in mesh_device_found()
10320 if (hdev->mesh_ad_types[j] == scan_rsp[i + 1]) in mesh_device_found()
10336 bacpy(&ev->addr.bdaddr, bdaddr); in mesh_device_found()
10337 ev->addr.type = link_to_bdaddr(LE_LINK, addr_type); in mesh_device_found()
10338 ev->rssi = rssi; in mesh_device_found()
10339 ev->flags = cpu_to_le32(flags); in mesh_device_found()
10340 ev->instant = cpu_to_le64(instant); in mesh_device_found()
10350 ev->eir_len = cpu_to_le16(eir_len + scan_rsp_len); in mesh_device_found()
10369 /* Don't send events for a non-kernel initiated discovery. With in mgmt_device_found()
10376 if (link_type == LE_LINK && !list_empty(&hdev->pend_le_reports)) in mgmt_device_found()
10382 if (hdev->discovery.result_filtering) { in mgmt_device_found()
10389 if (hdev->discovery.limited) { in mgmt_device_found()
10417 if (rssi == HCI_RSSI_INVALID && !hdev->discovery.report_invalid_rssi && in mgmt_device_found()
10421 bacpy(&ev->addr.bdaddr, bdaddr); in mgmt_device_found()
10422 ev->addr.type = link_to_bdaddr(link_type, addr_type); in mgmt_device_found()
10423 ev->rssi = rssi; in mgmt_device_found()
10424 ev->flags = cpu_to_le32(flags); in mgmt_device_found()
10442 ev->eir_len = cpu_to_le16(eir_len + scan_rsp_len); in mgmt_device_found()
10461 bacpy(&ev->addr.bdaddr, bdaddr); in mgmt_remote_name()
10462 ev->addr.type = link_to_bdaddr(link_type, addr_type); in mgmt_remote_name()
10463 ev->rssi = rssi; in mgmt_remote_name()
10470 ev->eir_len = cpu_to_le16(eir_len); in mgmt_remote_name()
10471 ev->flags = cpu_to_le32(flags); in mgmt_remote_name()
10483 ev.type = hdev->discovery.type; in mgmt_discovering()