Skip to content

Commit

Permalink
Bluetooth: Implement disable and removal of adv instance
Browse files Browse the repository at this point in the history
If ext adv is enabled then use ext adv to disable as well.
Also remove the adv set during LE disable.

< HCI Command: LE Set Extended Advertising Enable (0x08|0x0039) plen 2
        Extended advertising: Disabled (0x00)
        Number of sets: Disable all sets (0x00)
> HCI Event: Command Complete (0x0e) plen 4
      LE Set Extended Advertising Enable (0x08|0x0039) ncmd 2
        Status: Success (0x00)

Signed-off-by: Jaganath Kanakkassery <jaganathx.kanakkassery@intel.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
  • Loading branch information
Jaganath Kanakkassery authored and Marcel Holtmann committed Jul 30, 2018
1 parent a0fb372 commit 45b7749
Show file tree
Hide file tree
Showing 5 changed files with 29 additions and 2 deletions.
2 changes: 2 additions & 0 deletions include/net/bluetooth/hci.h
Original file line number Diff line number Diff line change
Expand Up @@ -1647,6 +1647,8 @@ struct hci_cp_le_set_ext_scan_rsp_data {

#define LE_SET_ADV_DATA_NO_FRAG 0x01

#define HCI_OP_LE_CLEAR_ADV_SETS 0x203d

/* ---- HCI Events ---- */
#define HCI_EV_INQUIRY_COMPLETE 0x01

Expand Down
2 changes: 2 additions & 0 deletions net/bluetooth/hci_event.c
Original file line number Diff line number Diff line change
Expand Up @@ -1129,6 +1129,8 @@ static void hci_cc_le_set_ext_adv_enable(struct hci_dev *hdev,
queue_delayed_work(hdev->workqueue,
&conn->le_conn_timeout,
conn->conn_timeout);
} else {
hci_dev_clear_flag(hdev, HCI_LE_ADV);
}

hci_dev_unlock(hdev);
Expand Down
23 changes: 21 additions & 2 deletions net/bluetooth/hci_request.c
Original file line number Diff line number Diff line change
Expand Up @@ -934,9 +934,19 @@ static u8 get_cur_adv_instance_scan_rsp_len(struct hci_dev *hdev)

void __hci_req_disable_advertising(struct hci_request *req)
{
u8 enable = 0x00;
if (ext_adv_capable(req->hdev)) {
struct hci_cp_le_set_ext_adv_enable cp;

hci_req_add(req, HCI_OP_LE_SET_ADV_ENABLE, sizeof(enable), &enable);
cp.enable = 0x00;
/* Disable all sets since we only support one set at the moment */
cp.num_of_sets = 0x00;

hci_req_add(req, HCI_OP_LE_SET_EXT_ADV_ENABLE, sizeof(cp), &cp);
} else {
u8 enable = 0x00;

hci_req_add(req, HCI_OP_LE_SET_ADV_ENABLE, sizeof(enable), &enable);
}
}

static u32 get_adv_instance_flags(struct hci_dev *hdev, u8 instance)
Expand Down Expand Up @@ -1430,6 +1440,11 @@ static void adv_timeout_expire(struct work_struct *work)
hci_dev_unlock(hdev);
}

void __hci_req_clear_ext_adv_sets(struct hci_request *req)
{
hci_req_add(req, HCI_OP_LE_CLEAR_ADV_SETS, 0, NULL);
}

int __hci_req_setup_ext_adv_instance(struct hci_request *req, u8 instance)
{
struct hci_cp_le_set_ext_adv_params cp;
Expand Down Expand Up @@ -1499,8 +1514,12 @@ void __hci_req_enable_ext_advertising(struct hci_request *req)

int __hci_req_start_ext_adv(struct hci_request *req, u8 instance)
{
struct hci_dev *hdev = req->hdev;
int err;

if (hci_dev_test_flag(hdev, HCI_LE_ADV))
__hci_req_disable_advertising(req);

err = __hci_req_setup_ext_adv_instance(req, instance);
if (err < 0)
return err;
Expand Down
1 change: 1 addition & 0 deletions net/bluetooth/hci_request.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ void hci_req_clear_adv_instance(struct hci_dev *hdev, struct sock *sk,
int __hci_req_setup_ext_adv_instance(struct hci_request *req, u8 instance);
int __hci_req_start_ext_adv(struct hci_request *req, u8 instance);
void __hci_req_enable_ext_advertising(struct hci_request *req);
void __hci_req_clear_ext_adv_sets(struct hci_request *req);

void __hci_req_update_class(struct hci_request *req);

Expand Down
3 changes: 3 additions & 0 deletions net/bluetooth/mgmt.c
Original file line number Diff line number Diff line change
Expand Up @@ -1956,6 +1956,9 @@ static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
} else {
if (hci_dev_test_flag(hdev, HCI_LE_ADV))
__hci_req_disable_advertising(&req);

if (ext_adv_capable(hdev))
__hci_req_clear_ext_adv_sets(&req);
}

hci_req_add(&req, HCI_OP_WRITE_LE_HOST_SUPPORTED, sizeof(hci_cp),
Expand Down

0 comments on commit 45b7749

Please sign in to comment.