@@ -147,7 +147,6 @@ const uint16_t CHIPoBLEGATTAttrCount = sizeof(CHIPoBLEGATTAttrs) / sizeof(CHIPoB
147147ChipDeviceScanner & mDeviceScanner = Internal::ChipDeviceScanner::GetInstance();
148148#endif
149149BLEManagerImpl BLEManagerImpl::sInstance ;
150- constexpr System::Clock::Timeout BLEManagerImpl::kFastAdvertiseTimeout ;
151150#ifdef CONFIG_ENABLE_ESP32_BLE_CONTROLLER
152151static esp_gattc_char_elem_t * char_elem_result = NULL ;
153152static esp_gattc_descr_elem_t * descr_elem_result = NULL ;
@@ -228,6 +227,23 @@ CHIP_ERROR BLEManagerImpl::_Init()
228227 return err;
229228}
230229
230+ void BLEManagerImpl::_Shutdown ()
231+ {
232+ CancelBleAdvTimeoutTimer ();
233+
234+ BleLayer::Shutdown ();
235+ mServiceMode = ConnectivityManager::kCHIPoBLEServiceMode_Disabled ;
236+
237+ // selectively setting kGATTServiceStarted flag, in order to notify the state machine to stop the CHIPoBLE gatt service
238+ mFlags .ClearAll ().Set (Flags::kGATTServiceStarted );
239+
240+ #ifdef CONFIG_ENABLE_ESP32_BLE_CONTROLLER
241+ OnChipBleConnectReceived = nullptr ;
242+ #endif // CONFIG_ENABLE_ESP32_BLE_CONTROLLER
243+
244+ PlatformMgr ().ScheduleWork (DriveBLEState, 0 );
245+ }
246+
231247CHIP_ERROR BLEManagerImpl::_SetAdvertisingEnabled (bool val)
232248{
233249 CHIP_ERROR err = CHIP_NO_ERROR;
@@ -236,8 +252,7 @@ CHIP_ERROR BLEManagerImpl::_SetAdvertisingEnabled(bool val)
236252
237253 if (val)
238254 {
239- mAdvertiseStartTime = System::SystemClock ().GetMonotonicTimestamp ();
240- ReturnErrorOnFailure (DeviceLayer::SystemLayer ().StartTimer (kFastAdvertiseTimeout , HandleFastAdvertisementTimer, this ));
255+ StartBleAdvTimeoutTimer (CHIP_DEVICE_CONFIG_BLE_ADVERTISING_INTERVAL_CHANGE_TIME);
241256 }
242257 mFlags .Set (Flags::kFastAdvertisingEnabled , val);
243258 mFlags .Set (Flags::kAdvertisingRefreshNeeded , 1 );
@@ -247,21 +262,29 @@ CHIP_ERROR BLEManagerImpl::_SetAdvertisingEnabled(bool val)
247262 return err;
248263}
249264
250- void BLEManagerImpl::HandleFastAdvertisementTimer (System::Layer * systemLayer, void * context)
251- {
252- static_cast <BLEManagerImpl *>(context)->HandleFastAdvertisementTimer ();
253- }
254-
255- void BLEManagerImpl::HandleFastAdvertisementTimer ()
265+ void BLEManagerImpl::BleAdvTimeoutHandler (System::Layer *, void *)
256266{
257- System::Clock::Timestamp currentTimestamp = System::SystemClock ().GetMonotonicTimestamp ();
258-
259- if (currentTimestamp - mAdvertiseStartTime >= kFastAdvertiseTimeout )
267+ if (BLEMgrImpl ().mFlags .Has (Flags::kFastAdvertisingEnabled ))
268+ {
269+ ChipLogProgress (DeviceLayer, " bleAdv Timeout : Start slow advertisement" );
270+ BLEMgrImpl ().mFlags .Set (Flags::kFastAdvertisingEnabled , 0 );
271+ BLEMgrImpl ().mFlags .Set (Flags::kAdvertisingRefreshNeeded , 1 );
272+ #if CHIP_DEVICE_CONFIG_EXT_ADVERTISING
273+ BLEMgrImpl ().mFlags .Clear (Flags::kExtAdvertisingEnabled );
274+ BLEMgrImpl ().StartBleAdvTimeoutTimer (CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING_INTERVAL_CHANGE_TIME_MS);
275+ #endif
276+ }
277+ #if CHIP_DEVICE_CONFIG_EXT_ADVERTISING
278+ else
260279 {
261- mFlags .Clear (Flags::kFastAdvertisingEnabled );
262- mFlags .Set (Flags::kAdvertisingRefreshNeeded );
263- PlatformMgr ().ScheduleWork (DriveBLEState, 0 );
280+ ChipLogProgress (DeviceLayer, " bleAdv Timeout : Start extended advertisement" );
281+ BLEMgrImpl ().mFlags .Set (Flags::kAdvertising );
282+ BLEMgrImpl ().mFlags .Set (Flags::kExtAdvertisingEnabled );
283+ BLEMgr ().SetAdvertisingMode (BLEAdvertisingMode::kSlowAdvertising );
284+ BLEMgrImpl ().mFlags .Set (Flags::kAdvertisingRefreshNeeded , 1 );
264285 }
286+ #endif
287+ PlatformMgr ().ScheduleWork (DriveBLEState, 0 );
265288}
266289
267290CHIP_ERROR BLEManagerImpl::_SetAdvertisingMode (BLEAdvertisingMode mode)
@@ -843,8 +866,8 @@ CHIP_ERROR BLEManagerImpl::SendIndication(BLE_CONNECTION_OBJECT conId, const Chi
843866#endif
844867
845868 // Set param need_confirm as false will send notification, otherwise indication.
846- err = MapBLEError (
847- esp_ble_gatts_send_indicate ( mAppIf , conId, mTXCharAttrHandle , data-> DataLength (), data->Start (), true /* need_confirm */ ));
869+ err = MapBLEError (esp_ble_gatts_send_indicate ( mAppIf , conId, mTXCharAttrHandle , static_cast < uint16_t >(data-> DataLength ()),
870+ data->Start (), true /* need_confirm */ ));
848871 if (err != CHIP_NO_ERROR)
849872 {
850873 ChipLogError (DeviceLayer, " esp_ble_gatts_send_indicate() failed: %s" , ErrorStr (err));
@@ -907,6 +930,20 @@ CHIP_ERROR BLEManagerImpl::MapBLEError(int bleErr)
907930 }
908931}
909932
933+ void BLEManagerImpl::CancelBleAdvTimeoutTimer (void )
934+ {
935+ SystemLayer ().CancelTimer (BleAdvTimeoutHandler, nullptr );
936+ }
937+
938+ void BLEManagerImpl::StartBleAdvTimeoutTimer (uint32_t aTimeoutInMs)
939+ {
940+ CHIP_ERROR err = SystemLayer ().StartTimer (System::Clock::Milliseconds32 (aTimeoutInMs), BleAdvTimeoutHandler, nullptr );
941+ if ((err != CHIP_NO_ERROR))
942+ {
943+ ChipLogError (DeviceLayer, " Failed to start BledAdv timeout timer" );
944+ }
945+ }
946+
910947void BLEManagerImpl::DriveBLEState (void )
911948{
912949 CHIP_ERROR err = CHIP_NO_ERROR;
@@ -1030,7 +1067,8 @@ void BLEManagerImpl::DriveBLEState(void)
10301067 ExitNow ();
10311068 }
10321069
1033- mFlags .Set (Flags::kControlOpInProgress );
1070+ DeinitESPBleLayer ();
1071+ mFlags .ClearAll ();
10341072
10351073 ExitNow ();
10361074 }
@@ -1133,6 +1171,23 @@ CHIP_ERROR BLEManagerImpl::InitESPBleLayer(void)
11331171 return err;
11341172}
11351173
1174+ esp_err_t bluedroid_set_random_address ()
1175+ {
1176+ esp_bd_addr_t rand_addr;
1177+
1178+ esp_fill_random (rand_addr, sizeof (esp_bd_addr_t ));
1179+ rand_addr[0 ] = (rand_addr[0 ] & 0x3F ) | 0xC0 ;
1180+
1181+ esp_err_t ret = esp_ble_gap_set_rand_addr (rand_addr);
1182+ if (ret != ESP_OK)
1183+ {
1184+ ChipLogError (DeviceLayer, " Failed to set random address: %s" , esp_err_to_name (ret));
1185+ return ret;
1186+ }
1187+
1188+ return ESP_OK;
1189+ }
1190+
11361191CHIP_ERROR BLEManagerImpl::ConfigureAdvertisingData (void )
11371192{
11381193 CHIP_ERROR err;
@@ -1158,6 +1213,27 @@ CHIP_ERROR BLEManagerImpl::ConfigureAdvertisingData(void)
11581213 ExitNow ();
11591214 }
11601215
1216+ #if CHIP_DEVICE_CONFIG_EXT_ADVERTISING
1217+ // Check for extended advertisement interval and redact VID/PID if past the initial period.
1218+ if (mFlags .Has (Flags::kExtAdvertisingEnabled ))
1219+ {
1220+ deviceIdInfo.SetVendorId (0 );
1221+ deviceIdInfo.SetProductId (0 );
1222+ deviceIdInfo.SetExtendedAnnouncementFlag (true );
1223+ }
1224+ #endif
1225+
1226+ #if CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING
1227+ if (!mFlags .Has (Flags::kExtAdvertisingEnabled ))
1228+ {
1229+ deviceIdInfo.SetAdditionalDataFlag (true );
1230+ }
1231+ else
1232+ {
1233+ deviceIdInfo.SetAdditionalDataFlag (false );
1234+ }
1235+ #endif
1236+
11611237 memset (advData, 0 , sizeof (advData));
11621238 advData[index++] = 0x02 ; // length
11631239 advData[index++] = CHIP_ADV_DATA_TYPE_FLAGS; // AD type : flags
@@ -1187,12 +1263,16 @@ CHIP_ERROR BLEManagerImpl::ConfigureAdvertisingData(void)
11871263 ExitNow ();
11881264 }
11891265
1266+ bluedroid_set_random_address ();
11901267 mFlags .Set (Flags::kControlOpInProgress );
11911268
11921269exit:
11931270 return err;
11941271}
11951272
1273+ // TODO(#36919): Fix the Bluedroid ShutDown flow for ESP32.
1274+ void BLEManagerImpl::DeinitESPBleLayer () {}
1275+
11961276CHIP_ERROR BLEManagerImpl::StartAdvertising (void )
11971277{
11981278 CHIP_ERROR err;
@@ -1223,8 +1303,23 @@ CHIP_ERROR BLEManagerImpl::StartAdvertising(void)
12231303 }
12241304 else
12251305 {
1306+ #if CHIP_DEVICE_CONFIG_EXT_ADVERTISING
1307+ if (!mFlags .Has (Flags::kExtAdvertisingEnabled ))
1308+ {
1309+ advertParams.adv_int_min = CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MIN;
1310+ advertParams.adv_int_max = CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MAX;
1311+ }
1312+ else
1313+ {
1314+ advertParams.adv_int_min = CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING_INTERVAL_MIN;
1315+ advertParams.adv_int_max = CHIP_DEVICE_CONFIG_BLE_EXT_ADVERTISING_INTERVAL_MAX;
1316+ }
1317+ #else
1318+
12261319 advertParams.adv_int_min = CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MIN;
12271320 advertParams.adv_int_max = CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MAX;
1321+
1322+ #endif
12281323 }
12291324
12301325 ChipLogProgress (DeviceLayer, " Configuring CHIPoBLE advertising (interval %" PRIu32 " ms, %sconnectable, device name %s)" ,
0 commit comments