diff options
author | Jaganath Kanakkassery <jaganath.k.os@gmail.com> | 2018-07-19 07:39:43 -0400 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2018-07-30 07:44:53 -0400 |
commit | 45b7749f16aacd9ffab8e958caa77e2aa2358c0b (patch) | |
tree | ef9dab3d8dd6024b3da5ac1c9ed5887235eb684a | |
parent | a0fb3726ba55138ef6fdd5dc67da6d9a70360696 (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.h | 2 | ||||
-rw-r--r-- | net/bluetooth/hci_event.c | 2 | ||||
-rw-r--r-- | net/bluetooth/hci_request.c | 23 | ||||
-rw-r--r-- | net/bluetooth/hci_request.h | 1 | ||||
-rw-r--r-- | net/bluetooth/mgmt.c | 3 |
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 | ||
935 | void __hci_req_disable_advertising(struct hci_request *req) | 935 | void __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 | ||
942 | static u32 get_adv_instance_flags(struct hci_dev *hdev, u8 instance) | 952 | static 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 | ||
1443 | void __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 | |||
1433 | int __hci_req_setup_ext_adv_instance(struct hci_request *req, u8 instance) | 1448 | int __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 | ||
1500 | int __hci_req_start_ext_adv(struct hci_request *req, u8 instance) | 1515 | int __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, | |||
83 | int __hci_req_setup_ext_adv_instance(struct hci_request *req, u8 instance); | 83 | int __hci_req_setup_ext_adv_instance(struct hci_request *req, u8 instance); |
84 | int __hci_req_start_ext_adv(struct hci_request *req, u8 instance); | 84 | int __hci_req_start_ext_adv(struct hci_request *req, u8 instance); |
85 | void __hci_req_enable_ext_advertising(struct hci_request *req); | 85 | void __hci_req_enable_ext_advertising(struct hci_request *req); |
86 | void __hci_req_clear_ext_adv_sets(struct hci_request *req); | ||
86 | 87 | ||
87 | void __hci_req_update_class(struct hci_request *req); | 88 | void __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), |