From 409625916c0bae2bc09e3b3d5d75f34081f9aee2 Mon Sep 17 00:00:00 2001 From: Timothy Maes Date: Sat, 2 Jul 2022 18:19:31 +0200 Subject: [PATCH] [QPG] Update BLE State machine to not try starting advertisement while previous start was still in progress (#20219) Case existed where 2 paths restarted advertising on a FailSafe timeout. Protection added by adding additional state. --- src/platform/qpg/BLEManagerImpl.cpp | 12 ++++++++---- src/platform/qpg/BLEManagerImpl.h | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/platform/qpg/BLEManagerImpl.cpp b/src/platform/qpg/BLEManagerImpl.cpp index b9eb7f831f3124..6fa8ff8bda69dd 100644 --- a/src/platform/qpg/BLEManagerImpl.cpp +++ b/src/platform/qpg/BLEManagerImpl.cpp @@ -254,7 +254,7 @@ void BLEManagerImpl::_OnPlatformEvent(const ChipDeviceEvent * event) // Force the advertising state to be refreshed to reflect new provisioning state. mFlags.Set(Flags::kAdvertisingRefreshNeeded); - DriveBLEState(); + PlatformMgr().ScheduleWork(DriveBLEState, 0); break; @@ -519,7 +519,7 @@ CHIP_ERROR BLEManagerImpl::StartAdvertising(void) uint16_t intervalMax; // If already advertising, stop it, before changing values - if (mFlags.Has(Flags::kAdvertising)) + if (mFlags.Has(Flags::kAdvertising) || mFlags.Has(Flags::kEnablingAdvertising)) { err = MapBLEError(qvCHIP_BleStopAdvertising()); SuccessOrExit(err); @@ -550,7 +550,9 @@ CHIP_ERROR BLEManagerImpl::StartAdvertising(void) err = MapBLEError(qvCHIP_BleStartAdvertising()); SuccessOrExit(err); - mFlags.Set(Flags::kAdvertising); + // Flag updated asynchronously by BLE host callback + mFlags.Set(Flags::kEnablingAdvertising); + if (mFlags.Has(Flags::kFastAdvertisingEnabled)) { StartBleAdvTimeoutTimer(CHIP_DEVICE_CONFIG_BLE_ADVERTISING_INTERVAL_CHANGE_TIME); @@ -715,6 +717,7 @@ void BLEManagerImpl::HandleDmMsg(qvCHIP_Ble_DmEvt_t * pDmEvt) } sInstance.mFlags.Clear(Flags::kAdvertisingRefreshNeeded); + sInstance.mFlags.Clear(Flags::kEnablingAdvertising); // Transition to the Advertising state... if (!sInstance.mFlags.Has(Flags::kAdvertising)) @@ -739,6 +742,7 @@ void BLEManagerImpl::HandleDmMsg(qvCHIP_Ble_DmEvt_t * pDmEvt) ChipLogError(DeviceLayer, "QVCHIP_DM_ADV_STOP_IND error: %d", (int) pDmEvt->advSetStop.status); return; } + if (mFlags.Has(Flags::kRestartAdvertising)) { BLEMgr().SetAdvertisingMode(BLEAdvertisingMode::kSlowAdvertising); @@ -932,7 +936,7 @@ void BLEManagerImpl::BleAdvTimeoutHandler(TimerHandle_t xTimer) if (BLEMgrImpl().mFlags.Has(Flags::kFastAdvertisingEnabled)) { /* Stop advertising and defer restart for when stop confirmation is received from the stack */ - ChipLogDetail(DeviceLayer, "bleAdv Timeout : Start slow advertissment"); + ChipLogDetail(DeviceLayer, "bleAdv Timeout : Start slow advertisement"); sInstance.mFlags.Set(Flags::kRestartAdvertising); sInstance.StopAdvertising(); } diff --git a/src/platform/qpg/BLEManagerImpl.h b/src/platform/qpg/BLEManagerImpl.h index b9ea6c974ab5db..5c5b571e1485f0 100644 --- a/src/platform/qpg/BLEManagerImpl.h +++ b/src/platform/qpg/BLEManagerImpl.h @@ -99,6 +99,7 @@ class BLEManagerImpl final : public BLEManager, private BleLayer, private BlePla kDeviceNameSet = 0x0020, /**< The device name has been set. */ kRestartAdvertising = 0x0040, /**< The advertising will be restarted when stop advertising confirmation is received and this flag is set*/ + kEnablingAdvertising = 0x0080, /**< The BLE controller is setting up Advertisements. */ }; enum