2020-09-17 07:08:13

by Miao-chen Chou

[permalink] [raw]
Subject: [BlueZ PATCH v3 5/8] adapter: Clear all Adv monitors upon bring-up

This clears all Adv monitors upon daemon bring-up by issuing
MGMT_OP_REMOVE_ADV_MONITOR command with monitor_handle 0.

The following test was performed:
- Add an Adv Monitor using btmgmt, restart bluetoothd and observe the
monitor got removed.

Reviewed-by: Alain Michaud <[email protected]>
Reviewed-by: Manish Mandlik <[email protected]>
Reviewed-by: Howard Chung <[email protected]>
---

(no changes since v1)

src/adapter.c | 39 +++++++++++++++++++++++++++++++++++++++
1 file changed, 39 insertions(+)

diff --git a/src/adapter.c b/src/adapter.c
index d33ce7124..191467048 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -9513,6 +9513,43 @@ failed:
btd_adapter_unref(adapter);
}

+static void reset_adv_monitors_complete(uint8_t status, uint16_t length,
+ const void *param, void *user_data)
+{
+ struct mgmt_rp_remove_adv_monitor *rp = param;
+
+ if (status != MGMT_STATUS_SUCCESS) {
+ error("Failed to reset Adv Monitors: %s (0x%02x)",
+ mgmt_errstr(status), status);
+ return;
+ }
+
+ if (length < sizeof(*rp)) {
+ error("Wrong size of remove Adv Monitor response for reset "
+ "all Adv Monitors");
+ return;
+ }
+
+ DBG("Removed all Adv Monitors");
+}
+
+static void reset_adv_monitors(uint16_t index)
+{
+ struct mgmt_cp_remove_adv_monitor cp;
+
+ DBG("sending remove Adv Monitor command with handle 0");
+
+ /* Handle 0 indicates to remove all */
+ cp.monitor_handle = 0;
+ if (mgmt_send(mgmt_master, MGMT_OP_REMOVE_ADV_MONITOR, index,
+ sizeof(cp), &cp, reset_adv_monitors_complete, NULL,
+ NULL) > 0) {
+ return;
+ }
+
+ error("Failed to reset Adv Monitors");
+}
+
static void index_added(uint16_t index, uint16_t length, const void *param,
void *user_data)
{
@@ -9527,6 +9564,8 @@ static void index_added(uint16_t index, uint16_t length, const void *param,
return;
}

+ reset_adv_monitors(index);
+
adapter = btd_adapter_new(index);
if (!adapter) {
btd_error(index,
--
2.26.2