From a2a5c0fdf1389b7d36db9d732a4b2814ef9a3961 Mon Sep 17 00:00:00 2001 From: Wootak Jung Date: Thu, 28 Dec 2023 09:12:59 +0900 Subject: [PATCH] adapter: Fix issue where the adv restart logic operates even though adv stop is requested Fix the adv restart logic to only operate when adv is enabled Change-Id: I9aebdc393050b6c7b3674281ffd801c6db18f14c Signed-off-by: Wootak Jung --- src/adapter.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/adapter.c b/src/adapter.c index e0525835..df93118e 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -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); -- 2.34.1