• Home
  • Raw
  • Download

Lines Matching +full:unlock +full:- +full:keys

2    BlueZ - Bluetooth protocol stack for Linux
5 Copyright (C) 2011-2012 Intel Corporation
314 rp->version = MGMT_VERSION; in mgmt_fill_version_info()
315 rp->revision = cpu_to_le16(MGMT_REVISION); in mgmt_fill_version_info()
353 return -ENOMEM; in read_commands()
355 rp->num_commands = cpu_to_le16(num_commands); in read_commands()
356 rp->num_events = cpu_to_le16(num_events); in read_commands()
359 __le16 *opcode = rp->opcodes; in read_commands()
367 __le16 *opcode = rp->opcodes; in read_commands()
398 if (d->dev_type == HCI_PRIMARY && in read_index_list()
407 return -ENOMEM; in read_index_list()
417 /* Devices marked as raw-only are neither configured in read_index_list()
420 if (test_bit(HCI_QUIRK_RAW_DEVICE, &d->quirks)) in read_index_list()
423 if (d->dev_type == HCI_PRIMARY && in read_index_list()
425 rp->index[count++] = cpu_to_le16(d->id); in read_index_list()
426 bt_dev_dbg(hdev, "Added hci%u", d->id); in read_index_list()
430 rp->num_controllers = cpu_to_le16(count); in read_index_list()
458 if (d->dev_type == HCI_PRIMARY && in read_unconf_index_list()
467 return -ENOMEM; in read_unconf_index_list()
477 /* Devices marked as raw-only are neither configured in read_unconf_index_list()
480 if (test_bit(HCI_QUIRK_RAW_DEVICE, &d->quirks)) in read_unconf_index_list()
483 if (d->dev_type == HCI_PRIMARY && in read_unconf_index_list()
485 rp->index[count++] = cpu_to_le16(d->id); in read_unconf_index_list()
486 bt_dev_dbg(hdev, "Added hci%u", d->id); in read_unconf_index_list()
490 rp->num_controllers = cpu_to_le16(count); in read_unconf_index_list()
517 if (d->dev_type == HCI_PRIMARY || d->dev_type == HCI_AMP) in read_ext_index_list()
524 return -ENOMEM; in read_ext_index_list()
534 /* Devices marked as raw-only are neither configured in read_ext_index_list()
537 if (test_bit(HCI_QUIRK_RAW_DEVICE, &d->quirks)) in read_ext_index_list()
540 if (d->dev_type == HCI_PRIMARY) { in read_ext_index_list()
542 rp->entry[count].type = 0x01; in read_ext_index_list()
544 rp->entry[count].type = 0x00; in read_ext_index_list()
545 } else if (d->dev_type == HCI_AMP) { in read_ext_index_list()
546 rp->entry[count].type = 0x02; in read_ext_index_list()
551 rp->entry[count].bus = d->bus; in read_ext_index_list()
552 rp->entry[count++].index = cpu_to_le16(d->id); in read_ext_index_list()
553 bt_dev_dbg(hdev, "Added hci%u", d->id); in read_ext_index_list()
556 rp->num_controllers = cpu_to_le16(count); in read_ext_index_list()
579 if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) && in is_configured()
583 if ((test_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks) || in is_configured()
584 test_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks)) && in is_configured()
585 !bacmp(&hdev->public_addr, BDADDR_ANY)) in is_configured()
595 if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) && in get_missing_options()
599 if ((test_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks) || in get_missing_options()
600 test_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks)) && in get_missing_options()
601 !bacmp(&hdev->public_addr, BDADDR_ANY)) in get_missing_options()
619 return mgmt_cmd_complete(sk, hdev->id, opcode, 0, &options, in send_options_rsp()
634 rp.manufacturer = cpu_to_le16(hdev->manufacturer); in read_config_info()
636 if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks)) in read_config_info()
639 if (hdev->set_bdaddr) in read_config_info()
647 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_CONFIG_INFO, 0, in read_config_info()
658 if (hdev->features[0][0] & LMP_3SLOT) in get_supported_phys()
661 if (hdev->features[0][0] & LMP_5SLOT) in get_supported_phys()
689 if (hdev->le_features[1] & HCI_LE_PHY_2M) { in get_supported_phys()
694 if (hdev->le_features[1] & HCI_LE_PHY_CODED) { in get_supported_phys()
710 if (hdev->pkt_type & (HCI_DM3 | HCI_DH3)) in get_selected_phys()
713 if (hdev->pkt_type & (HCI_DM5 | HCI_DH5)) in get_selected_phys()
717 if (!(hdev->pkt_type & HCI_2DH1)) in get_selected_phys()
721 !(hdev->pkt_type & HCI_2DH3)) in get_selected_phys()
725 !(hdev->pkt_type & HCI_2DH5)) in get_selected_phys()
729 if (!(hdev->pkt_type & HCI_3DH1)) in get_selected_phys()
733 !(hdev->pkt_type & HCI_3DH3)) in get_selected_phys()
737 !(hdev->pkt_type & HCI_3DH5)) in get_selected_phys()
744 if (hdev->le_tx_def_phys & HCI_LE_SET_PHY_1M) in get_selected_phys()
747 if (hdev->le_rx_def_phys & HCI_LE_SET_PHY_1M) in get_selected_phys()
750 if (hdev->le_tx_def_phys & HCI_LE_SET_PHY_2M) in get_selected_phys()
753 if (hdev->le_rx_def_phys & HCI_LE_SET_PHY_2M) in get_selected_phys()
756 if (hdev->le_tx_def_phys & HCI_LE_SET_PHY_CODED) in get_selected_phys()
759 if (hdev->le_rx_def_phys & HCI_LE_SET_PHY_CODED) in get_selected_phys()
783 if (hdev->hci_ver >= BLUETOOTH_VER_1_2) in get_supported_settings()
798 &hdev->quirks)) in get_supported_settings()
815 if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) || in get_supported_settings()
816 hdev->set_bdaddr) in get_supported_settings()
878 * For single mode LE only controllers and dual-mode controllers in get_current_settings()
884 !bacmp(&hdev->bdaddr, BDADDR_ANY)) { in get_current_settings()
885 if (bacmp(&hdev->static_addr, BDADDR_ANY)) in get_current_settings()
916 struct mgmt_mode *cp = cmd->param; in mgmt_get_adv_discov_flags()
917 if (cp->val == 0x01) in mgmt_get_adv_discov_flags()
919 else if (cp->val == 0x02) in mgmt_get_adv_discov_flags()
940 struct mgmt_mode *cp = cmd->param; in mgmt_get_connectable()
942 return cp->val; in mgmt_get_connectable()
988 __hci_req_start_ext_adv(&req, hdev->cur_adv_instance); in rpa_expired()
999 INIT_DELAYED_WORK(&hdev->service_cache, service_cache_off); in mgmt_init_hdev()
1000 INIT_DELAYED_WORK(&hdev->rpa_expired, rpa_expired); in mgmt_init_hdev()
1002 /* Non-mgmt controlled devices get this bit set in mgmt_init_hdev()
1004 * for mgmt we require user-space to explicitly enable in mgmt_init_hdev()
1021 bacpy(&rp.bdaddr, &hdev->bdaddr); in read_controller_info()
1023 rp.version = hdev->hci_ver; in read_controller_info()
1024 rp.manufacturer = cpu_to_le16(hdev->manufacturer); in read_controller_info()
1029 memcpy(rp.dev_class, hdev->dev_class, 3); in read_controller_info()
1031 memcpy(rp.name, hdev->dev_name, sizeof(hdev->dev_name)); in read_controller_info()
1032 memcpy(rp.short_name, hdev->short_name, sizeof(hdev->short_name)); in read_controller_info()
1036 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_INFO, 0, &rp, in read_controller_info()
1047 hdev->dev_class, 3); in append_eir_data_to_buf()
1051 hdev->appearance); in append_eir_data_to_buf()
1053 name_len = strlen(hdev->dev_name); in append_eir_data_to_buf()
1055 hdev->dev_name, name_len); in append_eir_data_to_buf()
1057 name_len = strlen(hdev->short_name); in append_eir_data_to_buf()
1059 hdev->short_name, name_len); in append_eir_data_to_buf()
1077 bacpy(&rp->bdaddr, &hdev->bdaddr); in read_ext_controller_info()
1079 rp->version = hdev->hci_ver; in read_ext_controller_info()
1080 rp->manufacturer = cpu_to_le16(hdev->manufacturer); in read_ext_controller_info()
1082 rp->supported_settings = cpu_to_le32(get_supported_settings(hdev)); in read_ext_controller_info()
1083 rp->current_settings = cpu_to_le32(get_current_settings(hdev)); in read_ext_controller_info()
1086 eir_len = append_eir_data_to_buf(hdev, rp->eir); in read_ext_controller_info()
1087 rp->eir_len = cpu_to_le16(eir_len); in read_ext_controller_info()
1100 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_EXT_INFO, 0, rp, in read_ext_controller_info()
1112 eir_len = append_eir_data_to_buf(hdev, ev->eir); in ext_info_changed()
1113 ev->eir_len = cpu_to_le16(eir_len); in ext_info_changed()
1124 return mgmt_cmd_complete(sk, hdev->id, opcode, 0, &settings, in send_settings_rsp()
1133 cancel_delayed_work(&hdev->power_off); in clean_up_hci_complete()
1134 queue_work(hdev->req_workqueue, &hdev->power_off.work); in clean_up_hci_complete()
1159 if (hdev->adv_instance_timeout) { in cancel_adv_timeout()
1160 hdev->adv_instance_timeout = 0; in cancel_adv_timeout()
1161 cancel_delayed_work(&hdev->adv_instance_expire); in cancel_adv_timeout()
1174 if (test_bit(HCI_ISCAN, &hdev->flags) || in clean_up_hci_state()
1175 test_bit(HCI_PSCAN, &hdev->flags)) { in clean_up_hci_state()
1187 list_for_each_entry(conn, &hdev->conn_hash.list, list) { in clean_up_hci_state()
1208 if (cp->val != 0x00 && cp->val != 0x01) in set_powered()
1209 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED, in set_powered()
1215 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED, in set_powered()
1220 if (!!cp->val == hdev_is_powered(hdev)) { in set_powered()
1227 err = -ENOMEM; in set_powered()
1231 if (cp->val) { in set_powered()
1232 queue_work(hdev->req_workqueue, &hdev->power_on); in set_powered()
1238 queue_delayed_work(hdev->req_workqueue, &hdev->power_off, in set_powered()
1242 if (err == -ENODATA) { in set_powered()
1243 cancel_delayed_work(&hdev->power_off); in set_powered()
1244 queue_work(hdev->req_workqueue, &hdev->power_off.work); in set_powered()
1277 send_settings_rsp(cmd->sk, cmd->opcode, match->hdev); in settings_rsp()
1279 if (match->sk == NULL) { in settings_rsp()
1280 match->sk = cmd->sk; in settings_rsp()
1281 sock_hold(match->sk); in settings_rsp()
1289 mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, *status); in cmd_status_rsp()
1294 if (cmd->cmd_complete) { in cmd_complete_rsp()
1297 cmd->cmd_complete(cmd, *status); in cmd_complete_rsp()
1306 return mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, status, in generic_cmd_complete()
1307 cmd->param, cmd->param_len); in generic_cmd_complete()
1312 return mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, status, in addr_cmd_complete()
1313 cmd->param, sizeof(struct mgmt_addr_info)); in addr_cmd_complete()
1346 goto unlock; in mgmt_set_discoverable_complete()
1350 mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_err); in mgmt_set_discoverable_complete()
1356 hdev->discov_timeout > 0) { in mgmt_set_discoverable_complete()
1357 int to = msecs_to_jiffies(hdev->discov_timeout * 1000); in mgmt_set_discoverable_complete()
1358 queue_delayed_work(hdev->req_workqueue, &hdev->discov_off, to); in mgmt_set_discoverable_complete()
1361 send_settings_rsp(cmd->sk, MGMT_OP_SET_DISCOVERABLE, hdev); in mgmt_set_discoverable_complete()
1362 new_settings(hdev, cmd->sk); in mgmt_set_discoverable_complete()
1367 unlock: in mgmt_set_discoverable_complete()
1383 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1386 if (cp->val != 0x00 && cp->val != 0x01 && cp->val != 0x02) in set_discoverable()
1387 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1390 timeout = __le16_to_cpu(cp->timeout); in set_discoverable()
1395 if ((cp->val == 0x00 && timeout > 0) || in set_discoverable()
1396 (cp->val == 0x02 && timeout == 0)) in set_discoverable()
1397 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1403 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1410 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1416 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1421 if (hdev->advertising_paused) { in set_discoverable()
1422 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1434 if (!!cp->val != hci_dev_test_flag(hdev, HCI_DISCOVERABLE)) { in set_discoverable()
1453 if (!!cp->val == hci_dev_test_flag(hdev, HCI_DISCOVERABLE) && in set_discoverable()
1454 (cp->val == 0x02) == hci_dev_test_flag(hdev, in set_discoverable()
1456 cancel_delayed_work(&hdev->discov_off); in set_discoverable()
1457 hdev->discov_timeout = timeout; in set_discoverable()
1459 if (cp->val && hdev->discov_timeout > 0) { in set_discoverable()
1460 int to = msecs_to_jiffies(hdev->discov_timeout * 1000); in set_discoverable()
1461 queue_delayed_work(hdev->req_workqueue, in set_discoverable()
1462 &hdev->discov_off, to); in set_discoverable()
1471 err = -ENOMEM; in set_discoverable()
1479 cancel_delayed_work(&hdev->discov_off); in set_discoverable()
1480 hdev->discov_timeout = timeout; in set_discoverable()
1482 if (cp->val) in set_discoverable()
1488 if (cp->val == 0x02) in set_discoverable()
1493 queue_work(hdev->req_workqueue, &hdev->discoverable_update); in set_discoverable()
1511 goto unlock; in mgmt_set_connectable_complete()
1515 mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_err); in mgmt_set_connectable_complete()
1519 send_settings_rsp(cmd->sk, MGMT_OP_SET_CONNECTABLE, hdev); in mgmt_set_connectable_complete()
1520 new_settings(hdev, cmd->sk); in mgmt_set_connectable_complete()
1525 unlock: in mgmt_set_connectable_complete()
1569 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE, in set_connectable()
1572 if (cp->val != 0x00 && cp->val != 0x01) in set_connectable()
1573 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE, in set_connectable()
1579 err = set_connectable_update_settings(hdev, sk, cp->val); in set_connectable()
1585 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE, in set_connectable()
1592 err = -ENOMEM; in set_connectable()
1596 if (cp->val) { in set_connectable()
1599 if (hdev->discov_timeout > 0) in set_connectable()
1600 cancel_delayed_work(&hdev->discov_off); in set_connectable()
1607 queue_work(hdev->req_workqueue, &hdev->connectable_update); in set_connectable()
1624 if (cp->val != 0x00 && cp->val != 0x01) in set_bondable()
1625 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BONDABLE, in set_bondable()
1630 if (cp->val) in set_bondable()
1637 goto unlock; in set_bondable()
1647 queue_work(hdev->req_workqueue, in set_bondable()
1648 &hdev->discoverable_update); in set_bondable()
1653 unlock: in set_bondable()
1670 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY, in set_link_security()
1673 if (cp->val != 0x00 && cp->val != 0x01) in set_link_security()
1674 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY, in set_link_security()
1682 if (!!cp->val != hci_dev_test_flag(hdev, HCI_LINK_SECURITY)) { in set_link_security()
1698 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY, in set_link_security()
1703 val = !!cp->val; in set_link_security()
1705 if (test_bit(HCI_AUTH, &hdev->flags) == val) { in set_link_security()
1712 err = -ENOMEM; in set_link_security()
1738 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP, status); in set_ssp()
1741 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP, in set_ssp()
1744 if (cp->val != 0x00 && cp->val != 0x01) in set_ssp()
1745 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP, in set_ssp()
1753 if (cp->val) { in set_ssp()
1777 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP, in set_ssp()
1782 if (!!cp->val == hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) { in set_ssp()
1789 err = -ENOMEM; in set_ssp()
1793 if (!cp->val && hci_dev_test_flag(hdev, HCI_USE_DEBUG_KEYS)) in set_ssp()
1795 sizeof(cp->val), &cp->val); in set_ssp()
1797 err = hci_send_cmd(hdev, HCI_OP_WRITE_SSP_MODE, 1, &cp->val); in set_ssp()
1818 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, in set_hs()
1823 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, status); in set_hs()
1826 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, in set_hs()
1830 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, in set_hs()
1833 if (cp->val != 0x00 && cp->val != 0x01) in set_hs()
1834 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, in set_hs()
1840 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, in set_hs()
1842 goto unlock; in set_hs()
1845 if (cp->val) { in set_hs()
1849 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, in set_hs()
1851 goto unlock; in set_hs()
1859 goto unlock; in set_hs()
1864 unlock: in set_hs()
1880 goto unlock; in le_enable_complete()
1912 unlock: in le_enable_complete()
1928 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE, in set_le()
1931 if (cp->val != 0x00 && cp->val != 0x01) in set_le()
1932 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE, in set_le()
1935 /* Bluetooth single mode LE only controllers or dual-mode in set_le()
1945 if (cp->val == 0x01) in set_le()
1948 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE, in set_le()
1954 val = !!cp->val; in set_le()
1975 goto unlock; in set_le()
1980 goto unlock; in set_le()
1985 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE, in set_le()
1987 goto unlock; in set_le()
1992 err = -ENOMEM; in set_le()
1993 goto unlock; in set_le()
2018 unlock: in set_le()
2033 list_for_each_entry(cmd, &hdev->mgmt_pending, list) { in pending_eir_or_class()
2034 switch (cmd->opcode) { in pending_eir_or_class()
2073 goto unlock; in mgmt_class_complete()
2075 mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, in mgmt_class_complete()
2076 mgmt_status(status), hdev->dev_class, 3); in mgmt_class_complete()
2080 unlock: in mgmt_class_complete()
2104 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_UUID, in add_uuid()
2111 err = -ENOMEM; in add_uuid()
2115 memcpy(uuid->uuid, cp->uuid, 16); in add_uuid()
2116 uuid->svc_hint = cp->svc_hint; in add_uuid()
2117 uuid->size = get_uuid_size(cp->uuid); in add_uuid()
2119 list_add_tail(&uuid->list, &hdev->uuids); in add_uuid()
2128 if (err != -ENODATA) in add_uuid()
2131 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_UUID, 0, in add_uuid()
2132 hdev->dev_class, 3); in add_uuid()
2138 err = -ENOMEM; in add_uuid()
2155 queue_delayed_work(hdev->workqueue, &hdev->service_cache, in enable_service_cache()
2185 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID, in remove_uuid()
2187 goto unlock; in remove_uuid()
2190 if (memcmp(cp->uuid, bt_uuid_any, 16) == 0) { in remove_uuid()
2194 err = mgmt_cmd_complete(sk, hdev->id, in remove_uuid()
2196 0, hdev->dev_class, 3); in remove_uuid()
2197 goto unlock; in remove_uuid()
2205 list_for_each_entry_safe(match, tmp, &hdev->uuids, list) { in remove_uuid()
2206 if (memcmp(match->uuid, cp->uuid, 16) != 0) in remove_uuid()
2209 list_del(&match->list); in remove_uuid()
2215 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID, in remove_uuid()
2217 goto unlock; in remove_uuid()
2228 if (err != -ENODATA) in remove_uuid()
2229 goto unlock; in remove_uuid()
2231 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_UUID, 0, in remove_uuid()
2232 hdev->dev_class, 3); in remove_uuid()
2233 goto unlock; in remove_uuid()
2238 err = -ENOMEM; in remove_uuid()
2239 goto unlock; in remove_uuid()
2244 unlock: in remove_uuid()
2267 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, in set_dev_class()
2273 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, in set_dev_class()
2275 goto unlock; in set_dev_class()
2278 if ((cp->minor & 0x03) != 0 || (cp->major & 0xe0) != 0) { in set_dev_class()
2279 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, in set_dev_class()
2281 goto unlock; in set_dev_class()
2284 hdev->major_class = cp->major; in set_dev_class()
2285 hdev->minor_class = cp->minor; in set_dev_class()
2288 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0, in set_dev_class()
2289 hdev->dev_class, 3); in set_dev_class()
2290 goto unlock; in set_dev_class()
2297 cancel_delayed_work_sync(&hdev->service_cache); in set_dev_class()
2306 if (err != -ENODATA) in set_dev_class()
2307 goto unlock; in set_dev_class()
2309 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0, in set_dev_class()
2310 hdev->dev_class, 3); in set_dev_class()
2311 goto unlock; in set_dev_class()
2316 err = -ENOMEM; in set_dev_class()
2317 goto unlock; in set_dev_class()
2322 unlock: in set_dev_class()
2331 const u16 max_key_count = ((U16_MAX - sizeof(*cp)) / in load_link_keys()
2340 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, in load_link_keys()
2343 key_count = __le16_to_cpu(cp->key_count); in load_link_keys()
2347 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, in load_link_keys()
2351 expected_len = struct_size(cp, keys, key_count); in load_link_keys()
2355 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, in load_link_keys()
2359 if (cp->debug_keys != 0x00 && cp->debug_keys != 0x01) in load_link_keys()
2360 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, in load_link_keys()
2363 bt_dev_dbg(hdev, "debug_keys %u key_count %u", cp->debug_keys, in load_link_keys()
2367 struct mgmt_link_key_info *key = &cp->keys[i]; in load_link_keys()
2370 if (key->type > 0x08) in load_link_keys()
2371 return mgmt_cmd_status(sk, hdev->id, in load_link_keys()
2380 if (cp->debug_keys) in load_link_keys()
2390 struct mgmt_link_key_info *key = &cp->keys[i]; in load_link_keys()
2394 key->val)) { in load_link_keys()
2396 &key->addr.bdaddr); in load_link_keys()
2400 /* Always ignore debug keys and require a new pairing if in load_link_keys()
2403 if (key->type == HCI_LK_DEBUG_COMBINATION) in load_link_keys()
2406 hci_add_link_key(hdev, NULL, &key->addr.bdaddr, key->val, in load_link_keys()
2407 key->type, key->pin_len, NULL); in load_link_keys()
2410 mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, 0, NULL, 0); in load_link_keys()
2441 bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr); in unpair_device()
2442 rp.addr.type = cp->addr.type; in unpair_device()
2444 if (!bdaddr_type_is_valid(cp->addr.type)) in unpair_device()
2445 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, in unpair_device()
2449 if (cp->disconnect != 0x00 && cp->disconnect != 0x01) in unpair_device()
2450 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, in unpair_device()
2457 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, in unpair_device()
2460 goto unlock; in unpair_device()
2463 if (cp->addr.type == BDADDR_BREDR) { in unpair_device()
2471 if (cp->disconnect) in unpair_device()
2473 &cp->addr.bdaddr); in unpair_device()
2477 err = hci_remove_link_key(hdev, &cp->addr.bdaddr); in unpair_device()
2479 err = mgmt_cmd_complete(sk, hdev->id, in unpair_device()
2483 goto unlock; in unpair_device()
2490 addr_type = le_addr_type(cp->addr.type); in unpair_device()
2493 err = smp_cancel_and_remove_pairing(hdev, &cp->addr.bdaddr, addr_type); in unpair_device()
2495 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, in unpair_device()
2498 goto unlock; in unpair_device()
2501 conn = hci_conn_hash_lookup_le(hdev, &cp->addr.bdaddr, addr_type); in unpair_device()
2503 hci_conn_params_del(hdev, &cp->addr.bdaddr, addr_type); in unpair_device()
2511 set_bit(HCI_CONN_PARAM_REMOVAL_PEND, &conn->flags); in unpair_device()
2513 /* Disable auto-connection parameters if present */ in unpair_device()
2514 params = hci_conn_params_lookup(hdev, &cp->addr.bdaddr, addr_type); in unpair_device()
2516 if (params->explicit_connect) in unpair_device()
2517 params->auto_connect = HCI_AUTO_CONN_EXPLICIT; in unpair_device()
2519 params->auto_connect = HCI_AUTO_CONN_DISABLED; in unpair_device()
2525 if (!cp->disconnect) in unpair_device()
2533 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, 0, in unpair_device()
2535 device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, sk); in unpair_device()
2536 goto unlock; in unpair_device()
2542 err = -ENOMEM; in unpair_device()
2543 goto unlock; in unpair_device()
2546 cmd->cmd_complete = addr_cmd_complete; in unpair_device()
2552 unlock: in unpair_device()
2569 bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr); in disconnect()
2570 rp.addr.type = cp->addr.type; in disconnect()
2572 if (!bdaddr_type_is_valid(cp->addr.type)) in disconnect()
2573 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT, in disconnect()
2579 if (!test_bit(HCI_UP, &hdev->flags)) { in disconnect()
2580 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT, in disconnect()
2587 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT, in disconnect()
2592 if (cp->addr.type == BDADDR_BREDR) in disconnect()
2594 &cp->addr.bdaddr); in disconnect()
2596 conn = hci_conn_hash_lookup_le(hdev, &cp->addr.bdaddr, in disconnect()
2597 le_addr_type(cp->addr.type)); in disconnect()
2599 if (!conn || conn->state == BT_OPEN || conn->state == BT_CLOSED) { in disconnect()
2600 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT, in disconnect()
2608 err = -ENOMEM; in disconnect()
2612 cmd->cmd_complete = generic_cmd_complete; in disconnect()
2655 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_GET_CONNECTIONS, in get_connections()
2657 goto unlock; in get_connections()
2661 list_for_each_entry(c, &hdev->conn_hash.list, list) { in get_connections()
2662 if (test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags)) in get_connections()
2668 err = -ENOMEM; in get_connections()
2669 goto unlock; in get_connections()
2673 list_for_each_entry(c, &hdev->conn_hash.list, list) { in get_connections()
2674 if (!test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags)) in get_connections()
2676 bacpy(&rp->addr[i].bdaddr, &c->dst); in get_connections()
2677 rp->addr[i].type = link_to_bdaddr(c->type, c->dst_type); in get_connections()
2678 if (c->type == SCO_LINK || c->type == ESCO_LINK) in get_connections()
2683 rp->conn_count = cpu_to_le16(i); in get_connections()
2686 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONNECTIONS, 0, rp, in get_connections()
2691 unlock: in get_connections()
2705 return -ENOMEM; in send_pin_code_neg_reply()
2707 cmd->cmd_complete = addr_cmd_complete; in send_pin_code_neg_reply()
2710 sizeof(cp->addr.bdaddr), &cp->addr.bdaddr); in send_pin_code_neg_reply()
2731 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY, in pin_code_reply()
2736 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->addr.bdaddr); in pin_code_reply()
2738 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY, in pin_code_reply()
2743 if (conn->pending_sec_level == BT_SECURITY_HIGH && cp->pin_len != 16) { in pin_code_reply()
2746 memcpy(&ncp.addr, &cp->addr, sizeof(ncp.addr)); in pin_code_reply()
2752 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY, in pin_code_reply()
2760 err = -ENOMEM; in pin_code_reply()
2764 cmd->cmd_complete = addr_cmd_complete; in pin_code_reply()
2766 bacpy(&reply.bdaddr, &cp->addr.bdaddr); in pin_code_reply()
2767 reply.pin_len = cp->pin_len; in pin_code_reply()
2768 memcpy(reply.pin_code, cp->pin_code, sizeof(reply.pin_code)); in pin_code_reply()
2786 if (cp->io_capability > SMP_IO_KEYBOARD_DISPLAY) in set_io_capability()
2787 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_IO_CAPABILITY, in set_io_capability()
2792 hdev->io_capability = cp->io_capability; in set_io_capability()
2794 bt_dev_dbg(hdev, "IO capability set to 0x%02x", hdev->io_capability); in set_io_capability()
2798 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_IO_CAPABILITY, 0, in set_io_capability()
2804 struct hci_dev *hdev = conn->hdev; in find_pairing()
2807 list_for_each_entry(cmd, &hdev->mgmt_pending, list) { in find_pairing()
2808 if (cmd->opcode != MGMT_OP_PAIR_DEVICE) in find_pairing()
2811 if (cmd->user_data != conn) in find_pairing()
2823 struct hci_conn *conn = cmd->user_data; in pairing_complete()
2826 bacpy(&rp.addr.bdaddr, &conn->dst); in pairing_complete()
2827 rp.addr.type = link_to_bdaddr(conn->type, conn->dst_type); in pairing_complete()
2829 err = mgmt_cmd_complete(cmd->sk, cmd->hdev->id, MGMT_OP_PAIR_DEVICE, in pairing_complete()
2833 conn->connect_cfm_cb = NULL; in pairing_complete()
2834 conn->security_cfm_cb = NULL; in pairing_complete()
2835 conn->disconn_cfm_cb = NULL; in pairing_complete()
2842 clear_bit(HCI_CONN_PARAM_REMOVAL_PEND, &conn->flags); in pairing_complete()
2856 cmd->cmd_complete(cmd, status); in mgmt_smp_complete()
2873 cmd->cmd_complete(cmd, mgmt_status(status)); in pairing_complete_cb()
2892 cmd->cmd_complete(cmd, mgmt_status(status)); in le_pairing_complete_cb()
2909 bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr); in pair_device()
2910 rp.addr.type = cp->addr.type; in pair_device()
2912 if (!bdaddr_type_is_valid(cp->addr.type)) in pair_device()
2913 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE, in pair_device()
2917 if (cp->io_cap > SMP_IO_KEYBOARD_DISPLAY) in pair_device()
2918 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE, in pair_device()
2925 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE, in pair_device()
2928 goto unlock; in pair_device()
2931 if (hci_bdaddr_is_paired(hdev, &cp->addr.bdaddr, cp->addr.type)) { in pair_device()
2932 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE, in pair_device()
2935 goto unlock; in pair_device()
2941 if (cp->addr.type == BDADDR_BREDR) { in pair_device()
2942 conn = hci_connect_acl(hdev, &cp->addr.bdaddr, sec_level, in pair_device()
2945 u8 addr_type = le_addr_type(cp->addr.type); in pair_device()
2957 p = hci_conn_params_add(hdev, &cp->addr.bdaddr, addr_type); in pair_device()
2959 err = -EIO; in pair_device()
2960 goto unlock; in pair_device()
2963 if (p->auto_connect == HCI_AUTO_CONN_EXPLICIT) in pair_device()
2964 p->auto_connect = HCI_AUTO_CONN_DISABLED; in pair_device()
2966 conn = hci_connect_le_scan(hdev, &cp->addr.bdaddr, addr_type, in pair_device()
2974 if (PTR_ERR(conn) == -EBUSY) in pair_device()
2976 else if (PTR_ERR(conn) == -EOPNOTSUPP) in pair_device()
2978 else if (PTR_ERR(conn) == -ECONNREFUSED) in pair_device()
2983 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE, in pair_device()
2985 goto unlock; in pair_device()
2988 if (conn->connect_cfm_cb) { in pair_device()
2990 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE, in pair_device()
2992 goto unlock; in pair_device()
2997 err = -ENOMEM; in pair_device()
2999 goto unlock; in pair_device()
3002 cmd->cmd_complete = pairing_complete; in pair_device()
3005 if (cp->addr.type == BDADDR_BREDR) { in pair_device()
3006 conn->connect_cfm_cb = pairing_complete_cb; in pair_device()
3007 conn->security_cfm_cb = pairing_complete_cb; in pair_device()
3008 conn->disconn_cfm_cb = pairing_complete_cb; in pair_device()
3010 conn->connect_cfm_cb = le_pairing_complete_cb; in pair_device()
3011 conn->security_cfm_cb = le_pairing_complete_cb; in pair_device()
3012 conn->disconn_cfm_cb = le_pairing_complete_cb; in pair_device()
3015 conn->io_capability = cp->io_cap; in pair_device()
3016 cmd->user_data = hci_conn_get(conn); in pair_device()
3018 if ((conn->state == BT_CONNECTED || conn->state == BT_CONFIG) && in pair_device()
3020 cmd->cmd_complete(cmd, 0); in pair_device()
3026 unlock: in pair_device()
3044 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, in cancel_pair_device()
3046 goto unlock; in cancel_pair_device()
3051 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, in cancel_pair_device()
3053 goto unlock; in cancel_pair_device()
3056 conn = cmd->user_data; in cancel_pair_device()
3058 if (bacmp(&addr->bdaddr, &conn->dst) != 0) { in cancel_pair_device()
3059 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, in cancel_pair_device()
3061 goto unlock; in cancel_pair_device()
3064 cmd->cmd_complete(cmd, MGMT_STATUS_CANCELLED); in cancel_pair_device()
3067 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, 0, in cancel_pair_device()
3074 if (addr->type == BDADDR_BREDR) in cancel_pair_device()
3075 hci_remove_link_key(hdev, &addr->bdaddr); in cancel_pair_device()
3077 smp_cancel_and_remove_pairing(hdev, &addr->bdaddr, in cancel_pair_device()
3078 le_addr_type(addr->type)); in cancel_pair_device()
3080 if (conn->conn_reason == CONN_REASON_PAIR_DEVICE) in cancel_pair_device()
3083 unlock: in cancel_pair_device()
3099 err = mgmt_cmd_complete(sk, hdev->id, mgmt_op, in user_pairing_resp()
3105 if (addr->type == BDADDR_BREDR) in user_pairing_resp()
3106 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &addr->bdaddr); in user_pairing_resp()
3108 conn = hci_conn_hash_lookup_le(hdev, &addr->bdaddr, in user_pairing_resp()
3109 le_addr_type(addr->type)); in user_pairing_resp()
3112 err = mgmt_cmd_complete(sk, hdev->id, mgmt_op, in user_pairing_resp()
3118 if (addr->type == BDADDR_LE_PUBLIC || addr->type == BDADDR_LE_RANDOM) { in user_pairing_resp()
3121 err = mgmt_cmd_complete(sk, hdev->id, mgmt_op, in user_pairing_resp()
3125 err = mgmt_cmd_complete(sk, hdev->id, mgmt_op, in user_pairing_resp()
3134 err = -ENOMEM; in user_pairing_resp()
3138 cmd->cmd_complete = addr_cmd_complete; in user_pairing_resp()
3144 bacpy(&cp.bdaddr, &addr->bdaddr); in user_pairing_resp()
3148 err = hci_send_cmd(hdev, hci_op, sizeof(addr->bdaddr), in user_pairing_resp()
3149 &addr->bdaddr); in user_pairing_resp()
3166 return user_pairing_resp(sk, hdev, &cp->addr, in pin_code_neg_reply()
3179 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_USER_CONFIRM_REPLY, in user_confirm_reply()
3182 return user_pairing_resp(sk, hdev, &cp->addr, in user_confirm_reply()
3194 return user_pairing_resp(sk, hdev, &cp->addr, in user_confirm_neg_reply()
3206 return user_pairing_resp(sk, hdev, &cp->addr, in user_passkey_reply()
3208 HCI_OP_USER_PASSKEY_REPLY, cp->passkey); in user_passkey_reply()
3218 return user_pairing_resp(sk, hdev, &cp->addr, in user_passkey_neg_reply()
3229 adv_instance = hci_find_adv_instance(hdev, hdev->cur_adv_instance); in adv_expire()
3234 if (!(adv_instance->flags & flags)) in adv_expire()
3239 adv_instance = hci_get_next_instance(hdev, adv_instance->instance); in adv_expire()
3244 err = __hci_req_schedule_adv_instance(&req, adv_instance->instance, in adv_expire()
3263 goto unlock; in set_name_complete()
3265 cp = cmd->param; in set_name_complete()
3268 mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, in set_name_complete()
3271 mgmt_cmd_complete(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0, in set_name_complete()
3280 unlock: in set_name_complete()
3299 if (!memcmp(hdev->dev_name, cp->name, sizeof(hdev->dev_name)) && in set_local_name()
3300 !memcmp(hdev->short_name, cp->short_name, in set_local_name()
3301 sizeof(hdev->short_name))) { in set_local_name()
3302 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0, in set_local_name()
3307 memcpy(hdev->short_name, cp->short_name, sizeof(hdev->short_name)); in set_local_name()
3310 memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name)); in set_local_name()
3312 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0, in set_local_name()
3326 err = -ENOMEM; in set_local_name()
3330 memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name)); in set_local_name()
3343 __hci_req_update_scan_rsp_data(&req, hdev->cur_adv_instance); in set_local_name()
3364 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_APPEARANCE, in set_appearance()
3367 appearance = le16_to_cpu(cp->appearance); in set_appearance()
3371 if (hdev->appearance != appearance) { in set_appearance()
3372 hdev->appearance = appearance; in set_appearance()
3380 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_APPEARANCE, 0, NULL, in set_appearance()
3405 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_PHY_CONFIGURATION, 0, in get_phy_configuration()
3432 goto unlock; in set_default_phy_complete()
3435 mgmt_cmd_status(cmd->sk, hdev->id, in set_default_phy_complete()
3439 mgmt_cmd_complete(cmd->sk, hdev->id, in set_default_phy_complete()
3443 mgmt_phy_configuration_changed(hdev, cmd->sk); in set_default_phy_complete()
3448 unlock: in set_default_phy_complete()
3468 selected_phys = __le32_to_cpu(cp->selected_phys); in set_phy_configuration()
3471 return mgmt_cmd_status(sk, hdev->id, in set_phy_configuration()
3478 return mgmt_cmd_status(sk, hdev->id, in set_phy_configuration()
3483 return mgmt_cmd_complete(sk, hdev->id, in set_phy_configuration()
3490 err = mgmt_cmd_status(sk, hdev->id, in set_phy_configuration()
3493 goto unlock; in set_phy_configuration()
3497 err = mgmt_cmd_status(sk, hdev->id, in set_phy_configuration()
3500 goto unlock; in set_phy_configuration()
3543 if (pkt_type != hdev->pkt_type) { in set_phy_configuration()
3544 hdev->pkt_type = pkt_type; in set_phy_configuration()
3553 err = mgmt_cmd_complete(sk, hdev->id, in set_phy_configuration()
3557 goto unlock; in set_phy_configuration()
3563 err = -ENOMEM; in set_phy_configuration()
3564 goto unlock; in set_phy_configuration()
3601 unlock: in set_phy_configuration()
3611 struct mgmt_cp_set_blocked_keys *keys = data; in set_blocked_keys() local
3612 const u16 max_key_count = ((U16_MAX - sizeof(*keys)) / in set_blocked_keys()
3619 key_count = __le16_to_cpu(keys->key_count); in set_blocked_keys()
3622 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BLOCKED_KEYS, in set_blocked_keys()
3626 expected_len = struct_size(keys, keys, key_count); in set_blocked_keys()
3630 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BLOCKED_KEYS, in set_blocked_keys()
3638 for (i = 0; i < keys->key_count; ++i) { in set_blocked_keys()
3646 b->type = keys->keys[i].type; in set_blocked_keys()
3647 memcpy(b->val, keys->keys[i].val, sizeof(b->val)); in set_blocked_keys()
3648 list_add_rcu(&b->list, &hdev->blocked_keys); in set_blocked_keys()
3652 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_BLOCKED_KEYS, in set_blocked_keys()
3665 if (!test_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED, &hdev->quirks)) in set_wideband_speech()
3666 return mgmt_cmd_status(sk, hdev->id, in set_wideband_speech()
3670 if (cp->val != 0x00 && cp->val != 0x01) in set_wideband_speech()
3671 return mgmt_cmd_status(sk, hdev->id, in set_wideband_speech()
3678 err = mgmt_cmd_status(sk, hdev->id, in set_wideband_speech()
3681 goto unlock; in set_wideband_speech()
3685 !!cp->val != hci_dev_test_flag(hdev, in set_wideband_speech()
3687 err = mgmt_cmd_status(sk, hdev->id, in set_wideband_speech()
3690 goto unlock; in set_wideband_speech()
3693 if (cp->val) in set_wideband_speech()
3702 goto unlock; in set_wideband_speech()
3707 unlock: in set_wideband_speech()
3729 if (hdev->commands[41] & 0x08) in read_security_info()
3737 if (hdev->commands[20] & 0x10) in read_security_info()
3742 sec_len = eir_append_data(rp->sec, sec_len, 0x01, &flags, 1); in read_security_info()
3747 if (hdev->commands[41] & 0x08) in read_security_info()
3748 sec_len = eir_append_le16(rp->sec, sec_len, 0x02, in read_security_info()
3749 hdev->max_enc_key_size); in read_security_info()
3751 sec_len = eir_append_le16(rp->sec, sec_len, 0x03, SMP_MAX_ENC_KEY_SIZE); in read_security_info()
3753 rp->sec_len = cpu_to_le16(sec_len); in read_security_info()
3757 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_SECURITY_INFO, 0, in read_security_info()
3762 /* d4992530-b9ec-469f-ab01-6c481c47da1c */
3769 /* 671b10b5-42c0-4696-9227-eb28d1b049d6 */
3775 /* 15c0a148-c273-11ea-b3de-0242ac130004 */
3797 memcpy(rp->features[idx].uuid, debug_uuid, 16); in read_exp_features_info()
3798 rp->features[idx].flags = cpu_to_le32(flags); in read_exp_features_info()
3804 if (test_bit(HCI_QUIRK_VALID_LE_STATES, &hdev->quirks) && in read_exp_features_info()
3805 (hdev->le_states[4] & 0x08) && /* Central */ in read_exp_features_info()
3806 (hdev->le_states[4] & 0x40) && /* Peripheral */ in read_exp_features_info()
3807 (hdev->le_states[3] & 0x10)) /* Simultaneous */ in read_exp_features_info()
3812 memcpy(rp->features[idx].uuid, simult_central_periph_uuid, 16); in read_exp_features_info()
3813 rp->features[idx].flags = cpu_to_le32(flags); in read_exp_features_info()
3823 memcpy(rp->features[idx].uuid, rpa_resolution_uuid, 16); in read_exp_features_info()
3824 rp->features[idx].flags = cpu_to_le32(flags); in read_exp_features_info()
3828 rp->feature_count = cpu_to_le16(idx); in read_exp_features_info()
3835 return mgmt_cmd_complete(sk, hdev ? hdev->id : MGMT_INDEX_NONE, in read_exp_features_info()
3878 if (!memcmp(cp->uuid, ZERO_KEY, 16)) { in set_exp_feature()
3905 return mgmt_cmd_complete(sk, hdev ? hdev->id : MGMT_INDEX_NONE, in set_exp_feature()
3911 if (!memcmp(cp->uuid, debug_uuid, 16)) { in set_exp_feature()
3915 /* Command requires to use the non-controller index */ in set_exp_feature()
3917 return mgmt_cmd_status(sk, hdev->id, in set_exp_feature()
3928 if (cp->param[0] != 0x00 && cp->param[0] != 0x01) in set_exp_feature()
3933 val = !!cp->param[0]; in set_exp_feature()
3953 if (!memcmp(cp->uuid, rpa_resolution_uuid, 16)) { in set_exp_feature()
3966 return mgmt_cmd_status(sk, hdev->id, in set_exp_feature()
3972 return mgmt_cmd_status(sk, hdev->id, in set_exp_feature()
3977 if (cp->param[0] != 0x00 && cp->param[0] != 0x01) in set_exp_feature()
3978 return mgmt_cmd_status(sk, hdev->id, in set_exp_feature()
3982 val = !!cp->param[0]; in set_exp_feature()
4006 err = mgmt_cmd_complete(sk, hdev->id, in set_exp_feature()
4016 return mgmt_cmd_status(sk, hdev ? hdev->id : MGMT_INDEX_NONE, in set_exp_feature()
4021 #define SUPPORTED_DEVICE_FLAGS() ((1U << HCI_CONN_FLAG_MAX) - 1)
4035 &cp->addr.bdaddr, cp->addr.type); in get_device_flags()
4041 if (cp->addr.type == BDADDR_BREDR) { in get_device_flags()
4042 br_params = hci_bdaddr_list_lookup_with_flags(&hdev->accept_list, in get_device_flags()
4043 &cp->addr.bdaddr, in get_device_flags()
4044 cp->addr.type); in get_device_flags()
4048 current_flags = br_params->current_flags; in get_device_flags()
4050 params = hci_conn_params_lookup(hdev, &cp->addr.bdaddr, in get_device_flags()
4051 le_addr_type(cp->addr.type)); in get_device_flags()
4056 current_flags = params->current_flags; in get_device_flags()
4059 bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr); in get_device_flags()
4060 rp.addr.type = cp->addr.type; in get_device_flags()
4069 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_DEVICE_FLAGS, status, in get_device_flags()
4095 u32 current_flags = __le32_to_cpu(cp->current_flags); in set_device_flags()
4098 &cp->addr.bdaddr, cp->addr.type, in set_device_flags()
4109 if (cp->addr.type == BDADDR_BREDR) { in set_device_flags()
4110 br_params = hci_bdaddr_list_lookup_with_flags(&hdev->accept_list, in set_device_flags()
4111 &cp->addr.bdaddr, in set_device_flags()
4112 cp->addr.type); in set_device_flags()
4115 br_params->current_flags = current_flags; in set_device_flags()
4119 &cp->addr.bdaddr, cp->addr.type); in set_device_flags()
4122 params = hci_conn_params_lookup(hdev, &cp->addr.bdaddr, in set_device_flags()
4123 le_addr_type(cp->addr.type)); in set_device_flags()
4125 params->current_flags = current_flags; in set_device_flags()
4129 &cp->addr.bdaddr, in set_device_flags()
4130 le_addr_type(cp->addr.type)); in set_device_flags()
4138 device_flags_changed(sk, hdev, &cp->addr.bdaddr, cp->addr.type, in set_device_flags()
4141 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_DEVICE_FLAGS, status, in set_device_flags()
4142 &cp->addr, sizeof(cp->addr)); in set_device_flags()
4176 BT_DBG("request for %s", hdev->name); in read_adv_mon_features()
4183 idr_for_each_entry(&hdev->adv_monitors_idr, monitor, handle) { in read_adv_mon_features()
4184 handles[num_handles++] = monitor->handle; in read_adv_mon_features()
4192 return -ENOMEM; in read_adv_mon_features()
4194 /* Once controller-based monitoring is in place, the enabled_features in read_adv_mon_features()
4197 rp->supported_features = cpu_to_le32(supported); in read_adv_mon_features()
4198 rp->enabled_features = 0; in read_adv_mon_features()
4199 rp->max_num_handles = cpu_to_le16(HCI_MAX_ADV_MONITOR_NUM_HANDLES); in read_adv_mon_features()
4200 rp->max_num_patterns = HCI_MAX_ADV_MONITOR_NUM_PATTERNS; in read_adv_mon_features()
4201 rp->num_handles = cpu_to_le16(num_handles); in read_adv_mon_features()
4203 memcpy(&rp->handles, &handles, (num_handles * sizeof(u16))); in read_adv_mon_features()
4205 err = mgmt_cmd_complete(sk, hdev->id, in read_adv_mon_features()
4225 BT_DBG("request for %s", hdev->name); in add_adv_patterns_monitor()
4227 if (len <= sizeof(*cp) || cp->pattern_count == 0) { in add_adv_patterns_monitor()
4228 err = mgmt_cmd_status(sk, hdev->id, in add_adv_patterns_monitor()
4236 err = -ENOMEM; in add_adv_patterns_monitor()
4240 INIT_LIST_HEAD(&m->patterns); in add_adv_patterns_monitor()
4241 m->active = false; in add_adv_patterns_monitor()
4243 for (i = 0; i < cp->pattern_count; i++) { in add_adv_patterns_monitor()
4245 err = mgmt_cmd_status(sk, hdev->id, in add_adv_patterns_monitor()
4251 cp_ofst = cp->patterns[i].offset; in add_adv_patterns_monitor()
4252 cp_len = cp->patterns[i].length; in add_adv_patterns_monitor()
4256 err = mgmt_cmd_status(sk, hdev->id, in add_adv_patterns_monitor()
4264 err = -ENOMEM; in add_adv_patterns_monitor()
4268 p->ad_type = cp->patterns[i].ad_type; in add_adv_patterns_monitor()
4269 p->offset = cp->patterns[i].offset; in add_adv_patterns_monitor()
4270 p->length = cp->patterns[i].length; in add_adv_patterns_monitor()
4271 memcpy(p->value, cp->patterns[i].value, p->length); in add_adv_patterns_monitor()
4273 INIT_LIST_HEAD(&p->list); in add_adv_patterns_monitor()
4274 list_add(&p->list, &m->patterns); in add_adv_patterns_monitor()
4277 if (mp_cnt != cp->pattern_count) { in add_adv_patterns_monitor()
4278 err = mgmt_cmd_status(sk, hdev->id, in add_adv_patterns_monitor()
4286 prev_adv_monitors_cnt = hdev->adv_monitors_cnt; in add_adv_patterns_monitor()
4290 if (err == -ENOSPC) { in add_adv_patterns_monitor()
4291 mgmt_cmd_status(sk, hdev->id, in add_adv_patterns_monitor()
4295 goto unlock; in add_adv_patterns_monitor()
4298 if (hdev->adv_monitors_cnt > prev_adv_monitors_cnt) in add_adv_patterns_monitor()
4299 mgmt_adv_monitor_added(sk, hdev, m->handle); in add_adv_patterns_monitor()
4303 rp.monitor_handle = cpu_to_le16(m->handle); in add_adv_patterns_monitor()
4305 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_ADV_PATTERNS_MONITOR, in add_adv_patterns_monitor()
4308 unlock: in add_adv_patterns_monitor()
4325 BT_DBG("request for %s", hdev->name); in remove_adv_monitor()
4329 handle = __le16_to_cpu(cp->monitor_handle); in remove_adv_monitor()
4330 prev_adv_monitors_cnt = hdev->adv_monitors_cnt; in remove_adv_monitor()
4333 if (err == -ENOENT) { in remove_adv_monitor()
4334 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_ADV_MONITOR, in remove_adv_monitor()
4336 goto unlock; in remove_adv_monitor()
4339 if (hdev->adv_monitors_cnt < prev_adv_monitors_cnt) in remove_adv_monitor()
4344 rp.monitor_handle = cp->monitor_handle; in remove_adv_monitor()
4346 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_ADV_MONITOR, in remove_adv_monitor()
4349 unlock: in remove_adv_monitor()
4368 mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA, in read_local_oob_data_complete()
4376 struct hci_rp_read_local_oob_data *rp = (void *) skb->data; in read_local_oob_data_complete()
4378 if (skb->len < sizeof(*rp)) { in read_local_oob_data_complete()
4379 mgmt_cmd_status(cmd->sk, hdev->id, in read_local_oob_data_complete()
4385 memcpy(mgmt_rp.hash192, rp->hash, sizeof(rp->hash)); in read_local_oob_data_complete()
4386 memcpy(mgmt_rp.rand192, rp->rand, sizeof(rp->rand)); in read_local_oob_data_complete()
4388 rp_size -= sizeof(mgmt_rp.hash256) + sizeof(mgmt_rp.rand256); in read_local_oob_data_complete()
4390 struct hci_rp_read_local_oob_ext_data *rp = (void *) skb->data; in read_local_oob_data_complete()
4392 if (skb->len < sizeof(*rp)) { in read_local_oob_data_complete()
4393 mgmt_cmd_status(cmd->sk, hdev->id, in read_local_oob_data_complete()
4399 memcpy(mgmt_rp.hash192, rp->hash192, sizeof(rp->hash192)); in read_local_oob_data_complete()
4400 memcpy(mgmt_rp.rand192, rp->rand192, sizeof(rp->rand192)); in read_local_oob_data_complete()
4402 memcpy(mgmt_rp.hash256, rp->hash256, sizeof(rp->hash256)); in read_local_oob_data_complete()
4403 memcpy(mgmt_rp.rand256, rp->rand256, sizeof(rp->rand256)); in read_local_oob_data_complete()
4406 mgmt_cmd_complete(cmd->sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA, in read_local_oob_data_complete()
4425 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA, in read_local_oob_data()
4427 goto unlock; in read_local_oob_data()
4431 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA, in read_local_oob_data()
4433 goto unlock; in read_local_oob_data()
4437 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA, in read_local_oob_data()
4439 goto unlock; in read_local_oob_data()
4444 err = -ENOMEM; in read_local_oob_data()
4445 goto unlock; in read_local_oob_data()
4459 unlock: in read_local_oob_data()
4472 if (!bdaddr_type_is_valid(addr->type)) in add_remote_oob_data()
4473 return mgmt_cmd_complete(sk, hdev->id, in add_remote_oob_data()
4484 if (cp->addr.type != BDADDR_BREDR) { in add_remote_oob_data()
4485 err = mgmt_cmd_complete(sk, hdev->id, in add_remote_oob_data()
4488 &cp->addr, sizeof(cp->addr)); in add_remote_oob_data()
4489 goto unlock; in add_remote_oob_data()
4492 err = hci_add_remote_oob_data(hdev, &cp->addr.bdaddr, in add_remote_oob_data()
4493 cp->addr.type, cp->hash, in add_remote_oob_data()
4494 cp->rand, NULL, NULL); in add_remote_oob_data()
4500 err = mgmt_cmd_complete(sk, hdev->id, in add_remote_oob_data()
4502 &cp->addr, sizeof(cp->addr)); in add_remote_oob_data()
4508 if (bdaddr_type_is_le(cp->addr.type)) { in add_remote_oob_data()
4509 /* Enforce zero-valued 192-bit parameters as in add_remote_oob_data()
4512 if (memcmp(cp->rand192, ZERO_KEY, 16) || in add_remote_oob_data()
4513 memcmp(cp->hash192, ZERO_KEY, 16)) { in add_remote_oob_data()
4514 err = mgmt_cmd_complete(sk, hdev->id, in add_remote_oob_data()
4518 goto unlock; in add_remote_oob_data()
4524 /* In case one of the P-192 values is set to zero, in add_remote_oob_data()
4525 * then just disable OOB data for P-192. in add_remote_oob_data()
4527 if (!memcmp(cp->rand192, ZERO_KEY, 16) || in add_remote_oob_data()
4528 !memcmp(cp->hash192, ZERO_KEY, 16)) { in add_remote_oob_data()
4532 rand192 = cp->rand192; in add_remote_oob_data()
4533 hash192 = cp->hash192; in add_remote_oob_data()
4537 /* In case one of the P-256 values is set to zero, then just in add_remote_oob_data()
4538 * disable OOB data for P-256. in add_remote_oob_data()
4540 if (!memcmp(cp->rand256, ZERO_KEY, 16) || in add_remote_oob_data()
4541 !memcmp(cp->hash256, ZERO_KEY, 16)) { in add_remote_oob_data()
4545 rand256 = cp->rand256; in add_remote_oob_data()
4546 hash256 = cp->hash256; in add_remote_oob_data()
4549 err = hci_add_remote_oob_data(hdev, &cp->addr.bdaddr, in add_remote_oob_data()
4550 cp->addr.type, hash192, rand192, in add_remote_oob_data()
4557 err = mgmt_cmd_complete(sk, hdev->id, in add_remote_oob_data()
4559 status, &cp->addr, sizeof(cp->addr)); in add_remote_oob_data()
4563 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_REMOTE_OOB_DATA, in add_remote_oob_data()
4567 unlock: in add_remote_oob_data()
4581 if (cp->addr.type != BDADDR_BREDR) in remove_remote_oob_data()
4582 return mgmt_cmd_complete(sk, hdev->id, in remove_remote_oob_data()
4585 &cp->addr, sizeof(cp->addr)); in remove_remote_oob_data()
4589 if (!bacmp(&cp->addr.bdaddr, BDADDR_ANY)) { in remove_remote_oob_data()
4595 err = hci_remove_remote_oob_data(hdev, &cp->addr.bdaddr, cp->addr.type); in remove_remote_oob_data()
4602 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_REMOTE_OOB_DATA, in remove_remote_oob_data()
4603 status, &cp->addr, sizeof(cp->addr)); in remove_remote_oob_data()
4625 cmd->cmd_complete(cmd, mgmt_status(status)); in mgmt_start_discovery_complete()
4633 hdev->suspend_tasks)) { in mgmt_start_discovery_complete()
4635 wake_up(&hdev->suspend_wait_q); in mgmt_start_discovery_complete()
4679 err = mgmt_cmd_complete(sk, hdev->id, op, in start_discovery_internal()
4681 &cp->type, sizeof(cp->type)); in start_discovery_internal()
4685 if (hdev->discovery.state != DISCOVERY_STOPPED || in start_discovery_internal()
4687 err = mgmt_cmd_complete(sk, hdev->id, op, MGMT_STATUS_BUSY, in start_discovery_internal()
4688 &cp->type, sizeof(cp->type)); in start_discovery_internal()
4692 if (!discovery_type_is_valid(hdev, cp->type, &status)) { in start_discovery_internal()
4693 err = mgmt_cmd_complete(sk, hdev->id, op, status, in start_discovery_internal()
4694 &cp->type, sizeof(cp->type)); in start_discovery_internal()
4699 if (hdev->discovery_paused) { in start_discovery_internal()
4700 err = mgmt_cmd_complete(sk, hdev->id, op, MGMT_STATUS_BUSY, in start_discovery_internal()
4701 &cp->type, sizeof(cp->type)); in start_discovery_internal()
4710 hdev->discovery.type = cp->type; in start_discovery_internal()
4711 hdev->discovery.report_invalid_rssi = false; in start_discovery_internal()
4713 hdev->discovery.limited = true; in start_discovery_internal()
4715 hdev->discovery.limited = false; in start_discovery_internal()
4719 err = -ENOMEM; in start_discovery_internal()
4723 cmd->cmd_complete = generic_cmd_complete; in start_discovery_internal()
4726 queue_work(hdev->req_workqueue, &hdev->discov_update); in start_discovery_internal()
4752 return mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, status, in service_discovery_cmd_complete()
4753 cmd->param, 1); in service_discovery_cmd_complete()
4761 const u16 max_uuid_count = ((U16_MAX - sizeof(*cp)) / 16); in start_service_discovery()
4771 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
4774 &cp->type, sizeof(cp->type)); in start_service_discovery()
4778 if (hdev->discovery.state != DISCOVERY_STOPPED || in start_service_discovery()
4780 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
4782 MGMT_STATUS_BUSY, &cp->type, in start_service_discovery()
4783 sizeof(cp->type)); in start_service_discovery()
4787 uuid_count = __le16_to_cpu(cp->uuid_count); in start_service_discovery()
4791 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
4793 MGMT_STATUS_INVALID_PARAMS, &cp->type, in start_service_discovery()
4794 sizeof(cp->type)); in start_service_discovery()
4802 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
4804 MGMT_STATUS_INVALID_PARAMS, &cp->type, in start_service_discovery()
4805 sizeof(cp->type)); in start_service_discovery()
4809 if (!discovery_type_is_valid(hdev, cp->type, &status)) { in start_service_discovery()
4810 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
4812 status, &cp->type, sizeof(cp->type)); in start_service_discovery()
4819 err = -ENOMEM; in start_service_discovery()
4823 cmd->cmd_complete = service_discovery_cmd_complete; in start_service_discovery()
4830 hdev->discovery.result_filtering = true; in start_service_discovery()
4831 hdev->discovery.type = cp->type; in start_service_discovery()
4832 hdev->discovery.rssi = cp->rssi; in start_service_discovery()
4833 hdev->discovery.uuid_count = uuid_count; in start_service_discovery()
4836 hdev->discovery.uuids = kmemdup(cp->uuids, uuid_count * 16, in start_service_discovery()
4838 if (!hdev->discovery.uuids) { in start_service_discovery()
4839 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
4842 &cp->type, sizeof(cp->type)); in start_service_discovery()
4849 queue_work(hdev->req_workqueue, &hdev->discov_update); in start_service_discovery()
4867 cmd->cmd_complete(cmd, mgmt_status(status)); in mgmt_stop_discovery_complete()
4874 if (test_and_clear_bit(SUSPEND_PAUSE_DISCOVERY, hdev->suspend_tasks)) { in mgmt_stop_discovery_complete()
4876 wake_up(&hdev->suspend_wait_q); in mgmt_stop_discovery_complete()
4892 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY, in stop_discovery()
4893 MGMT_STATUS_REJECTED, &mgmt_cp->type, in stop_discovery()
4894 sizeof(mgmt_cp->type)); in stop_discovery()
4895 goto unlock; in stop_discovery()
4898 if (hdev->discovery.type != mgmt_cp->type) { in stop_discovery()
4899 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY, in stop_discovery()
4901 &mgmt_cp->type, sizeof(mgmt_cp->type)); in stop_discovery()
4902 goto unlock; in stop_discovery()
4907 err = -ENOMEM; in stop_discovery()
4908 goto unlock; in stop_discovery()
4911 cmd->cmd_complete = generic_cmd_complete; in stop_discovery()
4914 queue_work(hdev->req_workqueue, &hdev->discov_update); in stop_discovery()
4917 unlock: in stop_discovery()
4934 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME, in confirm_name()
4935 MGMT_STATUS_FAILED, &cp->addr, in confirm_name()
4936 sizeof(cp->addr)); in confirm_name()
4940 e = hci_inquiry_cache_lookup_unknown(hdev, &cp->addr.bdaddr); in confirm_name()
4942 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME, in confirm_name()
4943 MGMT_STATUS_INVALID_PARAMS, &cp->addr, in confirm_name()
4944 sizeof(cp->addr)); in confirm_name()
4948 if (cp->name_known) { in confirm_name()
4949 e->name_state = NAME_KNOWN; in confirm_name()
4950 list_del(&e->list); in confirm_name()
4952 e->name_state = NAME_NEEDED; in confirm_name()
4956 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME, 0, in confirm_name()
4957 &cp->addr, sizeof(cp->addr)); in confirm_name()
4973 if (!bdaddr_type_is_valid(cp->addr.type)) in block_device()
4974 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE, in block_device()
4976 &cp->addr, sizeof(cp->addr)); in block_device()
4980 err = hci_bdaddr_list_add(&hdev->reject_list, &cp->addr.bdaddr, in block_device()
4981 cp->addr.type); in block_device()
4987 mgmt_event(MGMT_EV_DEVICE_BLOCKED, hdev, &cp->addr, sizeof(cp->addr), in block_device()
4992 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE, status, in block_device()
4993 &cp->addr, sizeof(cp->addr)); in block_device()
5009 if (!bdaddr_type_is_valid(cp->addr.type)) in unblock_device()
5010 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE, in unblock_device()
5012 &cp->addr, sizeof(cp->addr)); in unblock_device()
5016 err = hci_bdaddr_list_del(&hdev->reject_list, &cp->addr.bdaddr, in unblock_device()
5017 cp->addr.type); in unblock_device()
5023 mgmt_event(MGMT_EV_DEVICE_UNBLOCKED, hdev, &cp->addr, sizeof(cp->addr), in unblock_device()
5028 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE, status, in unblock_device()
5029 &cp->addr, sizeof(cp->addr)); in unblock_device()
5046 source = __le16_to_cpu(cp->source); in set_device_id()
5049 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEVICE_ID, in set_device_id()
5054 hdev->devid_source = source; in set_device_id()
5055 hdev->devid_vendor = __le16_to_cpu(cp->vendor); in set_device_id()
5056 hdev->devid_product = __le16_to_cpu(cp->product); in set_device_id()
5057 hdev->devid_version = __le16_to_cpu(cp->version); in set_device_id()
5059 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_DEVICE_ID, 0, in set_device_id()
5093 goto unlock; in set_advertising_complete()
5111 hdev->suspend_tasks)) { in set_advertising_complete()
5113 wake_up(&hdev->suspend_wait_q); in set_advertising_complete()
5115 hdev->suspend_tasks)) { in set_advertising_complete()
5117 wake_up(&hdev->suspend_wait_q); in set_advertising_complete()
5121 * set up earlier, then re-enable multi-instance advertising. in set_advertising_complete()
5124 list_empty(&hdev->adv_instances)) in set_advertising_complete()
5125 goto unlock; in set_advertising_complete()
5127 instance = hdev->cur_adv_instance; in set_advertising_complete()
5129 adv_instance = list_first_entry_or_null(&hdev->adv_instances, in set_advertising_complete()
5132 goto unlock; in set_advertising_complete()
5134 instance = adv_instance->instance; in set_advertising_complete()
5145 bt_dev_err(hdev, "failed to re-configure advertising"); in set_advertising_complete()
5147 unlock: in set_advertising_complete()
5164 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING, in set_advertising()
5171 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING, in set_advertising()
5174 if (cp->val != 0x00 && cp->val != 0x01 && cp->val != 0x02) in set_advertising()
5175 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING, in set_advertising()
5178 if (hdev->advertising_paused) in set_advertising()
5179 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING, in set_advertising()
5184 val = !!cp->val; in set_advertising()
5193 (cp->val == 0x02) == hci_dev_test_flag(hdev, HCI_ADVERTISING_CONNECTABLE)) || in set_advertising()
5196 hdev->le_scan_type == LE_SCAN_ACTIVE)) { in set_advertising()
5199 if (cp->val) { in set_advertising()
5200 hdev->cur_adv_instance = 0x00; in set_advertising()
5202 if (cp->val == 0x02) in set_advertising()
5213 goto unlock; in set_advertising()
5218 goto unlock; in set_advertising()
5223 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING, in set_advertising()
5225 goto unlock; in set_advertising()
5230 err = -ENOMEM; in set_advertising()
5231 goto unlock; in set_advertising()
5236 if (cp->val == 0x02) in set_advertising()
5248 hdev->cur_adv_instance = 0x00; in set_advertising()
5265 unlock: in set_advertising()
5279 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_STATIC_ADDRESS, in set_static_address()
5283 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_STATIC_ADDRESS, in set_static_address()
5286 if (bacmp(&cp->bdaddr, BDADDR_ANY)) { in set_static_address()
5287 if (!bacmp(&cp->bdaddr, BDADDR_NONE)) in set_static_address()
5288 return mgmt_cmd_status(sk, hdev->id, in set_static_address()
5293 if ((cp->bdaddr.b[5] & 0xc0) != 0xc0) in set_static_address()
5294 return mgmt_cmd_status(sk, hdev->id, in set_static_address()
5301 bacpy(&hdev->static_addr, &cp->bdaddr); in set_static_address()
5305 goto unlock; in set_static_address()
5309 unlock: in set_static_address()
5324 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, in set_scan_params()
5327 interval = __le16_to_cpu(cp->interval); in set_scan_params()
5330 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, in set_scan_params()
5333 window = __le16_to_cpu(cp->window); in set_scan_params()
5336 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, in set_scan_params()
5340 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, in set_scan_params()
5345 hdev->le_scan_interval = interval; in set_scan_params()
5346 hdev->le_scan_window = window; in set_scan_params()
5348 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, 0, in set_scan_params()
5355 hdev->discovery.state == DISCOVERY_STOPPED) { in set_scan_params()
5382 goto unlock; in fast_connectable_complete()
5385 mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE, in fast_connectable_complete()
5388 struct mgmt_mode *cp = cmd->param; in fast_connectable_complete()
5390 if (cp->val) in fast_connectable_complete()
5395 send_settings_rsp(cmd->sk, MGMT_OP_SET_FAST_CONNECTABLE, hdev); in fast_connectable_complete()
5396 new_settings(hdev, cmd->sk); in fast_connectable_complete()
5401 unlock: in fast_connectable_complete()
5416 hdev->hci_ver < BLUETOOTH_VER_1_2) in set_fast_connectable()
5417 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE, in set_fast_connectable()
5420 if (cp->val != 0x00 && cp->val != 0x01) in set_fast_connectable()
5421 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE, in set_fast_connectable()
5427 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE, in set_fast_connectable()
5429 goto unlock; in set_fast_connectable()
5432 if (!!cp->val == hci_dev_test_flag(hdev, HCI_FAST_CONNECTABLE)) { in set_fast_connectable()
5435 goto unlock; in set_fast_connectable()
5443 goto unlock; in set_fast_connectable()
5449 err = -ENOMEM; in set_fast_connectable()
5450 goto unlock; in set_fast_connectable()
5455 __hci_req_write_fast_connectable(&req, cp->val); in set_fast_connectable()
5459 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE, in set_fast_connectable()
5464 unlock: in set_fast_connectable()
5480 goto unlock; in set_bredr_complete()
5490 mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_err); in set_bredr_complete()
5492 send_settings_rsp(cmd->sk, MGMT_OP_SET_BREDR, hdev); in set_bredr_complete()
5493 new_settings(hdev, cmd->sk); in set_bredr_complete()
5498 unlock: in set_bredr_complete()
5512 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, in set_bredr()
5516 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, in set_bredr()
5519 if (cp->val != 0x00 && cp->val != 0x01) in set_bredr()
5520 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, in set_bredr()
5525 if (cp->val == hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) { in set_bredr()
5527 goto unlock; in set_bredr()
5531 if (!cp->val) { in set_bredr()
5543 goto unlock; in set_bredr()
5546 goto unlock; in set_bredr()
5550 if (!cp->val) { in set_bredr()
5551 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, in set_bredr()
5553 goto unlock; in set_bredr()
5555 /* When configuring a dual-mode controller to operate in set_bredr()
5559 * Dual-mode controllers shall operate with the public in set_bredr()
5570 (bacmp(&hdev->static_addr, BDADDR_ANY) || in set_bredr()
5572 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, in set_bredr()
5574 goto unlock; in set_bredr()
5579 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, in set_bredr()
5581 goto unlock; in set_bredr()
5586 err = -ENOMEM; in set_bredr()
5587 goto unlock; in set_bredr()
5603 __hci_req_update_adv_data(&req, hdev->cur_adv_instance); in set_bredr()
5609 unlock: in set_bredr()
5625 goto unlock; in sc_enable_complete()
5628 mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, in sc_enable_complete()
5633 cp = cmd->param; in sc_enable_complete()
5635 switch (cp->val) { in sc_enable_complete()
5650 send_settings_rsp(cmd->sk, MGMT_OP_SET_SECURE_CONN, hdev); in sc_enable_complete()
5651 new_settings(hdev, cmd->sk); in sc_enable_complete()
5655 unlock: in sc_enable_complete()
5672 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN, in set_secure_conn()
5678 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN, in set_secure_conn()
5681 if (cp->val != 0x00 && cp->val != 0x01 && cp->val != 0x02) in set_secure_conn()
5682 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN, in set_secure_conn()
5691 if (cp->val) { in set_secure_conn()
5694 if (cp->val == 0x02) in set_secure_conn()
5715 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN, in set_secure_conn()
5720 val = !!cp->val; in set_secure_conn()
5723 (cp->val == 0x02) == hci_dev_test_flag(hdev, HCI_SC_ONLY)) { in set_secure_conn()
5730 err = -ENOMEM; in set_secure_conn()
5756 if (cp->val != 0x00 && cp->val != 0x01 && cp->val != 0x02) in set_debug_keys()
5757 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEBUG_KEYS, in set_debug_keys()
5762 if (cp->val) in set_debug_keys()
5768 if (cp->val == 0x02) in set_debug_keys()
5777 u8 mode = (cp->val == 0x02) ? 0x01 : 0x00; in set_debug_keys()
5784 goto unlock; in set_debug_keys()
5789 unlock: in set_debug_keys()
5804 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PRIVACY, in set_privacy()
5807 if (cp->privacy != 0x00 && cp->privacy != 0x01 && cp->privacy != 0x02) in set_privacy()
5808 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PRIVACY, in set_privacy()
5812 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PRIVACY, in set_privacy()
5822 if (cp->privacy) { in set_privacy()
5824 memcpy(hdev->irk, cp->irk, sizeof(hdev->irk)); in set_privacy()
5827 if (cp->privacy == 0x02) in set_privacy()
5833 memset(hdev->irk, 0, sizeof(hdev->irk)); in set_privacy()
5841 goto unlock; in set_privacy()
5846 unlock: in set_privacy()
5853 switch (irk->addr.type) { in irk_is_valid()
5859 if ((irk->addr.bdaddr.b[5] & 0xc0) != 0xc0) in irk_is_valid()
5871 const u16 max_irk_count = ((U16_MAX - sizeof(*cp)) / in load_irks()
5879 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_IRKS, in load_irks()
5882 irk_count = __le16_to_cpu(cp->irk_count); in load_irks()
5886 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_IRKS, in load_irks()
5894 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_IRKS, in load_irks()
5901 struct mgmt_irk_info *key = &cp->irks[i]; in load_irks()
5904 return mgmt_cmd_status(sk, hdev->id, in load_irks()
5914 struct mgmt_irk_info *irk = &cp->irks[i]; in load_irks()
5915 u8 addr_type = le_addr_type(irk->addr.type); in load_irks()
5919 irk->val)) { in load_irks()
5921 &irk->addr.bdaddr); in load_irks()
5926 if (irk->addr.type == BDADDR_BREDR) in load_irks()
5929 hci_add_irk(hdev, &irk->addr.bdaddr, in load_irks()
5930 addr_type, irk->val, in load_irks()
5936 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_IRKS, 0, NULL, 0); in load_irks()
5945 if (key->initiator != 0x00 && key->initiator != 0x01) in ltk_is_valid()
5948 switch (key->addr.type) { in ltk_is_valid()
5954 if ((key->addr.bdaddr.b[5] & 0xc0) != 0xc0) in ltk_is_valid()
5966 const u16 max_key_count = ((U16_MAX - sizeof(*cp)) / in load_long_term_keys()
5974 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, in load_long_term_keys()
5977 key_count = __le16_to_cpu(cp->key_count); in load_long_term_keys()
5981 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, in load_long_term_keys()
5985 expected_len = struct_size(cp, keys, key_count); in load_long_term_keys()
5989 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, in load_long_term_keys()
5996 struct mgmt_ltk_info *key = &cp->keys[i]; in load_long_term_keys()
5999 return mgmt_cmd_status(sk, hdev->id, in load_long_term_keys()
6009 struct mgmt_ltk_info *key = &cp->keys[i]; in load_long_term_keys()
6011 u8 addr_type = le_addr_type(key->addr.type); in load_long_term_keys()
6015 key->val)) { in load_long_term_keys()
6017 &key->addr.bdaddr); in load_long_term_keys()
6021 switch (key->type) { in load_long_term_keys()
6024 type = key->initiator ? SMP_LTK : SMP_LTK_RESPONDER; in load_long_term_keys()
6028 type = key->initiator ? SMP_LTK : SMP_LTK_RESPONDER; in load_long_term_keys()
6047 if (key->addr.type == BDADDR_BREDR) in load_long_term_keys()
6050 hci_add_ltk(hdev, &key->addr.bdaddr, in load_long_term_keys()
6052 key->val, key->enc_size, key->ediv, key->rand); in load_long_term_keys()
6055 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, 0, in load_long_term_keys()
6065 struct hci_conn *conn = cmd->user_data; in conn_info_cmd_complete()
6069 memcpy(&rp.addr, cmd->param, sizeof(rp.addr)); in conn_info_cmd_complete()
6072 rp.rssi = conn->rssi; in conn_info_cmd_complete()
6073 rp.tx_power = conn->tx_power; in conn_info_cmd_complete()
6074 rp.max_tx_power = conn->max_tx_power; in conn_info_cmd_complete()
6081 err = mgmt_cmd_complete(cmd->sk, cmd->hdev->id, MGMT_OP_GET_CONN_INFO, in conn_info_cmd_complete()
6122 goto unlock; in conn_info_refresh_complete()
6125 handle = __le16_to_cpu(cp->handle); in conn_info_refresh_complete()
6130 goto unlock; in conn_info_refresh_complete()
6135 goto unlock; in conn_info_refresh_complete()
6137 cmd->cmd_complete(cmd, status); in conn_info_refresh_complete()
6140 unlock: in conn_info_refresh_complete()
6156 bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr); in get_conn_info()
6157 rp.addr.type = cp->addr.type; in get_conn_info()
6159 if (!bdaddr_type_is_valid(cp->addr.type)) in get_conn_info()
6160 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO, in get_conn_info()
6167 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO, in get_conn_info()
6170 goto unlock; in get_conn_info()
6173 if (cp->addr.type == BDADDR_BREDR) in get_conn_info()
6175 &cp->addr.bdaddr); in get_conn_info()
6177 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->addr.bdaddr); in get_conn_info()
6179 if (!conn || conn->state != BT_CONNECTED) { in get_conn_info()
6180 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO, in get_conn_info()
6183 goto unlock; in get_conn_info()
6187 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO, in get_conn_info()
6189 goto unlock; in get_conn_info()
6195 conn_info_age = hdev->conn_info_min_age + in get_conn_info()
6196 prandom_u32_max(hdev->conn_info_max_age - in get_conn_info()
6197 hdev->conn_info_min_age); in get_conn_info()
6202 if (time_after(jiffies, conn->conn_info_timestamp + in get_conn_info()
6204 !conn->conn_info_timestamp) { in get_conn_info()
6211 req_rssi_cp.handle = cpu_to_le16(conn->handle); in get_conn_info()
6218 if (!bdaddr_type_is_le(cp->addr.type) || in get_conn_info()
6219 conn->tx_power == HCI_TX_POWER_INVALID) { in get_conn_info()
6220 req_txp_cp.handle = cpu_to_le16(conn->handle); in get_conn_info()
6227 if (conn->max_tx_power == HCI_TX_POWER_INVALID) { in get_conn_info()
6228 req_txp_cp.handle = cpu_to_le16(conn->handle); in get_conn_info()
6236 goto unlock; in get_conn_info()
6241 err = -ENOMEM; in get_conn_info()
6242 goto unlock; in get_conn_info()
6246 cmd->user_data = hci_conn_get(conn); in get_conn_info()
6247 cmd->cmd_complete = conn_info_cmd_complete; in get_conn_info()
6249 conn->conn_info_timestamp = jiffies; in get_conn_info()
6252 rp.rssi = conn->rssi; in get_conn_info()
6253 rp.tx_power = conn->tx_power; in get_conn_info()
6254 rp.max_tx_power = conn->max_tx_power; in get_conn_info()
6256 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO, in get_conn_info()
6260 unlock: in get_conn_info()
6267 struct hci_conn *conn = cmd->user_data; in clock_info_cmd_complete()
6273 memcpy(&rp.addr, cmd->param, sizeof(rp.addr)); in clock_info_cmd_complete()
6278 hdev = hci_dev_get(cmd->hdev->id); in clock_info_cmd_complete()
6280 rp.local_clock = cpu_to_le32(hdev->clock); in clock_info_cmd_complete()
6285 rp.piconet_clock = cpu_to_le32(conn->clock); in clock_info_cmd_complete()
6286 rp.accuracy = cpu_to_le16(conn->clock_accuracy); in clock_info_cmd_complete()
6290 err = mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, status, &rp, in clock_info_cmd_complete()
6313 goto unlock; in get_clock_info_complete()
6315 if (hci_cp->which) { in get_clock_info_complete()
6316 u16 handle = __le16_to_cpu(hci_cp->handle); in get_clock_info_complete()
6324 goto unlock; in get_clock_info_complete()
6326 cmd->cmd_complete(cmd, mgmt_status(status)); in get_clock_info_complete()
6329 unlock: in get_clock_info_complete()
6347 bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr); in get_clock_info()
6348 rp.addr.type = cp->addr.type; in get_clock_info()
6350 if (cp->addr.type != BDADDR_BREDR) in get_clock_info()
6351 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CLOCK_INFO, in get_clock_info()
6358 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CLOCK_INFO, in get_clock_info()
6361 goto unlock; in get_clock_info()
6364 if (bacmp(&cp->addr.bdaddr, BDADDR_ANY)) { in get_clock_info()
6366 &cp->addr.bdaddr); in get_clock_info()
6367 if (!conn || conn->state != BT_CONNECTED) { in get_clock_info()
6368 err = mgmt_cmd_complete(sk, hdev->id, in get_clock_info()
6372 goto unlock; in get_clock_info()
6380 err = -ENOMEM; in get_clock_info()
6381 goto unlock; in get_clock_info()
6384 cmd->cmd_complete = clock_info_cmd_complete; in get_clock_info()
6393 cmd->user_data = hci_conn_get(conn); in get_clock_info()
6395 hci_cp.handle = cpu_to_le16(conn->handle); in get_clock_info()
6404 unlock: in get_clock_info()
6417 if (conn->dst_type != type) in is_connected()
6420 if (conn->state != BT_CONNECTED) in is_connected()
6426 /* This function requires the caller holds hdev->lock */
6434 return -EIO; in hci_conn_params_set()
6436 if (params->auto_connect == auto_connect) in hci_conn_params_set()
6439 list_del_init(&params->action); in hci_conn_params_set()
6447 if (params->explicit_connect) in hci_conn_params_set()
6448 list_add(&params->action, &hdev->pend_le_conns); in hci_conn_params_set()
6451 if (params->explicit_connect) in hci_conn_params_set()
6452 list_add(&params->action, &hdev->pend_le_conns); in hci_conn_params_set()
6454 list_add(&params->action, &hdev->pend_le_reports); in hci_conn_params_set()
6459 list_add(&params->action, &hdev->pend_le_conns); in hci_conn_params_set()
6463 params->auto_connect = auto_connect; in hci_conn_params_set()
6494 if (!bdaddr_type_is_valid(cp->addr.type) || in add_device()
6495 !bacmp(&cp->addr.bdaddr, BDADDR_ANY)) in add_device()
6496 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE, in add_device()
6498 &cp->addr, sizeof(cp->addr)); in add_device()
6500 if (cp->action != 0x00 && cp->action != 0x01 && cp->action != 0x02) in add_device()
6501 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE, in add_device()
6503 &cp->addr, sizeof(cp->addr)); in add_device()
6507 if (cp->addr.type == BDADDR_BREDR) { in add_device()
6509 if (cp->action != 0x01) { in add_device()
6510 err = mgmt_cmd_complete(sk, hdev->id, in add_device()
6513 &cp->addr, sizeof(cp->addr)); in add_device()
6514 goto unlock; in add_device()
6517 err = hci_bdaddr_list_add_with_flags(&hdev->accept_list, in add_device()
6518 &cp->addr.bdaddr, in add_device()
6519 cp->addr.type, 0); in add_device()
6521 goto unlock; in add_device()
6528 addr_type = le_addr_type(cp->addr.type); in add_device()
6530 if (cp->action == 0x02) in add_device()
6532 else if (cp->action == 0x01) in add_device()
6542 if (!hci_is_identity_address(&cp->addr.bdaddr, addr_type)) { in add_device()
6543 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE, in add_device()
6545 &cp->addr, sizeof(cp->addr)); in add_device()
6546 goto unlock; in add_device()
6552 if (hci_conn_params_set(hdev, &cp->addr.bdaddr, addr_type, in add_device()
6554 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE, in add_device()
6555 MGMT_STATUS_FAILED, &cp->addr, in add_device()
6556 sizeof(cp->addr)); in add_device()
6557 goto unlock; in add_device()
6559 params = hci_conn_params_lookup(hdev, &cp->addr.bdaddr, in add_device()
6562 current_flags = params->current_flags; in add_device()
6568 device_added(sk, hdev, &cp->addr.bdaddr, cp->addr.type, cp->action); in add_device()
6569 device_flags_changed(NULL, hdev, &cp->addr.bdaddr, cp->addr.type, in add_device()
6572 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE, in add_device()
6573 MGMT_STATUS_SUCCESS, &cp->addr, in add_device()
6574 sizeof(cp->addr)); in add_device()
6576 unlock: in add_device()
6602 if (bacmp(&cp->addr.bdaddr, BDADDR_ANY)) { in remove_device()
6606 if (!bdaddr_type_is_valid(cp->addr.type)) { in remove_device()
6607 err = mgmt_cmd_complete(sk, hdev->id, in remove_device()
6610 &cp->addr, sizeof(cp->addr)); in remove_device()
6611 goto unlock; in remove_device()
6614 if (cp->addr.type == BDADDR_BREDR) { in remove_device()
6615 err = hci_bdaddr_list_del(&hdev->accept_list, in remove_device()
6616 &cp->addr.bdaddr, in remove_device()
6617 cp->addr.type); in remove_device()
6619 err = mgmt_cmd_complete(sk, hdev->id, in remove_device()
6622 &cp->addr, in remove_device()
6623 sizeof(cp->addr)); in remove_device()
6624 goto unlock; in remove_device()
6629 device_removed(sk, hdev, &cp->addr.bdaddr, in remove_device()
6630 cp->addr.type); in remove_device()
6634 addr_type = le_addr_type(cp->addr.type); in remove_device()
6641 if (!hci_is_identity_address(&cp->addr.bdaddr, addr_type)) { in remove_device()
6642 err = mgmt_cmd_complete(sk, hdev->id, in remove_device()
6645 &cp->addr, sizeof(cp->addr)); in remove_device()
6646 goto unlock; in remove_device()
6649 params = hci_conn_params_lookup(hdev, &cp->addr.bdaddr, in remove_device()
6652 err = mgmt_cmd_complete(sk, hdev->id, in remove_device()
6655 &cp->addr, sizeof(cp->addr)); in remove_device()
6656 goto unlock; in remove_device()
6659 if (params->auto_connect == HCI_AUTO_CONN_DISABLED || in remove_device()
6660 params->auto_connect == HCI_AUTO_CONN_EXPLICIT) { in remove_device()
6661 err = mgmt_cmd_complete(sk, hdev->id, in remove_device()
6664 &cp->addr, sizeof(cp->addr)); in remove_device()
6665 goto unlock; in remove_device()
6668 list_del(&params->action); in remove_device()
6669 list_del(&params->list); in remove_device()
6673 device_removed(sk, hdev, &cp->addr.bdaddr, cp->addr.type); in remove_device()
6678 if (cp->addr.type) { in remove_device()
6679 err = mgmt_cmd_complete(sk, hdev->id, in remove_device()
6682 &cp->addr, sizeof(cp->addr)); in remove_device()
6683 goto unlock; in remove_device()
6686 list_for_each_entry_safe(b, btmp, &hdev->accept_list, list) { in remove_device()
6687 device_removed(sk, hdev, &b->bdaddr, b->bdaddr_type); in remove_device()
6688 list_del(&b->list); in remove_device()
6694 list_for_each_entry_safe(p, tmp, &hdev->le_conn_params, list) { in remove_device()
6695 if (p->auto_connect == HCI_AUTO_CONN_DISABLED) in remove_device()
6697 device_removed(sk, hdev, &p->addr, p->addr_type); in remove_device()
6698 if (p->explicit_connect) { in remove_device()
6699 p->auto_connect = HCI_AUTO_CONN_EXPLICIT; in remove_device()
6702 list_del(&p->action); in remove_device()
6703 list_del(&p->list); in remove_device()
6713 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_DEVICE, in remove_device()
6714 MGMT_STATUS_SUCCESS, &cp->addr, in remove_device()
6715 sizeof(cp->addr)); in remove_device()
6716 unlock: in remove_device()
6725 const u16 max_param_count = ((U16_MAX - sizeof(*cp)) / in load_conn_param()
6731 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM, in load_conn_param()
6734 param_count = __le16_to_cpu(cp->param_count); in load_conn_param()
6738 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM, in load_conn_param()
6746 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM, in load_conn_param()
6757 struct mgmt_conn_param *param = &cp->params[i]; in load_conn_param()
6762 bt_dev_dbg(hdev, "Adding %pMR (type %u)", &param->addr.bdaddr, in load_conn_param()
6763 param->addr.type); in load_conn_param()
6765 if (param->addr.type == BDADDR_LE_PUBLIC) { in load_conn_param()
6767 } else if (param->addr.type == BDADDR_LE_RANDOM) { in load_conn_param()
6774 min = le16_to_cpu(param->min_interval); in load_conn_param()
6775 max = le16_to_cpu(param->max_interval); in load_conn_param()
6776 latency = le16_to_cpu(param->latency); in load_conn_param()
6777 timeout = le16_to_cpu(param->timeout); in load_conn_param()
6787 hci_param = hci_conn_params_add(hdev, &param->addr.bdaddr, in load_conn_param()
6794 hci_param->conn_min_interval = min; in load_conn_param()
6795 hci_param->conn_max_interval = max; in load_conn_param()
6796 hci_param->conn_latency = latency; in load_conn_param()
6797 hci_param->supervision_timeout = timeout; in load_conn_param()
6802 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM, 0, in load_conn_param()
6816 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_EXTERNAL_CONFIG, in set_external_config()
6819 if (cp->config != 0x00 && cp->config != 0x01) in set_external_config()
6820 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_EXTERNAL_CONFIG, in set_external_config()
6823 if (!test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks)) in set_external_config()
6824 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_EXTERNAL_CONFIG, in set_external_config()
6829 if (cp->config) in set_external_config()
6836 goto unlock; in set_external_config()
6839 goto unlock; in set_external_config()
6850 queue_work(hdev->req_workqueue, &hdev->power_on); in set_external_config()
6852 set_bit(HCI_RAW, &hdev->flags); in set_external_config()
6857 unlock: in set_external_config()
6872 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PUBLIC_ADDRESS, in set_public_address()
6875 if (!bacmp(&cp->bdaddr, BDADDR_ANY)) in set_public_address()
6876 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PUBLIC_ADDRESS, in set_public_address()
6879 if (!hdev->set_bdaddr) in set_public_address()
6880 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PUBLIC_ADDRESS, in set_public_address()
6885 changed = !!bacmp(&hdev->public_addr, &cp->bdaddr); in set_public_address()
6886 bacpy(&hdev->public_addr, &cp->bdaddr); in set_public_address()
6890 goto unlock; in set_public_address()
6893 goto unlock; in set_public_address()
6906 queue_work(hdev->req_workqueue, &hdev->power_on); in set_public_address()
6909 unlock: in set_public_address()
6930 mgmt_cp = cmd->param; in read_local_oob_ext_data_complete()
6943 if (skb->len != sizeof(*rp)) { in read_local_oob_ext_data_complete()
6948 rp = (void *)skb->data; in read_local_oob_ext_data_complete()
6951 h192 = rp->hash; in read_local_oob_ext_data_complete()
6952 r192 = rp->rand; in read_local_oob_ext_data_complete()
6959 if (skb->len != sizeof(*rp)) { in read_local_oob_ext_data_complete()
6964 rp = (void *)skb->data; in read_local_oob_ext_data_complete()
6972 h192 = rp->hash192; in read_local_oob_ext_data_complete()
6973 r192 = rp->rand192; in read_local_oob_ext_data_complete()
6976 h256 = rp->hash256; in read_local_oob_ext_data_complete()
6977 r256 = rp->rand256; in read_local_oob_ext_data_complete()
6988 eir_len = eir_append_data(mgmt_rp->eir, 0, EIR_CLASS_OF_DEV, in read_local_oob_ext_data_complete()
6989 hdev->dev_class, 3); in read_local_oob_ext_data_complete()
6992 eir_len = eir_append_data(mgmt_rp->eir, eir_len, in read_local_oob_ext_data_complete()
6994 eir_len = eir_append_data(mgmt_rp->eir, eir_len, in read_local_oob_ext_data_complete()
6999 eir_len = eir_append_data(mgmt_rp->eir, eir_len, in read_local_oob_ext_data_complete()
7001 eir_len = eir_append_data(mgmt_rp->eir, eir_len, in read_local_oob_ext_data_complete()
7006 mgmt_rp->type = mgmt_cp->type; in read_local_oob_ext_data_complete()
7007 mgmt_rp->eir_len = cpu_to_le16(eir_len); in read_local_oob_ext_data_complete()
7009 err = mgmt_cmd_complete(cmd->sk, hdev->id, in read_local_oob_ext_data_complete()
7015 hci_sock_set_flag(cmd->sk, HCI_MGMT_OOB_DATA_EVENTS); in read_local_oob_ext_data_complete()
7019 HCI_MGMT_OOB_DATA_EVENTS, cmd->sk); in read_local_oob_ext_data_complete()
7035 return -ENOMEM; in read_local_ssp_oob_req()
7066 switch (cp->type) { in read_local_oob_ext_data()
7094 return -ENOMEM; in read_local_oob_ext_data()
7102 switch (cp->type) { in read_local_oob_ext_data()
7113 eir_len = eir_append_data(rp->eir, eir_len, in read_local_oob_ext_data()
7115 hdev->dev_class, 3); in read_local_oob_ext_data()
7129 * local out-of-band data when privacy is in use. in read_local_oob_ext_data()
7143 !bacmp(&hdev->bdaddr, BDADDR_ANY) || in read_local_oob_ext_data()
7145 bacmp(&hdev->static_addr, BDADDR_ANY))) { in read_local_oob_ext_data()
7146 memcpy(addr, &hdev->static_addr, 6); in read_local_oob_ext_data()
7149 memcpy(addr, &hdev->bdaddr, 6); in read_local_oob_ext_data()
7153 eir_len = eir_append_data(rp->eir, eir_len, EIR_LE_BDADDR, in read_local_oob_ext_data()
7161 eir_len = eir_append_data(rp->eir, eir_len, EIR_LE_ROLE, in read_local_oob_ext_data()
7165 eir_len = eir_append_data(rp->eir, eir_len, in read_local_oob_ext_data()
7169 eir_len = eir_append_data(rp->eir, eir_len, in read_local_oob_ext_data()
7179 eir_len = eir_append_data(rp->eir, eir_len, EIR_FLAGS, in read_local_oob_ext_data()
7191 rp->type = cp->type; in read_local_oob_ext_data()
7192 rp->eir_len = cpu_to_le16(eir_len); in read_local_oob_ext_data()
7194 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_EXT_DATA, in read_local_oob_ext_data()
7223 if ((hdev->adv_tx_power != HCI_TX_POWER_INVALID) || in get_supported_adv_flags()
7232 if (hdev->le_features[1] & HCI_LE_PHY_2M) in get_supported_adv_flags()
7235 if (hdev->le_features[1] & HCI_LE_PHY_CODED) in get_supported_adv_flags()
7255 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_ADV_FEATURES, in read_adv_features()
7262 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING, in read_adv_features()
7267 rp_len = sizeof(*rp) + hdev->adv_instance_cnt; in read_adv_features()
7271 return -ENOMEM; in read_adv_features()
7276 rp->supported_flags = cpu_to_le32(supported_flags); in read_adv_features()
7277 rp->max_adv_data_len = HCI_MAX_AD_LENGTH; in read_adv_features()
7278 rp->max_scan_rsp_len = HCI_MAX_AD_LENGTH; in read_adv_features()
7279 rp->max_instances = hdev->le_num_of_adv_sets; in read_adv_features()
7280 rp->num_instances = hdev->adv_instance_cnt; in read_adv_features()
7282 instance = rp->instance; in read_adv_features()
7283 list_for_each_entry(adv_instance, &hdev->adv_instances, list) { in read_adv_features()
7284 *instance = adv_instance->instance; in read_adv_features()
7290 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_ADV_FEATURES, in read_adv_features()
7314 max_len -= 3; in tlv_data_max_len()
7317 max_len -= 3; in tlv_data_max_len()
7320 max_len -= calculate_name_len(hdev); in tlv_data_max_len()
7323 max_len -= 4; in tlv_data_max_len()
7411 list_for_each_entry_safe(adv_instance, n, &hdev->adv_instances, list) { in add_advertising_complete()
7412 if (!adv_instance->pending) in add_advertising_complete()
7416 adv_instance->pending = false; in add_advertising_complete()
7420 instance = adv_instance->instance; in add_advertising_complete()
7422 if (hdev->cur_adv_instance == instance) in add_advertising_complete()
7426 mgmt_advertising_removed(cmd ? cmd->sk : NULL, hdev, instance); in add_advertising_complete()
7430 goto unlock; in add_advertising_complete()
7432 cp = cmd->param; in add_advertising_complete()
7433 rp.instance = cp->instance; in add_advertising_complete()
7436 mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, in add_advertising_complete()
7439 mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, in add_advertising_complete()
7444 unlock: in add_advertising_complete()
7457 unsigned int prev_instance_cnt = hdev->adv_instance_cnt; in add_advertising()
7468 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
7475 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
7478 if (cp->instance < 1 || cp->instance > hdev->le_num_of_adv_sets) in add_advertising()
7479 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
7482 if (data_len != sizeof(*cp) + cp->adv_data_len + cp->scan_rsp_len) in add_advertising()
7483 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
7486 flags = __le32_to_cpu(cp->flags); in add_advertising()
7487 timeout = __le16_to_cpu(cp->timeout); in add_advertising()
7488 duration = __le16_to_cpu(cp->duration); in add_advertising()
7496 ((phy_flags && (phy_flags ^ (phy_flags & -phy_flags))))) in add_advertising()
7497 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
7503 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
7505 goto unlock; in add_advertising()
7511 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
7513 goto unlock; in add_advertising()
7516 if (!tlv_data_is_valid(hdev, flags, cp->data, cp->adv_data_len, true) || in add_advertising()
7517 !tlv_data_is_valid(hdev, flags, cp->data + cp->adv_data_len, in add_advertising()
7518 cp->scan_rsp_len, false)) { in add_advertising()
7519 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
7521 goto unlock; in add_advertising()
7524 err = hci_add_adv_instance(hdev, cp->instance, flags, in add_advertising()
7525 cp->adv_data_len, cp->data, in add_advertising()
7526 cp->scan_rsp_len, in add_advertising()
7527 cp->data + cp->adv_data_len, in add_advertising()
7530 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
7532 goto unlock; in add_advertising()
7538 if (hdev->adv_instance_cnt > prev_instance_cnt) in add_advertising()
7539 mgmt_advertising_added(sk, hdev, cp->instance); in add_advertising()
7541 if (hdev->cur_adv_instance == cp->instance) { in add_advertising()
7549 next_instance = hci_get_next_instance(hdev, cp->instance); in add_advertising()
7551 schedule_instance = next_instance->instance; in add_advertising()
7552 } else if (!hdev->adv_instance_timeout) { in add_advertising()
7556 schedule_instance = cp->instance; in add_advertising()
7566 rp.instance = cp->instance; in add_advertising()
7567 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
7569 goto unlock; in add_advertising()
7578 err = -ENOMEM; in add_advertising()
7579 goto unlock; in add_advertising()
7590 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
7595 unlock: in add_advertising()
7618 goto unlock; in remove_advertising_complete()
7620 cp = cmd->param; in remove_advertising_complete()
7621 rp.instance = cp->instance; in remove_advertising_complete()
7623 mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, MGMT_STATUS_SUCCESS, in remove_advertising_complete()
7627 unlock: in remove_advertising_complete()
7646 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING, in remove_advertising()
7651 if (cp->instance && !hci_find_adv_instance(hdev, cp->instance)) { in remove_advertising()
7652 err = mgmt_cmd_status(sk, hdev->id, in remove_advertising()
7655 goto unlock; in remove_advertising()
7661 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_ADVERTISING, in remove_advertising()
7663 goto unlock; in remove_advertising()
7666 if (list_empty(&hdev->adv_instances)) { in remove_advertising()
7667 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_ADVERTISING, in remove_advertising()
7669 goto unlock; in remove_advertising()
7676 __hci_req_disable_ext_adv_instance(&req, cp->instance); in remove_advertising()
7677 __hci_req_remove_ext_adv_instance(&req, cp->instance); in remove_advertising()
7680 hci_req_clear_adv_instance(hdev, sk, &req, cp->instance, true); in remove_advertising()
7682 if (list_empty(&hdev->adv_instances)) in remove_advertising()
7693 rp.instance = cp->instance; in remove_advertising()
7694 err = mgmt_cmd_complete(sk, hdev->id, in remove_advertising()
7697 goto unlock; in remove_advertising()
7703 err = -ENOMEM; in remove_advertising()
7704 goto unlock; in remove_advertising()
7711 unlock: in remove_advertising()
7728 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_GET_ADV_SIZE_INFO, in get_adv_size_info()
7731 if (cp->instance < 1 || cp->instance > hdev->le_num_of_adv_sets) in get_adv_size_info()
7732 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_GET_ADV_SIZE_INFO, in get_adv_size_info()
7735 flags = __le32_to_cpu(cp->flags); in get_adv_size_info()
7742 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_GET_ADV_SIZE_INFO, in get_adv_size_info()
7745 rp.instance = cp->instance; in get_adv_size_info()
7746 rp.flags = cp->flags; in get_adv_size_info()
7750 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_ADV_SIZE_INFO, in get_adv_size_info()
7881 if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks)) in mgmt_index_added()
7884 switch (hdev->dev_type) { in mgmt_index_added()
7903 ev.bus = hdev->bus; in mgmt_index_added()
7914 if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks)) in mgmt_index_removed()
7917 switch (hdev->dev_type) { in mgmt_index_removed()
7938 ev.bus = hdev->bus; in mgmt_index_removed()
7944 /* This function requires the caller holds hdev->lock */
7949 list_for_each_entry(p, &hdev->le_conn_params, list) { in restart_le_actions()
7953 list_del_init(&p->action); in restart_le_actions()
7955 switch (p->auto_connect) { in restart_le_actions()
7958 list_add(&p->action, &hdev->pend_le_conns); in restart_le_actions()
7961 list_add(&p->action, &hdev->pend_le_reports); in restart_le_actions()
8015 if (memcmp(hdev->dev_class, zero_cod, sizeof(zero_cod)) != 0) { in __mgmt_power_off()
8037 if (err == -ERFKILL) in mgmt_set_powered_failed()
8042 mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_POWERED, status); in mgmt_set_powered_failed()
8055 bacpy(&ev.key.addr.bdaddr, &key->bdaddr); in mgmt_new_link_key()
8056 ev.key.addr.type = link_to_bdaddr(key->link_type, key->bdaddr_type); in mgmt_new_link_key()
8057 ev.key.type = key->type; in mgmt_new_link_key()
8058 memcpy(ev.key.val, key->val, HCI_LINK_KEY_SIZE); in mgmt_new_link_key()
8059 ev.key.pin_len = key->pin_len; in mgmt_new_link_key()
8066 switch (ltk->type) { in mgmt_ltk_type()
8069 if (ltk->authenticated) in mgmt_ltk_type()
8073 if (ltk->authenticated) in mgmt_ltk_type()
8089 /* Devices using resolvable or non-resolvable random addresses in mgmt_new_ltk()
8091 * to store long term keys. Their addresses will change the in mgmt_new_ltk()
8096 * identity is known, the long term keys are internally in mgmt_new_ltk()
8100 if (key->bdaddr_type == ADDR_LE_DEV_RANDOM && in mgmt_new_ltk()
8101 (key->bdaddr.b[5] & 0xc0) != 0xc0) in mgmt_new_ltk()
8106 bacpy(&ev.key.addr.bdaddr, &key->bdaddr); in mgmt_new_ltk()
8107 ev.key.addr.type = link_to_bdaddr(key->link_type, key->bdaddr_type); in mgmt_new_ltk()
8109 ev.key.enc_size = key->enc_size; in mgmt_new_ltk()
8110 ev.key.ediv = key->ediv; in mgmt_new_ltk()
8111 ev.key.rand = key->rand; in mgmt_new_ltk()
8113 if (key->type == SMP_LTK) in mgmt_new_ltk()
8119 memcpy(ev.key.val, key->val, key->enc_size); in mgmt_new_ltk()
8120 memset(ev.key.val + key->enc_size, 0, in mgmt_new_ltk()
8121 sizeof(ev.key.val) - key->enc_size); in mgmt_new_ltk()
8134 bacpy(&ev.rpa, &irk->rpa); in mgmt_new_irk()
8135 bacpy(&ev.irk.addr.bdaddr, &irk->bdaddr); in mgmt_new_irk()
8136 ev.irk.addr.type = link_to_bdaddr(irk->link_type, irk->addr_type); in mgmt_new_irk()
8137 memcpy(ev.irk.val, irk->val, sizeof(irk->val)); in mgmt_new_irk()
8149 /* Devices using resolvable or non-resolvable random addresses in mgmt_new_csrk()
8151 * to store signature resolving keys. Their addresses will change in mgmt_new_csrk()
8158 if (csrk->bdaddr_type == ADDR_LE_DEV_RANDOM && in mgmt_new_csrk()
8159 (csrk->bdaddr.b[5] & 0xc0) != 0xc0) in mgmt_new_csrk()
8164 bacpy(&ev.key.addr.bdaddr, &csrk->bdaddr); in mgmt_new_csrk()
8165 ev.key.addr.type = link_to_bdaddr(csrk->link_type, csrk->bdaddr_type); in mgmt_new_csrk()
8166 ev.key.type = csrk->type; in mgmt_new_csrk()
8167 memcpy(ev.key.val, csrk->val, sizeof(csrk->val)); in mgmt_new_csrk()
8201 bacpy(&ev->addr.bdaddr, &conn->dst); in mgmt_device_connected()
8202 ev->addr.type = link_to_bdaddr(conn->type, conn->dst_type); in mgmt_device_connected()
8204 if (conn->out) in mgmt_device_connected()
8207 ev->flags = __cpu_to_le32(flags); in mgmt_device_connected()
8213 if (conn->le_adv_data_len > 0) { in mgmt_device_connected()
8214 memcpy(&ev->eir[eir_len], in mgmt_device_connected()
8215 conn->le_adv_data, conn->le_adv_data_len); in mgmt_device_connected()
8216 eir_len = conn->le_adv_data_len; in mgmt_device_connected()
8219 eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE, in mgmt_device_connected()
8222 if (memcmp(conn->dev_class, "\0\0\0", 3) != 0) in mgmt_device_connected()
8223 eir_len = eir_append_data(ev->eir, eir_len, in mgmt_device_connected()
8225 conn->dev_class, 3); in mgmt_device_connected()
8228 ev->eir_len = cpu_to_le16(eir_len); in mgmt_device_connected()
8238 cmd->cmd_complete(cmd, 0); in disconnect_rsp()
8240 *sk = cmd->sk; in disconnect_rsp()
8249 struct mgmt_cp_unpair_device *cp = cmd->param; in unpair_device_rsp()
8251 device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, cmd->sk); in unpair_device_rsp()
8253 cmd->cmd_complete(cmd, 0); in unpair_device_rsp()
8265 cp = cmd->param; in mgmt_powering_down()
8266 if (!cp->val) in mgmt_powering_down()
8283 cancel_delayed_work(&hdev->power_off); in mgmt_device_disconnected()
8284 queue_work(hdev->req_workqueue, &hdev->power_off.work); in mgmt_device_disconnected()
8300 if (hdev->suspended) in mgmt_device_disconnected()
8326 cp = cmd->param; in mgmt_disconnect_failed()
8328 if (bacmp(bdaddr, &cp->addr.bdaddr)) in mgmt_disconnect_failed()
8331 if (cp->addr.type != bdaddr_type) in mgmt_disconnect_failed()
8334 cmd->cmd_complete(cmd, mgmt_status(status)); in mgmt_disconnect_failed()
8347 cancel_delayed_work(&hdev->power_off); in mgmt_connect_failed()
8348 queue_work(hdev->req_workqueue, &hdev->power_off.work); in mgmt_connect_failed()
8378 cmd->cmd_complete(cmd, mgmt_status(status)); in mgmt_pin_code_reply_complete()
8391 cmd->cmd_complete(cmd, mgmt_status(status)); in mgmt_pin_code_neg_reply_complete()
8434 return -ENOENT; in user_pairing_resp_complete()
8436 cmd->cmd_complete(cmd, mgmt_status(status)); in user_pairing_resp_complete()
8494 bacpy(&ev.addr.bdaddr, &conn->dst); in mgmt_auth_failed()
8495 ev.addr.type = link_to_bdaddr(conn->type, conn->dst_type); in mgmt_auth_failed()
8500 mgmt_event(MGMT_EV_AUTH_FAILED, conn->hdev, &ev, sizeof(ev), in mgmt_auth_failed()
8501 cmd ? cmd->sk : NULL); in mgmt_auth_failed()
8504 cmd->cmd_complete(cmd, status); in mgmt_auth_failed()
8521 if (test_bit(HCI_AUTH, &hdev->flags)) in mgmt_auth_enable_complete()
8538 struct hci_dev *hdev = req->hdev; in clear_eir()
8544 memset(hdev->eir, 0, sizeof(hdev->eir)); in clear_eir()
8608 if (match->sk == NULL) { in sk_lookup()
8609 match->sk = cmd->sk; in sk_lookup()
8610 sock_hold(match->sk); in sk_lookup()
8646 memcpy(ev.short_name, hdev->short_name, HCI_MAX_SHORT_NAME_LENGTH); in mgmt_set_local_name_complete()
8650 memcpy(hdev->dev_name, name, sizeof(hdev->dev_name)); in mgmt_set_local_name_complete()
8660 HCI_MGMT_LOCAL_NAME_EVENTS, cmd ? cmd->sk : NULL); in mgmt_set_local_name_complete()
8661 ext_info_changed(hdev, cmd ? cmd->sk : NULL); in mgmt_set_local_name_complete()
8688 if (eir_len - parsed < field_len + 1) in eir_has_uuids()
8738 hdev->discovery.scan_start + in restart_le_scan()
8739 hdev->discovery.scan_duration)) in restart_le_scan()
8742 queue_delayed_work(hdev->req_workqueue, &hdev->le_scan_restart, in restart_le_scan()
8758 if (hdev->discovery.rssi != HCI_RSSI_INVALID && in is_filter_match()
8760 (rssi < hdev->discovery.rssi && in is_filter_match()
8761 !test_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks)))) in is_filter_match()
8764 if (hdev->discovery.uuid_count != 0) { in is_filter_match()
8768 if (!eir_has_uuids(eir, eir_len, hdev->discovery.uuid_count, in is_filter_match()
8769 hdev->discovery.uuids) && in is_filter_match()
8771 hdev->discovery.uuid_count, in is_filter_match()
8772 hdev->discovery.uuids)) in is_filter_match()
8779 if (test_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks)) { in is_filter_match()
8783 if (hdev->discovery.rssi != HCI_RSSI_INVALID && in is_filter_match()
8784 rssi < hdev->discovery.rssi) in is_filter_match()
8799 /* Don't send events for a non-kernel initiated discovery. With in mgmt_device_found()
8807 list_empty(&hdev->pend_le_reports) && in mgmt_device_found()
8813 if (hdev->discovery.result_filtering) { in mgmt_device_found()
8820 if (hdev->discovery.limited) { in mgmt_device_found()
8848 if (rssi == HCI_RSSI_INVALID && !hdev->discovery.report_invalid_rssi && in mgmt_device_found()
8852 bacpy(&ev->addr.bdaddr, bdaddr); in mgmt_device_found()
8853 ev->addr.type = link_to_bdaddr(link_type, addr_type); in mgmt_device_found()
8854 ev->rssi = rssi; in mgmt_device_found()
8855 ev->flags = cpu_to_le32(flags); in mgmt_device_found()
8859 memcpy(ev->eir, eir, eir_len); in mgmt_device_found()
8861 if (dev_class && !eir_get_data(ev->eir, eir_len, EIR_CLASS_OF_DEV, in mgmt_device_found()
8863 eir_len = eir_append_data(ev->eir, eir_len, EIR_CLASS_OF_DEV, in mgmt_device_found()
8868 memcpy(ev->eir + eir_len, scan_rsp, scan_rsp_len); in mgmt_device_found()
8870 ev->eir_len = cpu_to_le16(eir_len + scan_rsp_len); in mgmt_device_found()
8887 bacpy(&ev->addr.bdaddr, bdaddr); in mgmt_remote_name()
8888 ev->addr.type = link_to_bdaddr(link_type, addr_type); in mgmt_remote_name()
8889 ev->rssi = rssi; in mgmt_remote_name()
8891 eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE, name, in mgmt_remote_name()
8894 ev->eir_len = cpu_to_le16(eir_len); in mgmt_remote_name()
8906 ev.type = hdev->discovery.type; in mgmt_discovering()