From 57578cc21547d76e98c2208c7f8f373f0b842e21 Mon Sep 17 00:00:00 2001 From: Shubham Patil Date: Tue, 7 Nov 2023 02:07:45 +0530 Subject: [PATCH] [ESP32] Fix the threading issue in nimble (#29180) * [ESP32] Fix the threading issue in nimble Send ble connection error than executing in nimble thread context * comment explaining why we are posting connection error event * Adding a comment for kCHIPoBLEConnectionError --- src/include/platform/CHIPDeviceEvent.h | 6 ++++++ src/platform/ESP32/nimble/BLEManagerImpl.cpp | 9 ++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/include/platform/CHIPDeviceEvent.h b/src/include/platform/CHIPDeviceEvent.h index bf4c55ca438377..561cd5f539367b 100644 --- a/src/include/platform/CHIPDeviceEvent.h +++ b/src/include/platform/CHIPDeviceEvent.h @@ -258,6 +258,12 @@ enum InternalEventTypes kCHIPoBLEUnsubscribe, kCHIPoBLEWriteReceived, kCHIPoBLEIndicateConfirm, + + /** + * Post this event in case of a BLE connection error. This event should be posted + * if the BLE central disconnects without unsubscribing from the BLE characteristic. + * This event should populate CHIPoBLEConnectionError structure. + */ kCHIPoBLEConnectionError, kCHIPoBLENotifyConfirm }; diff --git a/src/platform/ESP32/nimble/BLEManagerImpl.cpp b/src/platform/ESP32/nimble/BLEManagerImpl.cpp index 66a4d29df768d4..877f49e5fb006c 100644 --- a/src/platform/ESP32/nimble/BLEManagerImpl.cpp +++ b/src/platform/ESP32/nimble/BLEManagerImpl.cpp @@ -1273,6 +1273,8 @@ CHIP_ERROR BLEManagerImpl::HandleGAPDisconnect(struct ble_gap_event * gapEvent) peer_delete(gapEvent->disconnect.conn.conn_handle); #endif + // There can be a case where the BLE central disconnects without unsubscribing from the BLE characteristic. + // In such situations, it is necessary to clear the subscription and post a connection error event. if (UnsetSubscribed(gapEvent->disconnect.conn.conn_handle)) { CHIP_ERROR disconReason; @@ -1288,7 +1290,12 @@ CHIP_ERROR BLEManagerImpl::HandleGAPDisconnect(struct ble_gap_event * gapEvent) disconReason = BLE_ERROR_CHIPOBLE_PROTOCOL_ABORT; break; } - HandleConnectionError(gapEvent->disconnect.conn.conn_handle, disconReason); + + ChipDeviceEvent connectionErrorEvent; + connectionErrorEvent.Type = DeviceEventType::kCHIPoBLEConnectionError; + connectionErrorEvent.CHIPoBLEConnectionError.ConId = gapEvent->disconnect.conn.conn_handle; + connectionErrorEvent.CHIPoBLEConnectionError.Reason = disconReason; + ReturnErrorOnFailure(PlatformMgr().PostEvent(&connectionErrorEvent)); } ChipDeviceEvent disconnectEvent;