summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJaganath Kanakkassery <jaganath.k.os@gmail.com>2018-07-19 07:39:43 -0400
committerMarcel Holtmann <marcel@holtmann.org>2018-07-30 07:44:53 -0400
commit45b7749f16aacd9ffab8e958caa77e2aa2358c0b (patch)
treeef9dab3d8dd6024b3da5ac1c9ed5887235eb684a
parenta0fb3726ba55138ef6fdd5dc67da6d9a70360696 (diff)
Bluetooth: Implement disable and removal of adv instance
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>
-rw-r--r--include/net/bluetooth/hci.h2
-rw-r--r--net/bluetooth/hci_event.c2
-rw-r--r--net/bluetooth/hci_request.c23
-rw-r--r--net/bluetooth/hci_request.h1
-rw-r--r--net/bluetooth/mgmt.c3
5 files changed, 29 insertions, 2 deletions
diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h
index aace97099ead..faa2922a69fd 100644
--- a/include/net/bluetooth/hci.h
+++ b/include/net/bluetooth/hci.h
@@ -1647,6 +1647,8 @@ struct hci_cp_le_set_ext_scan_rsp_data {
1647 1647
1648#define LE_SET_ADV_DATA_NO_FRAG 0x01 1648#define LE_SET_ADV_DATA_NO_FRAG 0x01
1649 1649
1650#define HCI_OP_LE_CLEAR_ADV_SETS 0x203d
1651
1650/* ---- HCI Events ---- */ 1652/* ---- HCI Events ---- */
1651#define HCI_EV_INQUIRY_COMPLETE 0x01 1653#define HCI_EV_INQUIRY_COMPLETE 0x01
1652 1654
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
index 0a92bf7e3d80..a78d1dd2f57b 100644
--- a/net/bluetooth/hci_event.c
+++ b/net/bluetooth/hci_event.c
@@ -1129,6 +1129,8 @@ static void hci_cc_le_set_ext_adv_enable(struct hci_dev *hdev,
1129 queue_delayed_work(hdev->workqueue, 1129 queue_delayed_work(hdev->workqueue,
1130 &conn->le_conn_timeout, 1130 &conn->le_conn_timeout,
1131 conn->conn_timeout); 1131 conn->conn_timeout);
1132 } else {
1133 hci_dev_clear_flag(hdev, HCI_LE_ADV);
1132 } 1134 }
1133 1135
1134 hci_dev_unlock(hdev); 1136 hci_dev_unlock(hdev);
diff --git a/net/bluetooth/hci_request.c b/net/bluetooth/hci_request.c
index c41e9bb7818b..96e1e05a92c3 100644
--- a/net/bluetooth/hci_request.c
+++ b/net/bluetooth/hci_request.c
@@ -934,9 +934,19 @@ static u8 get_cur_adv_instance_scan_rsp_len(struct hci_dev *hdev)
934 934
935void __hci_req_disable_advertising(struct hci_request *req) 935void __hci_req_disable_advertising(struct hci_request *req)
936{ 936{
937 u8 enable = 0x00; 937 if (ext_adv_capable(req->hdev)) {
938 struct hci_cp_le_set_ext_adv_enable cp;
938 939
939 hci_req_add(req, HCI_OP_LE_SET_ADV_ENABLE, sizeof(enable), &enable); 940 cp.enable = 0x00;
941 /* Disable all sets since we only support one set at the moment */
942 cp.num_of_sets = 0x00;
943
944 hci_req_add(req, HCI_OP_LE_SET_EXT_ADV_ENABLE, sizeof(cp), &cp);
945 } else {
946 u8 enable = 0x00;
947
948 hci_req_add(req, HCI_OP_LE_SET_ADV_ENABLE, sizeof(enable), &enable);
949 }
940} 950}
941 951
942static u32 get_adv_instance_flags(struct hci_dev *hdev, u8 instance) 952static u32 get_adv_instance_flags(struct hci_dev *hdev, u8 instance)
@@ -1430,6 +1440,11 @@ unlock:
1430 hci_dev_unlock(hdev); 1440 hci_dev_unlock(hdev);
1431} 1441}
1432 1442
1443void __hci_req_clear_ext_adv_sets(struct hci_request *req)
1444{
1445 hci_req_add(req, HCI_OP_LE_CLEAR_ADV_SETS, 0, NULL);
1446}
1447
1433int __hci_req_setup_ext_adv_instance(struct hci_request *req, u8 instance) 1448int __hci_req_setup_ext_adv_instance(struct hci_request *req, u8 instance)
1434{ 1449{
1435 struct hci_cp_le_set_ext_adv_params cp; 1450 struct hci_cp_le_set_ext_adv_params cp;
@@ -1499,8 +1514,12 @@ void __hci_req_enable_ext_advertising(struct hci_request *req)
1499 1514
1500int __hci_req_start_ext_adv(struct hci_request *req, u8 instance) 1515int __hci_req_start_ext_adv(struct hci_request *req, u8 instance)
1501{ 1516{
1517 struct hci_dev *hdev = req->hdev;
1502 int err; 1518 int err;
1503 1519
1520 if (hci_dev_test_flag(hdev, HCI_LE_ADV))
1521 __hci_req_disable_advertising(req);
1522
1504 err = __hci_req_setup_ext_adv_instance(req, instance); 1523 err = __hci_req_setup_ext_adv_instance(req, instance);
1505 if (err < 0) 1524 if (err < 0)
1506 return err; 1525 return err;
diff --git a/net/bluetooth/hci_request.h b/net/bluetooth/hci_request.h
index 6afc624605af..2451861bb4f8 100644
--- a/net/bluetooth/hci_request.h
+++ b/net/bluetooth/hci_request.h
@@ -83,6 +83,7 @@ void hci_req_clear_adv_instance(struct hci_dev *hdev, struct sock *sk,
83int __hci_req_setup_ext_adv_instance(struct hci_request *req, u8 instance); 83int __hci_req_setup_ext_adv_instance(struct hci_request *req, u8 instance);
84int __hci_req_start_ext_adv(struct hci_request *req, u8 instance); 84int __hci_req_start_ext_adv(struct hci_request *req, u8 instance);
85void __hci_req_enable_ext_advertising(struct hci_request *req); 85void __hci_req_enable_ext_advertising(struct hci_request *req);
86void __hci_req_clear_ext_adv_sets(struct hci_request *req);
86 87
87void __hci_req_update_class(struct hci_request *req); 88void __hci_req_update_class(struct hci_request *req);
88 89
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index 142f7e72a9a2..c283f0364c0f 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -1956,6 +1956,9 @@ static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1956 } else { 1956 } else {
1957 if (hci_dev_test_flag(hdev, HCI_LE_ADV)) 1957 if (hci_dev_test_flag(hdev, HCI_LE_ADV))
1958 __hci_req_disable_advertising(&req); 1958 __hci_req_disable_advertising(&req);
1959
1960 if (ext_adv_capable(hdev))
1961 __hci_req_clear_ext_adv_sets(&req);
1959 } 1962 }
1960 1963
1961 hci_req_add(&req, HCI_OP_WRITE_LE_HOST_SUPPORTED, sizeof(hci_cp), 1964 hci_req_add(&req, HCI_OP_WRITE_LE_HOST_SUPPORTED, sizeof(hci_cp),