|
|
|
|
@@ -1440,17 +1440,22 @@ static void settings_rsp(struct mgmt_pending_cmd *cmd, void *data)
|
|
|
|
|
|
|
|
|
|
send_settings_rsp(cmd->sk, cmd->opcode, match->hdev);
|
|
|
|
|
|
|
|
|
|
list_del(&cmd->list);
|
|
|
|
|
|
|
|
|
|
if (match->sk == NULL) {
|
|
|
|
|
match->sk = cmd->sk;
|
|
|
|
|
sock_hold(match->sk);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mgmt_pending_free(cmd);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void cmd_status_rsp(struct mgmt_pending_cmd *cmd, void *data)
|
|
|
|
|
{
|
|
|
|
|
u8 *status = data;
|
|
|
|
|
|
|
|
|
|
mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, *status);
|
|
|
|
|
mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, *status);
|
|
|
|
|
mgmt_pending_remove(cmd);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void cmd_complete_rsp(struct mgmt_pending_cmd *cmd, void *data)
|
|
|
|
|
@@ -1464,6 +1469,8 @@ static void cmd_complete_rsp(struct mgmt_pending_cmd *cmd, void *data)
|
|
|
|
|
|
|
|
|
|
if (cmd->cmd_complete) {
|
|
|
|
|
cmd->cmd_complete(cmd, match->mgmt_status);
|
|
|
|
|
mgmt_pending_remove(cmd);
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -1472,13 +1479,13 @@ static void cmd_complete_rsp(struct mgmt_pending_cmd *cmd, void *data)
|
|
|
|
|
|
|
|
|
|
static int generic_cmd_complete(struct mgmt_pending_cmd *cmd, u8 status)
|
|
|
|
|
{
|
|
|
|
|
return mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, status,
|
|
|
|
|
return mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status,
|
|
|
|
|
cmd->param, cmd->param_len);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int addr_cmd_complete(struct mgmt_pending_cmd *cmd, u8 status)
|
|
|
|
|
{
|
|
|
|
|
return mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, status,
|
|
|
|
|
return mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status,
|
|
|
|
|
cmd->param, sizeof(struct mgmt_addr_info));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -1518,7 +1525,7 @@ static void mgmt_set_discoverable_complete(struct hci_dev *hdev, void *data,
|
|
|
|
|
|
|
|
|
|
if (err) {
|
|
|
|
|
u8 mgmt_err = mgmt_status(err);
|
|
|
|
|
mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_err);
|
|
|
|
|
mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err);
|
|
|
|
|
hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE);
|
|
|
|
|
goto done;
|
|
|
|
|
}
|
|
|
|
|
@@ -1693,7 +1700,7 @@ static void mgmt_set_connectable_complete(struct hci_dev *hdev, void *data,
|
|
|
|
|
|
|
|
|
|
if (err) {
|
|
|
|
|
u8 mgmt_err = mgmt_status(err);
|
|
|
|
|
mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_err);
|
|
|
|
|
mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err);
|
|
|
|
|
goto done;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -1929,8 +1936,8 @@ static void set_ssp_complete(struct hci_dev *hdev, void *data, int err)
|
|
|
|
|
new_settings(hdev, NULL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, true,
|
|
|
|
|
cmd_status_rsp, &mgmt_err);
|
|
|
|
|
mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, cmd_status_rsp,
|
|
|
|
|
&mgmt_err);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -1940,7 +1947,7 @@ static void set_ssp_complete(struct hci_dev *hdev, void *data, int err)
|
|
|
|
|
changed = hci_dev_test_and_clear_flag(hdev, HCI_SSP_ENABLED);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, true, settings_rsp, &match);
|
|
|
|
|
mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, settings_rsp, &match);
|
|
|
|
|
|
|
|
|
|
if (changed)
|
|
|
|
|
new_settings(hdev, match.sk);
|
|
|
|
|
@@ -2060,12 +2067,12 @@ static void set_le_complete(struct hci_dev *hdev, void *data, int err)
|
|
|
|
|
bt_dev_dbg(hdev, "err %d", err);
|
|
|
|
|
|
|
|
|
|
if (status) {
|
|
|
|
|
mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, true, cmd_status_rsp,
|
|
|
|
|
&status);
|
|
|
|
|
mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, cmd_status_rsp,
|
|
|
|
|
&status);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, true, settings_rsp, &match);
|
|
|
|
|
mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, settings_rsp, &match);
|
|
|
|
|
|
|
|
|
|
new_settings(hdev, match.sk);
|
|
|
|
|
|
|
|
|
|
@@ -2124,7 +2131,7 @@ static void set_mesh_complete(struct hci_dev *hdev, void *data, int err)
|
|
|
|
|
struct sock *sk = cmd->sk;
|
|
|
|
|
|
|
|
|
|
if (status) {
|
|
|
|
|
mgmt_pending_foreach(MGMT_OP_SET_MESH_RECEIVER, hdev, true,
|
|
|
|
|
mgmt_pending_foreach(MGMT_OP_SET_MESH_RECEIVER, hdev,
|
|
|
|
|
cmd_status_rsp, &status);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
@@ -2565,7 +2572,7 @@ static void mgmt_class_complete(struct hci_dev *hdev, void *data, int err)
|
|
|
|
|
|
|
|
|
|
bt_dev_dbg(hdev, "err %d", err);
|
|
|
|
|
|
|
|
|
|
mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode,
|
|
|
|
|
mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode,
|
|
|
|
|
mgmt_status(err), hdev->dev_class, 3);
|
|
|
|
|
|
|
|
|
|
mgmt_pending_free(cmd);
|
|
|
|
|
@@ -3353,7 +3360,7 @@ static int pairing_complete(struct mgmt_pending_cmd *cmd, u8 status)
|
|
|
|
|
bacpy(&rp.addr.bdaddr, &conn->dst);
|
|
|
|
|
rp.addr.type = link_to_bdaddr(conn->type, conn->dst_type);
|
|
|
|
|
|
|
|
|
|
err = mgmt_cmd_complete(cmd->sk, cmd->hdev->id, MGMT_OP_PAIR_DEVICE,
|
|
|
|
|
err = mgmt_cmd_complete(cmd->sk, cmd->index, MGMT_OP_PAIR_DEVICE,
|
|
|
|
|
status, &rp, sizeof(rp));
|
|
|
|
|
|
|
|
|
|
/* So we don't get further callbacks for this connection */
|
|
|
|
|
@@ -5243,7 +5250,7 @@ static void mgmt_add_adv_patterns_monitor_complete(struct hci_dev *hdev,
|
|
|
|
|
hci_update_passive_scan(hdev);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode,
|
|
|
|
|
mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode,
|
|
|
|
|
mgmt_status(status), &rp, sizeof(rp));
|
|
|
|
|
mgmt_pending_remove(cmd);
|
|
|
|
|
|
|
|
|
|
@@ -5458,7 +5465,7 @@ static void mgmt_remove_adv_monitor_complete(struct hci_dev *hdev,
|
|
|
|
|
hci_update_passive_scan(hdev);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode,
|
|
|
|
|
mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode,
|
|
|
|
|
mgmt_status(status), &rp, sizeof(rp));
|
|
|
|
|
mgmt_pending_free(cmd);
|
|
|
|
|
|
|
|
|
|
@@ -5857,7 +5864,7 @@ static void start_discovery_complete(struct hci_dev *hdev, void *data, int err)
|
|
|
|
|
cmd != pending_find(MGMT_OP_START_SERVICE_DISCOVERY, hdev))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_status(err),
|
|
|
|
|
mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, mgmt_status(err),
|
|
|
|
|
cmd->param, 1);
|
|
|
|
|
mgmt_pending_remove(cmd);
|
|
|
|
|
|
|
|
|
|
@@ -6095,7 +6102,7 @@ static void stop_discovery_complete(struct hci_dev *hdev, void *data, int err)
|
|
|
|
|
|
|
|
|
|
bt_dev_dbg(hdev, "err %d", err);
|
|
|
|
|
|
|
|
|
|
mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_status(err),
|
|
|
|
|
mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, mgmt_status(err),
|
|
|
|
|
cmd->param, 1);
|
|
|
|
|
mgmt_pending_remove(cmd);
|
|
|
|
|
|
|
|
|
|
@@ -6320,7 +6327,7 @@ static void set_advertising_complete(struct hci_dev *hdev, void *data, int err)
|
|
|
|
|
u8 status = mgmt_status(err);
|
|
|
|
|
|
|
|
|
|
if (status) {
|
|
|
|
|
mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev, true,
|
|
|
|
|
mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev,
|
|
|
|
|
cmd_status_rsp, &status);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
@@ -6330,7 +6337,7 @@ static void set_advertising_complete(struct hci_dev *hdev, void *data, int err)
|
|
|
|
|
else
|
|
|
|
|
hci_dev_clear_flag(hdev, HCI_ADVERTISING);
|
|
|
|
|
|
|
|
|
|
mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev, true, settings_rsp,
|
|
|
|
|
mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev, settings_rsp,
|
|
|
|
|
&match);
|
|
|
|
|
|
|
|
|
|
new_settings(hdev, match.sk);
|
|
|
|
|
@@ -6674,7 +6681,7 @@ static void set_bredr_complete(struct hci_dev *hdev, void *data, int err)
|
|
|
|
|
*/
|
|
|
|
|
hci_dev_clear_flag(hdev, HCI_BREDR_ENABLED);
|
|
|
|
|
|
|
|
|
|
mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_err);
|
|
|
|
|
mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err);
|
|
|
|
|
} else {
|
|
|
|
|
send_settings_rsp(cmd->sk, MGMT_OP_SET_BREDR, hdev);
|
|
|
|
|
new_settings(hdev, cmd->sk);
|
|
|
|
|
@@ -6811,7 +6818,7 @@ static void set_secure_conn_complete(struct hci_dev *hdev, void *data, int err)
|
|
|
|
|
if (err) {
|
|
|
|
|
u8 mgmt_err = mgmt_status(err);
|
|
|
|
|
|
|
|
|
|
mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_err);
|
|
|
|
|
mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err);
|
|
|
|
|
goto done;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -7258,7 +7265,7 @@ static void get_conn_info_complete(struct hci_dev *hdev, void *data, int err)
|
|
|
|
|
rp.max_tx_power = HCI_TX_POWER_INVALID;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mgmt_cmd_complete(cmd->sk, cmd->hdev->id, MGMT_OP_GET_CONN_INFO, status,
|
|
|
|
|
mgmt_cmd_complete(cmd->sk, cmd->index, MGMT_OP_GET_CONN_INFO, status,
|
|
|
|
|
&rp, sizeof(rp));
|
|
|
|
|
|
|
|
|
|
mgmt_pending_free(cmd);
|
|
|
|
|
@@ -7418,7 +7425,7 @@ static void get_clock_info_complete(struct hci_dev *hdev, void *data, int err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
complete:
|
|
|
|
|
mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, status, &rp,
|
|
|
|
|
mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status, &rp,
|
|
|
|
|
sizeof(rp));
|
|
|
|
|
|
|
|
|
|
mgmt_pending_free(cmd);
|
|
|
|
|
@@ -8668,10 +8675,10 @@ static void add_advertising_complete(struct hci_dev *hdev, void *data, int err)
|
|
|
|
|
rp.instance = cp->instance;
|
|
|
|
|
|
|
|
|
|
if (err)
|
|
|
|
|
mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode,
|
|
|
|
|
mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode,
|
|
|
|
|
mgmt_status(err));
|
|
|
|
|
else
|
|
|
|
|
mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode,
|
|
|
|
|
mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode,
|
|
|
|
|
mgmt_status(err), &rp, sizeof(rp));
|
|
|
|
|
|
|
|
|
|
add_adv_complete(hdev, cmd->sk, cp->instance, err);
|
|
|
|
|
@@ -8859,10 +8866,10 @@ static void add_ext_adv_params_complete(struct hci_dev *hdev, void *data,
|
|
|
|
|
|
|
|
|
|
hci_remove_adv_instance(hdev, cp->instance);
|
|
|
|
|
|
|
|
|
|
mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode,
|
|
|
|
|
mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode,
|
|
|
|
|
mgmt_status(err));
|
|
|
|
|
} else {
|
|
|
|
|
mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode,
|
|
|
|
|
mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode,
|
|
|
|
|
mgmt_status(err), &rp, sizeof(rp));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -9009,10 +9016,10 @@ static void add_ext_adv_data_complete(struct hci_dev *hdev, void *data, int err)
|
|
|
|
|
rp.instance = cp->instance;
|
|
|
|
|
|
|
|
|
|
if (err)
|
|
|
|
|
mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode,
|
|
|
|
|
mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode,
|
|
|
|
|
mgmt_status(err));
|
|
|
|
|
else
|
|
|
|
|
mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode,
|
|
|
|
|
mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode,
|
|
|
|
|
mgmt_status(err), &rp, sizeof(rp));
|
|
|
|
|
|
|
|
|
|
mgmt_pending_free(cmd);
|
|
|
|
|
@@ -9171,10 +9178,10 @@ static void remove_advertising_complete(struct hci_dev *hdev, void *data,
|
|
|
|
|
rp.instance = cp->instance;
|
|
|
|
|
|
|
|
|
|
if (err)
|
|
|
|
|
mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode,
|
|
|
|
|
mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode,
|
|
|
|
|
mgmt_status(err));
|
|
|
|
|
else
|
|
|
|
|
mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode,
|
|
|
|
|
mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode,
|
|
|
|
|
MGMT_STATUS_SUCCESS, &rp, sizeof(rp));
|
|
|
|
|
|
|
|
|
|
mgmt_pending_free(cmd);
|
|
|
|
|
@@ -9445,7 +9452,7 @@ void mgmt_index_removed(struct hci_dev *hdev)
|
|
|
|
|
if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
mgmt_pending_foreach(0, hdev, true, cmd_complete_rsp, &match);
|
|
|
|
|
mgmt_pending_foreach(0, hdev, cmd_complete_rsp, &match);
|
|
|
|
|
|
|
|
|
|
if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) {
|
|
|
|
|
mgmt_index_event(MGMT_EV_UNCONF_INDEX_REMOVED, hdev, NULL, 0,
|
|
|
|
|
@@ -9483,8 +9490,7 @@ void mgmt_power_on(struct hci_dev *hdev, int err)
|
|
|
|
|
hci_update_passive_scan(hdev);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, true, settings_rsp,
|
|
|
|
|
&match);
|
|
|
|
|
mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp, &match);
|
|
|
|
|
|
|
|
|
|
new_settings(hdev, match.sk);
|
|
|
|
|
|
|
|
|
|
@@ -9499,8 +9505,7 @@ void __mgmt_power_off(struct hci_dev *hdev)
|
|
|
|
|
struct cmd_lookup match = { NULL, hdev };
|
|
|
|
|
u8 zero_cod[] = { 0, 0, 0 };
|
|
|
|
|
|
|
|
|
|
mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, true, settings_rsp,
|
|
|
|
|
&match);
|
|
|
|
|
mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp, &match);
|
|
|
|
|
|
|
|
|
|
/* If the power off is because of hdev unregistration let
|
|
|
|
|
* use the appropriate INVALID_INDEX status. Otherwise use
|
|
|
|
|
@@ -9514,7 +9519,7 @@ void __mgmt_power_off(struct hci_dev *hdev)
|
|
|
|
|
else
|
|
|
|
|
match.mgmt_status = MGMT_STATUS_NOT_POWERED;
|
|
|
|
|
|
|
|
|
|
mgmt_pending_foreach(0, hdev, true, cmd_complete_rsp, &match);
|
|
|
|
|
mgmt_pending_foreach(0, hdev, cmd_complete_rsp, &match);
|
|
|
|
|
|
|
|
|
|
if (memcmp(hdev->dev_class, zero_cod, sizeof(zero_cod)) != 0) {
|
|
|
|
|
mgmt_limited_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev,
|
|
|
|
|
@@ -9755,6 +9760,7 @@ static void unpair_device_rsp(struct mgmt_pending_cmd *cmd, void *data)
|
|
|
|
|
device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, cmd->sk);
|
|
|
|
|
|
|
|
|
|
cmd->cmd_complete(cmd, 0);
|
|
|
|
|
mgmt_pending_remove(cmd);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool mgmt_powering_down(struct hci_dev *hdev)
|
|
|
|
|
@@ -9810,8 +9816,8 @@ void mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr,
|
|
|
|
|
struct mgmt_cp_disconnect *cp;
|
|
|
|
|
struct mgmt_pending_cmd *cmd;
|
|
|
|
|
|
|
|
|
|
mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, true,
|
|
|
|
|
unpair_device_rsp, hdev);
|
|
|
|
|
mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
|
|
|
|
|
hdev);
|
|
|
|
|
|
|
|
|
|
cmd = pending_find(MGMT_OP_DISCONNECT, hdev);
|
|
|
|
|
if (!cmd)
|
|
|
|
|
@@ -10004,7 +10010,7 @@ void mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status)
|
|
|
|
|
|
|
|
|
|
if (status) {
|
|
|
|
|
u8 mgmt_err = mgmt_status(status);
|
|
|
|
|
mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, true,
|
|
|
|
|
mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev,
|
|
|
|
|
cmd_status_rsp, &mgmt_err);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
@@ -10014,8 +10020,8 @@ void mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status)
|
|
|
|
|
else
|
|
|
|
|
changed = hci_dev_test_and_clear_flag(hdev, HCI_LINK_SECURITY);
|
|
|
|
|
|
|
|
|
|
mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, true,
|
|
|
|
|
settings_rsp, &match);
|
|
|
|
|
mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, settings_rsp,
|
|
|
|
|
&match);
|
|
|
|
|
|
|
|
|
|
if (changed)
|
|
|
|
|
new_settings(hdev, match.sk);
|
|
|
|
|
@@ -10039,12 +10045,9 @@ void mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class,
|
|
|
|
|
{
|
|
|
|
|
struct cmd_lookup match = { NULL, hdev, mgmt_status(status) };
|
|
|
|
|
|
|
|
|
|
mgmt_pending_foreach(MGMT_OP_SET_DEV_CLASS, hdev, false, sk_lookup,
|
|
|
|
|
&match);
|
|
|
|
|
mgmt_pending_foreach(MGMT_OP_ADD_UUID, hdev, false, sk_lookup,
|
|
|
|
|
&match);
|
|
|
|
|
mgmt_pending_foreach(MGMT_OP_REMOVE_UUID, hdev, false, sk_lookup,
|
|
|
|
|
&match);
|
|
|
|
|
mgmt_pending_foreach(MGMT_OP_SET_DEV_CLASS, hdev, sk_lookup, &match);
|
|
|
|
|
mgmt_pending_foreach(MGMT_OP_ADD_UUID, hdev, sk_lookup, &match);
|
|
|
|
|
mgmt_pending_foreach(MGMT_OP_REMOVE_UUID, hdev, sk_lookup, &match);
|
|
|
|
|
|
|
|
|
|
if (!status) {
|
|
|
|
|
mgmt_limited_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev, dev_class,
|
|
|
|
|
|