Bluetooth: Add new mgmt setting for LE advertising
This patch adds a new mgmt setting for LE advertising and hooks up the necessary places in the mgmt code to operate on the HCI_LE_PERIPHERAL flag (which corresponds to this setting). This patch does not yet add any new command for enabling the setting - that is left for a subsequent patch. Signed-off-by: Johan Hedberg <johan.hedberg@intel.com> Acked-by: Marcel Holtmann <marcel@holtmann.org> Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
This commit is contained in:
parent
416a4ae56b
commit
eeca6f8913
|
@ -93,6 +93,7 @@ struct mgmt_rp_read_index_list {
|
|||
#define MGMT_SETTING_BREDR 0x00000080
|
||||
#define MGMT_SETTING_HS 0x00000100
|
||||
#define MGMT_SETTING_LE 0x00000200
|
||||
#define MGMT_SETTING_ADVERTISING 0x00000400
|
||||
|
||||
#define MGMT_OP_READ_INFO 0x0004
|
||||
#define MGMT_READ_INFO_SIZE 0
|
||||
|
|
|
@ -1000,6 +1000,7 @@ static void hci_cc_write_le_host_supported(struct hci_dev *hdev,
|
|||
} else {
|
||||
hdev->features[1][0] &= ~LMP_HOST_LE;
|
||||
clear_bit(HCI_LE_ENABLED, &hdev->dev_flags);
|
||||
clear_bit(HCI_LE_PERIPHERAL, &hdev->dev_flags);
|
||||
}
|
||||
|
||||
if (sent->simul)
|
||||
|
|
|
@ -384,8 +384,10 @@ static u32 get_supported_settings(struct hci_dev *hdev)
|
|||
if (enable_hs)
|
||||
settings |= MGMT_SETTING_HS;
|
||||
|
||||
if (lmp_le_capable(hdev))
|
||||
if (lmp_le_capable(hdev)) {
|
||||
settings |= MGMT_SETTING_LE;
|
||||
settings |= MGMT_SETTING_ADVERTISING;
|
||||
}
|
||||
|
||||
return settings;
|
||||
}
|
||||
|
@ -424,6 +426,9 @@ static u32 get_current_settings(struct hci_dev *hdev)
|
|||
if (test_bit(HCI_HS_ENABLED, &hdev->dev_flags))
|
||||
settings |= MGMT_SETTING_HS;
|
||||
|
||||
if (test_bit(HCI_LE_PERIPHERAL, &hdev->dev_flags))
|
||||
settings |= MGMT_SETTING_ADVERTISING;
|
||||
|
||||
return settings;
|
||||
}
|
||||
|
||||
|
@ -1411,6 +1416,11 @@ static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
|
|||
changed = true;
|
||||
}
|
||||
|
||||
if (!val && test_bit(HCI_LE_PERIPHERAL, &hdev->dev_flags)) {
|
||||
clear_bit(HCI_LE_PERIPHERAL, &hdev->dev_flags);
|
||||
changed = true;
|
||||
}
|
||||
|
||||
err = send_settings_rsp(sk, MGMT_OP_SET_LE, hdev);
|
||||
if (err < 0)
|
||||
goto unlock;
|
||||
|
@ -1442,6 +1452,9 @@ static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
|
|||
|
||||
hci_req_init(&req, hdev);
|
||||
|
||||
if (test_bit(HCI_LE_PERIPHERAL, &hdev->dev_flags) && !val)
|
||||
hci_req_add(&req, HCI_OP_LE_SET_ADV_ENABLE, sizeof(val), &val);
|
||||
|
||||
hci_req_add(&req, HCI_OP_WRITE_LE_HOST_SUPPORTED, sizeof(hci_cp),
|
||||
&hci_cp);
|
||||
|
||||
|
@ -3517,6 +3530,12 @@ static int powered_update_hci(struct hci_dev *hdev)
|
|||
sizeof(cp), &cp);
|
||||
}
|
||||
|
||||
if (test_bit(HCI_LE_PERIPHERAL, &hdev->dev_flags)) {
|
||||
u8 adv = 0x01;
|
||||
|
||||
hci_req_add(&req, HCI_OP_LE_SET_ADV_ENABLE, sizeof(adv), &adv);
|
||||
}
|
||||
|
||||
link_sec = test_bit(HCI_LINK_SECURITY, &hdev->dev_flags);
|
||||
if (link_sec != test_bit(HCI_AUTH, &hdev->flags))
|
||||
hci_req_add(&req, HCI_OP_WRITE_AUTH_ENABLE,
|
||||
|
|
Loading…
Reference in New Issue