Lines Matching refs:hdev
250 static int mgmt_index_event(u16 event, struct hci_dev *hdev, void *data, in mgmt_index_event() argument
253 return mgmt_send_event(event, hdev, HCI_CHANNEL_CONTROL, data, len, in mgmt_index_event()
257 static int mgmt_limited_event(u16 event, struct hci_dev *hdev, void *data, in mgmt_limited_event() argument
260 return mgmt_send_event(event, hdev, HCI_CHANNEL_CONTROL, data, len, in mgmt_limited_event()
264 static int mgmt_event(u16 event, struct hci_dev *hdev, void *data, u16 len, in mgmt_event() argument
267 return mgmt_send_event(event, hdev, HCI_CHANNEL_CONTROL, data, len, in mgmt_event()
287 static int read_version(struct sock *sk, struct hci_dev *hdev, void *data, in read_version() argument
300 static int read_commands(struct sock *sk, struct hci_dev *hdev, void *data, in read_commands() argument
352 static int read_index_list(struct sock *sk, struct hci_dev *hdev, void *data, in read_index_list() argument
412 static int read_unconf_index_list(struct sock *sk, struct hci_dev *hdev, in read_unconf_index_list() argument
472 static int read_ext_index_list(struct sock *sk, struct hci_dev *hdev, in read_ext_index_list() argument
548 static bool is_configured(struct hci_dev *hdev) in is_configured() argument
550 if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) && in is_configured()
551 !hci_dev_test_flag(hdev, HCI_EXT_CONFIGURED)) in is_configured()
554 if (test_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks) && in is_configured()
555 !bacmp(&hdev->public_addr, BDADDR_ANY)) in is_configured()
561 static __le32 get_missing_options(struct hci_dev *hdev) in get_missing_options() argument
565 if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) && in get_missing_options()
566 !hci_dev_test_flag(hdev, HCI_EXT_CONFIGURED)) in get_missing_options()
569 if (test_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks) && in get_missing_options()
570 !bacmp(&hdev->public_addr, BDADDR_ANY)) in get_missing_options()
576 static int new_options(struct hci_dev *hdev, struct sock *skip) in new_options() argument
578 __le32 options = get_missing_options(hdev); in new_options()
580 return mgmt_limited_event(MGMT_EV_NEW_CONFIG_OPTIONS, hdev, &options, in new_options()
584 static int send_options_rsp(struct sock *sk, u16 opcode, struct hci_dev *hdev) in send_options_rsp() argument
586 __le32 options = get_missing_options(hdev); in send_options_rsp()
588 return mgmt_cmd_complete(sk, hdev->id, opcode, 0, &options, in send_options_rsp()
592 static int read_config_info(struct sock *sk, struct hci_dev *hdev, in read_config_info() argument
598 BT_DBG("sock %p %s", sk, hdev->name); in read_config_info()
600 hci_dev_lock(hdev); in read_config_info()
603 rp.manufacturer = cpu_to_le16(hdev->manufacturer); in read_config_info()
605 if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks)) in read_config_info()
608 if (hdev->set_bdaddr) in read_config_info()
612 rp.missing_options = get_missing_options(hdev); in read_config_info()
614 hci_dev_unlock(hdev); in read_config_info()
616 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_CONFIG_INFO, 0, in read_config_info()
620 static u32 get_supported_settings(struct hci_dev *hdev) in get_supported_settings() argument
630 if (lmp_bredr_capable(hdev)) { in get_supported_settings()
631 if (hdev->hci_ver >= BLUETOOTH_VER_1_2) in get_supported_settings()
636 if (lmp_ssp_capable(hdev)) { in get_supported_settings()
641 if (lmp_sc_capable(hdev)) in get_supported_settings()
645 if (lmp_le_capable(hdev)) { in get_supported_settings()
653 if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) || in get_supported_settings()
654 hdev->set_bdaddr) in get_supported_settings()
660 static u32 get_current_settings(struct hci_dev *hdev) in get_current_settings() argument
664 if (hdev_is_powered(hdev)) in get_current_settings()
667 if (hci_dev_test_flag(hdev, HCI_CONNECTABLE)) in get_current_settings()
670 if (hci_dev_test_flag(hdev, HCI_FAST_CONNECTABLE)) in get_current_settings()
673 if (hci_dev_test_flag(hdev, HCI_DISCOVERABLE)) in get_current_settings()
676 if (hci_dev_test_flag(hdev, HCI_BONDABLE)) in get_current_settings()
679 if (hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) in get_current_settings()
682 if (hci_dev_test_flag(hdev, HCI_LE_ENABLED)) in get_current_settings()
685 if (hci_dev_test_flag(hdev, HCI_LINK_SECURITY)) in get_current_settings()
688 if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) in get_current_settings()
691 if (hci_dev_test_flag(hdev, HCI_HS_ENABLED)) in get_current_settings()
694 if (hci_dev_test_flag(hdev, HCI_ADVERTISING)) in get_current_settings()
697 if (hci_dev_test_flag(hdev, HCI_SC_ENABLED)) in get_current_settings()
700 if (hci_dev_test_flag(hdev, HCI_KEEP_DEBUG_KEYS)) in get_current_settings()
703 if (hci_dev_test_flag(hdev, HCI_PRIVACY)) in get_current_settings()
718 if (hci_dev_test_flag(hdev, HCI_FORCE_STATIC_ADDR) || in get_current_settings()
719 !hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) || in get_current_settings()
720 !bacmp(&hdev->bdaddr, BDADDR_ANY)) { in get_current_settings()
721 if (bacmp(&hdev->static_addr, BDADDR_ANY)) in get_current_settings()
728 static struct mgmt_pending_cmd *pending_find(u16 opcode, struct hci_dev *hdev) in pending_find() argument
730 return mgmt_pending_find(HCI_CHANNEL_CONTROL, opcode, hdev); in pending_find()
734 struct hci_dev *hdev, in pending_find_data() argument
737 return mgmt_pending_find_data(HCI_CHANNEL_CONTROL, opcode, hdev, data); in pending_find_data()
740 u8 mgmt_get_adv_discov_flags(struct hci_dev *hdev) in mgmt_get_adv_discov_flags() argument
747 cmd = pending_find(MGMT_OP_SET_DISCOVERABLE, hdev); in mgmt_get_adv_discov_flags()
755 if (hci_dev_test_flag(hdev, HCI_LIMITED_DISCOVERABLE)) in mgmt_get_adv_discov_flags()
757 else if (hci_dev_test_flag(hdev, HCI_DISCOVERABLE)) in mgmt_get_adv_discov_flags()
764 bool mgmt_get_connectable(struct hci_dev *hdev) in mgmt_get_connectable() argument
771 cmd = pending_find(MGMT_OP_SET_CONNECTABLE, hdev); in mgmt_get_connectable()
778 return hci_dev_test_flag(hdev, HCI_CONNECTABLE); in mgmt_get_connectable()
783 struct hci_dev *hdev = container_of(work, struct hci_dev, in service_cache_off() local
787 if (!hci_dev_test_and_clear_flag(hdev, HCI_SERVICE_CACHE)) in service_cache_off()
790 hci_req_init(&req, hdev); in service_cache_off()
792 hci_dev_lock(hdev); in service_cache_off()
797 hci_dev_unlock(hdev); in service_cache_off()
804 struct hci_dev *hdev = container_of(work, struct hci_dev, in rpa_expired() local
810 hci_dev_set_flag(hdev, HCI_RPA_EXPIRED); in rpa_expired()
812 if (!hci_dev_test_flag(hdev, HCI_ADVERTISING)) in rpa_expired()
819 hci_req_init(&req, hdev); in rpa_expired()
824 static void mgmt_init_hdev(struct sock *sk, struct hci_dev *hdev) in mgmt_init_hdev() argument
826 if (hci_dev_test_and_set_flag(hdev, HCI_MGMT)) in mgmt_init_hdev()
829 INIT_DELAYED_WORK(&hdev->service_cache, service_cache_off); in mgmt_init_hdev()
830 INIT_DELAYED_WORK(&hdev->rpa_expired, rpa_expired); in mgmt_init_hdev()
837 hci_dev_clear_flag(hdev, HCI_BONDABLE); in mgmt_init_hdev()
840 static int read_controller_info(struct sock *sk, struct hci_dev *hdev, in read_controller_info() argument
845 BT_DBG("sock %p %s", sk, hdev->name); in read_controller_info()
847 hci_dev_lock(hdev); in read_controller_info()
851 bacpy(&rp.bdaddr, &hdev->bdaddr); in read_controller_info()
853 rp.version = hdev->hci_ver; in read_controller_info()
854 rp.manufacturer = cpu_to_le16(hdev->manufacturer); in read_controller_info()
856 rp.supported_settings = cpu_to_le32(get_supported_settings(hdev)); in read_controller_info()
857 rp.current_settings = cpu_to_le32(get_current_settings(hdev)); in read_controller_info()
859 memcpy(rp.dev_class, hdev->dev_class, 3); in read_controller_info()
861 memcpy(rp.name, hdev->dev_name, sizeof(hdev->dev_name)); in read_controller_info()
862 memcpy(rp.short_name, hdev->short_name, sizeof(hdev->short_name)); in read_controller_info()
864 hci_dev_unlock(hdev); in read_controller_info()
866 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_INFO, 0, &rp, in read_controller_info()
870 static u16 append_eir_data_to_buf(struct hci_dev *hdev, u8 *eir) in append_eir_data_to_buf() argument
875 if (hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) in append_eir_data_to_buf()
877 hdev->dev_class, 3); in append_eir_data_to_buf()
879 if (hci_dev_test_flag(hdev, HCI_LE_ENABLED)) in append_eir_data_to_buf()
881 hdev->appearance); in append_eir_data_to_buf()
883 name_len = strlen(hdev->dev_name); in append_eir_data_to_buf()
885 hdev->dev_name, name_len); in append_eir_data_to_buf()
887 name_len = strlen(hdev->short_name); in append_eir_data_to_buf()
889 hdev->short_name, name_len); in append_eir_data_to_buf()
894 static int read_ext_controller_info(struct sock *sk, struct hci_dev *hdev, in read_ext_controller_info() argument
901 BT_DBG("sock %p %s", sk, hdev->name); in read_ext_controller_info()
905 hci_dev_lock(hdev); in read_ext_controller_info()
907 bacpy(&rp->bdaddr, &hdev->bdaddr); in read_ext_controller_info()
909 rp->version = hdev->hci_ver; in read_ext_controller_info()
910 rp->manufacturer = cpu_to_le16(hdev->manufacturer); in read_ext_controller_info()
912 rp->supported_settings = cpu_to_le32(get_supported_settings(hdev)); in read_ext_controller_info()
913 rp->current_settings = cpu_to_le32(get_current_settings(hdev)); in read_ext_controller_info()
916 eir_len = append_eir_data_to_buf(hdev, rp->eir); in read_ext_controller_info()
919 hci_dev_unlock(hdev); in read_ext_controller_info()
930 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_EXT_INFO, 0, rp, in read_ext_controller_info()
934 static int ext_info_changed(struct hci_dev *hdev, struct sock *skip) in ext_info_changed() argument
942 eir_len = append_eir_data_to_buf(hdev, ev->eir); in ext_info_changed()
945 return mgmt_limited_event(MGMT_EV_EXT_INFO_CHANGED, hdev, ev, in ext_info_changed()
950 static int send_settings_rsp(struct sock *sk, u16 opcode, struct hci_dev *hdev) in send_settings_rsp() argument
952 __le32 settings = cpu_to_le32(get_current_settings(hdev)); in send_settings_rsp()
954 return mgmt_cmd_complete(sk, hdev->id, opcode, 0, &settings, in send_settings_rsp()
958 static void clean_up_hci_complete(struct hci_dev *hdev, u8 status, u16 opcode) in clean_up_hci_complete() argument
960 BT_DBG("%s status 0x%02x", hdev->name, status); in clean_up_hci_complete()
962 if (hci_conn_count(hdev) == 0) { in clean_up_hci_complete()
963 cancel_delayed_work(&hdev->power_off); in clean_up_hci_complete()
964 queue_work(hdev->req_workqueue, &hdev->power_off.work); in clean_up_hci_complete()
968 void mgmt_advertising_added(struct sock *sk, struct hci_dev *hdev, u8 instance) in mgmt_advertising_added() argument
974 mgmt_event(MGMT_EV_ADVERTISING_ADDED, hdev, &ev, sizeof(ev), sk); in mgmt_advertising_added()
977 void mgmt_advertising_removed(struct sock *sk, struct hci_dev *hdev, in mgmt_advertising_removed() argument
984 mgmt_event(MGMT_EV_ADVERTISING_REMOVED, hdev, &ev, sizeof(ev), sk); in mgmt_advertising_removed()
987 static void cancel_adv_timeout(struct hci_dev *hdev) in cancel_adv_timeout() argument
989 if (hdev->adv_instance_timeout) { in cancel_adv_timeout()
990 hdev->adv_instance_timeout = 0; in cancel_adv_timeout()
991 cancel_delayed_work(&hdev->adv_instance_expire); in cancel_adv_timeout()
995 static int clean_up_hci_state(struct hci_dev *hdev) in clean_up_hci_state() argument
1002 hci_req_init(&req, hdev); in clean_up_hci_state()
1004 if (test_bit(HCI_ISCAN, &hdev->flags) || in clean_up_hci_state()
1005 test_bit(HCI_PSCAN, &hdev->flags)) { in clean_up_hci_state()
1010 hci_req_clear_adv_instance(hdev, NULL, NULL, 0x00, false); in clean_up_hci_state()
1012 if (hci_dev_test_flag(hdev, HCI_LE_ADV)) in clean_up_hci_state()
1017 list_for_each_entry(conn, &hdev->conn_hash.list, list) { in clean_up_hci_state()
1024 hci_discovery_set_state(hdev, DISCOVERY_STOPPING); in clean_up_hci_state()
1029 static int set_powered(struct sock *sk, struct hci_dev *hdev, void *data, in set_powered() argument
1036 BT_DBG("request for %s", hdev->name); in set_powered()
1039 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED, in set_powered()
1042 hci_dev_lock(hdev); in set_powered()
1044 if (pending_find(MGMT_OP_SET_POWERED, hdev)) { in set_powered()
1045 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED, in set_powered()
1050 if (!!cp->val == hdev_is_powered(hdev)) { in set_powered()
1051 err = send_settings_rsp(sk, MGMT_OP_SET_POWERED, hdev); in set_powered()
1055 cmd = mgmt_pending_add(sk, MGMT_OP_SET_POWERED, hdev, data, len); in set_powered()
1062 queue_work(hdev->req_workqueue, &hdev->power_on); in set_powered()
1066 err = clean_up_hci_state(hdev); in set_powered()
1068 queue_delayed_work(hdev->req_workqueue, &hdev->power_off, in set_powered()
1073 cancel_delayed_work(&hdev->power_off); in set_powered()
1074 queue_work(hdev->req_workqueue, &hdev->power_off.work); in set_powered()
1080 hci_dev_unlock(hdev); in set_powered()
1084 static int new_settings(struct hci_dev *hdev, struct sock *skip) in new_settings() argument
1086 __le32 ev = cpu_to_le32(get_current_settings(hdev)); in new_settings()
1088 return mgmt_limited_event(MGMT_EV_NEW_SETTINGS, hdev, &ev, in new_settings()
1092 int mgmt_new_settings(struct hci_dev *hdev) in mgmt_new_settings() argument
1094 return new_settings(hdev, NULL); in mgmt_new_settings()
1099 struct hci_dev *hdev; member
1107 send_settings_rsp(cmd->sk, cmd->opcode, match->hdev); in settings_rsp()
1153 static u8 mgmt_bredr_support(struct hci_dev *hdev) in mgmt_bredr_support() argument
1155 if (!lmp_bredr_capable(hdev)) in mgmt_bredr_support()
1157 else if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) in mgmt_bredr_support()
1163 static u8 mgmt_le_support(struct hci_dev *hdev) in mgmt_le_support() argument
1165 if (!lmp_le_capable(hdev)) in mgmt_le_support()
1167 else if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED)) in mgmt_le_support()
1173 void mgmt_set_discoverable_complete(struct hci_dev *hdev, u8 status) in mgmt_set_discoverable_complete() argument
1179 hci_dev_lock(hdev); in mgmt_set_discoverable_complete()
1181 cmd = pending_find(MGMT_OP_SET_DISCOVERABLE, hdev); in mgmt_set_discoverable_complete()
1188 hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE); in mgmt_set_discoverable_complete()
1192 if (hci_dev_test_flag(hdev, HCI_DISCOVERABLE) && in mgmt_set_discoverable_complete()
1193 hdev->discov_timeout > 0) { in mgmt_set_discoverable_complete()
1194 int to = msecs_to_jiffies(hdev->discov_timeout * 1000); in mgmt_set_discoverable_complete()
1195 queue_delayed_work(hdev->req_workqueue, &hdev->discov_off, to); in mgmt_set_discoverable_complete()
1198 send_settings_rsp(cmd->sk, MGMT_OP_SET_DISCOVERABLE, hdev); in mgmt_set_discoverable_complete()
1199 new_settings(hdev, cmd->sk); in mgmt_set_discoverable_complete()
1205 hci_dev_unlock(hdev); in mgmt_set_discoverable_complete()
1208 static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data, in set_discoverable() argument
1216 BT_DBG("request for %s", hdev->name); in set_discoverable()
1218 if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED) && in set_discoverable()
1219 !hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) in set_discoverable()
1220 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1224 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1234 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1237 hci_dev_lock(hdev); in set_discoverable()
1239 if (!hdev_is_powered(hdev) && timeout > 0) { in set_discoverable()
1240 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1245 if (pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) || in set_discoverable()
1246 pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) { in set_discoverable()
1247 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1252 if (!hci_dev_test_flag(hdev, HCI_CONNECTABLE)) { in set_discoverable()
1253 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE, in set_discoverable()
1258 if (!hdev_is_powered(hdev)) { in set_discoverable()
1265 if (!!cp->val != hci_dev_test_flag(hdev, HCI_DISCOVERABLE)) { in set_discoverable()
1266 hci_dev_change_flag(hdev, HCI_DISCOVERABLE); in set_discoverable()
1270 err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev); in set_discoverable()
1275 err = new_settings(hdev, sk); in set_discoverable()
1284 if (!!cp->val == hci_dev_test_flag(hdev, HCI_DISCOVERABLE) && in set_discoverable()
1285 (cp->val == 0x02) == hci_dev_test_flag(hdev, in set_discoverable()
1287 cancel_delayed_work(&hdev->discov_off); in set_discoverable()
1288 hdev->discov_timeout = timeout; in set_discoverable()
1290 if (cp->val && hdev->discov_timeout > 0) { in set_discoverable()
1291 int to = msecs_to_jiffies(hdev->discov_timeout * 1000); in set_discoverable()
1292 queue_delayed_work(hdev->req_workqueue, in set_discoverable()
1293 &hdev->discov_off, to); in set_discoverable()
1296 err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev); in set_discoverable()
1300 cmd = mgmt_pending_add(sk, MGMT_OP_SET_DISCOVERABLE, hdev, data, len); in set_discoverable()
1310 cancel_delayed_work(&hdev->discov_off); in set_discoverable()
1311 hdev->discov_timeout = timeout; in set_discoverable()
1314 hci_dev_set_flag(hdev, HCI_DISCOVERABLE); in set_discoverable()
1316 hci_dev_clear_flag(hdev, HCI_DISCOVERABLE); in set_discoverable()
1320 hci_dev_set_flag(hdev, HCI_LIMITED_DISCOVERABLE); in set_discoverable()
1322 hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE); in set_discoverable()
1324 queue_work(hdev->req_workqueue, &hdev->discoverable_update); in set_discoverable()
1328 hci_dev_unlock(hdev); in set_discoverable()
1332 void mgmt_set_connectable_complete(struct hci_dev *hdev, u8 status) in mgmt_set_connectable_complete() argument
1338 hci_dev_lock(hdev); in mgmt_set_connectable_complete()
1340 cmd = pending_find(MGMT_OP_SET_CONNECTABLE, hdev); in mgmt_set_connectable_complete()
1350 send_settings_rsp(cmd->sk, MGMT_OP_SET_CONNECTABLE, hdev); in mgmt_set_connectable_complete()
1351 new_settings(hdev, cmd->sk); in mgmt_set_connectable_complete()
1357 hci_dev_unlock(hdev); in mgmt_set_connectable_complete()
1360 static int set_connectable_update_settings(struct hci_dev *hdev, in set_connectable_update_settings() argument
1366 if (!!val != hci_dev_test_flag(hdev, HCI_CONNECTABLE)) in set_connectable_update_settings()
1370 hci_dev_set_flag(hdev, HCI_CONNECTABLE); in set_connectable_update_settings()
1372 hci_dev_clear_flag(hdev, HCI_CONNECTABLE); in set_connectable_update_settings()
1373 hci_dev_clear_flag(hdev, HCI_DISCOVERABLE); in set_connectable_update_settings()
1376 err = send_settings_rsp(sk, MGMT_OP_SET_CONNECTABLE, hdev); in set_connectable_update_settings()
1381 hci_req_update_scan(hdev); in set_connectable_update_settings()
1382 hci_update_background_scan(hdev); in set_connectable_update_settings()
1383 return new_settings(hdev, sk); in set_connectable_update_settings()
1389 static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data, in set_connectable() argument
1396 BT_DBG("request for %s", hdev->name); in set_connectable()
1398 if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED) && in set_connectable()
1399 !hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) in set_connectable()
1400 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE, in set_connectable()
1404 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE, in set_connectable()
1407 hci_dev_lock(hdev); in set_connectable()
1409 if (!hdev_is_powered(hdev)) { in set_connectable()
1410 err = set_connectable_update_settings(hdev, sk, cp->val); in set_connectable()
1414 if (pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) || in set_connectable()
1415 pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) { in set_connectable()
1416 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE, in set_connectable()
1421 cmd = mgmt_pending_add(sk, MGMT_OP_SET_CONNECTABLE, hdev, data, len); in set_connectable()
1428 hci_dev_set_flag(hdev, HCI_CONNECTABLE); in set_connectable()
1430 if (hdev->discov_timeout > 0) in set_connectable()
1431 cancel_delayed_work(&hdev->discov_off); in set_connectable()
1433 hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE); in set_connectable()
1434 hci_dev_clear_flag(hdev, HCI_DISCOVERABLE); in set_connectable()
1435 hci_dev_clear_flag(hdev, HCI_CONNECTABLE); in set_connectable()
1438 queue_work(hdev->req_workqueue, &hdev->connectable_update); in set_connectable()
1442 hci_dev_unlock(hdev); in set_connectable()
1446 static int set_bondable(struct sock *sk, struct hci_dev *hdev, void *data, in set_bondable() argument
1453 BT_DBG("request for %s", hdev->name); in set_bondable()
1456 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BONDABLE, in set_bondable()
1459 hci_dev_lock(hdev); in set_bondable()
1462 changed = !hci_dev_test_and_set_flag(hdev, HCI_BONDABLE); in set_bondable()
1464 changed = hci_dev_test_and_clear_flag(hdev, HCI_BONDABLE); in set_bondable()
1466 err = send_settings_rsp(sk, MGMT_OP_SET_BONDABLE, hdev); in set_bondable()
1474 if (hdev_is_powered(hdev) && in set_bondable()
1475 hci_dev_test_flag(hdev, HCI_ADVERTISING) && in set_bondable()
1476 hci_dev_test_flag(hdev, HCI_DISCOVERABLE) && in set_bondable()
1477 hci_dev_test_flag(hdev, HCI_LIMITED_PRIVACY)) in set_bondable()
1478 queue_work(hdev->req_workqueue, in set_bondable()
1479 &hdev->discoverable_update); in set_bondable()
1481 err = new_settings(hdev, sk); in set_bondable()
1485 hci_dev_unlock(hdev); in set_bondable()
1489 static int set_link_security(struct sock *sk, struct hci_dev *hdev, void *data, in set_link_security() argument
1497 BT_DBG("request for %s", hdev->name); in set_link_security()
1499 status = mgmt_bredr_support(hdev); in set_link_security()
1501 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY, in set_link_security()
1505 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY, in set_link_security()
1508 hci_dev_lock(hdev); in set_link_security()
1510 if (!hdev_is_powered(hdev)) { in set_link_security()
1513 if (!!cp->val != hci_dev_test_flag(hdev, HCI_LINK_SECURITY)) { in set_link_security()
1514 hci_dev_change_flag(hdev, HCI_LINK_SECURITY); in set_link_security()
1518 err = send_settings_rsp(sk, MGMT_OP_SET_LINK_SECURITY, hdev); in set_link_security()
1523 err = new_settings(hdev, sk); in set_link_security()
1528 if (pending_find(MGMT_OP_SET_LINK_SECURITY, hdev)) { in set_link_security()
1529 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY, in set_link_security()
1536 if (test_bit(HCI_AUTH, &hdev->flags) == val) { in set_link_security()
1537 err = send_settings_rsp(sk, MGMT_OP_SET_LINK_SECURITY, hdev); in set_link_security()
1541 cmd = mgmt_pending_add(sk, MGMT_OP_SET_LINK_SECURITY, hdev, data, len); in set_link_security()
1547 err = hci_send_cmd(hdev, HCI_OP_WRITE_AUTH_ENABLE, sizeof(val), &val); in set_link_security()
1554 hci_dev_unlock(hdev); in set_link_security()
1558 static int set_ssp(struct sock *sk, struct hci_dev *hdev, void *data, u16 len) in set_ssp() argument
1565 BT_DBG("request for %s", hdev->name); in set_ssp()
1567 status = mgmt_bredr_support(hdev); in set_ssp()
1569 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP, status); in set_ssp()
1571 if (!lmp_ssp_capable(hdev)) in set_ssp()
1572 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP, in set_ssp()
1576 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP, in set_ssp()
1579 hci_dev_lock(hdev); in set_ssp()
1581 if (!hdev_is_powered(hdev)) { in set_ssp()
1585 changed = !hci_dev_test_and_set_flag(hdev, in set_ssp()
1588 changed = hci_dev_test_and_clear_flag(hdev, in set_ssp()
1591 changed = hci_dev_test_and_clear_flag(hdev, in set_ssp()
1594 hci_dev_clear_flag(hdev, HCI_HS_ENABLED); in set_ssp()
1597 err = send_settings_rsp(sk, MGMT_OP_SET_SSP, hdev); in set_ssp()
1602 err = new_settings(hdev, sk); in set_ssp()
1607 if (pending_find(MGMT_OP_SET_SSP, hdev)) { in set_ssp()
1608 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP, in set_ssp()
1613 if (!!cp->val == hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) { in set_ssp()
1614 err = send_settings_rsp(sk, MGMT_OP_SET_SSP, hdev); in set_ssp()
1618 cmd = mgmt_pending_add(sk, MGMT_OP_SET_SSP, hdev, data, len); in set_ssp()
1624 if (!cp->val && hci_dev_test_flag(hdev, HCI_USE_DEBUG_KEYS)) in set_ssp()
1625 hci_send_cmd(hdev, HCI_OP_WRITE_SSP_DEBUG_MODE, in set_ssp()
1628 err = hci_send_cmd(hdev, HCI_OP_WRITE_SSP_MODE, 1, &cp->val); in set_ssp()
1635 hci_dev_unlock(hdev); in set_ssp()
1639 static int set_hs(struct sock *sk, struct hci_dev *hdev, void *data, u16 len) in set_hs() argument
1646 BT_DBG("request for %s", hdev->name); in set_hs()
1648 status = mgmt_bredr_support(hdev); in set_hs()
1650 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, status); in set_hs()
1652 if (!lmp_ssp_capable(hdev)) in set_hs()
1653 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, in set_hs()
1656 if (!hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) in set_hs()
1657 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, in set_hs()
1661 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, in set_hs()
1664 hci_dev_lock(hdev); in set_hs()
1666 if (pending_find(MGMT_OP_SET_SSP, hdev)) { in set_hs()
1667 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, in set_hs()
1673 changed = !hci_dev_test_and_set_flag(hdev, HCI_HS_ENABLED); in set_hs()
1675 if (hdev_is_powered(hdev)) { in set_hs()
1676 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, in set_hs()
1681 changed = hci_dev_test_and_clear_flag(hdev, HCI_HS_ENABLED); in set_hs()
1684 err = send_settings_rsp(sk, MGMT_OP_SET_HS, hdev); in set_hs()
1689 err = new_settings(hdev, sk); in set_hs()
1692 hci_dev_unlock(hdev); in set_hs()
1696 static void le_enable_complete(struct hci_dev *hdev, u8 status, u16 opcode) in le_enable_complete() argument
1698 struct cmd_lookup match = { NULL, hdev }; in le_enable_complete()
1700 hci_dev_lock(hdev); in le_enable_complete()
1705 mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, cmd_status_rsp, in le_enable_complete()
1710 mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, settings_rsp, &match); in le_enable_complete()
1712 new_settings(hdev, match.sk); in le_enable_complete()
1722 if (hci_dev_test_flag(hdev, HCI_LE_ENABLED)) { in le_enable_complete()
1725 hci_req_init(&req, hdev); in le_enable_complete()
1729 hci_update_background_scan(hdev); in le_enable_complete()
1733 hci_dev_unlock(hdev); in le_enable_complete()
1736 static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len) in set_le() argument
1745 BT_DBG("request for %s", hdev->name); in set_le()
1747 if (!lmp_le_capable(hdev)) in set_le()
1748 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE, in set_le()
1752 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE, in set_le()
1764 if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) { in set_le()
1766 return send_settings_rsp(sk, MGMT_OP_SET_LE, hdev); in set_le()
1768 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE, in set_le()
1772 hci_dev_lock(hdev); in set_le()
1775 enabled = lmp_host_le_capable(hdev); in set_le()
1778 hci_req_clear_adv_instance(hdev, NULL, NULL, 0x00, true); in set_le()
1780 if (!hdev_is_powered(hdev) || val == enabled) { in set_le()
1783 if (val != hci_dev_test_flag(hdev, HCI_LE_ENABLED)) { in set_le()
1784 hci_dev_change_flag(hdev, HCI_LE_ENABLED); in set_le()
1788 if (!val && hci_dev_test_flag(hdev, HCI_ADVERTISING)) { in set_le()
1789 hci_dev_clear_flag(hdev, HCI_ADVERTISING); in set_le()
1793 err = send_settings_rsp(sk, MGMT_OP_SET_LE, hdev); in set_le()
1798 err = new_settings(hdev, sk); in set_le()
1803 if (pending_find(MGMT_OP_SET_LE, hdev) || in set_le()
1804 pending_find(MGMT_OP_SET_ADVERTISING, hdev)) { in set_le()
1805 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE, in set_le()
1810 cmd = mgmt_pending_add(sk, MGMT_OP_SET_LE, hdev, data, len); in set_le()
1816 hci_req_init(&req, hdev); in set_le()
1824 if (hci_dev_test_flag(hdev, HCI_LE_ADV)) in set_le()
1836 hci_dev_unlock(hdev); in set_le()
1846 static bool pending_eir_or_class(struct hci_dev *hdev) in pending_eir_or_class() argument
1850 list_for_each_entry(cmd, &hdev->mgmt_pending, list) { in pending_eir_or_class()
1882 static void mgmt_class_complete(struct hci_dev *hdev, u16 mgmt_op, u8 status) in mgmt_class_complete() argument
1886 hci_dev_lock(hdev); in mgmt_class_complete()
1888 cmd = pending_find(mgmt_op, hdev); in mgmt_class_complete()
1893 mgmt_status(status), hdev->dev_class, 3); in mgmt_class_complete()
1898 hci_dev_unlock(hdev); in mgmt_class_complete()
1901 static void add_uuid_complete(struct hci_dev *hdev, u8 status, u16 opcode) in add_uuid_complete() argument
1905 mgmt_class_complete(hdev, MGMT_OP_ADD_UUID, status); in add_uuid_complete()
1908 static int add_uuid(struct sock *sk, struct hci_dev *hdev, void *data, u16 len) in add_uuid() argument
1916 BT_DBG("request for %s", hdev->name); in add_uuid()
1918 hci_dev_lock(hdev); in add_uuid()
1920 if (pending_eir_or_class(hdev)) { in add_uuid()
1921 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_UUID, in add_uuid()
1936 list_add_tail(&uuid->list, &hdev->uuids); in add_uuid()
1938 hci_req_init(&req, hdev); in add_uuid()
1948 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_UUID, 0, in add_uuid()
1949 hdev->dev_class, 3); in add_uuid()
1953 cmd = mgmt_pending_add(sk, MGMT_OP_ADD_UUID, hdev, data, len); in add_uuid()
1962 hci_dev_unlock(hdev); in add_uuid()
1966 static bool enable_service_cache(struct hci_dev *hdev) in enable_service_cache() argument
1968 if (!hdev_is_powered(hdev)) in enable_service_cache()
1971 if (!hci_dev_test_and_set_flag(hdev, HCI_SERVICE_CACHE)) { in enable_service_cache()
1972 queue_delayed_work(hdev->workqueue, &hdev->service_cache, in enable_service_cache()
1980 static void remove_uuid_complete(struct hci_dev *hdev, u8 status, u16 opcode) in remove_uuid_complete() argument
1984 mgmt_class_complete(hdev, MGMT_OP_REMOVE_UUID, status); in remove_uuid_complete()
1987 static int remove_uuid(struct sock *sk, struct hci_dev *hdev, void *data, in remove_uuid() argument
1997 BT_DBG("request for %s", hdev->name); in remove_uuid()
1999 hci_dev_lock(hdev); in remove_uuid()
2001 if (pending_eir_or_class(hdev)) { in remove_uuid()
2002 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID, in remove_uuid()
2008 hci_uuids_clear(hdev); in remove_uuid()
2010 if (enable_service_cache(hdev)) { in remove_uuid()
2011 err = mgmt_cmd_complete(sk, hdev->id, in remove_uuid()
2013 0, hdev->dev_class, 3); in remove_uuid()
2022 list_for_each_entry_safe(match, tmp, &hdev->uuids, list) { in remove_uuid()
2032 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID, in remove_uuid()
2038 hci_req_init(&req, hdev); in remove_uuid()
2048 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_UUID, 0, in remove_uuid()
2049 hdev->dev_class, 3); in remove_uuid()
2053 cmd = mgmt_pending_add(sk, MGMT_OP_REMOVE_UUID, hdev, data, len); in remove_uuid()
2062 hci_dev_unlock(hdev); in remove_uuid()
2066 static void set_class_complete(struct hci_dev *hdev, u8 status, u16 opcode) in set_class_complete() argument
2070 mgmt_class_complete(hdev, MGMT_OP_SET_DEV_CLASS, status); in set_class_complete()
2073 static int set_dev_class(struct sock *sk, struct hci_dev *hdev, void *data, in set_dev_class() argument
2081 BT_DBG("request for %s", hdev->name); in set_dev_class()
2083 if (!lmp_bredr_capable(hdev)) in set_dev_class()
2084 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, in set_dev_class()
2087 hci_dev_lock(hdev); in set_dev_class()
2089 if (pending_eir_or_class(hdev)) { in set_dev_class()
2090 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, in set_dev_class()
2096 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, in set_dev_class()
2101 hdev->major_class = cp->major; in set_dev_class()
2102 hdev->minor_class = cp->minor; in set_dev_class()
2104 if (!hdev_is_powered(hdev)) { in set_dev_class()
2105 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0, in set_dev_class()
2106 hdev->dev_class, 3); in set_dev_class()
2110 hci_req_init(&req, hdev); in set_dev_class()
2112 if (hci_dev_test_and_clear_flag(hdev, HCI_SERVICE_CACHE)) { in set_dev_class()
2113 hci_dev_unlock(hdev); in set_dev_class()
2114 cancel_delayed_work_sync(&hdev->service_cache); in set_dev_class()
2115 hci_dev_lock(hdev); in set_dev_class()
2126 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0, in set_dev_class()
2127 hdev->dev_class, 3); in set_dev_class()
2131 cmd = mgmt_pending_add(sk, MGMT_OP_SET_DEV_CLASS, hdev, data, len); in set_dev_class()
2140 hci_dev_unlock(hdev); in set_dev_class()
2144 static int load_link_keys(struct sock *sk, struct hci_dev *hdev, void *data, in load_link_keys() argument
2154 BT_DBG("request for %s", hdev->name); in load_link_keys()
2156 if (!lmp_bredr_capable(hdev)) in load_link_keys()
2157 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, in load_link_keys()
2164 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, in load_link_keys()
2173 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, in load_link_keys()
2178 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, in load_link_keys()
2181 BT_DBG("%s debug_keys %u key_count %u", hdev->name, cp->debug_keys, in load_link_keys()
2188 return mgmt_cmd_status(sk, hdev->id, in load_link_keys()
2193 hci_dev_lock(hdev); in load_link_keys()
2195 hci_link_keys_clear(hdev); in load_link_keys()
2198 changed = !hci_dev_test_and_set_flag(hdev, HCI_KEEP_DEBUG_KEYS); in load_link_keys()
2200 changed = hci_dev_test_and_clear_flag(hdev, in load_link_keys()
2204 new_settings(hdev, NULL); in load_link_keys()
2215 hci_add_link_key(hdev, NULL, &key->addr.bdaddr, key->val, in load_link_keys()
2219 mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, 0, NULL, 0); in load_link_keys()
2221 hci_dev_unlock(hdev); in load_link_keys()
2226 static int device_unpaired(struct hci_dev *hdev, bdaddr_t *bdaddr, in device_unpaired() argument
2234 return mgmt_event(MGMT_EV_DEVICE_UNPAIRED, hdev, &ev, sizeof(ev), in device_unpaired()
2238 static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data, in unpair_device() argument
2254 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, in unpair_device()
2259 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, in unpair_device()
2263 hci_dev_lock(hdev); in unpair_device()
2265 if (!hdev_is_powered(hdev)) { in unpair_device()
2266 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, in unpair_device()
2281 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, in unpair_device()
2286 err = hci_remove_link_key(hdev, &cp->addr.bdaddr); in unpair_device()
2288 err = mgmt_cmd_complete(sk, hdev->id, in unpair_device()
2301 hci_remove_irk(hdev, &cp->addr.bdaddr, addr_type); in unpair_device()
2303 err = hci_remove_ltk(hdev, &cp->addr.bdaddr, addr_type); in unpair_device()
2305 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, in unpair_device()
2311 conn = hci_conn_hash_lookup_le(hdev, &cp->addr.bdaddr, addr_type); in unpair_device()
2313 hci_conn_params_del(hdev, &cp->addr.bdaddr, addr_type); in unpair_device()
2326 params = hci_conn_params_lookup(hdev, &cp->addr.bdaddr, addr_type); in unpair_device()
2345 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, 0, in unpair_device()
2347 device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, sk); in unpair_device()
2351 cmd = mgmt_pending_add(sk, MGMT_OP_UNPAIR_DEVICE, hdev, cp, in unpair_device()
2365 hci_dev_unlock(hdev); in unpair_device()
2369 static int disconnect(struct sock *sk, struct hci_dev *hdev, void *data, in disconnect() argument
2385 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT, in disconnect()
2389 hci_dev_lock(hdev); in disconnect()
2391 if (!test_bit(HCI_UP, &hdev->flags)) { in disconnect()
2392 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT, in disconnect()
2398 if (pending_find(MGMT_OP_DISCONNECT, hdev)) { in disconnect()
2399 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT, in disconnect()
2405 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, in disconnect()
2408 conn = hci_conn_hash_lookup_le(hdev, &cp->addr.bdaddr, in disconnect()
2412 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT, in disconnect()
2418 cmd = mgmt_pending_add(sk, MGMT_OP_DISCONNECT, hdev, data, len); in disconnect()
2431 hci_dev_unlock(hdev); in disconnect()
2454 static int get_connections(struct sock *sk, struct hci_dev *hdev, void *data, in get_connections() argument
2465 hci_dev_lock(hdev); in get_connections()
2467 if (!hdev_is_powered(hdev)) { in get_connections()
2468 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_GET_CONNECTIONS, in get_connections()
2474 list_for_each_entry(c, &hdev->conn_hash.list, list) { in get_connections()
2487 list_for_each_entry(c, &hdev->conn_hash.list, list) { in get_connections()
2502 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONNECTIONS, 0, rp, in get_connections()
2508 hci_dev_unlock(hdev); in get_connections()
2512 static int send_pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev, in send_pin_code_neg_reply() argument
2518 cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_NEG_REPLY, hdev, cp, in send_pin_code_neg_reply()
2525 err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY, in send_pin_code_neg_reply()
2533 static int pin_code_reply(struct sock *sk, struct hci_dev *hdev, void *data, in pin_code_reply() argument
2544 hci_dev_lock(hdev); in pin_code_reply()
2546 if (!hdev_is_powered(hdev)) { in pin_code_reply()
2547 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY, in pin_code_reply()
2552 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->addr.bdaddr); in pin_code_reply()
2554 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY, in pin_code_reply()
2566 err = send_pin_code_neg_reply(sk, hdev, &ncp); in pin_code_reply()
2568 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY, in pin_code_reply()
2574 cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_REPLY, hdev, data, len); in pin_code_reply()
2586 err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_REPLY, sizeof(reply), &reply); in pin_code_reply()
2591 hci_dev_unlock(hdev); in pin_code_reply()
2595 static int set_io_capability(struct sock *sk, struct hci_dev *hdev, void *data, in set_io_capability() argument
2603 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_IO_CAPABILITY, in set_io_capability()
2606 hci_dev_lock(hdev); in set_io_capability()
2608 hdev->io_capability = cp->io_capability; in set_io_capability()
2610 BT_DBG("%s IO capability set to 0x%02x", hdev->name, in set_io_capability()
2611 hdev->io_capability); in set_io_capability()
2613 hci_dev_unlock(hdev); in set_io_capability()
2615 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_IO_CAPABILITY, 0, in set_io_capability()
2621 struct hci_dev *hdev = conn->hdev; in find_pairing() local
2624 list_for_each_entry(cmd, &hdev->mgmt_pending, list) { in find_pairing()
2713 static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data, in pair_device() argument
2730 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE, in pair_device()
2735 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE, in pair_device()
2739 hci_dev_lock(hdev); in pair_device()
2741 if (!hdev_is_powered(hdev)) { in pair_device()
2742 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE, in pair_device()
2748 if (hci_bdaddr_is_paired(hdev, &cp->addr.bdaddr, cp->addr.type)) { in pair_device()
2749 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE, in pair_device()
2759 conn = hci_connect_acl(hdev, &cp->addr.bdaddr, sec_level, in pair_device()
2774 p = hci_conn_params_add(hdev, &cp->addr.bdaddr, addr_type); in pair_device()
2779 conn = hci_connect_le_scan(hdev, &cp->addr.bdaddr, in pair_device()
2796 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE, in pair_device()
2803 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE, in pair_device()
2808 cmd = mgmt_pending_add(sk, MGMT_OP_PAIR_DEVICE, hdev, data, len); in pair_device()
2840 hci_dev_unlock(hdev); in pair_device()
2844 static int cancel_pair_device(struct sock *sk, struct hci_dev *hdev, void *data, in cancel_pair_device() argument
2854 hci_dev_lock(hdev); in cancel_pair_device()
2856 if (!hdev_is_powered(hdev)) { in cancel_pair_device()
2857 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, in cancel_pair_device()
2862 cmd = pending_find(MGMT_OP_PAIR_DEVICE, hdev); in cancel_pair_device()
2864 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, in cancel_pair_device()
2872 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, in cancel_pair_device()
2880 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, 0, in cancel_pair_device()
2883 hci_dev_unlock(hdev); in cancel_pair_device()
2887 static int user_pairing_resp(struct sock *sk, struct hci_dev *hdev, in user_pairing_resp() argument
2895 hci_dev_lock(hdev); in user_pairing_resp()
2897 if (!hdev_is_powered(hdev)) { in user_pairing_resp()
2898 err = mgmt_cmd_complete(sk, hdev->id, mgmt_op, in user_pairing_resp()
2905 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &addr->bdaddr); in user_pairing_resp()
2907 conn = hci_conn_hash_lookup_le(hdev, &addr->bdaddr, in user_pairing_resp()
2911 err = mgmt_cmd_complete(sk, hdev->id, mgmt_op, in user_pairing_resp()
2920 err = mgmt_cmd_complete(sk, hdev->id, mgmt_op, in user_pairing_resp()
2924 err = mgmt_cmd_complete(sk, hdev->id, mgmt_op, in user_pairing_resp()
2931 cmd = mgmt_pending_add(sk, mgmt_op, hdev, addr, sizeof(*addr)); in user_pairing_resp()
2945 err = hci_send_cmd(hdev, hci_op, sizeof(cp), &cp); in user_pairing_resp()
2947 err = hci_send_cmd(hdev, hci_op, sizeof(addr->bdaddr), in user_pairing_resp()
2954 hci_dev_unlock(hdev); in user_pairing_resp()
2958 static int pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev, in pin_code_neg_reply() argument
2965 return user_pairing_resp(sk, hdev, &cp->addr, in pin_code_neg_reply()
2970 static int user_confirm_reply(struct sock *sk, struct hci_dev *hdev, void *data, in user_confirm_reply() argument
2978 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_USER_CONFIRM_REPLY, in user_confirm_reply()
2981 return user_pairing_resp(sk, hdev, &cp->addr, in user_confirm_reply()
2986 static int user_confirm_neg_reply(struct sock *sk, struct hci_dev *hdev, in user_confirm_neg_reply() argument
2993 return user_pairing_resp(sk, hdev, &cp->addr, in user_confirm_neg_reply()
2998 static int user_passkey_reply(struct sock *sk, struct hci_dev *hdev, void *data, in user_passkey_reply() argument
3005 return user_pairing_resp(sk, hdev, &cp->addr, in user_passkey_reply()
3010 static int user_passkey_neg_reply(struct sock *sk, struct hci_dev *hdev, in user_passkey_neg_reply() argument
3017 return user_pairing_resp(sk, hdev, &cp->addr, in user_passkey_neg_reply()
3022 static void adv_expire(struct hci_dev *hdev, u32 flags) in adv_expire() argument
3028 adv_instance = hci_find_adv_instance(hdev, hdev->cur_adv_instance); in adv_expire()
3036 cancel_adv_timeout(hdev); in adv_expire()
3038 adv_instance = hci_get_next_instance(hdev, adv_instance->instance); in adv_expire()
3042 hci_req_init(&req, hdev); in adv_expire()
3051 static void set_name_complete(struct hci_dev *hdev, u8 status, u16 opcode) in set_name_complete() argument
3058 hci_dev_lock(hdev); in set_name_complete()
3060 cmd = pending_find(MGMT_OP_SET_LOCAL_NAME, hdev); in set_name_complete()
3067 mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, in set_name_complete()
3070 mgmt_cmd_complete(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0, in set_name_complete()
3073 if (hci_dev_test_flag(hdev, HCI_LE_ADV)) in set_name_complete()
3074 adv_expire(hdev, MGMT_ADV_FLAG_LOCAL_NAME); in set_name_complete()
3080 hci_dev_unlock(hdev); in set_name_complete()
3083 static int set_local_name(struct sock *sk, struct hci_dev *hdev, void *data, in set_local_name() argument
3093 hci_dev_lock(hdev); in set_local_name()
3098 if (!memcmp(hdev->dev_name, cp->name, sizeof(hdev->dev_name)) && in set_local_name()
3099 !memcmp(hdev->short_name, cp->short_name, in set_local_name()
3100 sizeof(hdev->short_name))) { in set_local_name()
3101 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0, in set_local_name()
3106 memcpy(hdev->short_name, cp->short_name, sizeof(hdev->short_name)); in set_local_name()
3108 if (!hdev_is_powered(hdev)) { in set_local_name()
3109 memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name)); in set_local_name()
3111 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0, in set_local_name()
3116 err = mgmt_limited_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, data, in set_local_name()
3118 ext_info_changed(hdev, sk); in set_local_name()
3123 cmd = mgmt_pending_add(sk, MGMT_OP_SET_LOCAL_NAME, hdev, data, len); in set_local_name()
3129 memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name)); in set_local_name()
3131 hci_req_init(&req, hdev); in set_local_name()
3133 if (lmp_bredr_capable(hdev)) { in set_local_name()
3141 if (lmp_le_capable(hdev) && hci_dev_test_flag(hdev, HCI_ADVERTISING)) in set_local_name()
3142 __hci_req_update_scan_rsp_data(&req, hdev->cur_adv_instance); in set_local_name()
3149 hci_dev_unlock(hdev); in set_local_name()
3153 static int set_appearance(struct sock *sk, struct hci_dev *hdev, void *data, in set_appearance() argument
3162 if (!lmp_le_capable(hdev)) in set_appearance()
3163 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_APPEARANCE, in set_appearance()
3168 hci_dev_lock(hdev); in set_appearance()
3170 if (hdev->appearance != apperance) { in set_appearance()
3171 hdev->appearance = apperance; in set_appearance()
3173 if (hci_dev_test_flag(hdev, HCI_LE_ADV)) in set_appearance()
3174 adv_expire(hdev, MGMT_ADV_FLAG_APPEARANCE); in set_appearance()
3176 ext_info_changed(hdev, sk); in set_appearance()
3179 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_APPEARANCE, 0, NULL, in set_appearance()
3182 hci_dev_unlock(hdev); in set_appearance()
3187 static void read_local_oob_data_complete(struct hci_dev *hdev, u8 status, in read_local_oob_data_complete() argument
3194 BT_DBG("%s status %u", hdev->name, status); in read_local_oob_data_complete()
3196 cmd = pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev); in read_local_oob_data_complete()
3201 mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA, in read_local_oob_data_complete()
3212 mgmt_cmd_status(cmd->sk, hdev->id, in read_local_oob_data_complete()
3226 mgmt_cmd_status(cmd->sk, hdev->id, in read_local_oob_data_complete()
3239 mgmt_cmd_complete(cmd->sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA, in read_local_oob_data_complete()
3246 static int read_local_oob_data(struct sock *sk, struct hci_dev *hdev, in read_local_oob_data() argument
3253 BT_DBG("%s", hdev->name); in read_local_oob_data()
3255 hci_dev_lock(hdev); in read_local_oob_data()
3257 if (!hdev_is_powered(hdev)) { in read_local_oob_data()
3258 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA, in read_local_oob_data()
3263 if (!lmp_ssp_capable(hdev)) { in read_local_oob_data()
3264 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA, in read_local_oob_data()
3269 if (pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev)) { in read_local_oob_data()
3270 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA, in read_local_oob_data()
3275 cmd = mgmt_pending_add(sk, MGMT_OP_READ_LOCAL_OOB_DATA, hdev, NULL, 0); in read_local_oob_data()
3281 hci_req_init(&req, hdev); in read_local_oob_data()
3283 if (bredr_sc_enabled(hdev)) in read_local_oob_data()
3293 hci_dev_unlock(hdev); in read_local_oob_data()
3297 static int add_remote_oob_data(struct sock *sk, struct hci_dev *hdev, in add_remote_oob_data() argument
3303 BT_DBG("%s ", hdev->name); in add_remote_oob_data()
3306 return mgmt_cmd_complete(sk, hdev->id, in add_remote_oob_data()
3311 hci_dev_lock(hdev); in add_remote_oob_data()
3318 err = mgmt_cmd_complete(sk, hdev->id, in add_remote_oob_data()
3325 err = hci_add_remote_oob_data(hdev, &cp->addr.bdaddr, in add_remote_oob_data()
3333 err = mgmt_cmd_complete(sk, hdev->id, in add_remote_oob_data()
3347 err = mgmt_cmd_complete(sk, hdev->id, in add_remote_oob_data()
3382 err = hci_add_remote_oob_data(hdev, &cp->addr.bdaddr, in add_remote_oob_data()
3390 err = mgmt_cmd_complete(sk, hdev->id, in add_remote_oob_data()
3395 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_REMOTE_OOB_DATA, in add_remote_oob_data()
3400 hci_dev_unlock(hdev); in add_remote_oob_data()
3404 static int remove_remote_oob_data(struct sock *sk, struct hci_dev *hdev, in remove_remote_oob_data() argument
3411 BT_DBG("%s", hdev->name); in remove_remote_oob_data()
3414 return mgmt_cmd_complete(sk, hdev->id, in remove_remote_oob_data()
3419 hci_dev_lock(hdev); in remove_remote_oob_data()
3422 hci_remote_oob_data_clear(hdev); in remove_remote_oob_data()
3427 err = hci_remove_remote_oob_data(hdev, &cp->addr.bdaddr, cp->addr.type); in remove_remote_oob_data()
3434 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_REMOTE_OOB_DATA, in remove_remote_oob_data()
3437 hci_dev_unlock(hdev); in remove_remote_oob_data()
3441 void mgmt_start_discovery_complete(struct hci_dev *hdev, u8 status) in mgmt_start_discovery_complete() argument
3447 hci_dev_lock(hdev); in mgmt_start_discovery_complete()
3449 cmd = pending_find(MGMT_OP_START_DISCOVERY, hdev); in mgmt_start_discovery_complete()
3451 cmd = pending_find(MGMT_OP_START_SERVICE_DISCOVERY, hdev); in mgmt_start_discovery_complete()
3454 cmd = pending_find(MGMT_OP_START_LIMITED_DISCOVERY, hdev); in mgmt_start_discovery_complete()
3461 hci_dev_unlock(hdev); in mgmt_start_discovery_complete()
3464 static bool discovery_type_is_valid(struct hci_dev *hdev, uint8_t type, in discovery_type_is_valid() argument
3469 *mgmt_status = mgmt_le_support(hdev); in discovery_type_is_valid()
3474 *mgmt_status = mgmt_le_support(hdev); in discovery_type_is_valid()
3479 *mgmt_status = mgmt_bredr_support(hdev); in discovery_type_is_valid()
3491 static int start_discovery_internal(struct sock *sk, struct hci_dev *hdev, in start_discovery_internal() argument
3499 BT_DBG("%s", hdev->name); in start_discovery_internal()
3501 hci_dev_lock(hdev); in start_discovery_internal()
3503 if (!hdev_is_powered(hdev)) { in start_discovery_internal()
3504 err = mgmt_cmd_complete(sk, hdev->id, op, in start_discovery_internal()
3510 if (hdev->discovery.state != DISCOVERY_STOPPED || in start_discovery_internal()
3511 hci_dev_test_flag(hdev, HCI_PERIODIC_INQ)) { in start_discovery_internal()
3512 err = mgmt_cmd_complete(sk, hdev->id, op, MGMT_STATUS_BUSY, in start_discovery_internal()
3517 if (!discovery_type_is_valid(hdev, cp->type, &status)) { in start_discovery_internal()
3518 err = mgmt_cmd_complete(sk, hdev->id, op, status, in start_discovery_internal()
3526 hci_discovery_filter_clear(hdev); in start_discovery_internal()
3528 hdev->discovery.type = cp->type; in start_discovery_internal()
3529 hdev->discovery.report_invalid_rssi = false; in start_discovery_internal()
3531 hdev->discovery.limited = true; in start_discovery_internal()
3533 hdev->discovery.limited = false; in start_discovery_internal()
3535 cmd = mgmt_pending_add(sk, op, hdev, data, len); in start_discovery_internal()
3543 hci_discovery_set_state(hdev, DISCOVERY_STARTING); in start_discovery_internal()
3544 queue_work(hdev->req_workqueue, &hdev->discov_update); in start_discovery_internal()
3548 hci_dev_unlock(hdev); in start_discovery_internal()
3552 static int start_discovery(struct sock *sk, struct hci_dev *hdev, in start_discovery() argument
3555 return start_discovery_internal(sk, hdev, MGMT_OP_START_DISCOVERY, in start_discovery()
3559 static int start_limited_discovery(struct sock *sk, struct hci_dev *hdev, in start_limited_discovery() argument
3562 return start_discovery_internal(sk, hdev, in start_limited_discovery()
3574 static int start_service_discovery(struct sock *sk, struct hci_dev *hdev, in start_service_discovery() argument
3584 BT_DBG("%s", hdev->name); in start_service_discovery()
3586 hci_dev_lock(hdev); in start_service_discovery()
3588 if (!hdev_is_powered(hdev)) { in start_service_discovery()
3589 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
3596 if (hdev->discovery.state != DISCOVERY_STOPPED || in start_service_discovery()
3597 hci_dev_test_flag(hdev, HCI_PERIODIC_INQ)) { in start_service_discovery()
3598 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
3609 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
3620 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
3627 if (!discovery_type_is_valid(hdev, cp->type, &status)) { in start_service_discovery()
3628 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
3635 hdev, data, len); in start_service_discovery()
3646 hci_discovery_filter_clear(hdev); in start_service_discovery()
3648 hdev->discovery.result_filtering = true; in start_service_discovery()
3649 hdev->discovery.type = cp->type; in start_service_discovery()
3650 hdev->discovery.rssi = cp->rssi; in start_service_discovery()
3651 hdev->discovery.uuid_count = uuid_count; in start_service_discovery()
3654 hdev->discovery.uuids = kmemdup(cp->uuids, uuid_count * 16, in start_service_discovery()
3656 if (!hdev->discovery.uuids) { in start_service_discovery()
3657 err = mgmt_cmd_complete(sk, hdev->id, in start_service_discovery()
3666 hci_discovery_set_state(hdev, DISCOVERY_STARTING); in start_service_discovery()
3667 queue_work(hdev->req_workqueue, &hdev->discov_update); in start_service_discovery()
3671 hci_dev_unlock(hdev); in start_service_discovery()
3675 void mgmt_stop_discovery_complete(struct hci_dev *hdev, u8 status) in mgmt_stop_discovery_complete() argument
3681 hci_dev_lock(hdev); in mgmt_stop_discovery_complete()
3683 cmd = pending_find(MGMT_OP_STOP_DISCOVERY, hdev); in mgmt_stop_discovery_complete()
3689 hci_dev_unlock(hdev); in mgmt_stop_discovery_complete()
3692 static int stop_discovery(struct sock *sk, struct hci_dev *hdev, void *data, in stop_discovery() argument
3699 BT_DBG("%s", hdev->name); in stop_discovery()
3701 hci_dev_lock(hdev); in stop_discovery()
3703 if (!hci_discovery_active(hdev)) { in stop_discovery()
3704 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY, in stop_discovery()
3710 if (hdev->discovery.type != mgmt_cp->type) { in stop_discovery()
3711 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY, in stop_discovery()
3717 cmd = mgmt_pending_add(sk, MGMT_OP_STOP_DISCOVERY, hdev, data, len); in stop_discovery()
3725 hci_discovery_set_state(hdev, DISCOVERY_STOPPING); in stop_discovery()
3726 queue_work(hdev->req_workqueue, &hdev->discov_update); in stop_discovery()
3730 hci_dev_unlock(hdev); in stop_discovery()
3734 static int confirm_name(struct sock *sk, struct hci_dev *hdev, void *data, in confirm_name() argument
3741 BT_DBG("%s", hdev->name); in confirm_name()
3743 hci_dev_lock(hdev); in confirm_name()
3745 if (!hci_discovery_active(hdev)) { in confirm_name()
3746 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME, in confirm_name()
3752 e = hci_inquiry_cache_lookup_unknown(hdev, &cp->addr.bdaddr); in confirm_name()
3754 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME, in confirm_name()
3765 hci_inquiry_cache_update_resolve(hdev, e); in confirm_name()
3768 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME, 0, in confirm_name()
3772 hci_dev_unlock(hdev); in confirm_name()
3776 static int block_device(struct sock *sk, struct hci_dev *hdev, void *data, in block_device() argument
3783 BT_DBG("%s", hdev->name); in block_device()
3786 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE, in block_device()
3790 hci_dev_lock(hdev); in block_device()
3792 err = hci_bdaddr_list_add(&hdev->blacklist, &cp->addr.bdaddr, in block_device()
3799 mgmt_event(MGMT_EV_DEVICE_BLOCKED, hdev, &cp->addr, sizeof(cp->addr), in block_device()
3804 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE, status, in block_device()
3807 hci_dev_unlock(hdev); in block_device()
3812 static int unblock_device(struct sock *sk, struct hci_dev *hdev, void *data, in unblock_device() argument
3819 BT_DBG("%s", hdev->name); in unblock_device()
3822 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE, in unblock_device()
3826 hci_dev_lock(hdev); in unblock_device()
3828 err = hci_bdaddr_list_del(&hdev->blacklist, &cp->addr.bdaddr, in unblock_device()
3835 mgmt_event(MGMT_EV_DEVICE_UNBLOCKED, hdev, &cp->addr, sizeof(cp->addr), in unblock_device()
3840 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE, status, in unblock_device()
3843 hci_dev_unlock(hdev); in unblock_device()
3848 static int set_device_id(struct sock *sk, struct hci_dev *hdev, void *data, in set_device_id() argument
3856 BT_DBG("%s", hdev->name); in set_device_id()
3861 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEVICE_ID, in set_device_id()
3864 hci_dev_lock(hdev); in set_device_id()
3866 hdev->devid_source = source; in set_device_id()
3867 hdev->devid_vendor = __le16_to_cpu(cp->vendor); in set_device_id()
3868 hdev->devid_product = __le16_to_cpu(cp->product); in set_device_id()
3869 hdev->devid_version = __le16_to_cpu(cp->version); in set_device_id()
3871 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_DEVICE_ID, 0, in set_device_id()
3874 hci_req_init(&req, hdev); in set_device_id()
3878 hci_dev_unlock(hdev); in set_device_id()
3883 static void enable_advertising_instance(struct hci_dev *hdev, u8 status, in enable_advertising_instance() argument
3889 static void set_advertising_complete(struct hci_dev *hdev, u8 status, in set_advertising_complete() argument
3892 struct cmd_lookup match = { NULL, hdev }; in set_advertising_complete()
3898 hci_dev_lock(hdev); in set_advertising_complete()
3903 mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev, in set_advertising_complete()
3908 if (hci_dev_test_flag(hdev, HCI_LE_ADV)) in set_advertising_complete()
3909 hci_dev_set_flag(hdev, HCI_ADVERTISING); in set_advertising_complete()
3911 hci_dev_clear_flag(hdev, HCI_ADVERTISING); in set_advertising_complete()
3913 mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev, settings_rsp, in set_advertising_complete()
3916 new_settings(hdev, match.sk); in set_advertising_complete()
3924 if (hci_dev_test_flag(hdev, HCI_ADVERTISING) || in set_advertising_complete()
3925 list_empty(&hdev->adv_instances)) in set_advertising_complete()
3928 instance = hdev->cur_adv_instance; in set_advertising_complete()
3930 adv_instance = list_first_entry_or_null(&hdev->adv_instances, in set_advertising_complete()
3938 hci_req_init(&req, hdev); in set_advertising_complete()
3949 hci_dev_unlock(hdev); in set_advertising_complete()
3952 static int set_advertising(struct sock *sk, struct hci_dev *hdev, void *data, in set_advertising() argument
3961 BT_DBG("request for %s", hdev->name); in set_advertising()
3963 status = mgmt_le_support(hdev); in set_advertising()
3965 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING, in set_advertising()
3969 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING, in set_advertising()
3972 hci_dev_lock(hdev); in set_advertising()
3981 if (!hdev_is_powered(hdev) || in set_advertising()
3982 (val == hci_dev_test_flag(hdev, HCI_ADVERTISING) && in set_advertising()
3983 (cp->val == 0x02) == hci_dev_test_flag(hdev, HCI_ADVERTISING_CONNECTABLE)) || in set_advertising()
3984 hci_conn_num(hdev, LE_LINK) > 0 || in set_advertising()
3985 (hci_dev_test_flag(hdev, HCI_LE_SCAN) && in set_advertising()
3986 hdev->le_scan_type == LE_SCAN_ACTIVE)) { in set_advertising()
3990 hdev->cur_adv_instance = 0x00; in set_advertising()
3991 changed = !hci_dev_test_and_set_flag(hdev, HCI_ADVERTISING); in set_advertising()
3993 hci_dev_set_flag(hdev, HCI_ADVERTISING_CONNECTABLE); in set_advertising()
3995 hci_dev_clear_flag(hdev, HCI_ADVERTISING_CONNECTABLE); in set_advertising()
3997 changed = hci_dev_test_and_clear_flag(hdev, HCI_ADVERTISING); in set_advertising()
3998 hci_dev_clear_flag(hdev, HCI_ADVERTISING_CONNECTABLE); in set_advertising()
4001 err = send_settings_rsp(sk, MGMT_OP_SET_ADVERTISING, hdev); in set_advertising()
4006 err = new_settings(hdev, sk); in set_advertising()
4011 if (pending_find(MGMT_OP_SET_ADVERTISING, hdev) || in set_advertising()
4012 pending_find(MGMT_OP_SET_LE, hdev)) { in set_advertising()
4013 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING, in set_advertising()
4018 cmd = mgmt_pending_add(sk, MGMT_OP_SET_ADVERTISING, hdev, data, len); in set_advertising()
4024 hci_req_init(&req, hdev); in set_advertising()
4027 hci_dev_set_flag(hdev, HCI_ADVERTISING_CONNECTABLE); in set_advertising()
4029 hci_dev_clear_flag(hdev, HCI_ADVERTISING_CONNECTABLE); in set_advertising()
4031 cancel_adv_timeout(hdev); in set_advertising()
4038 hdev->cur_adv_instance = 0x00; in set_advertising()
4051 hci_dev_unlock(hdev); in set_advertising()
4055 static int set_static_address(struct sock *sk, struct hci_dev *hdev, in set_static_address() argument
4061 BT_DBG("%s", hdev->name); in set_static_address()
4063 if (!lmp_le_capable(hdev)) in set_static_address()
4064 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_STATIC_ADDRESS, in set_static_address()
4067 if (hdev_is_powered(hdev)) in set_static_address()
4068 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_STATIC_ADDRESS, in set_static_address()
4073 return mgmt_cmd_status(sk, hdev->id, in set_static_address()
4079 return mgmt_cmd_status(sk, hdev->id, in set_static_address()
4084 hci_dev_lock(hdev); in set_static_address()
4086 bacpy(&hdev->static_addr, &cp->bdaddr); in set_static_address()
4088 err = send_settings_rsp(sk, MGMT_OP_SET_STATIC_ADDRESS, hdev); in set_static_address()
4092 err = new_settings(hdev, sk); in set_static_address()
4095 hci_dev_unlock(hdev); in set_static_address()
4099 static int set_scan_params(struct sock *sk, struct hci_dev *hdev, in set_scan_params() argument
4106 BT_DBG("%s", hdev->name); in set_scan_params()
4108 if (!lmp_le_capable(hdev)) in set_scan_params()
4109 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, in set_scan_params()
4115 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, in set_scan_params()
4121 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, in set_scan_params()
4125 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, in set_scan_params()
4128 hci_dev_lock(hdev); in set_scan_params()
4130 hdev->le_scan_interval = interval; in set_scan_params()
4131 hdev->le_scan_window = window; in set_scan_params()
4133 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, 0, in set_scan_params()
4139 if (hci_dev_test_flag(hdev, HCI_LE_SCAN) && in set_scan_params()
4140 hdev->discovery.state == DISCOVERY_STOPPED) { in set_scan_params()
4143 hci_req_init(&req, hdev); in set_scan_params()
4151 hci_dev_unlock(hdev); in set_scan_params()
4156 static void fast_connectable_complete(struct hci_dev *hdev, u8 status, in fast_connectable_complete() argument
4163 hci_dev_lock(hdev); in fast_connectable_complete()
4165 cmd = pending_find(MGMT_OP_SET_FAST_CONNECTABLE, hdev); in fast_connectable_complete()
4170 mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE, in fast_connectable_complete()
4176 hci_dev_set_flag(hdev, HCI_FAST_CONNECTABLE); in fast_connectable_complete()
4178 hci_dev_clear_flag(hdev, HCI_FAST_CONNECTABLE); in fast_connectable_complete()
4180 send_settings_rsp(cmd->sk, MGMT_OP_SET_FAST_CONNECTABLE, hdev); in fast_connectable_complete()
4181 new_settings(hdev, cmd->sk); in fast_connectable_complete()
4187 hci_dev_unlock(hdev); in fast_connectable_complete()
4190 static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev, in set_fast_connectable() argument
4198 BT_DBG("%s", hdev->name); in set_fast_connectable()
4200 if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) || in set_fast_connectable()
4201 hdev->hci_ver < BLUETOOTH_VER_1_2) in set_fast_connectable()
4202 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE, in set_fast_connectable()
4206 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE, in set_fast_connectable()
4209 hci_dev_lock(hdev); in set_fast_connectable()
4211 if (pending_find(MGMT_OP_SET_FAST_CONNECTABLE, hdev)) { in set_fast_connectable()
4212 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE, in set_fast_connectable()
4217 if (!!cp->val == hci_dev_test_flag(hdev, HCI_FAST_CONNECTABLE)) { in set_fast_connectable()
4219 hdev); in set_fast_connectable()
4223 if (!hdev_is_powered(hdev)) { in set_fast_connectable()
4224 hci_dev_change_flag(hdev, HCI_FAST_CONNECTABLE); in set_fast_connectable()
4226 hdev); in set_fast_connectable()
4227 new_settings(hdev, sk); in set_fast_connectable()
4231 cmd = mgmt_pending_add(sk, MGMT_OP_SET_FAST_CONNECTABLE, hdev, in set_fast_connectable()
4238 hci_req_init(&req, hdev); in set_fast_connectable()
4244 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE, in set_fast_connectable()
4250 hci_dev_unlock(hdev); in set_fast_connectable()
4255 static void set_bredr_complete(struct hci_dev *hdev, u8 status, u16 opcode) in set_bredr_complete() argument
4261 hci_dev_lock(hdev); in set_bredr_complete()
4263 cmd = pending_find(MGMT_OP_SET_BREDR, hdev); in set_bredr_complete()
4273 hci_dev_clear_flag(hdev, HCI_BREDR_ENABLED); in set_bredr_complete()
4277 send_settings_rsp(cmd->sk, MGMT_OP_SET_BREDR, hdev); in set_bredr_complete()
4278 new_settings(hdev, cmd->sk); in set_bredr_complete()
4284 hci_dev_unlock(hdev); in set_bredr_complete()
4287 static int set_bredr(struct sock *sk, struct hci_dev *hdev, void *data, u16 len) in set_bredr() argument
4294 BT_DBG("request for %s", hdev->name); in set_bredr()
4296 if (!lmp_bredr_capable(hdev) || !lmp_le_capable(hdev)) in set_bredr()
4297 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, in set_bredr()
4300 if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED)) in set_bredr()
4301 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, in set_bredr()
4305 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, in set_bredr()
4308 hci_dev_lock(hdev); in set_bredr()
4310 if (cp->val == hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) { in set_bredr()
4311 err = send_settings_rsp(sk, MGMT_OP_SET_BREDR, hdev); in set_bredr()
4315 if (!hdev_is_powered(hdev)) { in set_bredr()
4317 hci_dev_clear_flag(hdev, HCI_DISCOVERABLE); in set_bredr()
4318 hci_dev_clear_flag(hdev, HCI_SSP_ENABLED); in set_bredr()
4319 hci_dev_clear_flag(hdev, HCI_LINK_SECURITY); in set_bredr()
4320 hci_dev_clear_flag(hdev, HCI_FAST_CONNECTABLE); in set_bredr()
4321 hci_dev_clear_flag(hdev, HCI_HS_ENABLED); in set_bredr()
4324 hci_dev_change_flag(hdev, HCI_BREDR_ENABLED); in set_bredr()
4326 err = send_settings_rsp(sk, MGMT_OP_SET_BREDR, hdev); in set_bredr()
4330 err = new_settings(hdev, sk); in set_bredr()
4336 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, in set_bredr()
4354 if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) && in set_bredr()
4355 (bacmp(&hdev->static_addr, BDADDR_ANY) || in set_bredr()
4356 hci_dev_test_flag(hdev, HCI_SC_ENABLED))) { in set_bredr()
4357 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, in set_bredr()
4363 if (pending_find(MGMT_OP_SET_BREDR, hdev)) { in set_bredr()
4364 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR, in set_bredr()
4369 cmd = mgmt_pending_add(sk, MGMT_OP_SET_BREDR, hdev, data, len); in set_bredr()
4378 hci_dev_set_flag(hdev, HCI_BREDR_ENABLED); in set_bredr()
4380 hci_req_init(&req, hdev); in set_bredr()
4388 __hci_req_update_adv_data(&req, hdev->cur_adv_instance); in set_bredr()
4395 hci_dev_unlock(hdev); in set_bredr()
4399 static void sc_enable_complete(struct hci_dev *hdev, u8 status, u16 opcode) in sc_enable_complete() argument
4404 BT_DBG("%s status %u", hdev->name, status); in sc_enable_complete()
4406 hci_dev_lock(hdev); in sc_enable_complete()
4408 cmd = pending_find(MGMT_OP_SET_SECURE_CONN, hdev); in sc_enable_complete()
4422 hci_dev_clear_flag(hdev, HCI_SC_ENABLED); in sc_enable_complete()
4423 hci_dev_clear_flag(hdev, HCI_SC_ONLY); in sc_enable_complete()
4426 hci_dev_set_flag(hdev, HCI_SC_ENABLED); in sc_enable_complete()
4427 hci_dev_clear_flag(hdev, HCI_SC_ONLY); in sc_enable_complete()
4430 hci_dev_set_flag(hdev, HCI_SC_ENABLED); in sc_enable_complete()
4431 hci_dev_set_flag(hdev, HCI_SC_ONLY); in sc_enable_complete()
4435 send_settings_rsp(cmd->sk, MGMT_OP_SET_SECURE_CONN, hdev); in sc_enable_complete()
4436 new_settings(hdev, cmd->sk); in sc_enable_complete()
4441 hci_dev_unlock(hdev); in sc_enable_complete()
4444 static int set_secure_conn(struct sock *sk, struct hci_dev *hdev, in set_secure_conn() argument
4453 BT_DBG("request for %s", hdev->name); in set_secure_conn()
4455 if (!lmp_sc_capable(hdev) && in set_secure_conn()
4456 !hci_dev_test_flag(hdev, HCI_LE_ENABLED)) in set_secure_conn()
4457 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN, in set_secure_conn()
4460 if (hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) && in set_secure_conn()
4461 lmp_sc_capable(hdev) && in set_secure_conn()
4462 !hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) in set_secure_conn()
4463 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN, in set_secure_conn()
4467 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN, in set_secure_conn()
4470 hci_dev_lock(hdev); in set_secure_conn()
4472 if (!hdev_is_powered(hdev) || !lmp_sc_capable(hdev) || in set_secure_conn()
4473 !hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) { in set_secure_conn()
4477 changed = !hci_dev_test_and_set_flag(hdev, in set_secure_conn()
4480 hci_dev_set_flag(hdev, HCI_SC_ONLY); in set_secure_conn()
4482 hci_dev_clear_flag(hdev, HCI_SC_ONLY); in set_secure_conn()
4484 changed = hci_dev_test_and_clear_flag(hdev, in set_secure_conn()
4486 hci_dev_clear_flag(hdev, HCI_SC_ONLY); in set_secure_conn()
4489 err = send_settings_rsp(sk, MGMT_OP_SET_SECURE_CONN, hdev); in set_secure_conn()
4494 err = new_settings(hdev, sk); in set_secure_conn()
4499 if (pending_find(MGMT_OP_SET_SECURE_CONN, hdev)) { in set_secure_conn()
4500 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN, in set_secure_conn()
4507 if (val == hci_dev_test_flag(hdev, HCI_SC_ENABLED) && in set_secure_conn()
4508 (cp->val == 0x02) == hci_dev_test_flag(hdev, HCI_SC_ONLY)) { in set_secure_conn()
4509 err = send_settings_rsp(sk, MGMT_OP_SET_SECURE_CONN, hdev); in set_secure_conn()
4513 cmd = mgmt_pending_add(sk, MGMT_OP_SET_SECURE_CONN, hdev, data, len); in set_secure_conn()
4519 hci_req_init(&req, hdev); in set_secure_conn()
4528 hci_dev_unlock(hdev); in set_secure_conn()
4532 static int set_debug_keys(struct sock *sk, struct hci_dev *hdev, in set_debug_keys() argument
4539 BT_DBG("request for %s", hdev->name); in set_debug_keys()
4542 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEBUG_KEYS, in set_debug_keys()
4545 hci_dev_lock(hdev); in set_debug_keys()
4548 changed = !hci_dev_test_and_set_flag(hdev, HCI_KEEP_DEBUG_KEYS); in set_debug_keys()
4550 changed = hci_dev_test_and_clear_flag(hdev, in set_debug_keys()
4554 use_changed = !hci_dev_test_and_set_flag(hdev, in set_debug_keys()
4557 use_changed = hci_dev_test_and_clear_flag(hdev, in set_debug_keys()
4560 if (hdev_is_powered(hdev) && use_changed && in set_debug_keys()
4561 hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) { in set_debug_keys()
4563 hci_send_cmd(hdev, HCI_OP_WRITE_SSP_DEBUG_MODE, in set_debug_keys()
4567 err = send_settings_rsp(sk, MGMT_OP_SET_DEBUG_KEYS, hdev); in set_debug_keys()
4572 err = new_settings(hdev, sk); in set_debug_keys()
4575 hci_dev_unlock(hdev); in set_debug_keys()
4579 static int set_privacy(struct sock *sk, struct hci_dev *hdev, void *cp_data, in set_privacy() argument
4586 BT_DBG("request for %s", hdev->name); in set_privacy()
4588 if (!lmp_le_capable(hdev)) in set_privacy()
4589 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PRIVACY, in set_privacy()
4593 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PRIVACY, in set_privacy()
4596 if (hdev_is_powered(hdev)) in set_privacy()
4597 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PRIVACY, in set_privacy()
4600 hci_dev_lock(hdev); in set_privacy()
4605 hci_dev_set_flag(hdev, HCI_RPA_RESOLVING); in set_privacy()
4608 changed = !hci_dev_test_and_set_flag(hdev, HCI_PRIVACY); in set_privacy()
4609 memcpy(hdev->irk, cp->irk, sizeof(hdev->irk)); in set_privacy()
4610 hci_dev_set_flag(hdev, HCI_RPA_EXPIRED); in set_privacy()
4612 hci_dev_set_flag(hdev, HCI_LIMITED_PRIVACY); in set_privacy()
4614 hci_dev_clear_flag(hdev, HCI_LIMITED_PRIVACY); in set_privacy()
4616 changed = hci_dev_test_and_clear_flag(hdev, HCI_PRIVACY); in set_privacy()
4617 memset(hdev->irk, 0, sizeof(hdev->irk)); in set_privacy()
4618 hci_dev_clear_flag(hdev, HCI_RPA_EXPIRED); in set_privacy()
4619 hci_dev_clear_flag(hdev, HCI_LIMITED_PRIVACY); in set_privacy()
4622 err = send_settings_rsp(sk, MGMT_OP_SET_PRIVACY, hdev); in set_privacy()
4627 err = new_settings(hdev, sk); in set_privacy()
4630 hci_dev_unlock(hdev); in set_privacy()
4650 static int load_irks(struct sock *sk, struct hci_dev *hdev, void *cp_data, in load_irks() argument
4659 BT_DBG("request for %s", hdev->name); in load_irks()
4661 if (!lmp_le_capable(hdev)) in load_irks()
4662 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_IRKS, in load_irks()
4668 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_IRKS, in load_irks()
4676 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_IRKS, in load_irks()
4680 BT_DBG("%s irk_count %u", hdev->name, irk_count); in load_irks()
4686 return mgmt_cmd_status(sk, hdev->id, in load_irks()
4691 hci_dev_lock(hdev); in load_irks()
4693 hci_smp_irks_clear(hdev); in load_irks()
4698 hci_add_irk(hdev, &irk->addr.bdaddr, in load_irks()
4703 hci_dev_set_flag(hdev, HCI_RPA_RESOLVING); in load_irks()
4705 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_IRKS, 0, NULL, 0); in load_irks()
4707 hci_dev_unlock(hdev); in load_irks()
4731 static int load_long_term_keys(struct sock *sk, struct hci_dev *hdev, in load_long_term_keys() argument
4740 BT_DBG("request for %s", hdev->name); in load_long_term_keys()
4742 if (!lmp_le_capable(hdev)) in load_long_term_keys()
4743 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, in load_long_term_keys()
4749 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, in load_long_term_keys()
4758 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, in load_long_term_keys()
4762 BT_DBG("%s key_count %u", hdev->name, key_count); in load_long_term_keys()
4768 return mgmt_cmd_status(sk, hdev->id, in load_long_term_keys()
4773 hci_dev_lock(hdev); in load_long_term_keys()
4775 hci_smp_ltks_clear(hdev); in load_long_term_keys()
4805 hci_add_ltk(hdev, &key->addr.bdaddr, in load_long_term_keys()
4810 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, 0, in load_long_term_keys()
4813 hci_dev_unlock(hdev); in load_long_term_keys()
4845 static void conn_info_refresh_complete(struct hci_dev *hdev, u8 hci_status, in conn_info_refresh_complete() argument
4856 hci_dev_lock(hdev); in conn_info_refresh_complete()
4867 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_RSSI); in conn_info_refresh_complete()
4869 cp = hci_sent_cmd_data(hdev, HCI_OP_READ_TX_POWER); in conn_info_refresh_complete()
4881 conn = hci_conn_hash_lookup_handle(hdev, handle); in conn_info_refresh_complete()
4887 cmd = pending_find_data(MGMT_OP_GET_CONN_INFO, hdev, conn); in conn_info_refresh_complete()
4895 hci_dev_unlock(hdev); in conn_info_refresh_complete()
4898 static int get_conn_info(struct sock *sk, struct hci_dev *hdev, void *data, in get_conn_info() argument
4907 BT_DBG("%s", hdev->name); in get_conn_info()
4914 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO, in get_conn_info()
4918 hci_dev_lock(hdev); in get_conn_info()
4920 if (!hdev_is_powered(hdev)) { in get_conn_info()
4921 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO, in get_conn_info()
4928 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, in get_conn_info()
4931 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->addr.bdaddr); in get_conn_info()
4934 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO, in get_conn_info()
4940 if (pending_find_data(MGMT_OP_GET_CONN_INFO, hdev, conn)) { in get_conn_info()
4941 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO, in get_conn_info()
4949 conn_info_age = hdev->conn_info_min_age + in get_conn_info()
4950 prandom_u32_max(hdev->conn_info_max_age - in get_conn_info()
4951 hdev->conn_info_min_age); in get_conn_info()
4964 hci_req_init(&req, hdev); in get_conn_info()
4992 cmd = mgmt_pending_add(sk, MGMT_OP_GET_CONN_INFO, hdev, in get_conn_info()
5010 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO, in get_conn_info()
5015 hci_dev_unlock(hdev); in get_conn_info()
5023 struct hci_dev *hdev; in clock_info_cmd_complete() local
5032 hdev = hci_dev_get(cmd->index); in clock_info_cmd_complete()
5033 if (hdev) { in clock_info_cmd_complete()
5034 rp.local_clock = cpu_to_le32(hdev->clock); in clock_info_cmd_complete()
5035 hci_dev_put(hdev); in clock_info_cmd_complete()
5055 static void get_clock_info_complete(struct hci_dev *hdev, u8 status, u16 opcode) in get_clock_info_complete() argument
5061 BT_DBG("%s status %u", hdev->name, status); in get_clock_info_complete()
5063 hci_dev_lock(hdev); in get_clock_info_complete()
5065 hci_cp = hci_sent_cmd_data(hdev, HCI_OP_READ_CLOCK); in get_clock_info_complete()
5071 conn = hci_conn_hash_lookup_handle(hdev, handle); in get_clock_info_complete()
5076 cmd = pending_find_data(MGMT_OP_GET_CLOCK_INFO, hdev, conn); in get_clock_info_complete()
5084 hci_dev_unlock(hdev); in get_clock_info_complete()
5087 static int get_clock_info(struct sock *sk, struct hci_dev *hdev, void *data, in get_clock_info() argument
5098 BT_DBG("%s", hdev->name); in get_clock_info()
5105 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CLOCK_INFO, in get_clock_info()
5109 hci_dev_lock(hdev); in get_clock_info()
5111 if (!hdev_is_powered(hdev)) { in get_clock_info()
5112 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CLOCK_INFO, in get_clock_info()
5119 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, in get_clock_info()
5122 err = mgmt_cmd_complete(sk, hdev->id, in get_clock_info()
5132 cmd = mgmt_pending_add(sk, MGMT_OP_GET_CLOCK_INFO, hdev, data, len); in get_clock_info()
5140 hci_req_init(&req, hdev); in get_clock_info()
5159 hci_dev_unlock(hdev); in get_clock_info()
5163 static bool is_connected(struct hci_dev *hdev, bdaddr_t *addr, u8 type) in is_connected() argument
5167 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, addr); in is_connected()
5181 static int hci_conn_params_set(struct hci_dev *hdev, bdaddr_t *addr, in hci_conn_params_set() argument
5186 params = hci_conn_params_add(hdev, addr, addr_type); in hci_conn_params_set()
5202 list_add(¶ms->action, &hdev->pend_le_conns); in hci_conn_params_set()
5206 list_add(¶ms->action, &hdev->pend_le_conns); in hci_conn_params_set()
5208 list_add(¶ms->action, &hdev->pend_le_reports); in hci_conn_params_set()
5212 if (!is_connected(hdev, addr, addr_type)) in hci_conn_params_set()
5213 list_add(¶ms->action, &hdev->pend_le_conns); in hci_conn_params_set()
5225 static void device_added(struct sock *sk, struct hci_dev *hdev, in device_added() argument
5234 mgmt_event(MGMT_EV_DEVICE_ADDED, hdev, &ev, sizeof(ev), sk); in device_added()
5237 static int add_device(struct sock *sk, struct hci_dev *hdev, in add_device() argument
5244 BT_DBG("%s", hdev->name); in add_device()
5248 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE, in add_device()
5253 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE, in add_device()
5257 hci_dev_lock(hdev); in add_device()
5262 err = mgmt_cmd_complete(sk, hdev->id, in add_device()
5269 err = hci_bdaddr_list_add(&hdev->whitelist, &cp->addr.bdaddr, in add_device()
5274 hci_req_update_scan(hdev); in add_device()
5294 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE, in add_device()
5303 if (hci_conn_params_set(hdev, &cp->addr.bdaddr, addr_type, in add_device()
5305 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE, in add_device()
5311 hci_update_background_scan(hdev); in add_device()
5314 device_added(sk, hdev, &cp->addr.bdaddr, cp->addr.type, cp->action); in add_device()
5316 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE, in add_device()
5321 hci_dev_unlock(hdev); in add_device()
5325 static void device_removed(struct sock *sk, struct hci_dev *hdev, in device_removed() argument
5333 mgmt_event(MGMT_EV_DEVICE_REMOVED, hdev, &ev, sizeof(ev), sk); in device_removed()
5336 static int remove_device(struct sock *sk, struct hci_dev *hdev, in remove_device() argument
5342 BT_DBG("%s", hdev->name); in remove_device()
5344 hci_dev_lock(hdev); in remove_device()
5351 err = mgmt_cmd_complete(sk, hdev->id, in remove_device()
5359 err = hci_bdaddr_list_del(&hdev->whitelist, in remove_device()
5363 err = mgmt_cmd_complete(sk, hdev->id, in remove_device()
5371 hci_req_update_scan(hdev); in remove_device()
5373 device_removed(sk, hdev, &cp->addr.bdaddr, in remove_device()
5386 err = mgmt_cmd_complete(sk, hdev->id, in remove_device()
5393 params = hci_conn_params_lookup(hdev, &cp->addr.bdaddr, in remove_device()
5396 err = mgmt_cmd_complete(sk, hdev->id, in remove_device()
5405 err = mgmt_cmd_complete(sk, hdev->id, in remove_device()
5415 hci_update_background_scan(hdev); in remove_device()
5417 device_removed(sk, hdev, &cp->addr.bdaddr, cp->addr.type); in remove_device()
5423 err = mgmt_cmd_complete(sk, hdev->id, in remove_device()
5430 list_for_each_entry_safe(b, btmp, &hdev->whitelist, list) { in remove_device()
5431 device_removed(sk, hdev, &b->bdaddr, b->bdaddr_type); in remove_device()
5436 hci_req_update_scan(hdev); in remove_device()
5438 list_for_each_entry_safe(p, tmp, &hdev->le_conn_params, list) { in remove_device()
5441 device_removed(sk, hdev, &p->addr, p->addr_type); in remove_device()
5453 hci_update_background_scan(hdev); in remove_device()
5457 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_DEVICE, in remove_device()
5461 hci_dev_unlock(hdev); in remove_device()
5465 static int load_conn_param(struct sock *sk, struct hci_dev *hdev, void *data, in load_conn_param() argument
5474 if (!lmp_le_capable(hdev)) in load_conn_param()
5475 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM, in load_conn_param()
5482 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM, in load_conn_param()
5491 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM, in load_conn_param()
5495 BT_DBG("%s param_count %u", hdev->name, param_count); in load_conn_param()
5497 hci_dev_lock(hdev); in load_conn_param()
5499 hci_conn_params_clear_disabled(hdev); in load_conn_param()
5532 hci_param = hci_conn_params_add(hdev, ¶m->addr.bdaddr, in load_conn_param()
5545 hci_dev_unlock(hdev); in load_conn_param()
5547 return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM, 0, in load_conn_param()
5551 static int set_external_config(struct sock *sk, struct hci_dev *hdev, in set_external_config() argument
5558 BT_DBG("%s", hdev->name); in set_external_config()
5560 if (hdev_is_powered(hdev)) in set_external_config()
5561 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_EXTERNAL_CONFIG, in set_external_config()
5565 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_EXTERNAL_CONFIG, in set_external_config()
5568 if (!test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks)) in set_external_config()
5569 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_EXTERNAL_CONFIG, in set_external_config()
5572 hci_dev_lock(hdev); in set_external_config()
5575 changed = !hci_dev_test_and_set_flag(hdev, HCI_EXT_CONFIGURED); in set_external_config()
5577 changed = hci_dev_test_and_clear_flag(hdev, HCI_EXT_CONFIGURED); in set_external_config()
5579 err = send_options_rsp(sk, MGMT_OP_SET_EXTERNAL_CONFIG, hdev); in set_external_config()
5586 err = new_options(hdev, sk); in set_external_config()
5588 if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED) == is_configured(hdev)) { in set_external_config()
5589 mgmt_index_removed(hdev); in set_external_config()
5591 if (hci_dev_test_and_change_flag(hdev, HCI_UNCONFIGURED)) { in set_external_config()
5592 hci_dev_set_flag(hdev, HCI_CONFIG); in set_external_config()
5593 hci_dev_set_flag(hdev, HCI_AUTO_OFF); in set_external_config()
5595 queue_work(hdev->req_workqueue, &hdev->power_on); in set_external_config()
5597 set_bit(HCI_RAW, &hdev->flags); in set_external_config()
5598 mgmt_index_added(hdev); in set_external_config()
5603 hci_dev_unlock(hdev); in set_external_config()
5607 static int set_public_address(struct sock *sk, struct hci_dev *hdev, in set_public_address() argument
5614 BT_DBG("%s", hdev->name); in set_public_address()
5616 if (hdev_is_powered(hdev)) in set_public_address()
5617 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PUBLIC_ADDRESS, in set_public_address()
5621 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PUBLIC_ADDRESS, in set_public_address()
5624 if (!hdev->set_bdaddr) in set_public_address()
5625 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PUBLIC_ADDRESS, in set_public_address()
5628 hci_dev_lock(hdev); in set_public_address()
5630 changed = !!bacmp(&hdev->public_addr, &cp->bdaddr); in set_public_address()
5631 bacpy(&hdev->public_addr, &cp->bdaddr); in set_public_address()
5633 err = send_options_rsp(sk, MGMT_OP_SET_PUBLIC_ADDRESS, hdev); in set_public_address()
5640 if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) in set_public_address()
5641 err = new_options(hdev, sk); in set_public_address()
5643 if (is_configured(hdev)) { in set_public_address()
5644 mgmt_index_removed(hdev); in set_public_address()
5646 hci_dev_clear_flag(hdev, HCI_UNCONFIGURED); in set_public_address()
5648 hci_dev_set_flag(hdev, HCI_CONFIG); in set_public_address()
5649 hci_dev_set_flag(hdev, HCI_AUTO_OFF); in set_public_address()
5651 queue_work(hdev->req_workqueue, &hdev->power_on); in set_public_address()
5655 hci_dev_unlock(hdev); in set_public_address()
5659 static void read_local_oob_ext_data_complete(struct hci_dev *hdev, u8 status, in read_local_oob_ext_data_complete() argument
5669 BT_DBG("%s status %u", hdev->name, status); in read_local_oob_ext_data_complete()
5671 cmd = pending_find(MGMT_OP_READ_LOCAL_OOB_EXT_DATA, hdev); in read_local_oob_ext_data_complete()
5711 if (hci_dev_test_flag(hdev, HCI_SC_ONLY)) { in read_local_oob_ext_data_complete()
5734 hdev->dev_class, 3); in read_local_oob_ext_data_complete()
5754 err = mgmt_cmd_complete(cmd->sk, hdev->id, in read_local_oob_ext_data_complete()
5762 err = mgmt_limited_event(MGMT_EV_LOCAL_OOB_DATA_UPDATED, hdev, in read_local_oob_ext_data_complete()
5770 static int read_local_ssp_oob_req(struct hci_dev *hdev, struct sock *sk, in read_local_ssp_oob_req() argument
5777 cmd = mgmt_pending_add(sk, MGMT_OP_READ_LOCAL_OOB_EXT_DATA, hdev, in read_local_ssp_oob_req()
5782 hci_req_init(&req, hdev); in read_local_ssp_oob_req()
5784 if (bredr_sc_enabled(hdev)) in read_local_ssp_oob_req()
5798 static int read_local_oob_ext_data(struct sock *sk, struct hci_dev *hdev, in read_local_oob_ext_data() argument
5808 BT_DBG("%s", hdev->name); in read_local_oob_ext_data()
5810 if (hdev_is_powered(hdev)) { in read_local_oob_ext_data()
5813 status = mgmt_bredr_support(hdev); in read_local_oob_ext_data()
5820 status = mgmt_le_support(hdev); in read_local_oob_ext_data()
5844 hci_dev_lock(hdev); in read_local_oob_ext_data()
5849 if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) { in read_local_oob_ext_data()
5850 err = read_local_ssp_oob_req(hdev, sk, cp); in read_local_oob_ext_data()
5851 hci_dev_unlock(hdev); in read_local_oob_ext_data()
5860 hdev->dev_class, 3); in read_local_oob_ext_data()
5864 if (hci_dev_test_flag(hdev, HCI_SC_ENABLED) && in read_local_oob_ext_data()
5865 smp_generate_oob(hdev, hash, rand) < 0) { in read_local_oob_ext_data()
5866 hci_dev_unlock(hdev); in read_local_oob_ext_data()
5881 if (hci_dev_test_flag(hdev, HCI_PRIVACY)) { in read_local_oob_ext_data()
5882 hci_dev_unlock(hdev); in read_local_oob_ext_data()
5887 if (hci_dev_test_flag(hdev, HCI_FORCE_STATIC_ADDR) || in read_local_oob_ext_data()
5888 !bacmp(&hdev->bdaddr, BDADDR_ANY) || in read_local_oob_ext_data()
5889 (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) && in read_local_oob_ext_data()
5890 bacmp(&hdev->static_addr, BDADDR_ANY))) { in read_local_oob_ext_data()
5891 memcpy(addr, &hdev->static_addr, 6); in read_local_oob_ext_data()
5894 memcpy(addr, &hdev->bdaddr, 6); in read_local_oob_ext_data()
5901 if (hci_dev_test_flag(hdev, HCI_ADVERTISING)) in read_local_oob_ext_data()
5909 if (hci_dev_test_flag(hdev, HCI_SC_ENABLED)) { in read_local_oob_ext_data()
5919 flags = mgmt_get_adv_discov_flags(hdev); in read_local_oob_ext_data()
5921 if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) in read_local_oob_ext_data()
5929 hci_dev_unlock(hdev); in read_local_oob_ext_data()
5939 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_EXT_DATA, in read_local_oob_ext_data()
5944 err = mgmt_limited_event(MGMT_EV_LOCAL_OOB_DATA_UPDATED, hdev, in read_local_oob_ext_data()
5954 static u32 get_supported_adv_flags(struct hci_dev *hdev) in get_supported_adv_flags() argument
5965 if (hdev->adv_tx_power != HCI_TX_POWER_INVALID) in get_supported_adv_flags()
5971 static int read_adv_features(struct sock *sk, struct hci_dev *hdev, in read_adv_features() argument
5981 BT_DBG("%s", hdev->name); in read_adv_features()
5983 if (!lmp_le_capable(hdev)) in read_adv_features()
5984 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_ADV_FEATURES, in read_adv_features()
5987 hci_dev_lock(hdev); in read_adv_features()
5989 rp_len = sizeof(*rp) + hdev->adv_instance_cnt; in read_adv_features()
5992 hci_dev_unlock(hdev); in read_adv_features()
5996 supported_flags = get_supported_adv_flags(hdev); in read_adv_features()
6002 rp->num_instances = hdev->adv_instance_cnt; in read_adv_features()
6005 list_for_each_entry(adv_instance, &hdev->adv_instances, list) { in read_adv_features()
6010 hci_dev_unlock(hdev); in read_adv_features()
6012 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_ADV_FEATURES, in read_adv_features()
6020 static u8 calculate_name_len(struct hci_dev *hdev) in calculate_name_len() argument
6024 return append_local_name(hdev, buf, 0); in calculate_name_len()
6027 static u8 tlv_data_max_len(struct hci_dev *hdev, u32 adv_flags, in tlv_data_max_len() argument
6042 max_len -= calculate_name_len(hdev); in tlv_data_max_len()
6073 static bool tlv_data_is_valid(struct hci_dev *hdev, u32 adv_flags, u8 *data, in tlv_data_is_valid() argument
6079 max_len = tlv_data_max_len(hdev, adv_flags, is_adv_data); in tlv_data_is_valid()
6115 static void add_advertising_complete(struct hci_dev *hdev, u8 status, in add_advertising_complete() argument
6126 hci_dev_lock(hdev); in add_advertising_complete()
6128 cmd = pending_find(MGMT_OP_ADD_ADVERTISING, hdev); in add_advertising_complete()
6130 list_for_each_entry_safe(adv_instance, n, &hdev->adv_instances, list) { in add_advertising_complete()
6141 if (hdev->cur_adv_instance == instance) in add_advertising_complete()
6142 cancel_adv_timeout(hdev); in add_advertising_complete()
6144 hci_remove_adv_instance(hdev, instance); in add_advertising_complete()
6145 mgmt_advertising_removed(cmd ? cmd->sk : NULL, hdev, instance); in add_advertising_complete()
6164 hci_dev_unlock(hdev); in add_advertising_complete()
6167 static int add_advertising(struct sock *sk, struct hci_dev *hdev, in add_advertising() argument
6176 unsigned int prev_instance_cnt = hdev->adv_instance_cnt; in add_advertising()
6183 BT_DBG("%s", hdev->name); in add_advertising()
6185 status = mgmt_le_support(hdev); in add_advertising()
6187 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
6191 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
6195 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
6205 supported_flags = get_supported_adv_flags(hdev); in add_advertising()
6207 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
6210 hci_dev_lock(hdev); in add_advertising()
6212 if (timeout && !hdev_is_powered(hdev)) { in add_advertising()
6213 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
6218 if (pending_find(MGMT_OP_ADD_ADVERTISING, hdev) || in add_advertising()
6219 pending_find(MGMT_OP_REMOVE_ADVERTISING, hdev) || in add_advertising()
6220 pending_find(MGMT_OP_SET_LE, hdev)) { in add_advertising()
6221 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
6226 if (!tlv_data_is_valid(hdev, flags, cp->data, cp->adv_data_len, true) || in add_advertising()
6227 !tlv_data_is_valid(hdev, flags, cp->data + cp->adv_data_len, in add_advertising()
6229 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
6234 err = hci_add_adv_instance(hdev, cp->instance, flags, in add_advertising()
6240 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
6248 if (hdev->adv_instance_cnt > prev_instance_cnt) in add_advertising()
6249 mgmt_advertising_added(sk, hdev, cp->instance); in add_advertising()
6251 if (hdev->cur_adv_instance == cp->instance) { in add_advertising()
6257 cancel_adv_timeout(hdev); in add_advertising()
6259 next_instance = hci_get_next_instance(hdev, cp->instance); in add_advertising()
6262 } else if (!hdev->adv_instance_timeout) { in add_advertising()
6273 if (!hdev_is_powered(hdev) || in add_advertising()
6274 hci_dev_test_flag(hdev, HCI_ADVERTISING) || in add_advertising()
6277 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, in add_advertising()
6285 cmd = mgmt_pending_add(sk, MGMT_OP_ADD_ADVERTISING, hdev, data, in add_advertising()
6292 hci_req_init(&req, hdev); in add_advertising()
6303 hci_dev_unlock(hdev); in add_advertising()
6308 static void remove_advertising_complete(struct hci_dev *hdev, u8 status, in remove_advertising_complete() argument
6317 hci_dev_lock(hdev); in remove_advertising_complete()
6323 cmd = pending_find(MGMT_OP_REMOVE_ADVERTISING, hdev); in remove_advertising_complete()
6335 hci_dev_unlock(hdev); in remove_advertising_complete()
6338 static int remove_advertising(struct sock *sk, struct hci_dev *hdev, in remove_advertising() argument
6347 BT_DBG("%s", hdev->name); in remove_advertising()
6349 hci_dev_lock(hdev); in remove_advertising()
6351 if (cp->instance && !hci_find_adv_instance(hdev, cp->instance)) { in remove_advertising()
6352 err = mgmt_cmd_status(sk, hdev->id, in remove_advertising()
6358 if (pending_find(MGMT_OP_ADD_ADVERTISING, hdev) || in remove_advertising()
6359 pending_find(MGMT_OP_REMOVE_ADVERTISING, hdev) || in remove_advertising()
6360 pending_find(MGMT_OP_SET_LE, hdev)) { in remove_advertising()
6361 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_ADVERTISING, in remove_advertising()
6366 if (list_empty(&hdev->adv_instances)) { in remove_advertising()
6367 err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_ADVERTISING, in remove_advertising()
6372 hci_req_init(&req, hdev); in remove_advertising()
6374 hci_req_clear_adv_instance(hdev, sk, &req, cp->instance, true); in remove_advertising()
6376 if (list_empty(&hdev->adv_instances)) in remove_advertising()
6384 !hdev_is_powered(hdev) || in remove_advertising()
6385 hci_dev_test_flag(hdev, HCI_ADVERTISING)) { in remove_advertising()
6387 err = mgmt_cmd_complete(sk, hdev->id, in remove_advertising()
6393 cmd = mgmt_pending_add(sk, MGMT_OP_REMOVE_ADVERTISING, hdev, data, in remove_advertising()
6405 hci_dev_unlock(hdev); in remove_advertising()
6410 static int get_adv_size_info(struct sock *sk, struct hci_dev *hdev, in get_adv_size_info() argument
6418 BT_DBG("%s", hdev->name); in get_adv_size_info()
6420 if (!lmp_le_capable(hdev)) in get_adv_size_info()
6421 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_GET_ADV_SIZE_INFO, in get_adv_size_info()
6425 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_GET_ADV_SIZE_INFO, in get_adv_size_info()
6433 supported_flags = get_supported_adv_flags(hdev); in get_adv_size_info()
6435 return mgmt_cmd_status(sk, hdev->id, MGMT_OP_GET_ADV_SIZE_INFO, in get_adv_size_info()
6440 rp.max_adv_data_len = tlv_data_max_len(hdev, flags, true); in get_adv_size_info()
6441 rp.max_scan_rsp_len = tlv_data_max_len(hdev, flags, false); in get_adv_size_info()
6443 err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_ADV_SIZE_INFO, in get_adv_size_info()
6543 void mgmt_index_added(struct hci_dev *hdev) in mgmt_index_added() argument
6547 if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks)) in mgmt_index_added()
6550 switch (hdev->dev_type) { in mgmt_index_added()
6552 if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) { in mgmt_index_added()
6553 mgmt_index_event(MGMT_EV_UNCONF_INDEX_ADDED, hdev, in mgmt_index_added()
6557 mgmt_index_event(MGMT_EV_INDEX_ADDED, hdev, NULL, 0, in mgmt_index_added()
6569 ev.bus = hdev->bus; in mgmt_index_added()
6571 mgmt_index_event(MGMT_EV_EXT_INDEX_ADDED, hdev, &ev, sizeof(ev), in mgmt_index_added()
6575 void mgmt_index_removed(struct hci_dev *hdev) in mgmt_index_removed() argument
6580 if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks)) in mgmt_index_removed()
6583 switch (hdev->dev_type) { in mgmt_index_removed()
6585 mgmt_pending_foreach(0, hdev, cmd_complete_rsp, &status); in mgmt_index_removed()
6587 if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) { in mgmt_index_removed()
6588 mgmt_index_event(MGMT_EV_UNCONF_INDEX_REMOVED, hdev, in mgmt_index_removed()
6592 mgmt_index_event(MGMT_EV_INDEX_REMOVED, hdev, NULL, 0, in mgmt_index_removed()
6604 ev.bus = hdev->bus; in mgmt_index_removed()
6606 mgmt_index_event(MGMT_EV_EXT_INDEX_REMOVED, hdev, &ev, sizeof(ev), in mgmt_index_removed()
6611 static void restart_le_actions(struct hci_dev *hdev) in restart_le_actions() argument
6615 list_for_each_entry(p, &hdev->le_conn_params, list) { in restart_le_actions()
6624 list_add(&p->action, &hdev->pend_le_conns); in restart_le_actions()
6627 list_add(&p->action, &hdev->pend_le_reports); in restart_le_actions()
6635 void mgmt_power_on(struct hci_dev *hdev, int err) in mgmt_power_on() argument
6637 struct cmd_lookup match = { NULL, hdev }; in mgmt_power_on()
6641 hci_dev_lock(hdev); in mgmt_power_on()
6644 restart_le_actions(hdev); in mgmt_power_on()
6645 hci_update_background_scan(hdev); in mgmt_power_on()
6648 mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp, &match); in mgmt_power_on()
6650 new_settings(hdev, match.sk); in mgmt_power_on()
6655 hci_dev_unlock(hdev); in mgmt_power_on()
6658 void __mgmt_power_off(struct hci_dev *hdev) in __mgmt_power_off() argument
6660 struct cmd_lookup match = { NULL, hdev }; in __mgmt_power_off()
6663 mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp, &match); in __mgmt_power_off()
6672 if (hci_dev_test_flag(hdev, HCI_UNREGISTER)) in __mgmt_power_off()
6677 mgmt_pending_foreach(0, hdev, cmd_complete_rsp, &status); in __mgmt_power_off()
6679 if (memcmp(hdev->dev_class, zero_cod, sizeof(zero_cod)) != 0) { in __mgmt_power_off()
6680 mgmt_limited_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev, in __mgmt_power_off()
6683 ext_info_changed(hdev, NULL); in __mgmt_power_off()
6686 new_settings(hdev, match.sk); in __mgmt_power_off()
6692 void mgmt_set_powered_failed(struct hci_dev *hdev, int err) in mgmt_set_powered_failed() argument
6697 cmd = pending_find(MGMT_OP_SET_POWERED, hdev); in mgmt_set_powered_failed()
6706 mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_POWERED, status); in mgmt_set_powered_failed()
6711 void mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key, in mgmt_new_link_key() argument
6725 mgmt_event(MGMT_EV_NEW_LINK_KEY, hdev, &ev, sizeof(ev), NULL); in mgmt_new_link_key()
6747 void mgmt_new_ltk(struct hci_dev *hdev, struct smp_ltk *key, bool persistent) in mgmt_new_ltk() argument
6787 mgmt_event(MGMT_EV_NEW_LONG_TERM_KEY, hdev, &ev, sizeof(ev), NULL); in mgmt_new_ltk()
6790 void mgmt_new_irk(struct hci_dev *hdev, struct smp_irk *irk, bool persistent) in mgmt_new_irk() argument
6803 mgmt_event(MGMT_EV_NEW_IRK, hdev, &ev, sizeof(ev), NULL); in mgmt_new_irk()
6806 void mgmt_new_csrk(struct hci_dev *hdev, struct smp_csrk *csrk, in mgmt_new_csrk() argument
6833 mgmt_event(MGMT_EV_NEW_CSRK, hdev, &ev, sizeof(ev), NULL); in mgmt_new_csrk()
6836 void mgmt_new_conn_param(struct hci_dev *hdev, bdaddr_t *bdaddr, in mgmt_new_conn_param() argument
6854 mgmt_event(MGMT_EV_NEW_CONN_PARAM, hdev, &ev, sizeof(ev), NULL); in mgmt_new_conn_param()
6857 void mgmt_device_connected(struct hci_dev *hdev, struct hci_conn *conn, in mgmt_device_connected() argument
6890 mgmt_event(MGMT_EV_DEVICE_CONNECTED, hdev, buf, in mgmt_device_connected()
6908 struct hci_dev *hdev = data; in unpair_device_rsp() local
6911 device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, cmd->sk); in unpair_device_rsp()
6917 bool mgmt_powering_down(struct hci_dev *hdev) in mgmt_powering_down() argument
6922 cmd = pending_find(MGMT_OP_SET_POWERED, hdev); in mgmt_powering_down()
6933 void mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr, in mgmt_device_disconnected() argument
6943 if (mgmt_powering_down(hdev) && hci_conn_count(hdev) == 1) { in mgmt_device_disconnected()
6944 cancel_delayed_work(&hdev->power_off); in mgmt_device_disconnected()
6945 queue_work(hdev->req_workqueue, &hdev->power_off.work); in mgmt_device_disconnected()
6954 mgmt_pending_foreach(MGMT_OP_DISCONNECT, hdev, disconnect_rsp, &sk); in mgmt_device_disconnected()
6960 mgmt_event(MGMT_EV_DEVICE_DISCONNECTED, hdev, &ev, sizeof(ev), sk); in mgmt_device_disconnected()
6965 mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp, in mgmt_device_disconnected()
6966 hdev); in mgmt_device_disconnected()
6969 void mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, in mgmt_disconnect_failed() argument
6976 mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp, in mgmt_disconnect_failed()
6977 hdev); in mgmt_disconnect_failed()
6979 cmd = pending_find(MGMT_OP_DISCONNECT, hdev); in mgmt_disconnect_failed()
6995 void mgmt_connect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type, in mgmt_connect_failed() argument
7003 if (mgmt_powering_down(hdev) && hci_conn_count(hdev) == 1) { in mgmt_connect_failed()
7004 cancel_delayed_work(&hdev->power_off); in mgmt_connect_failed()
7005 queue_work(hdev->req_workqueue, &hdev->power_off.work); in mgmt_connect_failed()
7012 mgmt_event(MGMT_EV_CONNECT_FAILED, hdev, &ev, sizeof(ev), NULL); in mgmt_connect_failed()
7015 void mgmt_pin_code_request(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 secure) in mgmt_pin_code_request() argument
7023 mgmt_event(MGMT_EV_PIN_CODE_REQUEST, hdev, &ev, sizeof(ev), NULL); in mgmt_pin_code_request()
7026 void mgmt_pin_code_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr, in mgmt_pin_code_reply_complete() argument
7031 cmd = pending_find(MGMT_OP_PIN_CODE_REPLY, hdev); in mgmt_pin_code_reply_complete()
7039 void mgmt_pin_code_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr, in mgmt_pin_code_neg_reply_complete() argument
7044 cmd = pending_find(MGMT_OP_PIN_CODE_NEG_REPLY, hdev); in mgmt_pin_code_neg_reply_complete()
7052 int mgmt_user_confirm_request(struct hci_dev *hdev, bdaddr_t *bdaddr, in mgmt_user_confirm_request() argument
7058 BT_DBG("%s", hdev->name); in mgmt_user_confirm_request()
7065 return mgmt_event(MGMT_EV_USER_CONFIRM_REQUEST, hdev, &ev, sizeof(ev), in mgmt_user_confirm_request()
7069 int mgmt_user_passkey_request(struct hci_dev *hdev, bdaddr_t *bdaddr, in mgmt_user_passkey_request() argument
7074 BT_DBG("%s", hdev->name); in mgmt_user_passkey_request()
7079 return mgmt_event(MGMT_EV_USER_PASSKEY_REQUEST, hdev, &ev, sizeof(ev), in mgmt_user_passkey_request()
7083 static int user_pairing_resp_complete(struct hci_dev *hdev, bdaddr_t *bdaddr, in user_pairing_resp_complete() argument
7089 cmd = pending_find(opcode, hdev); in user_pairing_resp_complete()
7099 int mgmt_user_confirm_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr, in mgmt_user_confirm_reply_complete() argument
7102 return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type, in mgmt_user_confirm_reply_complete()
7106 int mgmt_user_confirm_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr, in mgmt_user_confirm_neg_reply_complete() argument
7109 return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type, in mgmt_user_confirm_neg_reply_complete()
7114 int mgmt_user_passkey_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr, in mgmt_user_passkey_reply_complete() argument
7117 return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type, in mgmt_user_passkey_reply_complete()
7121 int mgmt_user_passkey_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr, in mgmt_user_passkey_neg_reply_complete() argument
7124 return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type, in mgmt_user_passkey_neg_reply_complete()
7129 int mgmt_user_passkey_notify(struct hci_dev *hdev, bdaddr_t *bdaddr, in mgmt_user_passkey_notify() argument
7135 BT_DBG("%s", hdev->name); in mgmt_user_passkey_notify()
7142 return mgmt_event(MGMT_EV_PASSKEY_NOTIFY, hdev, &ev, sizeof(ev), NULL); in mgmt_user_passkey_notify()
7157 mgmt_event(MGMT_EV_AUTH_FAILED, conn->hdev, &ev, sizeof(ev), in mgmt_auth_failed()
7166 void mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status) in mgmt_auth_enable_complete() argument
7168 struct cmd_lookup match = { NULL, hdev }; in mgmt_auth_enable_complete()
7173 mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, in mgmt_auth_enable_complete()
7178 if (test_bit(HCI_AUTH, &hdev->flags)) in mgmt_auth_enable_complete()
7179 changed = !hci_dev_test_and_set_flag(hdev, HCI_LINK_SECURITY); in mgmt_auth_enable_complete()
7181 changed = hci_dev_test_and_clear_flag(hdev, HCI_LINK_SECURITY); in mgmt_auth_enable_complete()
7183 mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, settings_rsp, in mgmt_auth_enable_complete()
7187 new_settings(hdev, match.sk); in mgmt_auth_enable_complete()
7195 struct hci_dev *hdev = req->hdev; in clear_eir() local
7198 if (!lmp_ext_inq_capable(hdev)) in clear_eir()
7201 memset(hdev->eir, 0, sizeof(hdev->eir)); in clear_eir()
7208 void mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status) in mgmt_ssp_enable_complete() argument
7210 struct cmd_lookup match = { NULL, hdev }; in mgmt_ssp_enable_complete()
7217 if (enable && hci_dev_test_and_clear_flag(hdev, in mgmt_ssp_enable_complete()
7219 hci_dev_clear_flag(hdev, HCI_HS_ENABLED); in mgmt_ssp_enable_complete()
7220 new_settings(hdev, NULL); in mgmt_ssp_enable_complete()
7223 mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, cmd_status_rsp, in mgmt_ssp_enable_complete()
7229 changed = !hci_dev_test_and_set_flag(hdev, HCI_SSP_ENABLED); in mgmt_ssp_enable_complete()
7231 changed = hci_dev_test_and_clear_flag(hdev, HCI_SSP_ENABLED); in mgmt_ssp_enable_complete()
7233 changed = hci_dev_test_and_clear_flag(hdev, in mgmt_ssp_enable_complete()
7236 hci_dev_clear_flag(hdev, HCI_HS_ENABLED); in mgmt_ssp_enable_complete()
7239 mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, settings_rsp, &match); in mgmt_ssp_enable_complete()
7242 new_settings(hdev, match.sk); in mgmt_ssp_enable_complete()
7247 hci_req_init(&req, hdev); in mgmt_ssp_enable_complete()
7249 if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) { in mgmt_ssp_enable_complete()
7250 if (hci_dev_test_flag(hdev, HCI_USE_DEBUG_KEYS)) in mgmt_ssp_enable_complete()
7271 void mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class, in mgmt_set_class_of_dev_complete() argument
7274 struct cmd_lookup match = { NULL, hdev, mgmt_status(status) }; in mgmt_set_class_of_dev_complete()
7276 mgmt_pending_foreach(MGMT_OP_SET_DEV_CLASS, hdev, sk_lookup, &match); in mgmt_set_class_of_dev_complete()
7277 mgmt_pending_foreach(MGMT_OP_ADD_UUID, hdev, sk_lookup, &match); in mgmt_set_class_of_dev_complete()
7278 mgmt_pending_foreach(MGMT_OP_REMOVE_UUID, hdev, sk_lookup, &match); in mgmt_set_class_of_dev_complete()
7281 mgmt_limited_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev, dev_class, in mgmt_set_class_of_dev_complete()
7283 ext_info_changed(hdev, NULL); in mgmt_set_class_of_dev_complete()
7290 void mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status) in mgmt_set_local_name_complete() argument
7300 memcpy(ev.short_name, hdev->short_name, HCI_MAX_SHORT_NAME_LENGTH); in mgmt_set_local_name_complete()
7302 cmd = pending_find(MGMT_OP_SET_LOCAL_NAME, hdev); in mgmt_set_local_name_complete()
7304 memcpy(hdev->dev_name, name, sizeof(hdev->dev_name)); in mgmt_set_local_name_complete()
7309 if (pending_find(MGMT_OP_SET_POWERED, hdev)) in mgmt_set_local_name_complete()
7313 mgmt_limited_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, &ev, sizeof(ev), in mgmt_set_local_name_complete()
7315 ext_info_changed(hdev, cmd ? cmd->sk : NULL); in mgmt_set_local_name_complete()
7385 static void restart_le_scan(struct hci_dev *hdev) in restart_le_scan() argument
7388 if (!hci_dev_test_flag(hdev, HCI_LE_SCAN)) in restart_le_scan()
7392 hdev->discovery.scan_start + in restart_le_scan()
7393 hdev->discovery.scan_duration)) in restart_le_scan()
7396 queue_delayed_work(hdev->req_workqueue, &hdev->le_scan_restart, in restart_le_scan()
7400 static bool is_filter_match(struct hci_dev *hdev, s8 rssi, u8 *eir, in is_filter_match() argument
7412 if (hdev->discovery.rssi != HCI_RSSI_INVALID && in is_filter_match()
7414 (rssi < hdev->discovery.rssi && in is_filter_match()
7415 !test_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks)))) in is_filter_match()
7418 if (hdev->discovery.uuid_count != 0) { in is_filter_match()
7422 if (!eir_has_uuids(eir, eir_len, hdev->discovery.uuid_count, in is_filter_match()
7423 hdev->discovery.uuids) && in is_filter_match()
7425 hdev->discovery.uuid_count, in is_filter_match()
7426 hdev->discovery.uuids)) in is_filter_match()
7433 if (test_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks)) { in is_filter_match()
7434 restart_le_scan(hdev); in is_filter_match()
7437 if (hdev->discovery.rssi != HCI_RSSI_INVALID && in is_filter_match()
7438 rssi < hdev->discovery.rssi) in is_filter_match()
7445 void mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type, in mgmt_device_found() argument
7457 if (!hci_discovery_active(hdev)) { in mgmt_device_found()
7460 if (link_type == LE_LINK && list_empty(&hdev->pend_le_reports)) in mgmt_device_found()
7464 if (hdev->discovery.result_filtering) { in mgmt_device_found()
7466 if (!is_filter_match(hdev, rssi, eir, eir_len, scan_rsp, in mgmt_device_found()
7471 if (hdev->discovery.limited) { in mgmt_device_found()
7499 if (rssi == HCI_RSSI_INVALID && !hdev->discovery.report_invalid_rssi && in mgmt_device_found()
7524 mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, ev_size, NULL); in mgmt_device_found()
7527 void mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type, in mgmt_remote_name() argument
7547 mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, sizeof(*ev) + eir_len, NULL); in mgmt_remote_name()
7550 void mgmt_discovering(struct hci_dev *hdev, u8 discovering) in mgmt_discovering() argument
7554 BT_DBG("%s discovering %u", hdev->name, discovering); in mgmt_discovering()
7557 ev.type = hdev->discovery.type; in mgmt_discovering()
7560 mgmt_event(MGMT_EV_DISCOVERING, hdev, &ev, sizeof(ev), NULL); in mgmt_discovering()