adapter: Fix issue where the adv restart logic operates even though adv stop is requested 35/303435/4 accepted/tizen/7.0/unified/20240109.160534
authorWootak Jung <wootak.jung@samsung.com>
Thu, 28 Dec 2023 00:12:59 +0000 (09:12 +0900)
committerWootak Jung <wootak.jung@samsung.com>
Sun, 7 Jan 2024 23:57:56 +0000 (08:57 +0900)
Fix the adv restart logic to only operate when adv is enabled

Change-Id: I9aebdc393050b6c7b3674281ffd801c6db18f14c
Signed-off-by: Wootak Jung <wootak.jung@samsung.com>
src/adapter.c

index e05258359f62fa1af99bff6d8732af51e48068cd..df93118e69e5c8bfc778336c771929c0410fc350 100644 (file)
@@ -4665,8 +4665,15 @@ static DBusMessage *adapter_set_advertising(DBusConnection *conn,
                                                DBUS_TYPE_INVALID))
                return btd_error_invalid_args(msg);
 
-       if (adapter->adv_restart_timeout > 0)
-               return btd_error_in_progress(msg);
+       if (adapter->adv_restart_timeout) {
+               if (enable) {
+                       return btd_error_in_progress(msg);
+               } else {
+                       DBG("Advertising stop received. No need to restart advertising");
+                       g_source_remove(adapter->adv_restart_timeout);
+                       adapter->adv_restart_timeout = 0;
+               }
+       }
 
        DBG("%s advertising slot_id %d", enable ? "Enable" : "Disable", slot_id);
 
@@ -13560,6 +13567,7 @@ static void multi_adv_state_change_callback(uint16_t index, uint16_t length,
        const struct mgmt_ev_vendor_specific_multi_adv_state_changed *ev = param;
        struct btd_adapter *adapter = user_data;
        struct multi_adv_data *data;
+       struct adv_info *adv;
 
        if (length < sizeof(*ev)) {
                error("Too small adv state change event");
@@ -13569,8 +13577,11 @@ static void multi_adv_state_change_callback(uint16_t index, uint16_t length,
        DBG("adv id %d, state change reason %d, connection_handle %x",
                ev->adv_instance, ev->state_change_reason, ev->connection_handle);
 
+       adv = find_advertiser(adapter, ev->adv_instance);
+       DBG("current advertising status %d", adv->status);
+
        if ((ev->adv_instance > 0 && ev->adv_instance < adapter_le_get_max_adv_instance()) &&
-                       ev->state_change_reason == 0) {
+                       ev->state_change_reason == 0 && adv->status) {
                /* advertising is stopped by controller, it should be enabled again.
                * If fails, state should be changed to FALSE */
                data = g_new0(struct multi_adv_data, 1);