adapter: Clear all Adv monitors upon bring-up
authorMiao-chen Chou <mcchou@chromium.org>
Sat, 31 Oct 2020 00:52:50 +0000 (17:52 -0700)
committerAyush Garg <ayush.garg@samsung.com>
Fri, 11 Mar 2022 13:38:33 +0000 (19:08 +0530)
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.

Signed-off-by: Anuj Jain <anuj01.jain@samsung.com>
Signed-off-by: Ayush Garg <ayush.garg@samsung.com>
src/adapter.c

index f1e0e8d..a5b1b05 100644 (file)
@@ -15865,6 +15865,43 @@ failed:
        btd_adapter_unref(adapter);
 }
 
+static void reset_adv_monitors_complete(uint8_t status, uint16_t length,
+                                       const void *param, void *user_data)
+{
+       const 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)
 {
@@ -15879,6 +15916,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,