Skip to content

Commit

Permalink
[ESP32] Fix the threading issue in nimble (#29180)
Browse files Browse the repository at this point in the history
* [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
  • Loading branch information
shubhamdp authored Nov 6, 2023
1 parent 99f61c2 commit 57578cc
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 1 deletion.
6 changes: 6 additions & 0 deletions src/include/platform/CHIPDeviceEvent.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
};
Expand Down
9 changes: 8 additions & 1 deletion src/platform/ESP32/nimble/BLEManagerImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down

0 comments on commit 57578cc

Please sign in to comment.