Lines Matching +full:x +full:- +full:rp
2 BlueZ - Bluetooth protocol stack for Linux
5 Copyright (C) 2011-2012 Intel Corporation
317 struct mgmt_rp_read_version *rp = ver; in mgmt_fill_version_info() local
319 rp->version = MGMT_VERSION; in mgmt_fill_version_info()
320 rp->revision = cpu_to_le16(MGMT_REVISION); in mgmt_fill_version_info()
326 struct mgmt_rp_read_version rp; in read_version() local
330 mgmt_fill_version_info(&rp); in read_version()
333 &rp, sizeof(rp)); in read_version()
339 struct mgmt_rp_read_commands *rp; in read_commands() local
354 rp_size = sizeof(*rp) + ((num_commands + num_events) * sizeof(u16)); in read_commands()
356 rp = kmalloc(rp_size, GFP_KERNEL); in read_commands()
357 if (!rp) in read_commands()
358 return -ENOMEM; in read_commands()
360 rp->num_commands = cpu_to_le16(num_commands); in read_commands()
361 rp->num_events = cpu_to_le16(num_events); in read_commands()
364 __le16 *opcode = rp->opcodes; in read_commands()
372 __le16 *opcode = rp->opcodes; in read_commands()
382 rp, rp_size); in read_commands()
383 kfree(rp); in read_commands()
391 struct mgmt_rp_read_index_list *rp; in read_index_list() local
403 if (d->dev_type == HCI_PRIMARY && in read_index_list()
408 rp_len = sizeof(*rp) + (2 * count); in read_index_list()
409 rp = kmalloc(rp_len, GFP_ATOMIC); in read_index_list()
410 if (!rp) { in read_index_list()
412 return -ENOMEM; in read_index_list()
422 /* Devices marked as raw-only are neither configured in read_index_list()
425 if (test_bit(HCI_QUIRK_RAW_DEVICE, &d->quirks)) in read_index_list()
428 if (d->dev_type == HCI_PRIMARY && in read_index_list()
430 rp->index[count++] = cpu_to_le16(d->id); in read_index_list()
431 bt_dev_dbg(hdev, "Added hci%u", d->id); in read_index_list()
435 rp->num_controllers = cpu_to_le16(count); in read_index_list()
436 rp_len = sizeof(*rp) + (2 * count); in read_index_list()
441 0, rp, rp_len); in read_index_list()
443 kfree(rp); in read_index_list()
451 struct mgmt_rp_read_unconf_index_list *rp; in read_unconf_index_list() local
463 if (d->dev_type == HCI_PRIMARY && in read_unconf_index_list()
468 rp_len = sizeof(*rp) + (2 * count); in read_unconf_index_list()
469 rp = kmalloc(rp_len, GFP_ATOMIC); in read_unconf_index_list()
470 if (!rp) { in read_unconf_index_list()
472 return -ENOMEM; in read_unconf_index_list()
482 /* Devices marked as raw-only are neither configured in read_unconf_index_list()
485 if (test_bit(HCI_QUIRK_RAW_DEVICE, &d->quirks)) in read_unconf_index_list()
488 if (d->dev_type == HCI_PRIMARY && in read_unconf_index_list()
490 rp->index[count++] = cpu_to_le16(d->id); in read_unconf_index_list()
491 bt_dev_dbg(hdev, "Added hci%u", d->id); in read_unconf_index_list()
495 rp->num_controllers = cpu_to_le16(count); in read_unconf_index_list()
496 rp_len = sizeof(*rp) + (2 * count); in read_unconf_index_list()
501 MGMT_OP_READ_UNCONF_INDEX_LIST, 0, rp, rp_len); in read_unconf_index_list()
503 kfree(rp); in read_unconf_index_list()
511 struct mgmt_rp_read_ext_index_list *rp; in read_ext_index_list() local
522 if (d->dev_type == HCI_PRIMARY || d->dev_type == HCI_AMP) in read_ext_index_list()
526 rp = kmalloc(struct_size(rp, entry, count), GFP_ATOMIC); in read_ext_index_list()
527 if (!rp) { in read_ext_index_list()
529 return -ENOMEM; in read_ext_index_list()
539 /* Devices marked as raw-only are neither configured in read_ext_index_list()
542 if (test_bit(HCI_QUIRK_RAW_DEVICE, &d->quirks)) in read_ext_index_list()
545 if (d->dev_type == HCI_PRIMARY) { in read_ext_index_list()
547 rp->entry[count].type = 0x01; in read_ext_index_list()
549 rp->entry[count].type = 0x00; in read_ext_index_list()
550 } else if (d->dev_type == HCI_AMP) { in read_ext_index_list()
551 rp->entry[count].type = 0x02; in read_ext_index_list()
556 rp->entry[count].bus = d->bus; in read_ext_index_list()
557 rp->entry[count++].index = cpu_to_le16(d->id); in read_ext_index_list()
558 bt_dev_dbg(hdev, "Added hci%u", d->id); in read_ext_index_list()
561 rp->num_controllers = cpu_to_le16(count); in read_ext_index_list()
574 MGMT_OP_READ_EXT_INDEX_LIST, 0, rp, in read_ext_index_list()
575 struct_size(rp, entry, count)); in read_ext_index_list()
577 kfree(rp); in read_ext_index_list()
584 if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) && in is_configured()
588 if ((test_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks) || in is_configured()
589 test_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks)) && in is_configured()
590 !bacmp(&hdev->public_addr, BDADDR_ANY)) in is_configured()
600 if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) && in get_missing_options()
604 if ((test_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks) || in get_missing_options()
605 test_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks)) && in get_missing_options()
606 !bacmp(&hdev->public_addr, BDADDR_ANY)) in get_missing_options()
624 return mgmt_cmd_complete(sk, hdev->id, opcode, 0, &options, in send_options_rsp()
631 struct mgmt_rp_read_config_info rp; in read_config_info() local
638 memset(&rp, 0, sizeof(rp)); in read_config_info()
639 rp.manufacturer = cpu_to_le16(hdev->manufacturer); in read_config_info()
641 if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks)) in read_config_info()
644 if (hdev->set_bdaddr) in read_config_info()
647 rp.supported_options = cpu_to_le32(options); in read_config_info()
648 rp.missing_options = get_missing_options(hdev); in read_config_info()
652 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_CONFIG_INFO, 0, in read_config_info()
653 &rp, sizeof(rp)); in read_config_info()
663 if (hdev->features[0][0] & LMP_3SLOT) in get_supported_phys()
666 if (hdev->features[0][0] & LMP_5SLOT) in get_supported_phys()
694 if (hdev->le_features[1] & HCI_LE_PHY_2M) { in get_supported_phys()
699 if (hdev->le_features[1] & HCI_LE_PHY_CODED) { in get_supported_phys()
715 if (hdev->pkt_type & (HCI_DM3 | HCI_DH3)) in get_selected_phys()
718 if (hdev->pkt_type & (HCI_DM5 | HCI_DH5)) in get_selected_phys()
722 if (!(hdev->pkt_type & HCI_2DH1)) in get_selected_phys()
726 !(hdev->pkt_type & HCI_2DH3)) in get_selected_phys()
730 !(hdev->pkt_type & HCI_2DH5)) in get_selected_phys()
734 if (!(hdev->pkt_type & HCI_3DH1)) in get_selected_phys()
738 !(hdev->pkt_type & HCI_3DH3)) in get_selected_phys()
742 !(hdev->pkt_type & HCI_3DH5)) in get_selected_phys()
749 if (hdev->le_tx_def_phys & HCI_LE_SET_PHY_1M) in get_selected_phys()
752 if (hdev->le_rx_def_phys & HCI_LE_SET_PHY_1M) in get_selected_phys()
755 if (hdev->le_tx_def_phys & HCI_LE_SET_PHY_2M) in get_selected_phys()
758 if (hdev->le_rx_def_phys & HCI_LE_SET_PHY_2M) in get_selected_phys()
761 if (hdev->le_tx_def_phys & HCI_LE_SET_PHY_CODED) in get_selected_phys()
764 if (hdev->le_rx_def_phys & HCI_LE_SET_PHY_CODED) in get_selected_phys()
788 if (hdev->hci_ver >= BLUETOOTH_VER_1_2) in get_supported_settings()
803 &hdev->quirks)) in get_supported_settings()
820 if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) || in get_supported_settings()
821 hdev->set_bdaddr) in get_supported_settings()
883 * For single mode LE only controllers and dual-mode controllers in get_current_settings()
889 !bacmp(&hdev->bdaddr, BDADDR_ANY)) { in get_current_settings()
890 if (bacmp(&hdev->static_addr, BDADDR_ANY)) in get_current_settings()
921 struct mgmt_mode *cp = cmd->param; in mgmt_get_adv_discov_flags()
922 if (cp->val == 0x01) in mgmt_get_adv_discov_flags()
924 else if (cp->val == 0x02) in mgmt_get_adv_discov_flags()
945 struct mgmt_mode *cp = cmd->param; in mgmt_get_connectable()
947 return cp->val; in mgmt_get_connectable()
993 __hci_req_start_ext_adv(&req, hdev->cur_adv_instance); in rpa_expired()
1004 INIT_DELAYED_WORK(&hdev->service_cache, service_cache_off); in mgmt_init_hdev()
1005 INIT_DELAYED_WORK(&hdev->rpa_expired, rpa_expired); in mgmt_init_hdev()
1007 /* Non-mgmt controlled devices get this bit set in mgmt_init_hdev()
1009 * for mgmt we require user-space to explicitly enable in mgmt_init_hdev()
1018 struct mgmt_rp_read_info rp; in read_controller_info() local
1024 memset(&rp, 0, sizeof(rp)); in read_controller_info()
1026 bacpy(&rp.bdaddr, &hdev->bdaddr); in read_controller_info()
1028 rp.version = hdev->hci_ver; in read_controller_info()
1029 rp.manufacturer = cpu_to_le16(hdev->manufacturer); in read_controller_info()
1031 rp.supported_settings = cpu_to_le32(get_supported_settings(hdev)); in read_controller_info()
1032 rp.current_settings = cpu_to_le32(get_current_settings(hdev)); in read_controller_info()
1034 memcpy(rp.dev_class, hdev->dev_class, 3); in read_controller_info()
1036 memcpy(rp.name, hdev->dev_name, sizeof(hdev->dev_name)); in read_controller_info()
1037 memcpy(rp.short_name, hdev->short_name, sizeof(hdev->short_name)); in read_controller_info()
1041 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_INFO, 0, &rp, in read_controller_info()
1042 sizeof(rp)); in read_controller_info()
1052 hdev->dev_class, 3); in append_eir_data_to_buf()
1056 hdev->appearance); in append_eir_data_to_buf()
1058 name_len = strlen(hdev->dev_name); in append_eir_data_to_buf()
1060 hdev->dev_name, name_len); in append_eir_data_to_buf()
1062 name_len = strlen(hdev->short_name); in append_eir_data_to_buf()
1064 hdev->short_name, name_len); in append_eir_data_to_buf()
1073 struct mgmt_rp_read_ext_info *rp = (void *)buf; in read_ext_controller_info() local
1082 bacpy(&rp->bdaddr, &hdev->bdaddr); in read_ext_controller_info()
1084 rp->version = hdev->hci_ver; in read_ext_controller_info()
1085 rp->manufacturer = cpu_to_le16(hdev->manufacturer); in read_ext_controller_info()
1087 rp->supported_settings = cpu_to_le32(get_supported_settings(hdev)); in read_ext_controller_info()
1088 rp->current_settings = cpu_to_le32(get_current_settings(hdev)); in read_ext_controller_info()
1091 eir_len = append_eir_data_to_buf(hdev, rp->eir); in read_ext_controller_info()
1092 rp->eir_len = cpu_to_le16(eir_len); in read_ext_controller_info()
1105 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_EXT_INFO, 0, rp, in read_ext_controller_info()
1106 sizeof(*rp) + eir_len); in read_ext_controller_info()
1117 eir_len = append_eir_data_to_buf(hdev, ev->eir); in ext_info_changed()
1118 ev->eir_len = cpu_to_le16(eir_len); in ext_info_changed()
1129 return mgmt_cmd_complete(sk, hdev->id, opcode, 0, &settings, in send_settings_rsp()
1135 bt_dev_dbg(hdev, "status 0x%02x", status); in clean_up_hci_complete()
1138 cancel_delayed_work(&hdev->power_off); in clean_up_hci_complete()
1139 queue_work(hdev->req_workqueue, &hdev->power_off.work); in clean_up_hci_complete()
1164 if (hdev->adv_instance_timeout) { in cancel_adv_timeout()
1165 hdev->adv_instance_timeout = 0; in cancel_adv_timeout()
1166 cancel_delayed_work(&hdev->adv_instance_expire); in cancel_adv_timeout()
1179 if (test_bit(HCI_ISCAN, &hdev->flags) || in clean_up_hci_state()
1180 test_bit(HCI_PSCAN, &hdev->flags)) { in clean_up_hci_state()
1192 list_for_each_entry(conn, &hdev->conn_hash.list, list) { in clean_up_hci_state()
1213 if (cp->val != 0x00 && cp->val != 0x01) in set_powered()
1214 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED, in set_powered()
1220 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED, in set_powered()
1225 if (!!cp->val == hdev_is_powered(hdev)) { in set_powered()
1232 err = -ENOMEM; in set_powered()
1236 if (cp->val) { in set_powered()
1237 queue_work(hdev->req_workqueue, &hdev->power_on); in set_powered()
1243 queue_delayed_work(hdev->req_workqueue, &hdev->power_off, in set_powered()
1247 if (err == -ENODATA) { in set_powered()
1248 cancel_delayed_work(&hdev->power_off); in set_powered()
1249 queue_work(hdev->req_workqueue, &hdev->power_off.work); in set_powered()
1282 send_settings_rsp(cmd->sk, cmd->opcode, match->hdev); in settings_rsp()
1284 list_del(&cmd->list); in settings_rsp()
1286 if (match->sk == NULL) { in settings_rsp()
1287 match->sk = cmd->sk; in settings_rsp()
1288 sock_hold(match->sk); in settings_rsp()
1298 mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, *status); in cmd_status_rsp()
1304 if (cmd->cmd_complete) { in cmd_complete_rsp()
1307 cmd->cmd_complete(cmd, *status); in cmd_complete_rsp()
1318 return mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status, in generic_cmd_complete()
1319 cmd->param, cmd->param_len); in generic_cmd_complete()
1324 return mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status, in addr_cmd_complete()
1325 cmd->param, sizeof(struct mgmt_addr_info)); in addr_cmd_complete()
1352 bt_dev_dbg(hdev, "status 0x%02x", status); in mgmt_set_discoverable_complete()
1362 mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err); in mgmt_set_discoverable_complete()
1368 hdev->discov_timeout > 0) { in mgmt_set_discoverable_complete()
1369 int to = msecs_to_jiffies(hdev->discov_timeout * 1000); in mgmt_set_discoverable_complete()
1370 queue_delayed_work(hdev->req_workqueue, &hdev->discov_off, to); in mgmt_set_discoverable_complete()
1373 send_settings_rsp(cmd->sk, MGMT_OP_SET_DISCOVERABLE, hdev); in mgmt_set_discoverable_complete()
1374 new_settings(hdev, cmd->sk); in mgmt_set_discoverable_complete()
1395 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1398 if (cp->val != 0x00 && cp->val != 0x01 && cp->val != 0x02) in set_discoverable()
1399 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1402 timeout = __le16_to_cpu(cp->timeout); in set_discoverable()
1407 if ((cp->val == 0x00 && timeout > 0) || in set_discoverable()
1408 (cp->val == 0x02 && timeout == 0)) in set_discoverable()
1409 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1415 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1422 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1428 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1433 if (hdev->advertising_paused) { in set_discoverable()
1434 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1446 if (!!cp->val != hci_dev_test_flag(hdev, HCI_DISCOVERABLE)) { in set_discoverable()
1465 if (!!cp->val == hci_dev_test_flag(hdev, HCI_DISCOVERABLE) && in set_discoverable()
1466 (cp->val == 0x02) == hci_dev_test_flag(hdev, in set_discoverable()
1468 cancel_delayed_work(&hdev->discov_off); in set_discoverable()
1469 hdev->discov_timeout = timeout; in set_discoverable()
1471 if (cp->val && hdev->discov_timeout > 0) { in set_discoverable()
1472 int to = msecs_to_jiffies(hdev->discov_timeout * 1000); in set_discoverable()
1473 queue_delayed_work(hdev->req_workqueue, in set_discoverable()
1474 &hdev->discov_off, to); in set_discoverable()
1483 err = -ENOMEM; in set_discoverable()
1491 cancel_delayed_work(&hdev->discov_off); in set_discoverable()
1492 hdev->discov_timeout = timeout; in set_discoverable()
1494 if (cp->val) in set_discoverable()
1500 if (cp->val == 0x02) in set_discoverable()
1505 queue_work(hdev->req_workqueue, &hdev->discoverable_update); in set_discoverable()
1517 bt_dev_dbg(hdev, "status 0x%02x", status); in mgmt_set_connectable_complete()
1527 mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err); in mgmt_set_connectable_complete()
1531 send_settings_rsp(cmd->sk, MGMT_OP_SET_CONNECTABLE, hdev); in mgmt_set_connectable_complete()
1532 new_settings(hdev, cmd->sk); in mgmt_set_connectable_complete()
1581 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE, in set_connectable()
1584 if (cp->val != 0x00 && cp->val != 0x01) in set_connectable()
1585 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE, in set_connectable()
1591 err = set_connectable_update_settings(hdev, sk, cp->val); in set_connectable()
1597 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE, in set_connectable()
1604 err = -ENOMEM; in set_connectable()
1608 if (cp->val) { in set_connectable()
1611 if (hdev->discov_timeout > 0) in set_connectable()
1612 cancel_delayed_work(&hdev->discov_off); in set_connectable()
1619 queue_work(hdev->req_workqueue, &hdev->connectable_update); in set_connectable()
1636 if (cp->val != 0x00 && cp->val != 0x01) in set_bondable()
1637 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BONDABLE, in set_bondable()
1642 if (cp->val) in set_bondable()
1659 queue_work(hdev->req_workqueue, in set_bondable()
1660 &hdev->discoverable_update); in set_bondable()
1682 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY, in set_link_security()
1685 if (cp->val != 0x00 && cp->val != 0x01) in set_link_security()
1686 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY, in set_link_security()
1694 if (!!cp->val != hci_dev_test_flag(hdev, HCI_LINK_SECURITY)) { in set_link_security()
1710 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY, in set_link_security()
1715 val = !!cp->val; in set_link_security()
1717 if (test_bit(HCI_AUTH, &hdev->flags) == val) { in set_link_security()
1724 err = -ENOMEM; in set_link_security()
1750 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP, status); in set_ssp()
1753 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP, in set_ssp()
1756 if (cp->val != 0x00 && cp->val != 0x01) in set_ssp()
1757 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP, in set_ssp()
1765 if (cp->val) { in set_ssp()
1789 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP, in set_ssp()
1794 if (!!cp->val == hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) { in set_ssp()
1801 err = -ENOMEM; in set_ssp()
1805 if (!cp->val && hci_dev_test_flag(hdev, HCI_USE_DEBUG_KEYS)) in set_ssp()
1807 sizeof(cp->val), &cp->val); in set_ssp()
1809 err = hci_send_cmd(hdev, HCI_OP_WRITE_SSP_MODE, 1, &cp->val); in set_ssp()
1830 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, in set_hs()
1835 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, status); in set_hs()
1838 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, in set_hs()
1842 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, in set_hs()
1845 if (cp->val != 0x00 && cp->val != 0x01) in set_hs()
1846 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, in set_hs()
1852 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, in set_hs()
1857 if (cp->val) { in set_hs()
1861 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, in set_hs()
1940 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE, in set_le()
1943 if (cp->val != 0x00 && cp->val != 0x01) in set_le()
1944 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE, in set_le()
1947 /* Bluetooth single mode LE only controllers or dual-mode in set_le()
1957 if (cp->val == 0x01) in set_le()
1960 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE, in set_le()
1966 val = !!cp->val; in set_le()
1997 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE, in set_le()
2004 err = -ENOMEM; in set_le()
2045 list_for_each_entry(cmd, &hdev->mgmt_pending, list) { in pending_eir_or_class()
2046 switch (cmd->opcode) { in pending_eir_or_class()
2087 mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, in mgmt_class_complete()
2088 mgmt_status(status), hdev->dev_class, 3); in mgmt_class_complete()
2098 bt_dev_dbg(hdev, "status 0x%02x", status); in add_uuid_complete()
2116 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_UUID, in add_uuid()
2123 err = -ENOMEM; in add_uuid()
2127 memcpy(uuid->uuid, cp->uuid, 16); in add_uuid()
2128 uuid->svc_hint = cp->svc_hint; in add_uuid()
2129 uuid->size = get_uuid_size(cp->uuid); in add_uuid()
2131 list_add_tail(&uuid->list, &hdev->uuids); in add_uuid()
2140 if (err != -ENODATA) in add_uuid()
2143 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_UUID, 0, in add_uuid()
2144 hdev->dev_class, 3); in add_uuid()
2150 err = -ENOMEM; in add_uuid()
2167 queue_delayed_work(hdev->workqueue, &hdev->service_cache, in enable_service_cache()
2177 bt_dev_dbg(hdev, "status 0x%02x", status); in remove_uuid_complete()
2197 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID, in remove_uuid()
2202 if (memcmp(cp->uuid, bt_uuid_any, 16) == 0) { in remove_uuid()
2206 err = mgmt_cmd_complete(sk, hdev->id, in remove_uuid()
2208 0, hdev->dev_class, 3); in remove_uuid()
2217 list_for_each_entry_safe(match, tmp, &hdev->uuids, list) { in remove_uuid()
2218 if (memcmp(match->uuid, cp->uuid, 16) != 0) in remove_uuid()
2221 list_del(&match->list); in remove_uuid()
2227 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID, in remove_uuid()
2240 if (err != -ENODATA) in remove_uuid()
2243 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_UUID, 0, in remove_uuid()
2244 hdev->dev_class, 3); in remove_uuid()
2250 err = -ENOMEM; in remove_uuid()
2263 bt_dev_dbg(hdev, "status 0x%02x", status); in set_class_complete()
2279 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, in set_dev_class()
2285 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, in set_dev_class()
2290 if ((cp->minor & 0x03) != 0 || (cp->major & 0xe0) != 0) { in set_dev_class()
2291 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, in set_dev_class()
2296 hdev->major_class = cp->major; in set_dev_class()
2297 hdev->minor_class = cp->minor; in set_dev_class()
2300 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0, in set_dev_class()
2301 hdev->dev_class, 3); in set_dev_class()
2309 cancel_delayed_work_sync(&hdev->service_cache); in set_dev_class()
2318 if (err != -ENODATA) in set_dev_class()
2321 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0, in set_dev_class()
2322 hdev->dev_class, 3); in set_dev_class()
2328 err = -ENOMEM; in set_dev_class()
2343 const u16 max_key_count = ((U16_MAX - sizeof(*cp)) / in load_link_keys()
2352 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, in load_link_keys()
2355 key_count = __le16_to_cpu(cp->key_count); in load_link_keys()
2359 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, in load_link_keys()
2367 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, in load_link_keys()
2371 if (cp->debug_keys != 0x00 && cp->debug_keys != 0x01) in load_link_keys()
2372 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, in load_link_keys()
2375 bt_dev_dbg(hdev, "debug_keys %u key_count %u", cp->debug_keys, in load_link_keys()
2379 struct mgmt_link_key_info *key = &cp->keys[i]; in load_link_keys()
2381 if (key->addr.type != BDADDR_BREDR || key->type > 0x08) in load_link_keys()
2382 return mgmt_cmd_status(sk, hdev->id, in load_link_keys()
2391 if (cp->debug_keys) in load_link_keys()
2401 struct mgmt_link_key_info *key = &cp->keys[i]; in load_link_keys()
2405 key->val)) { in load_link_keys()
2407 &key->addr.bdaddr); in load_link_keys()
2414 if (key->type == HCI_LK_DEBUG_COMBINATION) in load_link_keys()
2417 hci_add_link_key(hdev, NULL, &key->addr.bdaddr, key->val, in load_link_keys()
2418 key->type, key->pin_len, NULL); in load_link_keys()
2421 mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, 0, NULL, 0); in load_link_keys()
2444 struct mgmt_rp_unpair_device rp; in unpair_device() local
2451 memset(&rp, 0, sizeof(rp)); in unpair_device()
2452 bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr); in unpair_device()
2453 rp.addr.type = cp->addr.type; in unpair_device()
2455 if (!bdaddr_type_is_valid(cp->addr.type)) in unpair_device()
2456 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, in unpair_device()
2458 &rp, sizeof(rp)); in unpair_device()
2460 if (cp->disconnect != 0x00 && cp->disconnect != 0x01) in unpair_device()
2461 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, in unpair_device()
2463 &rp, sizeof(rp)); in unpair_device()
2468 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, in unpair_device()
2469 MGMT_STATUS_NOT_POWERED, &rp, in unpair_device()
2470 sizeof(rp)); in unpair_device()
2474 if (cp->addr.type == BDADDR_BREDR) { in unpair_device()
2482 if (cp->disconnect) in unpair_device()
2484 &cp->addr.bdaddr); in unpair_device()
2488 err = hci_remove_link_key(hdev, &cp->addr.bdaddr); in unpair_device()
2490 err = mgmt_cmd_complete(sk, hdev->id, in unpair_device()
2492 MGMT_STATUS_NOT_PAIRED, &rp, in unpair_device()
2493 sizeof(rp)); in unpair_device()
2501 addr_type = le_addr_type(cp->addr.type); in unpair_device()
2504 err = smp_cancel_and_remove_pairing(hdev, &cp->addr.bdaddr, addr_type); in unpair_device()
2506 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, in unpair_device()
2507 MGMT_STATUS_NOT_PAIRED, &rp, in unpair_device()
2508 sizeof(rp)); in unpair_device()
2512 conn = hci_conn_hash_lookup_le(hdev, &cp->addr.bdaddr, addr_type); in unpair_device()
2514 hci_conn_params_del(hdev, &cp->addr.bdaddr, addr_type); in unpair_device()
2522 set_bit(HCI_CONN_PARAM_REMOVAL_PEND, &conn->flags); in unpair_device()
2524 /* Disable auto-connection parameters if present */ in unpair_device()
2525 params = hci_conn_params_lookup(hdev, &cp->addr.bdaddr, addr_type); in unpair_device()
2527 if (params->explicit_connect) in unpair_device()
2528 params->auto_connect = HCI_AUTO_CONN_EXPLICIT; in unpair_device()
2530 params->auto_connect = HCI_AUTO_CONN_DISABLED; in unpair_device()
2536 if (!cp->disconnect) in unpair_device()
2544 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, 0, in unpair_device()
2545 &rp, sizeof(rp)); in unpair_device()
2546 device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, sk); in unpair_device()
2553 err = -ENOMEM; in unpair_device()
2557 cmd->cmd_complete = addr_cmd_complete; in unpair_device()
2572 struct mgmt_rp_disconnect rp; in disconnect() local
2579 memset(&rp, 0, sizeof(rp)); in disconnect()
2580 bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr); in disconnect()
2581 rp.addr.type = cp->addr.type; in disconnect()
2583 if (!bdaddr_type_is_valid(cp->addr.type)) in disconnect()
2584 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT, in disconnect()
2586 &rp, sizeof(rp)); in disconnect()
2590 if (!test_bit(HCI_UP, &hdev->flags)) { in disconnect()
2591 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT, in disconnect()
2592 MGMT_STATUS_NOT_POWERED, &rp, in disconnect()
2593 sizeof(rp)); in disconnect()
2598 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT, in disconnect()
2599 MGMT_STATUS_BUSY, &rp, sizeof(rp)); in disconnect()
2603 if (cp->addr.type == BDADDR_BREDR) in disconnect()
2605 &cp->addr.bdaddr); in disconnect()
2607 conn = hci_conn_hash_lookup_le(hdev, &cp->addr.bdaddr, in disconnect()
2608 le_addr_type(cp->addr.type)); in disconnect()
2610 if (!conn || conn->state == BT_OPEN || conn->state == BT_CLOSED) { in disconnect()
2611 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT, in disconnect()
2612 MGMT_STATUS_NOT_CONNECTED, &rp, in disconnect()
2613 sizeof(rp)); in disconnect()
2619 err = -ENOMEM; in disconnect()
2623 cmd->cmd_complete = generic_cmd_complete; in disconnect()
2656 struct mgmt_rp_get_connections *rp; in get_connections() local
2666 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_GET_CONNECTIONS, in get_connections()
2672 list_for_each_entry(c, &hdev->conn_hash.list, list) { in get_connections()
2673 if (test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags)) in get_connections()
2677 rp = kmalloc(struct_size(rp, addr, i), GFP_KERNEL); in get_connections()
2678 if (!rp) { in get_connections()
2679 err = -ENOMEM; in get_connections()
2684 list_for_each_entry(c, &hdev->conn_hash.list, list) { in get_connections()
2685 if (!test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags)) in get_connections()
2687 bacpy(&rp->addr[i].bdaddr, &c->dst); in get_connections()
2688 rp->addr[i].type = link_to_bdaddr(c->type, c->dst_type); in get_connections()
2689 if (c->type == SCO_LINK || c->type == ESCO_LINK) in get_connections()
2694 rp->conn_count = cpu_to_le16(i); in get_connections()
2697 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONNECTIONS, 0, rp, in get_connections()
2698 struct_size(rp, addr, i)); in get_connections()
2700 kfree(rp); in get_connections()
2716 return -ENOMEM; in send_pin_code_neg_reply()
2718 cmd->cmd_complete = addr_cmd_complete; in send_pin_code_neg_reply()
2721 sizeof(cp->addr.bdaddr), &cp->addr.bdaddr); in send_pin_code_neg_reply()
2742 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY, in pin_code_reply()
2747 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->addr.bdaddr); in pin_code_reply()
2749 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY, in pin_code_reply()
2754 if (conn->pending_sec_level == BT_SECURITY_HIGH && cp->pin_len != 16) { in pin_code_reply()
2757 memcpy(&ncp.addr, &cp->addr, sizeof(ncp.addr)); in pin_code_reply()
2763 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY, in pin_code_reply()
2771 err = -ENOMEM; in pin_code_reply()
2775 cmd->cmd_complete = addr_cmd_complete; in pin_code_reply()
2777 bacpy(&reply.bdaddr, &cp->addr.bdaddr); in pin_code_reply()
2778 reply.pin_len = cp->pin_len; in pin_code_reply()
2779 memcpy(reply.pin_code, cp->pin_code, sizeof(reply.pin_code)); in pin_code_reply()
2797 if (cp->io_capability > SMP_IO_KEYBOARD_DISPLAY) in set_io_capability()
2798 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_IO_CAPABILITY, in set_io_capability()
2803 hdev->io_capability = cp->io_capability; in set_io_capability()
2805 bt_dev_dbg(hdev, "IO capability set to 0x%02x", hdev->io_capability); in set_io_capability()
2809 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_IO_CAPABILITY, 0, in set_io_capability()
2815 struct hci_dev *hdev = conn->hdev; in find_pairing()
2818 list_for_each_entry(cmd, &hdev->mgmt_pending, list) { in find_pairing()
2819 if (cmd->opcode != MGMT_OP_PAIR_DEVICE) in find_pairing()
2822 if (cmd->user_data != conn) in find_pairing()
2833 struct mgmt_rp_pair_device rp; in pairing_complete() local
2834 struct hci_conn *conn = cmd->user_data; in pairing_complete()
2837 bacpy(&rp.addr.bdaddr, &conn->dst); in pairing_complete()
2838 rp.addr.type = link_to_bdaddr(conn->type, conn->dst_type); in pairing_complete()
2840 err = mgmt_cmd_complete(cmd->sk, cmd->index, MGMT_OP_PAIR_DEVICE, in pairing_complete()
2841 status, &rp, sizeof(rp)); in pairing_complete()
2844 conn->connect_cfm_cb = NULL; in pairing_complete()
2845 conn->security_cfm_cb = NULL; in pairing_complete()
2846 conn->disconn_cfm_cb = NULL; in pairing_complete()
2853 clear_bit(HCI_CONN_PARAM_REMOVAL_PEND, &conn->flags); in pairing_complete()
2867 cmd->cmd_complete(cmd, status); in mgmt_smp_complete()
2884 cmd->cmd_complete(cmd, mgmt_status(status)); in pairing_complete_cb()
2903 cmd->cmd_complete(cmd, mgmt_status(status)); in le_pairing_complete_cb()
2911 struct mgmt_rp_pair_device rp; in pair_device() local
2919 memset(&rp, 0, sizeof(rp)); in pair_device()
2920 bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr); in pair_device()
2921 rp.addr.type = cp->addr.type; in pair_device()
2923 if (!bdaddr_type_is_valid(cp->addr.type)) in pair_device()
2924 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE, in pair_device()
2926 &rp, sizeof(rp)); in pair_device()
2928 if (cp->io_cap > SMP_IO_KEYBOARD_DISPLAY) in pair_device()
2929 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE, in pair_device()
2931 &rp, sizeof(rp)); in pair_device()
2936 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE, in pair_device()
2937 MGMT_STATUS_NOT_POWERED, &rp, in pair_device()
2938 sizeof(rp)); in pair_device()
2942 if (hci_bdaddr_is_paired(hdev, &cp->addr.bdaddr, cp->addr.type)) { in pair_device()
2943 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE, in pair_device()
2944 MGMT_STATUS_ALREADY_PAIRED, &rp, in pair_device()
2945 sizeof(rp)); in pair_device()
2952 if (cp->addr.type == BDADDR_BREDR) { in pair_device()
2953 conn = hci_connect_acl(hdev, &cp->addr.bdaddr, sec_level, in pair_device()
2956 u8 addr_type = le_addr_type(cp->addr.type); in pair_device()
2968 p = hci_conn_params_add(hdev, &cp->addr.bdaddr, addr_type); in pair_device()
2970 if (p->auto_connect == HCI_AUTO_CONN_EXPLICIT) in pair_device()
2971 p->auto_connect = HCI_AUTO_CONN_DISABLED; in pair_device()
2973 conn = hci_connect_le_scan(hdev, &cp->addr.bdaddr, addr_type, in pair_device()
2981 if (PTR_ERR(conn) == -EBUSY) in pair_device()
2983 else if (PTR_ERR(conn) == -EOPNOTSUPP) in pair_device()
2985 else if (PTR_ERR(conn) == -ECONNREFUSED) in pair_device()
2990 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE, in pair_device()
2991 status, &rp, sizeof(rp)); in pair_device()
2995 if (conn->connect_cfm_cb) { in pair_device()
2997 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE, in pair_device()
2998 MGMT_STATUS_BUSY, &rp, sizeof(rp)); in pair_device()
3004 err = -ENOMEM; in pair_device()
3009 cmd->cmd_complete = pairing_complete; in pair_device()
3012 if (cp->addr.type == BDADDR_BREDR) { in pair_device()
3013 conn->connect_cfm_cb = pairing_complete_cb; in pair_device()
3014 conn->security_cfm_cb = pairing_complete_cb; in pair_device()
3015 conn->disconn_cfm_cb = pairing_complete_cb; in pair_device()
3017 conn->connect_cfm_cb = le_pairing_complete_cb; in pair_device()
3018 conn->security_cfm_cb = le_pairing_complete_cb; in pair_device()
3019 conn->disconn_cfm_cb = le_pairing_complete_cb; in pair_device()
3022 conn->io_capability = cp->io_cap; in pair_device()
3023 cmd->user_data = hci_conn_get(conn); in pair_device()
3025 if ((conn->state == BT_CONNECTED || conn->state == BT_CONFIG) && in pair_device()
3027 cmd->cmd_complete(cmd, 0); in pair_device()
3051 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, in cancel_pair_device()
3058 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, in cancel_pair_device()
3063 conn = cmd->user_data; in cancel_pair_device()
3065 if (bacmp(&addr->bdaddr, &conn->dst) != 0) { in cancel_pair_device()
3066 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, in cancel_pair_device()
3071 cmd->cmd_complete(cmd, MGMT_STATUS_CANCELLED); in cancel_pair_device()
3074 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, 0, in cancel_pair_device()
3081 if (addr->type == BDADDR_BREDR) in cancel_pair_device()
3082 hci_remove_link_key(hdev, &addr->bdaddr); in cancel_pair_device()
3084 smp_cancel_and_remove_pairing(hdev, &addr->bdaddr, in cancel_pair_device()
3085 le_addr_type(addr->type)); in cancel_pair_device()
3087 if (conn->conn_reason == CONN_REASON_PAIR_DEVICE) in cancel_pair_device()
3106 err = mgmt_cmd_complete(sk, hdev->id, mgmt_op, in user_pairing_resp()
3112 if (addr->type == BDADDR_BREDR) in user_pairing_resp()
3113 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &addr->bdaddr); in user_pairing_resp()
3115 conn = hci_conn_hash_lookup_le(hdev, &addr->bdaddr, in user_pairing_resp()
3116 le_addr_type(addr->type)); in user_pairing_resp()
3119 err = mgmt_cmd_complete(sk, hdev->id, mgmt_op, in user_pairing_resp()
3125 if (addr->type == BDADDR_LE_PUBLIC || addr->type == BDADDR_LE_RANDOM) { in user_pairing_resp()
3128 err = mgmt_cmd_complete(sk, hdev->id, mgmt_op, in user_pairing_resp()
3132 err = mgmt_cmd_complete(sk, hdev->id, mgmt_op, in user_pairing_resp()
3141 err = -ENOMEM; in user_pairing_resp()
3145 cmd->cmd_complete = addr_cmd_complete; in user_pairing_resp()
3151 bacpy(&cp.bdaddr, &addr->bdaddr); in user_pairing_resp()
3155 err = hci_send_cmd(hdev, hci_op, sizeof(addr->bdaddr), in user_pairing_resp()
3156 &addr->bdaddr); in user_pairing_resp()
3173 return user_pairing_resp(sk, hdev, &cp->addr, in pin_code_neg_reply()
3186 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_USER_CONFIRM_REPLY, in user_confirm_reply()
3189 return user_pairing_resp(sk, hdev, &cp->addr, in user_confirm_reply()
3201 return user_pairing_resp(sk, hdev, &cp->addr, in user_confirm_neg_reply()
3213 return user_pairing_resp(sk, hdev, &cp->addr, in user_passkey_reply()
3215 HCI_OP_USER_PASSKEY_REPLY, cp->passkey); in user_passkey_reply()
3225 return user_pairing_resp(sk, hdev, &cp->addr, in user_passkey_neg_reply()
3236 adv_instance = hci_find_adv_instance(hdev, hdev->cur_adv_instance); in adv_expire()
3241 if (!(adv_instance->flags & flags)) in adv_expire()
3246 adv_instance = hci_get_next_instance(hdev, adv_instance->instance); in adv_expire()
3251 err = __hci_req_schedule_adv_instance(&req, adv_instance->instance, in adv_expire()
3264 bt_dev_dbg(hdev, "status 0x%02x", status); in set_name_complete()
3272 cp = cmd->param; in set_name_complete()
3275 mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, in set_name_complete()
3278 mgmt_cmd_complete(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0, in set_name_complete()
3306 if (!memcmp(hdev->dev_name, cp->name, sizeof(hdev->dev_name)) && in set_local_name()
3307 !memcmp(hdev->short_name, cp->short_name, in set_local_name()
3308 sizeof(hdev->short_name))) { in set_local_name()
3309 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0, in set_local_name()
3314 memcpy(hdev->short_name, cp->short_name, sizeof(hdev->short_name)); in set_local_name()
3317 memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name)); in set_local_name()
3319 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0, in set_local_name()
3333 err = -ENOMEM; in set_local_name()
3337 memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name)); in set_local_name()
3350 __hci_req_update_scan_rsp_data(&req, hdev->cur_adv_instance); in set_local_name()
3371 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_APPEARANCE, in set_appearance()
3374 appearance = le16_to_cpu(cp->appearance); in set_appearance()
3378 if (hdev->appearance != appearance) { in set_appearance()
3379 hdev->appearance = appearance; in set_appearance()
3387 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_APPEARANCE, 0, NULL, in set_appearance()
3398 struct mgmt_rp_get_phy_configuration rp; in get_phy_configuration() local
3404 memset(&rp, 0, sizeof(rp)); in get_phy_configuration()
3406 rp.supported_phys = cpu_to_le32(get_supported_phys(hdev)); in get_phy_configuration()
3407 rp.selected_phys = cpu_to_le32(get_selected_phys(hdev)); in get_phy_configuration()
3408 rp.configurable_phys = cpu_to_le32(get_configurable_phys(hdev)); in get_phy_configuration()
3412 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_PHY_CONFIGURATION, 0, in get_phy_configuration()
3413 &rp, sizeof(rp)); in get_phy_configuration()
3433 bt_dev_dbg(hdev, "status 0x%02x", status); in set_default_phy_complete()
3442 mgmt_cmd_status(cmd->sk, hdev->id, in set_default_phy_complete()
3446 mgmt_cmd_complete(cmd->sk, hdev->id, in set_default_phy_complete()
3450 mgmt_phy_configuration_changed(hdev, cmd->sk); in set_default_phy_complete()
3475 selected_phys = __le32_to_cpu(cp->selected_phys); in set_phy_configuration()
3478 return mgmt_cmd_status(sk, hdev->id, in set_phy_configuration()
3485 return mgmt_cmd_status(sk, hdev->id, in set_phy_configuration()
3490 return mgmt_cmd_complete(sk, hdev->id, in set_phy_configuration()
3497 err = mgmt_cmd_status(sk, hdev->id, in set_phy_configuration()
3504 err = mgmt_cmd_status(sk, hdev->id, in set_phy_configuration()
3550 if (pkt_type != hdev->pkt_type) { in set_phy_configuration()
3551 hdev->pkt_type = pkt_type; in set_phy_configuration()
3560 err = mgmt_cmd_complete(sk, hdev->id, in set_phy_configuration()
3570 err = -ENOMEM; in set_phy_configuration()
3619 const u16 max_key_count = ((U16_MAX - sizeof(*keys)) / in set_blocked_keys()
3626 key_count = __le16_to_cpu(keys->key_count); in set_blocked_keys()
3629 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BLOCKED_KEYS, in set_blocked_keys()
3637 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BLOCKED_KEYS, in set_blocked_keys()
3645 for (i = 0; i < keys->key_count; ++i) { in set_blocked_keys()
3653 b->type = keys->keys[i].type; in set_blocked_keys()
3654 memcpy(b->val, keys->keys[i].val, sizeof(b->val)); in set_blocked_keys()
3655 list_add_rcu(&b->list, &hdev->blocked_keys); in set_blocked_keys()
3659 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_BLOCKED_KEYS, in set_blocked_keys()
3672 if (!test_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED, &hdev->quirks)) in set_wideband_speech()
3673 return mgmt_cmd_status(sk, hdev->id, in set_wideband_speech()
3677 if (cp->val != 0x00 && cp->val != 0x01) in set_wideband_speech()
3678 return mgmt_cmd_status(sk, hdev->id, in set_wideband_speech()
3685 err = mgmt_cmd_status(sk, hdev->id, in set_wideband_speech()
3692 !!cp->val != hci_dev_test_flag(hdev, in set_wideband_speech()
3694 err = mgmt_cmd_status(sk, hdev->id, in set_wideband_speech()
3700 if (cp->val) in set_wideband_speech()
3723 struct mgmt_rp_read_controller_cap *rp = (void *)buf; in read_controller_cap() local
3740 if ((hdev->commands[41] & 0x08) || msft_curve_validity(hdev)) in read_controller_cap()
3748 if (hdev->commands[20] & 0x10) in read_controller_cap()
3753 cap_len = eir_append_data(rp->cap, cap_len, MGMT_CAP_SEC_FLAGS, in read_controller_cap()
3759 if (hdev->commands[41] & 0x08) in read_controller_cap()
3760 cap_len = eir_append_le16(rp->cap, cap_len, in read_controller_cap()
3762 hdev->max_enc_key_size); in read_controller_cap()
3764 cap_len = eir_append_le16(rp->cap, cap_len, in read_controller_cap()
3771 if (hdev->commands[38] & 0x80) { in read_controller_cap()
3772 memcpy(&tx_power_range[0], &hdev->min_le_tx_power, 1); in read_controller_cap()
3773 memcpy(&tx_power_range[1], &hdev->max_le_tx_power, 1); in read_controller_cap()
3774 cap_len = eir_append_data(rp->cap, cap_len, MGMT_CAP_LE_TX_PWR, in read_controller_cap()
3778 rp->cap_len = cpu_to_le16(cap_len); in read_controller_cap()
3782 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_CONTROLLER_CAP, 0, in read_controller_cap()
3783 rp, sizeof(*rp) + cap_len); in read_controller_cap()
3787 /* d4992530-b9ec-469f-ab01-6c481c47da1c */
3794 /* 671b10b5-42c0-4696-9227-eb28d1b049d6 */
3800 /* 15c0a148-c273-11ea-b3de-0242ac130004 */
3810 struct mgmt_rp_read_exp_features_info *rp = (void *)buf; in read_exp_features_info() local
3822 memcpy(rp->features[idx].uuid, debug_uuid, 16); in read_exp_features_info()
3823 rp->features[idx].flags = cpu_to_le32(flags); in read_exp_features_info()
3829 if (test_bit(HCI_QUIRK_VALID_LE_STATES, &hdev->quirks) && in read_exp_features_info()
3830 (hdev->le_states[4] & 0x08) && /* Central */ in read_exp_features_info()
3831 (hdev->le_states[4] & 0x40) && /* Peripheral */ in read_exp_features_info()
3832 (hdev->le_states[3] & 0x10)) /* Simultaneous */ in read_exp_features_info()
3837 memcpy(rp->features[idx].uuid, simult_central_periph_uuid, 16); in read_exp_features_info()
3838 rp->features[idx].flags = cpu_to_le32(flags); in read_exp_features_info()
3848 memcpy(rp->features[idx].uuid, rpa_resolution_uuid, 16); in read_exp_features_info()
3849 rp->features[idx].flags = cpu_to_le32(flags); in read_exp_features_info()
3853 rp->feature_count = cpu_to_le16(idx); in read_exp_features_info()
3860 return mgmt_cmd_complete(sk, hdev ? hdev->id : MGMT_INDEX_NONE, in read_exp_features_info()
3862 0, rp, sizeof(*rp) + (20 * idx)); in read_exp_features_info()
3899 struct mgmt_rp_set_exp_feature rp; in set_exp_feature() local
3903 if (!memcmp(cp->uuid, ZERO_KEY, 16)) { in set_exp_feature()
3904 memset(rp.uuid, 0, 16); in set_exp_feature()
3905 rp.flags = cpu_to_le32(0); in set_exp_feature()
3930 return mgmt_cmd_complete(sk, hdev ? hdev->id : MGMT_INDEX_NONE, in set_exp_feature()
3932 &rp, sizeof(rp)); in set_exp_feature()
3936 if (!memcmp(cp->uuid, debug_uuid, 16)) { in set_exp_feature()
3940 /* Command requires to use the non-controller index */ in set_exp_feature()
3942 return mgmt_cmd_status(sk, hdev->id, in set_exp_feature()
3953 if (cp->param[0] != 0x00 && cp->param[0] != 0x01) in set_exp_feature()
3958 val = !!cp->param[0]; in set_exp_feature()
3962 memcpy(rp.uuid, debug_uuid, 16); in set_exp_feature()
3963 rp.flags = cpu_to_le32(val ? BIT(0) : 0); in set_exp_feature()
3969 &rp, sizeof(rp)); in set_exp_feature()
3978 if (!memcmp(cp->uuid, rpa_resolution_uuid, 16)) { in set_exp_feature()
3991 return mgmt_cmd_status(sk, hdev->id, in set_exp_feature()
3997 return mgmt_cmd_status(sk, hdev->id, in set_exp_feature()
4002 if (cp->param[0] != 0x00 && cp->param[0] != 0x01) in set_exp_feature()
4003 return mgmt_cmd_status(sk, hdev->id, in set_exp_feature()
4007 val = !!cp->param[0]; in set_exp_feature()
4026 memcpy(rp.uuid, rpa_resolution_uuid, 16); in set_exp_feature()
4027 rp.flags = cpu_to_le32(flags); in set_exp_feature()
4031 err = mgmt_cmd_complete(sk, hdev->id, in set_exp_feature()
4033 &rp, sizeof(rp)); in set_exp_feature()
4041 return mgmt_cmd_status(sk, hdev ? hdev->id : MGMT_INDEX_NONE, in set_exp_feature()
4046 #define SUPPORTED_DEVICE_FLAGS() ((1U << HCI_CONN_FLAG_MAX) - 1)
4052 struct mgmt_rp_get_device_flags rp; in get_device_flags() local
4059 bt_dev_dbg(hdev, "Get device flags %pMR (type 0x%x)\n", in get_device_flags()
4060 &cp->addr.bdaddr, cp->addr.type); in get_device_flags()
4064 memset(&rp, 0, sizeof(rp)); in get_device_flags()
4066 if (cp->addr.type == BDADDR_BREDR) { in get_device_flags()
4067 br_params = hci_bdaddr_list_lookup_with_flags(&hdev->accept_list, in get_device_flags()
4068 &cp->addr.bdaddr, in get_device_flags()
4069 cp->addr.type); in get_device_flags()
4073 current_flags = br_params->current_flags; in get_device_flags()
4075 params = hci_conn_params_lookup(hdev, &cp->addr.bdaddr, in get_device_flags()
4076 le_addr_type(cp->addr.type)); in get_device_flags()
4081 current_flags = params->current_flags; in get_device_flags()
4084 bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr); in get_device_flags()
4085 rp.addr.type = cp->addr.type; in get_device_flags()
4086 rp.supported_flags = cpu_to_le32(supported_flags); in get_device_flags()
4087 rp.current_flags = cpu_to_le32(current_flags); in get_device_flags()
4094 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_DEVICE_FLAGS, status, in get_device_flags()
4095 &rp, sizeof(rp)); in get_device_flags()
4120 u32 current_flags = __le32_to_cpu(cp->current_flags); in set_device_flags()
4122 bt_dev_dbg(hdev, "Set device flags %pMR (type 0x%x) = 0x%x", in set_device_flags()
4123 &cp->addr.bdaddr, cp->addr.type, in set_device_flags()
4127 bt_dev_warn(hdev, "Bad flag given (0x%x) vs supported (0x%0x)", in set_device_flags()
4134 if (cp->addr.type == BDADDR_BREDR) { in set_device_flags()
4135 br_params = hci_bdaddr_list_lookup_with_flags(&hdev->accept_list, in set_device_flags()
4136 &cp->addr.bdaddr, in set_device_flags()
4137 cp->addr.type); in set_device_flags()
4140 br_params->current_flags = current_flags; in set_device_flags()
4143 bt_dev_warn(hdev, "No such BR/EDR device %pMR (0x%x)", in set_device_flags()
4144 &cp->addr.bdaddr, cp->addr.type); in set_device_flags()
4147 params = hci_conn_params_lookup(hdev, &cp->addr.bdaddr, in set_device_flags()
4148 le_addr_type(cp->addr.type)); in set_device_flags()
4150 params->current_flags = current_flags; in set_device_flags()
4153 bt_dev_warn(hdev, "No such LE device %pMR (0x%x)", in set_device_flags()
4154 &cp->addr.bdaddr, in set_device_flags()
4155 le_addr_type(cp->addr.type)); in set_device_flags()
4163 device_flags_changed(sk, hdev, &cp->addr.bdaddr, cp->addr.type, in set_device_flags()
4166 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_DEVICE_FLAGS, status, in set_device_flags()
4167 &cp->addr, sizeof(cp->addr)); in set_device_flags()
4189 cp = cmd->param; in mgmt_adv_monitor_removed()
4191 if (cp->monitor_handle) in mgmt_adv_monitor_removed()
4192 sk_skip = cmd->sk; in mgmt_adv_monitor_removed()
4204 struct mgmt_rp_read_adv_monitor_features *rp = NULL; in read_adv_mon_features() local
4212 BT_DBG("request for %s", hdev->name); in read_adv_mon_features()
4219 idr_for_each_entry(&hdev->adv_monitors_idr, monitor, handle) in read_adv_mon_features()
4220 handles[num_handles++] = monitor->handle; in read_adv_mon_features()
4224 rp_size = sizeof(*rp) + (num_handles * sizeof(u16)); in read_adv_mon_features()
4225 rp = kmalloc(rp_size, GFP_KERNEL); in read_adv_mon_features()
4226 if (!rp) in read_adv_mon_features()
4227 return -ENOMEM; in read_adv_mon_features()
4232 rp->supported_features = cpu_to_le32(supported); in read_adv_mon_features()
4233 rp->enabled_features = cpu_to_le32(enabled); in read_adv_mon_features()
4234 rp->max_num_handles = cpu_to_le16(HCI_MAX_ADV_MONITOR_NUM_HANDLES); in read_adv_mon_features()
4235 rp->max_num_patterns = HCI_MAX_ADV_MONITOR_NUM_PATTERNS; in read_adv_mon_features()
4236 rp->num_handles = cpu_to_le16(num_handles); in read_adv_mon_features()
4238 memcpy(&rp->handles, &handles, (num_handles * sizeof(u16))); in read_adv_mon_features()
4240 err = mgmt_cmd_complete(sk, hdev->id, in read_adv_mon_features()
4242 MGMT_STATUS_SUCCESS, rp, rp_size); in read_adv_mon_features()
4244 kfree(rp); in read_adv_mon_features()
4251 struct mgmt_rp_add_adv_patterns_monitor rp; in mgmt_add_adv_patterns_monitor_complete() local
4265 monitor = cmd->user_data; in mgmt_add_adv_patterns_monitor_complete()
4266 rp.monitor_handle = cpu_to_le16(monitor->handle); in mgmt_add_adv_patterns_monitor_complete()
4269 mgmt_adv_monitor_added(cmd->sk, hdev, monitor->handle); in mgmt_add_adv_patterns_monitor_complete()
4270 hdev->adv_monitors_cnt++; in mgmt_add_adv_patterns_monitor_complete()
4271 if (monitor->state == ADV_MONITOR_STATE_NOT_REGISTERED) in mgmt_add_adv_patterns_monitor_complete()
4272 monitor->state = ADV_MONITOR_STATE_REGISTERED; in mgmt_add_adv_patterns_monitor_complete()
4276 err = mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, in mgmt_add_adv_patterns_monitor_complete()
4277 mgmt_status(status), &rp, sizeof(rp)); in mgmt_add_adv_patterns_monitor_complete()
4283 rp.monitor_handle, status); in mgmt_add_adv_patterns_monitor_complete()
4292 struct mgmt_rp_add_adv_patterns_monitor rp; in __add_adv_patterns_monitor() local
4316 cmd->user_data = m; in __add_adv_patterns_monitor()
4319 if (err == -ENOSPC || err == -ENOMEM) in __add_adv_patterns_monitor()
4321 else if (err == -EINVAL) in __add_adv_patterns_monitor()
4332 rp.monitor_handle = cpu_to_le16(m->handle); in __add_adv_patterns_monitor()
4333 mgmt_adv_monitor_added(sk, hdev, m->handle); in __add_adv_patterns_monitor()
4334 m->state = ADV_MONITOR_STATE_REGISTERED; in __add_adv_patterns_monitor()
4335 hdev->adv_monitors_cnt++; in __add_adv_patterns_monitor()
4338 return mgmt_cmd_complete(sk, hdev->id, op, MGMT_STATUS_SUCCESS, in __add_adv_patterns_monitor()
4339 &rp, sizeof(rp)); in __add_adv_patterns_monitor()
4349 return mgmt_cmd_status(sk, hdev->id, op, status); in __add_adv_patterns_monitor()
4356 m->rssi.low_threshold = rssi->low_threshold; in parse_adv_monitor_rssi()
4357 m->rssi.low_threshold_timeout = in parse_adv_monitor_rssi()
4358 __le16_to_cpu(rssi->low_threshold_timeout); in parse_adv_monitor_rssi()
4359 m->rssi.high_threshold = rssi->high_threshold; in parse_adv_monitor_rssi()
4360 m->rssi.high_threshold_timeout = in parse_adv_monitor_rssi()
4361 __le16_to_cpu(rssi->high_threshold_timeout); in parse_adv_monitor_rssi()
4362 m->rssi.sampling_period = rssi->sampling_period; in parse_adv_monitor_rssi()
4369 m->rssi.low_threshold = -127; in parse_adv_monitor_rssi()
4370 m->rssi.low_threshold_timeout = 60; in parse_adv_monitor_rssi()
4371 m->rssi.high_threshold = -127; in parse_adv_monitor_rssi()
4372 m->rssi.high_threshold_timeout = 0; in parse_adv_monitor_rssi()
4373 m->rssi.sampling_period = 0; in parse_adv_monitor_rssi()
4396 p->ad_type = patterns[i].ad_type; in parse_adv_monitor_pattern()
4397 p->offset = patterns[i].offset; in parse_adv_monitor_pattern()
4398 p->length = patterns[i].length; in parse_adv_monitor_pattern()
4399 memcpy(p->value, patterns[i].value, p->length); in parse_adv_monitor_pattern()
4401 INIT_LIST_HEAD(&p->list); in parse_adv_monitor_pattern()
4402 list_add(&p->list, &m->patterns); in parse_adv_monitor_pattern()
4416 BT_DBG("request for %s", hdev->name); in add_adv_patterns_monitor()
4423 expected_size += cp->pattern_count * sizeof(struct mgmt_adv_pattern); in add_adv_patterns_monitor()
4435 INIT_LIST_HEAD(&m->patterns); in add_adv_patterns_monitor()
4438 status = parse_adv_monitor_pattern(m, cp->pattern_count, cp->patterns); in add_adv_patterns_monitor()
4453 BT_DBG("request for %s", hdev->name); in add_adv_patterns_monitor_rssi()
4460 expected_size += cp->pattern_count * sizeof(struct mgmt_adv_pattern); in add_adv_patterns_monitor_rssi()
4472 INIT_LIST_HEAD(&m->patterns); in add_adv_patterns_monitor_rssi()
4474 parse_adv_monitor_rssi(m, &cp->rssi); in add_adv_patterns_monitor_rssi()
4475 status = parse_adv_monitor_pattern(m, cp->pattern_count, cp->patterns); in add_adv_patterns_monitor_rssi()
4484 struct mgmt_rp_remove_adv_monitor rp; in mgmt_remove_adv_monitor_complete() local
4495 cp = cmd->param; in mgmt_remove_adv_monitor_complete()
4496 rp.monitor_handle = cp->monitor_handle; in mgmt_remove_adv_monitor_complete()
4501 err = mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, in mgmt_remove_adv_monitor_complete()
4502 mgmt_status(status), &rp, sizeof(rp)); in mgmt_remove_adv_monitor_complete()
4508 rp.monitor_handle, status); in mgmt_remove_adv_monitor_complete()
4517 struct mgmt_rp_remove_adv_monitor rp; in remove_adv_monitor() local
4519 u16 handle = __le16_to_cpu(cp->monitor_handle); in remove_adv_monitor()
4523 BT_DBG("request for %s", hdev->name); in remove_adv_monitor()
4524 rp.monitor_handle = cp->monitor_handle; in remove_adv_monitor()
4550 if (err == -ENOENT) in remove_adv_monitor()
4563 return mgmt_cmd_complete(sk, hdev->id, in remove_adv_monitor()
4566 &rp, sizeof(rp)); in remove_adv_monitor()
4574 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_ADV_MONITOR, in remove_adv_monitor()
4592 mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA, in read_local_oob_data_complete()
4600 struct hci_rp_read_local_oob_data *rp = (void *) skb->data; in read_local_oob_data_complete() local
4602 if (skb->len < sizeof(*rp)) { in read_local_oob_data_complete()
4603 mgmt_cmd_status(cmd->sk, hdev->id, in read_local_oob_data_complete()
4609 memcpy(mgmt_rp.hash192, rp->hash, sizeof(rp->hash)); in read_local_oob_data_complete()
4610 memcpy(mgmt_rp.rand192, rp->rand, sizeof(rp->rand)); in read_local_oob_data_complete()
4612 rp_size -= sizeof(mgmt_rp.hash256) + sizeof(mgmt_rp.rand256); in read_local_oob_data_complete()
4614 struct hci_rp_read_local_oob_ext_data *rp = (void *) skb->data; in read_local_oob_data_complete() local
4616 if (skb->len < sizeof(*rp)) { in read_local_oob_data_complete()
4617 mgmt_cmd_status(cmd->sk, hdev->id, in read_local_oob_data_complete()
4623 memcpy(mgmt_rp.hash192, rp->hash192, sizeof(rp->hash192)); in read_local_oob_data_complete()
4624 memcpy(mgmt_rp.rand192, rp->rand192, sizeof(rp->rand192)); in read_local_oob_data_complete()
4626 memcpy(mgmt_rp.hash256, rp->hash256, sizeof(rp->hash256)); in read_local_oob_data_complete()
4627 memcpy(mgmt_rp.rand256, rp->rand256, sizeof(rp->rand256)); in read_local_oob_data_complete()
4630 mgmt_cmd_complete(cmd->sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA, in read_local_oob_data_complete()
4649 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA, in read_local_oob_data()
4655 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA, in read_local_oob_data()
4661 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA, in read_local_oob_data()
4668 err = -ENOMEM; in read_local_oob_data()
4696 if (!bdaddr_type_is_valid(addr->type)) in add_remote_oob_data()
4697 return mgmt_cmd_complete(sk, hdev->id, in add_remote_oob_data()
4708 if (cp->addr.type != BDADDR_BREDR) { in add_remote_oob_data()
4709 err = mgmt_cmd_complete(sk, hdev->id, in add_remote_oob_data()
4712 &cp->addr, sizeof(cp->addr)); in add_remote_oob_data()
4716 err = hci_add_remote_oob_data(hdev, &cp->addr.bdaddr, in add_remote_oob_data()
4717 cp->addr.type, cp->hash, in add_remote_oob_data()
4718 cp->rand, NULL, NULL); in add_remote_oob_data()
4724 err = mgmt_cmd_complete(sk, hdev->id, in add_remote_oob_data()
4726 &cp->addr, sizeof(cp->addr)); in add_remote_oob_data()
4732 if (bdaddr_type_is_le(cp->addr.type)) { in add_remote_oob_data()
4733 /* Enforce zero-valued 192-bit parameters as in add_remote_oob_data()
4736 if (memcmp(cp->rand192, ZERO_KEY, 16) || in add_remote_oob_data()
4737 memcmp(cp->hash192, ZERO_KEY, 16)) { in add_remote_oob_data()
4738 err = mgmt_cmd_complete(sk, hdev->id, in add_remote_oob_data()
4748 /* In case one of the P-192 values is set to zero, in add_remote_oob_data()
4749 * then just disable OOB data for P-192. in add_remote_oob_data()
4751 if (!memcmp(cp->rand192, ZERO_KEY, 16) || in add_remote_oob_data()
4752 !memcmp(cp->hash192, ZERO_KEY, 16)) { in add_remote_oob_data()
4756 rand192 = cp->rand192; in add_remote_oob_data()
4757 hash192 = cp->hash192; in add_remote_oob_data()
4761 /* In case one of the P-256 values is set to zero, then just in add_remote_oob_data()
4762 * disable OOB data for P-256. in add_remote_oob_data()
4764 if (!memcmp(cp->rand256, ZERO_KEY, 16) || in add_remote_oob_data()
4765 !memcmp(cp->hash256, ZERO_KEY, 16)) { in add_remote_oob_data()
4769 rand256 = cp->rand256; in add_remote_oob_data()
4770 hash256 = cp->hash256; in add_remote_oob_data()
4773 err = hci_add_remote_oob_data(hdev, &cp->addr.bdaddr, in add_remote_oob_data()
4774 cp->addr.type, hash192, rand192, in add_remote_oob_data()
4781 err = mgmt_cmd_complete(sk, hdev->id, in add_remote_oob_data()
4783 status, &cp->addr, sizeof(cp->addr)); in add_remote_oob_data()
4787 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_REMOTE_OOB_DATA, in add_remote_oob_data()
4805 if (cp->addr.type != BDADDR_BREDR) in remove_remote_oob_data()
4806 return mgmt_cmd_complete(sk, hdev->id, in remove_remote_oob_data()
4809 &cp->addr, sizeof(cp->addr)); in remove_remote_oob_data()
4813 if (!bacmp(&cp->addr.bdaddr, BDADDR_ANY)) { in remove_remote_oob_data()
4819 err = hci_remove_remote_oob_data(hdev, &cp->addr.bdaddr, cp->addr.type); in remove_remote_oob_data()
4826 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_REMOTE_OOB_DATA, in remove_remote_oob_data()
4827 status, &cp->addr, sizeof(cp->addr)); in remove_remote_oob_data()
4849 cmd->cmd_complete(cmd, mgmt_status(status)); in mgmt_start_discovery_complete()
4857 hdev->suspend_tasks)) { in mgmt_start_discovery_complete()
4859 wake_up(&hdev->suspend_wait_q); in mgmt_start_discovery_complete()
4903 err = mgmt_cmd_complete(sk, hdev->id, op, in start_discovery_internal()
4905 &cp->type, sizeof(cp->type)); in start_discovery_internal()
4909 if (hdev->discovery.state != DISCOVERY_STOPPED || in start_discovery_internal()
4911 err = mgmt_cmd_complete(sk, hdev->id, op, MGMT_STATUS_BUSY, in start_discovery_internal()
4912 &cp->type, sizeof(cp->type)); in start_discovery_internal()
4916 if (!discovery_type_is_valid(hdev, cp->type, &status)) { in start_discovery_internal()
4917 err = mgmt_cmd_complete(sk, hdev->id, op, status, in start_discovery_internal()
4918 &cp->type, sizeof(cp->type)); in start_discovery_internal()
4923 if (hdev->discovery_paused) { in start_discovery_internal()
4924 err = mgmt_cmd_complete(sk, hdev->id, op, MGMT_STATUS_BUSY, in start_discovery_internal()
4925 &cp->type, sizeof(cp->type)); in start_discovery_internal()
4934 hdev->discovery.type = cp->type; in start_discovery_internal()
4935 hdev->discovery.report_invalid_rssi = false; in start_discovery_internal()
4937 hdev->discovery.limited = true; in start_discovery_internal()
4939 hdev->discovery.limited = false; in start_discovery_internal()
4943 err = -ENOMEM; in start_discovery_internal()
4947 cmd->cmd_complete = generic_cmd_complete; in start_discovery_internal()
4950 queue_work(hdev->req_workqueue, &hdev->discov_update); in start_discovery_internal()
4976 return mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status, in service_discovery_cmd_complete()
4977 cmd->param, 1); in service_discovery_cmd_complete()
4985 const u16 max_uuid_count = ((U16_MAX - sizeof(*cp)) / 16); in start_service_discovery()
4995 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
4998 &cp->type, sizeof(cp->type)); in start_service_discovery()
5002 if (hdev->discovery.state != DISCOVERY_STOPPED || in start_service_discovery()
5004 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
5006 MGMT_STATUS_BUSY, &cp->type, in start_service_discovery()
5007 sizeof(cp->type)); in start_service_discovery()
5011 if (hdev->discovery_paused) { in start_service_discovery()
5012 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
5014 MGMT_STATUS_BUSY, &cp->type, in start_service_discovery()
5015 sizeof(cp->type)); in start_service_discovery()
5019 uuid_count = __le16_to_cpu(cp->uuid_count); in start_service_discovery()
5023 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
5025 MGMT_STATUS_INVALID_PARAMS, &cp->type, in start_service_discovery()
5026 sizeof(cp->type)); in start_service_discovery()
5034 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
5036 MGMT_STATUS_INVALID_PARAMS, &cp->type, in start_service_discovery()
5037 sizeof(cp->type)); in start_service_discovery()
5041 if (!discovery_type_is_valid(hdev, cp->type, &status)) { in start_service_discovery()
5042 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
5044 status, &cp->type, sizeof(cp->type)); in start_service_discovery()
5051 err = -ENOMEM; in start_service_discovery()
5055 cmd->cmd_complete = service_discovery_cmd_complete; in start_service_discovery()
5062 hdev->discovery.result_filtering = true; in start_service_discovery()
5063 hdev->discovery.type = cp->type; in start_service_discovery()
5064 hdev->discovery.rssi = cp->rssi; in start_service_discovery()
5065 hdev->discovery.uuid_count = uuid_count; in start_service_discovery()
5068 hdev->discovery.uuids = kmemdup(cp->uuids, uuid_count * 16, in start_service_discovery()
5070 if (!hdev->discovery.uuids) { in start_service_discovery()
5071 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
5074 &cp->type, sizeof(cp->type)); in start_service_discovery()
5081 queue_work(hdev->req_workqueue, &hdev->discov_update); in start_service_discovery()
5099 cmd->cmd_complete(cmd, mgmt_status(status)); in mgmt_stop_discovery_complete()
5106 if (test_and_clear_bit(SUSPEND_PAUSE_DISCOVERY, hdev->suspend_tasks)) { in mgmt_stop_discovery_complete()
5108 wake_up(&hdev->suspend_wait_q); in mgmt_stop_discovery_complete()
5124 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY, in stop_discovery()
5125 MGMT_STATUS_REJECTED, &mgmt_cp->type, in stop_discovery()
5126 sizeof(mgmt_cp->type)); in stop_discovery()
5130 if (hdev->discovery.type != mgmt_cp->type) { in stop_discovery()
5131 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY, in stop_discovery()
5133 &mgmt_cp->type, sizeof(mgmt_cp->type)); in stop_discovery()
5139 err = -ENOMEM; in stop_discovery()
5143 cmd->cmd_complete = generic_cmd_complete; in stop_discovery()
5146 queue_work(hdev->req_workqueue, &hdev->discov_update); in stop_discovery()
5166 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME, in confirm_name()
5167 MGMT_STATUS_FAILED, &cp->addr, in confirm_name()
5168 sizeof(cp->addr)); in confirm_name()
5172 e = hci_inquiry_cache_lookup_unknown(hdev, &cp->addr.bdaddr); in confirm_name()
5174 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME, in confirm_name()
5175 MGMT_STATUS_INVALID_PARAMS, &cp->addr, in confirm_name()
5176 sizeof(cp->addr)); in confirm_name()
5180 if (cp->name_known) { in confirm_name()
5181 e->name_state = NAME_KNOWN; in confirm_name()
5182 list_del(&e->list); in confirm_name()
5184 e->name_state = NAME_NEEDED; in confirm_name()
5188 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME, 0, in confirm_name()
5189 &cp->addr, sizeof(cp->addr)); in confirm_name()
5205 if (!bdaddr_type_is_valid(cp->addr.type)) in block_device()
5206 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE, in block_device()
5208 &cp->addr, sizeof(cp->addr)); in block_device()
5212 err = hci_bdaddr_list_add(&hdev->reject_list, &cp->addr.bdaddr, in block_device()
5213 cp->addr.type); in block_device()
5219 mgmt_event(MGMT_EV_DEVICE_BLOCKED, hdev, &cp->addr, sizeof(cp->addr), in block_device()
5224 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE, status, in block_device()
5225 &cp->addr, sizeof(cp->addr)); in block_device()
5241 if (!bdaddr_type_is_valid(cp->addr.type)) in unblock_device()
5242 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE, in unblock_device()
5244 &cp->addr, sizeof(cp->addr)); in unblock_device()
5248 err = hci_bdaddr_list_del(&hdev->reject_list, &cp->addr.bdaddr, in unblock_device()
5249 cp->addr.type); in unblock_device()
5255 mgmt_event(MGMT_EV_DEVICE_UNBLOCKED, hdev, &cp->addr, sizeof(cp->addr), in unblock_device()
5260 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE, status, in unblock_device()
5261 &cp->addr, sizeof(cp->addr)); in unblock_device()
5278 source = __le16_to_cpu(cp->source); in set_device_id()
5281 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEVICE_ID, in set_device_id()
5286 hdev->devid_source = source; in set_device_id()
5287 hdev->devid_vendor = __le16_to_cpu(cp->vendor); in set_device_id()
5288 hdev->devid_product = __le16_to_cpu(cp->product); in set_device_id()
5289 hdev->devid_version = __le16_to_cpu(cp->version); in set_device_id()
5291 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_DEVICE_ID, 0, in set_device_id()
5343 hdev->suspend_tasks)) { in set_advertising_complete()
5345 wake_up(&hdev->suspend_wait_q); in set_advertising_complete()
5347 hdev->suspend_tasks)) { in set_advertising_complete()
5349 wake_up(&hdev->suspend_wait_q); in set_advertising_complete()
5353 * set up earlier, then re-enable multi-instance advertising. in set_advertising_complete()
5356 list_empty(&hdev->adv_instances)) in set_advertising_complete()
5359 instance = hdev->cur_adv_instance; in set_advertising_complete()
5361 adv_instance = list_first_entry_or_null(&hdev->adv_instances, in set_advertising_complete()
5366 instance = adv_instance->instance; in set_advertising_complete()
5377 bt_dev_err(hdev, "failed to re-configure advertising"); in set_advertising_complete()
5396 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING, in set_advertising()
5403 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING, in set_advertising()
5406 if (cp->val != 0x00 && cp->val != 0x01 && cp->val != 0x02) in set_advertising()
5407 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING, in set_advertising()
5410 if (hdev->advertising_paused) in set_advertising()
5411 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING, in set_advertising()
5416 val = !!cp->val; in set_advertising()
5425 (cp->val == 0x02) == hci_dev_test_flag(hdev, HCI_ADVERTISING_CONNECTABLE)) || in set_advertising()
5428 hdev->le_scan_type == LE_SCAN_ACTIVE)) { in set_advertising()
5431 if (cp->val) { in set_advertising()
5432 hdev->cur_adv_instance = 0x00; in set_advertising()
5434 if (cp->val == 0x02) in set_advertising()
5455 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING, in set_advertising()
5462 err = -ENOMEM; in set_advertising()
5468 if (cp->val == 0x02) in set_advertising()
5480 hdev->cur_adv_instance = 0x00; in set_advertising()
5511 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_STATIC_ADDRESS, in set_static_address()
5515 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_STATIC_ADDRESS, in set_static_address()
5518 if (bacmp(&cp->bdaddr, BDADDR_ANY)) { in set_static_address()
5519 if (!bacmp(&cp->bdaddr, BDADDR_NONE)) in set_static_address()
5520 return mgmt_cmd_status(sk, hdev->id, in set_static_address()
5525 if ((cp->bdaddr.b[5] & 0xc0) != 0xc0) in set_static_address()
5526 return mgmt_cmd_status(sk, hdev->id, in set_static_address()
5533 bacpy(&hdev->static_addr, &cp->bdaddr); in set_static_address()
5556 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, in set_scan_params()
5559 interval = __le16_to_cpu(cp->interval); in set_scan_params()
5562 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, in set_scan_params()
5565 window = __le16_to_cpu(cp->window); in set_scan_params()
5568 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, in set_scan_params()
5572 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, in set_scan_params()
5577 hdev->le_scan_interval = interval; in set_scan_params()
5578 hdev->le_scan_window = window; in set_scan_params()
5580 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, 0, in set_scan_params()
5587 hdev->discovery.state == DISCOVERY_STOPPED) { in set_scan_params()
5608 bt_dev_dbg(hdev, "status 0x%02x", status); in fast_connectable_complete()
5617 mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE, in fast_connectable_complete()
5620 struct mgmt_mode *cp = cmd->param; in fast_connectable_complete()
5622 if (cp->val) in fast_connectable_complete()
5627 send_settings_rsp(cmd->sk, MGMT_OP_SET_FAST_CONNECTABLE, hdev); in fast_connectable_complete()
5628 new_settings(hdev, cmd->sk); in fast_connectable_complete()
5648 hdev->hci_ver < BLUETOOTH_VER_1_2) in set_fast_connectable()
5649 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE, in set_fast_connectable()
5652 if (cp->val != 0x00 && cp->val != 0x01) in set_fast_connectable()
5653 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE, in set_fast_connectable()
5659 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE, in set_fast_connectable()
5664 if (!!cp->val == hci_dev_test_flag(hdev, HCI_FAST_CONNECTABLE)) { in set_fast_connectable()
5681 err = -ENOMEM; in set_fast_connectable()
5687 __hci_req_write_fast_connectable(&req, cp->val); in set_fast_connectable()
5691 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE, in set_fast_connectable()
5706 bt_dev_dbg(hdev, "status 0x%02x", status); in set_bredr_complete()
5722 mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err); in set_bredr_complete()
5724 send_settings_rsp(cmd->sk, MGMT_OP_SET_BREDR, hdev); in set_bredr_complete()
5725 new_settings(hdev, cmd->sk); in set_bredr_complete()
5744 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, in set_bredr()
5748 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, in set_bredr()
5751 if (cp->val != 0x00 && cp->val != 0x01) in set_bredr()
5752 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, in set_bredr()
5757 if (cp->val == hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) { in set_bredr()
5763 if (!cp->val) { in set_bredr()
5782 if (!cp->val) { in set_bredr()
5783 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, in set_bredr()
5787 /* When configuring a dual-mode controller to operate in set_bredr()
5791 * Dual-mode controllers shall operate with the public in set_bredr()
5802 (bacmp(&hdev->static_addr, BDADDR_ANY) || in set_bredr()
5804 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, in set_bredr()
5811 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, in set_bredr()
5818 err = -ENOMEM; in set_bredr()
5835 __hci_req_update_adv_data(&req, hdev->cur_adv_instance); in set_bredr()
5860 mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, in sc_enable_complete()
5865 cp = cmd->param; in sc_enable_complete()
5867 switch (cp->val) { in sc_enable_complete()
5882 send_settings_rsp(cmd->sk, MGMT_OP_SET_SECURE_CONN, hdev); in sc_enable_complete()
5883 new_settings(hdev, cmd->sk); in sc_enable_complete()
5904 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN, in set_secure_conn()
5910 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN, in set_secure_conn()
5913 if (cp->val != 0x00 && cp->val != 0x01 && cp->val != 0x02) in set_secure_conn()
5914 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN, in set_secure_conn()
5923 if (cp->val) { in set_secure_conn()
5926 if (cp->val == 0x02) in set_secure_conn()
5947 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN, in set_secure_conn()
5952 val = !!cp->val; in set_secure_conn()
5955 (cp->val == 0x02) == hci_dev_test_flag(hdev, HCI_SC_ONLY)) { in set_secure_conn()
5962 err = -ENOMEM; in set_secure_conn()
5988 if (cp->val != 0x00 && cp->val != 0x01 && cp->val != 0x02) in set_debug_keys()
5989 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEBUG_KEYS, in set_debug_keys()
5994 if (cp->val) in set_debug_keys()
6000 if (cp->val == 0x02) in set_debug_keys()
6009 u8 mode = (cp->val == 0x02) ? 0x01 : 0x00; in set_debug_keys()
6036 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PRIVACY, in set_privacy()
6039 if (cp->privacy != 0x00 && cp->privacy != 0x01 && cp->privacy != 0x02) in set_privacy()
6040 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PRIVACY, in set_privacy()
6044 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PRIVACY, in set_privacy()
6054 if (cp->privacy) { in set_privacy()
6056 memcpy(hdev->irk, cp->irk, sizeof(hdev->irk)); in set_privacy()
6059 if (cp->privacy == 0x02) in set_privacy()
6065 memset(hdev->irk, 0, sizeof(hdev->irk)); in set_privacy()
6085 switch (irk->addr.type) { in irk_is_valid()
6091 if ((irk->addr.bdaddr.b[5] & 0xc0) != 0xc0) in irk_is_valid()
6103 const u16 max_irk_count = ((U16_MAX - sizeof(*cp)) / in load_irks()
6111 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_IRKS, in load_irks()
6114 irk_count = __le16_to_cpu(cp->irk_count); in load_irks()
6118 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_IRKS, in load_irks()
6126 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_IRKS, in load_irks()
6133 struct mgmt_irk_info *key = &cp->irks[i]; in load_irks()
6136 return mgmt_cmd_status(sk, hdev->id, in load_irks()
6146 struct mgmt_irk_info *irk = &cp->irks[i]; in load_irks()
6150 irk->val)) { in load_irks()
6152 &irk->addr.bdaddr); in load_irks()
6156 hci_add_irk(hdev, &irk->addr.bdaddr, in load_irks()
6157 le_addr_type(irk->addr.type), irk->val, in load_irks()
6163 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_IRKS, 0, NULL, 0); in load_irks()
6172 if (key->initiator != 0x00 && key->initiator != 0x01) in ltk_is_valid()
6175 switch (key->addr.type) { in ltk_is_valid()
6181 if ((key->addr.bdaddr.b[5] & 0xc0) != 0xc0) in ltk_is_valid()
6193 const u16 max_key_count = ((U16_MAX - sizeof(*cp)) / in load_long_term_keys()
6201 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, in load_long_term_keys()
6204 key_count = __le16_to_cpu(cp->key_count); in load_long_term_keys()
6208 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, in load_long_term_keys()
6216 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, in load_long_term_keys()
6223 struct mgmt_ltk_info *key = &cp->keys[i]; in load_long_term_keys()
6226 return mgmt_cmd_status(sk, hdev->id, in load_long_term_keys()
6236 struct mgmt_ltk_info *key = &cp->keys[i]; in load_long_term_keys()
6241 key->val)) { in load_long_term_keys()
6243 &key->addr.bdaddr); in load_long_term_keys()
6247 switch (key->type) { in load_long_term_keys()
6250 type = key->initiator ? SMP_LTK : SMP_LTK_RESPONDER; in load_long_term_keys()
6254 type = key->initiator ? SMP_LTK : SMP_LTK_RESPONDER; in load_long_term_keys()
6272 hci_add_ltk(hdev, &key->addr.bdaddr, in load_long_term_keys()
6273 le_addr_type(key->addr.type), type, authenticated, in load_long_term_keys()
6274 key->val, key->enc_size, key->ediv, key->rand); in load_long_term_keys()
6277 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, 0, in load_long_term_keys()
6287 struct hci_conn *conn = cmd->user_data; in conn_info_cmd_complete()
6288 struct mgmt_rp_get_conn_info rp; in conn_info_cmd_complete() local
6291 memcpy(&rp.addr, cmd->param, sizeof(rp.addr)); in conn_info_cmd_complete()
6294 rp.rssi = conn->rssi; in conn_info_cmd_complete()
6295 rp.tx_power = conn->tx_power; in conn_info_cmd_complete()
6296 rp.max_tx_power = conn->max_tx_power; in conn_info_cmd_complete()
6298 rp.rssi = HCI_RSSI_INVALID; in conn_info_cmd_complete()
6299 rp.tx_power = HCI_TX_POWER_INVALID; in conn_info_cmd_complete()
6300 rp.max_tx_power = HCI_TX_POWER_INVALID; in conn_info_cmd_complete()
6303 err = mgmt_cmd_complete(cmd->sk, cmd->index, MGMT_OP_GET_CONN_INFO, in conn_info_cmd_complete()
6304 status, &rp, sizeof(rp)); in conn_info_cmd_complete()
6321 bt_dev_dbg(hdev, "status 0x%02x", hci_status); in conn_info_refresh_complete()
6347 handle = __le16_to_cpu(cp->handle); in conn_info_refresh_complete()
6359 cmd->cmd_complete(cmd, status); in conn_info_refresh_complete()
6370 struct mgmt_rp_get_conn_info rp; in get_conn_info() local
6377 memset(&rp, 0, sizeof(rp)); in get_conn_info()
6378 bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr); in get_conn_info()
6379 rp.addr.type = cp->addr.type; in get_conn_info()
6381 if (!bdaddr_type_is_valid(cp->addr.type)) in get_conn_info()
6382 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO, in get_conn_info()
6384 &rp, sizeof(rp)); in get_conn_info()
6389 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO, in get_conn_info()
6390 MGMT_STATUS_NOT_POWERED, &rp, in get_conn_info()
6391 sizeof(rp)); in get_conn_info()
6395 if (cp->addr.type == BDADDR_BREDR) in get_conn_info()
6397 &cp->addr.bdaddr); in get_conn_info()
6399 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->addr.bdaddr); in get_conn_info()
6401 if (!conn || conn->state != BT_CONNECTED) { in get_conn_info()
6402 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO, in get_conn_info()
6403 MGMT_STATUS_NOT_CONNECTED, &rp, in get_conn_info()
6404 sizeof(rp)); in get_conn_info()
6409 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO, in get_conn_info()
6410 MGMT_STATUS_BUSY, &rp, sizeof(rp)); in get_conn_info()
6417 conn_info_age = hdev->conn_info_min_age + in get_conn_info()
6418 prandom_u32_max(hdev->conn_info_max_age - in get_conn_info()
6419 hdev->conn_info_min_age); in get_conn_info()
6424 if (time_after(jiffies, conn->conn_info_timestamp + in get_conn_info()
6426 !conn->conn_info_timestamp) { in get_conn_info()
6433 req_rssi_cp.handle = cpu_to_le16(conn->handle); in get_conn_info()
6440 if (!bdaddr_type_is_le(cp->addr.type) || in get_conn_info()
6441 conn->tx_power == HCI_TX_POWER_INVALID) { in get_conn_info()
6442 req_txp_cp.handle = cpu_to_le16(conn->handle); in get_conn_info()
6449 if (conn->max_tx_power == HCI_TX_POWER_INVALID) { in get_conn_info()
6450 req_txp_cp.handle = cpu_to_le16(conn->handle); in get_conn_info()
6463 err = -ENOMEM; in get_conn_info()
6468 cmd->user_data = hci_conn_get(conn); in get_conn_info()
6469 cmd->cmd_complete = conn_info_cmd_complete; in get_conn_info()
6471 conn->conn_info_timestamp = jiffies; in get_conn_info()
6474 rp.rssi = conn->rssi; in get_conn_info()
6475 rp.tx_power = conn->tx_power; in get_conn_info()
6476 rp.max_tx_power = conn->max_tx_power; in get_conn_info()
6478 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO, in get_conn_info()
6479 MGMT_STATUS_SUCCESS, &rp, sizeof(rp)); in get_conn_info()
6489 struct hci_conn *conn = cmd->user_data; in clock_info_cmd_complete()
6490 struct mgmt_rp_get_clock_info rp; in clock_info_cmd_complete() local
6494 memset(&rp, 0, sizeof(rp)); in clock_info_cmd_complete()
6495 memcpy(&rp.addr, cmd->param, sizeof(rp.addr)); in clock_info_cmd_complete()
6500 hdev = hci_dev_get(cmd->index); in clock_info_cmd_complete()
6502 rp.local_clock = cpu_to_le32(hdev->clock); in clock_info_cmd_complete()
6507 rp.piconet_clock = cpu_to_le32(conn->clock); in clock_info_cmd_complete()
6508 rp.accuracy = cpu_to_le16(conn->clock_accuracy); in clock_info_cmd_complete()
6512 err = mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status, &rp, in clock_info_cmd_complete()
6513 sizeof(rp)); in clock_info_cmd_complete()
6537 if (hci_cp->which) { in get_clock_info_complete()
6538 u16 handle = __le16_to_cpu(hci_cp->handle); in get_clock_info_complete()
6548 cmd->cmd_complete(cmd, mgmt_status(status)); in get_clock_info_complete()
6559 struct mgmt_rp_get_clock_info rp; in get_clock_info() local
6568 memset(&rp, 0, sizeof(rp)); in get_clock_info()
6569 bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr); in get_clock_info()
6570 rp.addr.type = cp->addr.type; in get_clock_info()
6572 if (cp->addr.type != BDADDR_BREDR) in get_clock_info()
6573 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CLOCK_INFO, in get_clock_info()
6575 &rp, sizeof(rp)); in get_clock_info()
6580 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CLOCK_INFO, in get_clock_info()
6581 MGMT_STATUS_NOT_POWERED, &rp, in get_clock_info()
6582 sizeof(rp)); in get_clock_info()
6586 if (bacmp(&cp->addr.bdaddr, BDADDR_ANY)) { in get_clock_info()
6588 &cp->addr.bdaddr); in get_clock_info()
6589 if (!conn || conn->state != BT_CONNECTED) { in get_clock_info()
6590 err = mgmt_cmd_complete(sk, hdev->id, in get_clock_info()
6593 &rp, sizeof(rp)); in get_clock_info()
6602 err = -ENOMEM; in get_clock_info()
6606 cmd->cmd_complete = clock_info_cmd_complete; in get_clock_info()
6615 cmd->user_data = hci_conn_get(conn); in get_clock_info()
6617 hci_cp.handle = cpu_to_le16(conn->handle); in get_clock_info()
6639 if (conn->dst_type != type) in is_connected()
6642 if (conn->state != BT_CONNECTED) in is_connected()
6648 /* This function requires the caller holds hdev->lock */
6656 return -EIO; in hci_conn_params_set()
6658 if (params->auto_connect == auto_connect) in hci_conn_params_set()
6661 list_del_init(¶ms->action); in hci_conn_params_set()
6669 if (params->explicit_connect) in hci_conn_params_set()
6670 list_add(¶ms->action, &hdev->pend_le_conns); in hci_conn_params_set()
6673 if (params->explicit_connect) in hci_conn_params_set()
6674 list_add(¶ms->action, &hdev->pend_le_conns); in hci_conn_params_set()
6676 list_add(¶ms->action, &hdev->pend_le_reports); in hci_conn_params_set()
6681 list_add(¶ms->action, &hdev->pend_le_conns); in hci_conn_params_set()
6685 params->auto_connect = auto_connect; in hci_conn_params_set()
6716 if (!bdaddr_type_is_valid(cp->addr.type) || in add_device()
6717 !bacmp(&cp->addr.bdaddr, BDADDR_ANY)) in add_device()
6718 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE, in add_device()
6720 &cp->addr, sizeof(cp->addr)); in add_device()
6722 if (cp->action != 0x00 && cp->action != 0x01 && cp->action != 0x02) in add_device()
6723 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE, in add_device()
6725 &cp->addr, sizeof(cp->addr)); in add_device()
6729 if (cp->addr.type == BDADDR_BREDR) { in add_device()
6731 if (cp->action != 0x01) { in add_device()
6732 err = mgmt_cmd_complete(sk, hdev->id, in add_device()
6735 &cp->addr, sizeof(cp->addr)); in add_device()
6739 err = hci_bdaddr_list_add_with_flags(&hdev->accept_list, in add_device()
6740 &cp->addr.bdaddr, in add_device()
6741 cp->addr.type, 0); in add_device()
6750 addr_type = le_addr_type(cp->addr.type); in add_device()
6752 if (cp->action == 0x02) in add_device()
6754 else if (cp->action == 0x01) in add_device()
6764 if (!hci_is_identity_address(&cp->addr.bdaddr, addr_type)) { in add_device()
6765 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE, in add_device()
6767 &cp->addr, sizeof(cp->addr)); in add_device()
6774 if (hci_conn_params_set(hdev, &cp->addr.bdaddr, addr_type, in add_device()
6776 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE, in add_device()
6777 MGMT_STATUS_FAILED, &cp->addr, in add_device()
6778 sizeof(cp->addr)); in add_device()
6781 params = hci_conn_params_lookup(hdev, &cp->addr.bdaddr, in add_device()
6784 current_flags = params->current_flags; in add_device()
6790 device_added(sk, hdev, &cp->addr.bdaddr, cp->addr.type, cp->action); in add_device()
6791 device_flags_changed(NULL, hdev, &cp->addr.bdaddr, cp->addr.type, in add_device()
6794 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE, in add_device()
6795 MGMT_STATUS_SUCCESS, &cp->addr, in add_device()
6796 sizeof(cp->addr)); in add_device()
6824 if (bacmp(&cp->addr.bdaddr, BDADDR_ANY)) { in remove_device()
6828 if (!bdaddr_type_is_valid(cp->addr.type)) { in remove_device()
6829 err = mgmt_cmd_complete(sk, hdev->id, in remove_device()
6832 &cp->addr, sizeof(cp->addr)); in remove_device()
6836 if (cp->addr.type == BDADDR_BREDR) { in remove_device()
6837 err = hci_bdaddr_list_del(&hdev->accept_list, in remove_device()
6838 &cp->addr.bdaddr, in remove_device()
6839 cp->addr.type); in remove_device()
6841 err = mgmt_cmd_complete(sk, hdev->id, in remove_device()
6844 &cp->addr, in remove_device()
6845 sizeof(cp->addr)); in remove_device()
6851 device_removed(sk, hdev, &cp->addr.bdaddr, in remove_device()
6852 cp->addr.type); in remove_device()
6856 addr_type = le_addr_type(cp->addr.type); in remove_device()
6863 if (!hci_is_identity_address(&cp->addr.bdaddr, addr_type)) { in remove_device()
6864 err = mgmt_cmd_complete(sk, hdev->id, in remove_device()
6867 &cp->addr, sizeof(cp->addr)); in remove_device()
6871 params = hci_conn_params_lookup(hdev, &cp->addr.bdaddr, in remove_device()
6874 err = mgmt_cmd_complete(sk, hdev->id, in remove_device()
6877 &cp->addr, sizeof(cp->addr)); in remove_device()
6881 if (params->auto_connect == HCI_AUTO_CONN_DISABLED || in remove_device()
6882 params->auto_connect == HCI_AUTO_CONN_EXPLICIT) { in remove_device()
6883 err = mgmt_cmd_complete(sk, hdev->id, in remove_device()
6886 &cp->addr, sizeof(cp->addr)); in remove_device()
6890 list_del(¶ms->action); in remove_device()
6891 list_del(¶ms->list); in remove_device()
6895 device_removed(sk, hdev, &cp->addr.bdaddr, cp->addr.type); in remove_device()
6900 if (cp->addr.type) { in remove_device()
6901 err = mgmt_cmd_complete(sk, hdev->id, in remove_device()
6904 &cp->addr, sizeof(cp->addr)); in remove_device()
6908 list_for_each_entry_safe(b, btmp, &hdev->accept_list, list) { in remove_device()
6909 device_removed(sk, hdev, &b->bdaddr, b->bdaddr_type); in remove_device()
6910 list_del(&b->list); in remove_device()
6916 list_for_each_entry_safe(p, tmp, &hdev->le_conn_params, list) { in remove_device()
6917 if (p->auto_connect == HCI_AUTO_CONN_DISABLED) in remove_device()
6919 device_removed(sk, hdev, &p->addr, p->addr_type); in remove_device()
6920 if (p->explicit_connect) { in remove_device()
6921 p->auto_connect = HCI_AUTO_CONN_EXPLICIT; in remove_device()
6924 list_del(&p->action); in remove_device()
6925 list_del(&p->list); in remove_device()
6935 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_DEVICE, in remove_device()
6936 MGMT_STATUS_SUCCESS, &cp->addr, in remove_device()
6937 sizeof(cp->addr)); in remove_device()
6947 const u16 max_param_count = ((U16_MAX - sizeof(*cp)) / in load_conn_param()
6953 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM, in load_conn_param()
6956 param_count = __le16_to_cpu(cp->param_count); in load_conn_param()
6960 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM, in load_conn_param()
6968 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM, in load_conn_param()
6979 struct mgmt_conn_param *param = &cp->params[i]; in load_conn_param()
6984 bt_dev_dbg(hdev, "Adding %pMR (type %u)", ¶m->addr.bdaddr, in load_conn_param()
6985 param->addr.type); in load_conn_param()
6987 if (param->addr.type == BDADDR_LE_PUBLIC) { in load_conn_param()
6989 } else if (param->addr.type == BDADDR_LE_RANDOM) { in load_conn_param()
6996 min = le16_to_cpu(param->min_interval); in load_conn_param()
6997 max = le16_to_cpu(param->max_interval); in load_conn_param()
6998 latency = le16_to_cpu(param->latency); in load_conn_param()
6999 timeout = le16_to_cpu(param->timeout); in load_conn_param()
7001 bt_dev_dbg(hdev, "min 0x%04x max 0x%04x latency 0x%04x timeout 0x%04x", in load_conn_param()
7009 hci_param = hci_conn_params_add(hdev, ¶m->addr.bdaddr, in load_conn_param()
7016 hci_param->conn_min_interval = min; in load_conn_param()
7017 hci_param->conn_max_interval = max; in load_conn_param()
7018 hci_param->conn_latency = latency; in load_conn_param()
7019 hci_param->supervision_timeout = timeout; in load_conn_param()
7024 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM, 0, in load_conn_param()
7038 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_EXTERNAL_CONFIG, in set_external_config()
7041 if (cp->config != 0x00 && cp->config != 0x01) in set_external_config()
7042 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_EXTERNAL_CONFIG, in set_external_config()
7045 if (!test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks)) in set_external_config()
7046 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_EXTERNAL_CONFIG, in set_external_config()
7051 if (cp->config) in set_external_config()
7072 queue_work(hdev->req_workqueue, &hdev->power_on); in set_external_config()
7074 set_bit(HCI_RAW, &hdev->flags); in set_external_config()
7094 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PUBLIC_ADDRESS, in set_public_address()
7097 if (!bacmp(&cp->bdaddr, BDADDR_ANY)) in set_public_address()
7098 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PUBLIC_ADDRESS, in set_public_address()
7101 if (!hdev->set_bdaddr) in set_public_address()
7102 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PUBLIC_ADDRESS, in set_public_address()
7107 changed = !!bacmp(&hdev->public_addr, &cp->bdaddr); in set_public_address()
7108 bacpy(&hdev->public_addr, &cp->bdaddr); in set_public_address()
7128 queue_work(hdev->req_workqueue, &hdev->power_on); in set_public_address()
7152 mgmt_cp = cmd->param; in read_local_oob_ext_data_complete()
7163 struct hci_rp_read_local_oob_data *rp; in read_local_oob_ext_data_complete() local
7165 if (skb->len != sizeof(*rp)) { in read_local_oob_ext_data_complete()
7170 rp = (void *)skb->data; in read_local_oob_ext_data_complete()
7173 h192 = rp->hash; in read_local_oob_ext_data_complete()
7174 r192 = rp->rand; in read_local_oob_ext_data_complete()
7179 struct hci_rp_read_local_oob_ext_data *rp; in read_local_oob_ext_data_complete() local
7181 if (skb->len != sizeof(*rp)) { in read_local_oob_ext_data_complete()
7186 rp = (void *)skb->data; in read_local_oob_ext_data_complete()
7194 h192 = rp->hash192; in read_local_oob_ext_data_complete()
7195 r192 = rp->rand192; in read_local_oob_ext_data_complete()
7198 h256 = rp->hash256; in read_local_oob_ext_data_complete()
7199 r256 = rp->rand256; in read_local_oob_ext_data_complete()
7210 eir_len = eir_append_data(mgmt_rp->eir, 0, EIR_CLASS_OF_DEV, in read_local_oob_ext_data_complete()
7211 hdev->dev_class, 3); in read_local_oob_ext_data_complete()
7214 eir_len = eir_append_data(mgmt_rp->eir, eir_len, in read_local_oob_ext_data_complete()
7216 eir_len = eir_append_data(mgmt_rp->eir, eir_len, in read_local_oob_ext_data_complete()
7221 eir_len = eir_append_data(mgmt_rp->eir, eir_len, in read_local_oob_ext_data_complete()
7223 eir_len = eir_append_data(mgmt_rp->eir, eir_len, in read_local_oob_ext_data_complete()
7228 mgmt_rp->type = mgmt_cp->type; in read_local_oob_ext_data_complete()
7229 mgmt_rp->eir_len = cpu_to_le16(eir_len); in read_local_oob_ext_data_complete()
7231 err = mgmt_cmd_complete(cmd->sk, hdev->id, in read_local_oob_ext_data_complete()
7237 hci_sock_set_flag(cmd->sk, HCI_MGMT_OOB_DATA_EVENTS); in read_local_oob_ext_data_complete()
7241 HCI_MGMT_OOB_DATA_EVENTS, cmd->sk); in read_local_oob_ext_data_complete()
7257 return -ENOMEM; in read_local_ssp_oob_req()
7279 struct mgmt_rp_read_local_oob_ext_data *rp; in read_local_oob_ext_data() local
7288 switch (cp->type) { in read_local_oob_ext_data()
7313 rp_len = sizeof(*rp) + eir_len; in read_local_oob_ext_data()
7314 rp = kmalloc(rp_len, GFP_ATOMIC); in read_local_oob_ext_data()
7315 if (!rp) in read_local_oob_ext_data()
7316 return -ENOMEM; in read_local_oob_ext_data()
7324 switch (cp->type) { in read_local_oob_ext_data()
7335 eir_len = eir_append_data(rp->eir, eir_len, in read_local_oob_ext_data()
7337 hdev->dev_class, 3); in read_local_oob_ext_data()
7351 * local out-of-band data when privacy is in use. in read_local_oob_ext_data()
7365 !bacmp(&hdev->bdaddr, BDADDR_ANY) || in read_local_oob_ext_data()
7367 bacmp(&hdev->static_addr, BDADDR_ANY))) { in read_local_oob_ext_data()
7368 memcpy(addr, &hdev->static_addr, 6); in read_local_oob_ext_data()
7371 memcpy(addr, &hdev->bdaddr, 6); in read_local_oob_ext_data()
7375 eir_len = eir_append_data(rp->eir, eir_len, EIR_LE_BDADDR, in read_local_oob_ext_data()
7383 eir_len = eir_append_data(rp->eir, eir_len, EIR_LE_ROLE, in read_local_oob_ext_data()
7387 eir_len = eir_append_data(rp->eir, eir_len, in read_local_oob_ext_data()
7391 eir_len = eir_append_data(rp->eir, eir_len, in read_local_oob_ext_data()
7401 eir_len = eir_append_data(rp->eir, eir_len, EIR_FLAGS, in read_local_oob_ext_data()
7413 rp->type = cp->type; in read_local_oob_ext_data()
7414 rp->eir_len = cpu_to_le16(eir_len); in read_local_oob_ext_data()
7416 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_EXT_DATA, in read_local_oob_ext_data()
7417 status, rp, sizeof(*rp) + eir_len); in read_local_oob_ext_data()
7422 rp, sizeof(*rp) + eir_len, in read_local_oob_ext_data()
7426 kfree(rp); in read_local_oob_ext_data()
7450 if ((hdev->adv_tx_power != HCI_TX_POWER_INVALID) || in get_supported_adv_flags()
7459 if (hdev->le_features[1] & HCI_LE_PHY_2M) in get_supported_adv_flags()
7462 if (hdev->le_features[1] & HCI_LE_PHY_CODED) in get_supported_adv_flags()
7472 struct mgmt_rp_read_adv_features *rp; in read_adv_features() local
7482 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_ADV_FEATURES, in read_adv_features()
7489 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_ADV_FEATURES, in read_adv_features()
7494 rp_len = sizeof(*rp) + hdev->adv_instance_cnt; in read_adv_features()
7495 rp = kmalloc(rp_len, GFP_ATOMIC); in read_adv_features()
7496 if (!rp) { in read_adv_features()
7498 return -ENOMEM; in read_adv_features()
7503 rp->supported_flags = cpu_to_le32(supported_flags); in read_adv_features()
7504 rp->max_adv_data_len = HCI_MAX_AD_LENGTH; in read_adv_features()
7505 rp->max_scan_rsp_len = HCI_MAX_AD_LENGTH; in read_adv_features()
7506 rp->max_instances = hdev->le_num_of_adv_sets; in read_adv_features()
7507 rp->num_instances = hdev->adv_instance_cnt; in read_adv_features()
7509 instance = rp->instance; in read_adv_features()
7510 list_for_each_entry(adv_instance, &hdev->adv_instances, list) { in read_adv_features()
7511 *instance = adv_instance->instance; in read_adv_features()
7517 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_ADV_FEATURES, in read_adv_features()
7518 MGMT_STATUS_SUCCESS, rp, rp_len); in read_adv_features()
7520 kfree(rp); in read_adv_features()
7541 max_len -= 3; in tlv_data_max_len()
7544 max_len -= 3; in tlv_data_max_len()
7547 max_len -= calculate_name_len(hdev); in tlv_data_max_len()
7550 max_len -= 4; in tlv_data_max_len()
7633 ((phy_flags && (phy_flags ^ (phy_flags & -phy_flags))))) in requested_adv_flags_are_valid()
7653 struct mgmt_rp_add_advertising rp; in add_advertising_complete() local
7665 list_for_each_entry_safe(adv_instance, n, &hdev->adv_instances, list) { in add_advertising_complete()
7666 if (!adv_instance->pending) in add_advertising_complete()
7670 adv_instance->pending = false; in add_advertising_complete()
7674 instance = adv_instance->instance; in add_advertising_complete()
7676 if (hdev->cur_adv_instance == instance) in add_advertising_complete()
7680 mgmt_advertising_removed(cmd ? cmd->sk : NULL, hdev, instance); in add_advertising_complete()
7686 cp = cmd->param; in add_advertising_complete()
7687 rp.instance = cp->instance; in add_advertising_complete()
7690 mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, in add_advertising_complete()
7693 mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, in add_advertising_complete()
7694 mgmt_status(status), &rp, sizeof(rp)); in add_advertising_complete()
7706 struct mgmt_rp_add_advertising rp; in add_advertising() local
7710 unsigned int prev_instance_cnt = hdev->adv_instance_cnt; in add_advertising()
7721 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
7728 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
7731 if (cp->instance < 1 || cp->instance > hdev->le_num_of_adv_sets) in add_advertising()
7732 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
7735 if (data_len != sizeof(*cp) + cp->adv_data_len + cp->scan_rsp_len) in add_advertising()
7736 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
7739 flags = __le32_to_cpu(cp->flags); in add_advertising()
7740 timeout = __le16_to_cpu(cp->timeout); in add_advertising()
7741 duration = __le16_to_cpu(cp->duration); in add_advertising()
7744 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
7750 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
7756 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
7761 if (!tlv_data_is_valid(hdev, flags, cp->data, cp->adv_data_len, true) || in add_advertising()
7762 !tlv_data_is_valid(hdev, flags, cp->data + cp->adv_data_len, in add_advertising()
7763 cp->scan_rsp_len, false)) { in add_advertising()
7764 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
7769 err = hci_add_adv_instance(hdev, cp->instance, flags, in add_advertising()
7770 cp->adv_data_len, cp->data, in add_advertising()
7771 cp->scan_rsp_len, in add_advertising()
7772 cp->data + cp->adv_data_len, in add_advertising()
7775 hdev->le_adv_min_interval, in add_advertising()
7776 hdev->le_adv_max_interval); in add_advertising()
7778 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
7786 if (hdev->adv_instance_cnt > prev_instance_cnt) in add_advertising()
7787 mgmt_advertising_added(sk, hdev, cp->instance); in add_advertising()
7789 if (hdev->cur_adv_instance == cp->instance) { in add_advertising()
7797 next_instance = hci_get_next_instance(hdev, cp->instance); in add_advertising()
7799 schedule_instance = next_instance->instance; in add_advertising()
7800 } else if (!hdev->adv_instance_timeout) { in add_advertising()
7804 schedule_instance = cp->instance; in add_advertising()
7814 rp.instance = cp->instance; in add_advertising()
7815 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
7816 MGMT_STATUS_SUCCESS, &rp, sizeof(rp)); in add_advertising()
7826 err = -ENOMEM; in add_advertising()
7838 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
7854 struct mgmt_rp_add_ext_adv_params rp; in add_ext_adv_params_complete() local
7858 BT_DBG("%s", hdev->name); in add_ext_adv_params_complete()
7866 cp = cmd->param; in add_ext_adv_params_complete()
7867 adv_instance = hci_find_adv_instance(hdev, cp->instance); in add_ext_adv_params_complete()
7871 rp.instance = cp->instance; in add_ext_adv_params_complete()
7872 rp.tx_power = adv_instance->tx_power; in add_ext_adv_params_complete()
7877 flags = __le32_to_cpu(cp->flags); in add_ext_adv_params_complete()
7878 rp.max_adv_data_len = tlv_data_max_len(hdev, flags, true); in add_ext_adv_params_complete()
7879 rp.max_scan_rsp_len = tlv_data_max_len(hdev, flags, false); in add_ext_adv_params_complete()
7886 if (!adv_instance->pending) in add_ext_adv_params_complete()
7887 mgmt_advertising_removed(cmd->sk, hdev, cp->instance); in add_ext_adv_params_complete()
7889 hci_remove_adv_instance(hdev, cp->instance); in add_ext_adv_params_complete()
7891 mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, in add_ext_adv_params_complete()
7895 mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, in add_ext_adv_params_complete()
7896 mgmt_status(status), &rp, sizeof(rp)); in add_ext_adv_params_complete()
7910 struct mgmt_rp_add_ext_adv_params rp; in add_ext_adv_params() local
7920 BT_DBG("%s", hdev->name); in add_ext_adv_params()
7924 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_EXT_ADV_PARAMS, in add_ext_adv_params()
7927 if (cp->instance < 1 || cp->instance > hdev->le_num_of_adv_sets) in add_ext_adv_params()
7928 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_EXT_ADV_PARAMS, in add_ext_adv_params()
7938 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_ext_adv_params()
7941 flags = __le32_to_cpu(cp->flags); in add_ext_adv_params()
7944 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_EXT_ADV_PARAMS, in add_ext_adv_params()
7951 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_EXT_ADV_PARAMS, in add_ext_adv_params()
7957 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_EXT_ADV_PARAMS, in add_ext_adv_params()
7964 __le16_to_cpu(cp->timeout) : 0; in add_ext_adv_params()
7967 __le16_to_cpu(cp->duration) : in add_ext_adv_params()
7968 hdev->def_multi_adv_rotation_duration; in add_ext_adv_params()
7971 __le32_to_cpu(cp->min_interval) : in add_ext_adv_params()
7972 hdev->le_adv_min_interval; in add_ext_adv_params()
7975 __le32_to_cpu(cp->max_interval) : in add_ext_adv_params()
7976 hdev->le_adv_max_interval; in add_ext_adv_params()
7979 cp->tx_power : in add_ext_adv_params()
7983 err = hci_add_adv_instance(hdev, cp->instance, flags, in add_ext_adv_params()
7988 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_EXT_ADV_PARAMS, in add_ext_adv_params()
7996 adv_instance = hci_find_adv_instance(hdev, cp->instance); in add_ext_adv_params()
8002 if (!adv_instance->pending) in add_ext_adv_params()
8003 __hci_req_disable_ext_adv_instance(&req, cp->instance); in add_ext_adv_params()
8005 __hci_req_setup_ext_adv_instance(&req, cp->instance); in add_ext_adv_params()
8013 err = -ENOMEM; in add_ext_adv_params()
8014 hci_remove_adv_instance(hdev, cp->instance); in add_ext_adv_params()
8019 rp.instance = cp->instance; in add_ext_adv_params()
8020 rp.tx_power = HCI_ADV_TX_POWER_NO_PREFERENCE; in add_ext_adv_params()
8021 rp.max_adv_data_len = tlv_data_max_len(hdev, flags, true); in add_ext_adv_params()
8022 rp.max_scan_rsp_len = tlv_data_max_len(hdev, flags, false); in add_ext_adv_params()
8023 err = mgmt_cmd_complete(sk, hdev->id, in add_ext_adv_params()
8025 MGMT_STATUS_SUCCESS, &rp, sizeof(rp)); in add_ext_adv_params()
8038 struct mgmt_rp_add_ext_adv_data rp; in add_ext_adv_data() local
8046 BT_DBG("%s", hdev->name); in add_ext_adv_data()
8050 adv_instance = hci_find_adv_instance(hdev, cp->instance); in add_ext_adv_data()
8053 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_EXT_ADV_DATA, in add_ext_adv_data()
8060 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_EXT_ADV_DATA, in add_ext_adv_data()
8066 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_EXT_ADV_DATA, in add_ext_adv_data()
8072 if (!tlv_data_is_valid(hdev, adv_instance->flags, cp->data, in add_ext_adv_data()
8073 cp->adv_data_len, true) || in add_ext_adv_data()
8074 !tlv_data_is_valid(hdev, adv_instance->flags, cp->data + in add_ext_adv_data()
8075 cp->adv_data_len, cp->scan_rsp_len, false)) { in add_ext_adv_data()
8076 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_EXT_ADV_DATA, in add_ext_adv_data()
8082 hci_set_adv_instance_data(hdev, cp->instance, cp->adv_data_len, in add_ext_adv_data()
8083 cp->data, cp->scan_rsp_len, in add_ext_adv_data()
8084 cp->data + cp->adv_data_len); in add_ext_adv_data()
8095 __hci_req_update_adv_data(&req, cp->instance); in add_ext_adv_data()
8096 __hci_req_update_scan_rsp_data(&req, cp->instance); in add_ext_adv_data()
8097 __hci_req_enable_ext_advertising(&req, cp->instance); in add_ext_adv_data()
8102 if (hdev->cur_adv_instance == cp->instance) { in add_ext_adv_data()
8112 cp->instance); in add_ext_adv_data()
8114 schedule_instance = next_instance->instance; in add_ext_adv_data()
8115 } else if (!hdev->adv_instance_timeout) { in add_ext_adv_data()
8119 schedule_instance = cp->instance; in add_ext_adv_data()
8128 if (adv_instance->pending) { in add_ext_adv_data()
8129 mgmt_advertising_added(sk, hdev, cp->instance); in add_ext_adv_data()
8130 adv_instance->pending = false; in add_ext_adv_data()
8132 rp.instance = cp->instance; in add_ext_adv_data()
8133 err = mgmt_cmd_complete(sk, hdev->id, in add_ext_adv_data()
8135 MGMT_STATUS_SUCCESS, &rp, in add_ext_adv_data()
8136 sizeof(rp)); in add_ext_adv_data()
8147 err = -ENOMEM; in add_ext_adv_data()
8155 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_EXT_ADV_DATA, in add_ext_adv_data()
8166 if (adv_instance->pending) in add_ext_adv_data()
8167 mgmt_advertising_added(sk, hdev, cp->instance); in add_ext_adv_data()
8172 hci_remove_adv_instance(hdev, cp->instance); in add_ext_adv_data()
8185 struct mgmt_rp_remove_advertising rp; in remove_advertising_complete() local
8199 cp = cmd->param; in remove_advertising_complete()
8200 rp.instance = cp->instance; in remove_advertising_complete()
8202 mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, MGMT_STATUS_SUCCESS, in remove_advertising_complete()
8203 &rp, sizeof(rp)); in remove_advertising_complete()
8214 struct mgmt_rp_remove_advertising rp; in remove_advertising() local
8225 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING, in remove_advertising()
8230 if (cp->instance && !hci_find_adv_instance(hdev, cp->instance)) { in remove_advertising()
8231 err = mgmt_cmd_status(sk, hdev->id, in remove_advertising()
8240 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_ADVERTISING, in remove_advertising()
8245 if (list_empty(&hdev->adv_instances)) { in remove_advertising()
8246 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_ADVERTISING, in remove_advertising()
8255 __hci_req_disable_ext_adv_instance(&req, cp->instance); in remove_advertising()
8256 __hci_req_remove_ext_adv_instance(&req, cp->instance); in remove_advertising()
8259 hci_req_clear_adv_instance(hdev, sk, &req, cp->instance, true); in remove_advertising()
8261 if (list_empty(&hdev->adv_instances)) in remove_advertising()
8272 rp.instance = cp->instance; in remove_advertising()
8273 err = mgmt_cmd_complete(sk, hdev->id, in remove_advertising()
8275 MGMT_STATUS_SUCCESS, &rp, sizeof(rp)); in remove_advertising()
8282 err = -ENOMEM; in remove_advertising()
8300 struct mgmt_rp_get_adv_size_info rp; in get_adv_size_info() local
8307 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_GET_ADV_SIZE_INFO, in get_adv_size_info()
8310 if (cp->instance < 1 || cp->instance > hdev->le_num_of_adv_sets) in get_adv_size_info()
8311 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_GET_ADV_SIZE_INFO, in get_adv_size_info()
8314 flags = __le32_to_cpu(cp->flags); in get_adv_size_info()
8321 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_GET_ADV_SIZE_INFO, in get_adv_size_info()
8324 rp.instance = cp->instance; in get_adv_size_info()
8325 rp.flags = cp->flags; in get_adv_size_info()
8326 rp.max_adv_data_len = tlv_data_max_len(hdev, flags, true); in get_adv_size_info()
8327 rp.max_scan_rsp_len = tlv_data_max_len(hdev, flags, false); in get_adv_size_info()
8329 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_ADV_SIZE_INFO, in get_adv_size_info()
8330 MGMT_STATUS_SUCCESS, &rp, sizeof(rp)); in get_adv_size_info()
8467 if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks)) in mgmt_index_added()
8470 switch (hdev->dev_type) { in mgmt_index_added()
8489 ev.bus = hdev->bus; in mgmt_index_added()
8500 if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks)) in mgmt_index_removed()
8503 switch (hdev->dev_type) { in mgmt_index_removed()
8524 ev.bus = hdev->bus; in mgmt_index_removed()
8530 /* This function requires the caller holds hdev->lock */
8535 list_for_each_entry(p, &hdev->le_conn_params, list) { in restart_le_actions()
8539 list_del_init(&p->action); in restart_le_actions()
8541 switch (p->auto_connect) { in restart_le_actions()
8544 list_add(&p->action, &hdev->pend_le_conns); in restart_le_actions()
8547 list_add(&p->action, &hdev->pend_le_reports); in restart_le_actions()
8599 if (memcmp(hdev->dev_class, zero_cod, sizeof(zero_cod)) != 0) { in __mgmt_power_off()
8621 if (err == -ERFKILL) in mgmt_set_powered_failed()
8626 mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_POWERED, status); in mgmt_set_powered_failed()
8639 bacpy(&ev.key.addr.bdaddr, &key->bdaddr); in mgmt_new_link_key()
8641 ev.key.type = key->type; in mgmt_new_link_key()
8642 memcpy(ev.key.val, key->val, HCI_LINK_KEY_SIZE); in mgmt_new_link_key()
8643 ev.key.pin_len = key->pin_len; in mgmt_new_link_key()
8650 switch (ltk->type) { in mgmt_ltk_type()
8653 if (ltk->authenticated) in mgmt_ltk_type()
8657 if (ltk->authenticated) in mgmt_ltk_type()
8673 /* Devices using resolvable or non-resolvable random addresses in mgmt_new_ltk()
8684 if (key->bdaddr_type == ADDR_LE_DEV_RANDOM && in mgmt_new_ltk()
8685 (key->bdaddr.b[5] & 0xc0) != 0xc0) in mgmt_new_ltk()
8690 bacpy(&ev.key.addr.bdaddr, &key->bdaddr); in mgmt_new_ltk()
8691 ev.key.addr.type = link_to_bdaddr(LE_LINK, key->bdaddr_type); in mgmt_new_ltk()
8693 ev.key.enc_size = key->enc_size; in mgmt_new_ltk()
8694 ev.key.ediv = key->ediv; in mgmt_new_ltk()
8695 ev.key.rand = key->rand; in mgmt_new_ltk()
8697 if (key->type == SMP_LTK) in mgmt_new_ltk()
8703 memcpy(ev.key.val, key->val, key->enc_size); in mgmt_new_ltk()
8704 memset(ev.key.val + key->enc_size, 0, in mgmt_new_ltk()
8705 sizeof(ev.key.val) - key->enc_size); in mgmt_new_ltk()
8718 bacpy(&ev.rpa, &irk->rpa); in mgmt_new_irk()
8719 bacpy(&ev.irk.addr.bdaddr, &irk->bdaddr); in mgmt_new_irk()
8720 ev.irk.addr.type = link_to_bdaddr(LE_LINK, irk->addr_type); in mgmt_new_irk()
8721 memcpy(ev.irk.val, irk->val, sizeof(irk->val)); in mgmt_new_irk()
8733 /* Devices using resolvable or non-resolvable random addresses in mgmt_new_csrk()
8742 if (csrk->bdaddr_type == ADDR_LE_DEV_RANDOM && in mgmt_new_csrk()
8743 (csrk->bdaddr.b[5] & 0xc0) != 0xc0) in mgmt_new_csrk()
8748 bacpy(&ev.key.addr.bdaddr, &csrk->bdaddr); in mgmt_new_csrk()
8749 ev.key.addr.type = link_to_bdaddr(LE_LINK, csrk->bdaddr_type); in mgmt_new_csrk()
8750 ev.key.type = csrk->type; in mgmt_new_csrk()
8751 memcpy(ev.key.val, csrk->val, sizeof(csrk->val)); in mgmt_new_csrk()
8785 bacpy(&ev->addr.bdaddr, &conn->dst); in mgmt_device_connected()
8786 ev->addr.type = link_to_bdaddr(conn->type, conn->dst_type); in mgmt_device_connected()
8788 if (conn->out) in mgmt_device_connected()
8791 ev->flags = __cpu_to_le32(flags); in mgmt_device_connected()
8797 if (conn->le_adv_data_len > 0) { in mgmt_device_connected()
8798 memcpy(&ev->eir[eir_len], in mgmt_device_connected()
8799 conn->le_adv_data, conn->le_adv_data_len); in mgmt_device_connected()
8800 eir_len = conn->le_adv_data_len; in mgmt_device_connected()
8803 eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE, in mgmt_device_connected()
8806 if (memcmp(conn->dev_class, "\0\0\0", 3) != 0) in mgmt_device_connected()
8807 eir_len = eir_append_data(ev->eir, eir_len, in mgmt_device_connected()
8809 conn->dev_class, 3); in mgmt_device_connected()
8812 ev->eir_len = cpu_to_le16(eir_len); in mgmt_device_connected()
8822 cmd->cmd_complete(cmd, 0); in disconnect_rsp()
8824 *sk = cmd->sk; in disconnect_rsp()
8833 struct mgmt_cp_unpair_device *cp = cmd->param; in unpair_device_rsp()
8835 device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, cmd->sk); in unpair_device_rsp()
8837 cmd->cmd_complete(cmd, 0); in unpair_device_rsp()
8850 cp = cmd->param; in mgmt_powering_down()
8851 if (!cp->val) in mgmt_powering_down()
8868 cancel_delayed_work(&hdev->power_off); in mgmt_device_disconnected()
8869 queue_work(hdev->req_workqueue, &hdev->power_off.work); in mgmt_device_disconnected()
8885 if (hdev->suspended) in mgmt_device_disconnected()
8911 cp = cmd->param; in mgmt_disconnect_failed()
8913 if (bacmp(bdaddr, &cp->addr.bdaddr)) in mgmt_disconnect_failed()
8916 if (cp->addr.type != bdaddr_type) in mgmt_disconnect_failed()
8919 cmd->cmd_complete(cmd, mgmt_status(status)); in mgmt_disconnect_failed()
8932 cancel_delayed_work(&hdev->power_off); in mgmt_connect_failed()
8933 queue_work(hdev->req_workqueue, &hdev->power_off.work); in mgmt_connect_failed()
8963 cmd->cmd_complete(cmd, mgmt_status(status)); in mgmt_pin_code_reply_complete()
8976 cmd->cmd_complete(cmd, mgmt_status(status)); in mgmt_pin_code_neg_reply_complete()
9019 return -ENOENT; in user_pairing_resp_complete()
9021 cmd->cmd_complete(cmd, mgmt_status(status)); in user_pairing_resp_complete()
9079 bacpy(&ev.addr.bdaddr, &conn->dst); in mgmt_auth_failed()
9080 ev.addr.type = link_to_bdaddr(conn->type, conn->dst_type); in mgmt_auth_failed()
9085 mgmt_event(MGMT_EV_AUTH_FAILED, conn->hdev, &ev, sizeof(ev), in mgmt_auth_failed()
9086 cmd ? cmd->sk : NULL); in mgmt_auth_failed()
9089 cmd->cmd_complete(cmd, status); in mgmt_auth_failed()
9106 if (test_bit(HCI_AUTH, &hdev->flags)) in mgmt_auth_enable_complete()
9123 struct hci_dev *hdev = req->hdev; in clear_eir()
9129 memset(hdev->eir, 0, sizeof(hdev->eir)); in clear_eir()
9193 if (match->sk == NULL) { in sk_lookup()
9194 match->sk = cmd->sk; in sk_lookup()
9195 sock_hold(match->sk); in sk_lookup()
9228 memcpy(ev.short_name, hdev->short_name, HCI_MAX_SHORT_NAME_LENGTH); in mgmt_set_local_name_complete()
9232 memcpy(hdev->dev_name, name, sizeof(hdev->dev_name)); in mgmt_set_local_name_complete()
9242 HCI_MGMT_LOCAL_NAME_EVENTS, cmd ? cmd->sk : NULL); in mgmt_set_local_name_complete()
9243 ext_info_changed(hdev, cmd ? cmd->sk : NULL); in mgmt_set_local_name_complete()
9270 if (eir_len - parsed < field_len + 1) in eir_has_uuids()
9320 hdev->discovery.scan_start + in restart_le_scan()
9321 hdev->discovery.scan_duration)) in restart_le_scan()
9324 queue_delayed_work(hdev->req_workqueue, &hdev->le_scan_restart, in restart_le_scan()
9340 if (hdev->discovery.rssi != HCI_RSSI_INVALID && in is_filter_match()
9342 (rssi < hdev->discovery.rssi && in is_filter_match()
9343 !test_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks)))) in is_filter_match()
9346 if (hdev->discovery.uuid_count != 0) { in is_filter_match()
9350 if (!eir_has_uuids(eir, eir_len, hdev->discovery.uuid_count, in is_filter_match()
9351 hdev->discovery.uuids) && in is_filter_match()
9353 hdev->discovery.uuid_count, in is_filter_match()
9354 hdev->discovery.uuids)) in is_filter_match()
9361 if (test_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks)) { in is_filter_match()
9365 if (hdev->discovery.rssi != HCI_RSSI_INVALID && in is_filter_match()
9366 rssi < hdev->discovery.rssi) in is_filter_match()
9381 /* Don't send events for a non-kernel initiated discovery. With in mgmt_device_found()
9389 list_empty(&hdev->pend_le_reports) && in mgmt_device_found()
9395 if (hdev->discovery.result_filtering) { in mgmt_device_found()
9402 if (hdev->discovery.limited) { in mgmt_device_found()
9430 if (rssi == HCI_RSSI_INVALID && !hdev->discovery.report_invalid_rssi && in mgmt_device_found()
9434 bacpy(&ev->addr.bdaddr, bdaddr); in mgmt_device_found()
9435 ev->addr.type = link_to_bdaddr(link_type, addr_type); in mgmt_device_found()
9436 ev->rssi = rssi; in mgmt_device_found()
9437 ev->flags = cpu_to_le32(flags); in mgmt_device_found()
9441 memcpy(ev->eir, eir, eir_len); in mgmt_device_found()
9443 if (dev_class && !eir_get_data(ev->eir, eir_len, EIR_CLASS_OF_DEV, in mgmt_device_found()
9445 eir_len = eir_append_data(ev->eir, eir_len, EIR_CLASS_OF_DEV, in mgmt_device_found()
9450 memcpy(ev->eir + eir_len, scan_rsp, scan_rsp_len); in mgmt_device_found()
9452 ev->eir_len = cpu_to_le16(eir_len + scan_rsp_len); in mgmt_device_found()
9469 bacpy(&ev->addr.bdaddr, bdaddr); in mgmt_remote_name()
9470 ev->addr.type = link_to_bdaddr(link_type, addr_type); in mgmt_remote_name()
9471 ev->rssi = rssi; in mgmt_remote_name()
9473 eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE, name, in mgmt_remote_name()
9476 ev->eir_len = cpu_to_le16(eir_len); in mgmt_remote_name()
9488 ev.type = hdev->discovery.type; in mgmt_discovering()