|
@@ -3012,6 +3012,35 @@ static int user_passkey_neg_reply(struct sock *sk, struct hci_dev *hdev,
|
|
|
HCI_OP_USER_PASSKEY_NEG_REPLY, 0);
|
|
|
}
|
|
|
|
|
|
+static void adv_expire(struct hci_dev *hdev, u32 flags)
|
|
|
+{
|
|
|
+ struct adv_info *adv_instance;
|
|
|
+ struct hci_request req;
|
|
|
+ int err;
|
|
|
+
|
|
|
+ adv_instance = hci_find_adv_instance(hdev, hdev->cur_adv_instance);
|
|
|
+ if (!adv_instance)
|
|
|
+ return;
|
|
|
+
|
|
|
+ /* stop if current instance doesn't need to be changed */
|
|
|
+ if (!(adv_instance->flags & flags))
|
|
|
+ return;
|
|
|
+
|
|
|
+ cancel_adv_timeout(hdev);
|
|
|
+
|
|
|
+ adv_instance = hci_get_next_instance(hdev, adv_instance->instance);
|
|
|
+ if (!adv_instance)
|
|
|
+ return;
|
|
|
+
|
|
|
+ hci_req_init(&req, hdev);
|
|
|
+ err = __hci_req_schedule_adv_instance(&req, adv_instance->instance,
|
|
|
+ true);
|
|
|
+ if (err)
|
|
|
+ return;
|
|
|
+
|
|
|
+ hci_req_run(&req, NULL);
|
|
|
+}
|
|
|
+
|
|
|
static void set_name_complete(struct hci_dev *hdev, u8 status, u16 opcode)
|
|
|
{
|
|
|
struct mgmt_cp_set_local_name *cp;
|
|
@@ -3027,13 +3056,17 @@ static void set_name_complete(struct hci_dev *hdev, u8 status, u16 opcode)
|
|
|
|
|
|
cp = cmd->param;
|
|
|
|
|
|
- if (status)
|
|
|
+ if (status) {
|
|
|
mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME,
|
|
|
mgmt_status(status));
|
|
|
- else
|
|
|
+ } else {
|
|
|
mgmt_cmd_complete(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0,
|
|
|
cp, sizeof(*cp));
|
|
|
|
|
|
+ if (hci_dev_test_flag(hdev, HCI_LE_ADV))
|
|
|
+ adv_expire(hdev, MGMT_ADV_FLAG_LOCAL_NAME);
|
|
|
+ }
|
|
|
+
|
|
|
mgmt_pending_remove(cmd);
|
|
|
|
|
|
unlock:
|
|
@@ -5885,6 +5918,7 @@ static u32 get_supported_adv_flags(struct hci_dev *hdev)
|
|
|
flags |= MGMT_ADV_FLAG_DISCOV;
|
|
|
flags |= MGMT_ADV_FLAG_LIMITED_DISCOV;
|
|
|
flags |= MGMT_ADV_FLAG_MANAGED_FLAGS;
|
|
|
+ flags |= MGMT_ADV_FLAG_LOCAL_NAME;
|
|
|
|
|
|
if (hdev->adv_tx_power != HCI_TX_POWER_INVALID)
|
|
|
flags |= MGMT_ADV_FLAG_TX_POWER;
|
|
@@ -5961,6 +5995,10 @@ static bool tlv_data_is_valid(struct hci_dev *hdev, u32 adv_flags, u8 *data,
|
|
|
tx_power_managed = true;
|
|
|
max_len -= 3;
|
|
|
}
|
|
|
+ } else {
|
|
|
+ /* at least 1 byte of name should fit in */
|
|
|
+ if (adv_flags & MGMT_ADV_FLAG_LOCAL_NAME)
|
|
|
+ max_len -= 3;
|
|
|
}
|
|
|
|
|
|
if (len > max_len)
|
|
@@ -6293,6 +6331,10 @@ static u8 tlv_data_max_len(u32 adv_flags, bool is_adv_data)
|
|
|
|
|
|
if (adv_flags & MGMT_ADV_FLAG_TX_POWER)
|
|
|
max_len -= 3;
|
|
|
+ } else {
|
|
|
+ /* at least 1 byte of name should fit in */
|
|
|
+ if (adv_flags & MGMT_ADV_FLAG_LOCAL_NAME)
|
|
|
+ max_len -= 3;
|
|
|
}
|
|
|
|
|
|
return max_len;
|