@@ -161,7 +161,7 @@ BLEManagerImpl BLEManagerImpl::sInstance;
161
161
CHIP_ERROR BLEManagerImpl::_Init ()
162
162
{
163
163
int err = 0 ;
164
- int id = 0 ;
164
+ int id = 0 ;
165
165
166
166
mServiceMode = ConnectivityManager::kCHIPoBLEServiceMode_Enabled ;
167
167
mFlags .ClearAll ().Set (Flags::kAdvertisingEnabled , CHIP_DEVICE_CONFIG_CHIPOBLE_ENABLE_ADVERTISING_AUTOSTART);
@@ -240,15 +240,26 @@ void BLEManagerImpl::DriveBLEState()
240
240
{
241
241
mFlags .Clear (Flags::kAdvertisingRefreshNeeded );
242
242
err = StartAdvertising ();
243
- SuccessOrExit (err);
243
+ if (err != CHIP_NO_ERROR)
244
+ {
245
+ // Return prematurely but keep the CHIPoBLE service mode enabled to allow advertising retries
246
+ mServiceMode = ConnectivityManager::kCHIPoBLEServiceMode_Enabled ;
247
+ ChipLogError (DeviceLayer, " Could not start CHIPoBLE service due to error: %" CHIP_ERROR_FORMAT, err.Format ());
248
+ return ;
249
+ }
244
250
}
245
251
}
246
252
else
247
253
{
248
254
if (mFlags .Has (Flags::kAdvertising ))
249
255
{
250
256
err = StopAdvertising ();
251
- SuccessOrExit (err);
257
+ if (err != CHIP_NO_ERROR)
258
+ {
259
+ ChipLogError (DeviceLayer, " Disabling CHIPoBLE service due to error: %" CHIP_ERROR_FORMAT, err.Format ());
260
+ mServiceMode = ConnectivityManager::kCHIPoBLEServiceMode_Disabled ;
261
+ return ;
262
+ }
252
263
}
253
264
254
265
// If no connections are active unregister also CHIPoBLE GATT service
@@ -265,13 +276,6 @@ void BLEManagerImpl::DriveBLEState()
265
276
}
266
277
}
267
278
}
268
-
269
- exit :
270
- if (err != CHIP_NO_ERROR)
271
- {
272
- ChipLogError (DeviceLayer, " Disabling CHIPoBLE service due to error: %" CHIP_ERROR_FORMAT, err.Format ());
273
- mServiceMode = ConnectivityManager::kCHIPoBLEServiceMode_Disabled ;
274
- }
275
279
}
276
280
277
281
struct BLEManagerImpl ::ServiceData
@@ -316,37 +320,67 @@ inline CHIP_ERROR BLEManagerImpl::PrepareAdvertisingRequest()
316
320
else
317
321
{
318
322
ChipLogError (DeviceLayer, " Failed to start CHIPoBLE advertising: %d" , rc);
323
+ BLEManagerImpl ().StopAdvertising ();
319
324
}
320
325
};
321
326
322
327
return CHIP_NO_ERROR;
323
328
}
324
329
325
- CHIP_ERROR BLEManagerImpl::StartAdvertising ()
330
+ CHIP_ERROR BLEManagerImpl::RegisterGattService ()
326
331
{
327
- // Prepare advertising request
328
- ReturnErrorOnFailure (PrepareAdvertisingRequest ());
329
-
330
- // Register dynamically CHIPoBLE GATT service
332
+ // Register CHIPoBLE GATT service
331
333
if (!mFlags .Has (Flags::kChipoBleGattServiceRegister ))
332
334
{
333
335
int err = bt_gatt_service_register (&sChipoBleService );
334
-
335
336
if (err != 0 )
336
- ChipLogError (DeviceLayer, " Failed to register CHIPoBLE GATT service" );
337
+ {
338
+ ChipLogError (DeviceLayer, " Failed to register CHIPoBLE GATT service: %d" , err);
339
+ }
337
340
338
341
VerifyOrReturnError (err == 0 , MapErrorZephyr (err));
339
-
340
342
mFlags .Set (Flags::kChipoBleGattServiceRegister );
341
343
}
344
+ return CHIP_NO_ERROR;
345
+ }
346
+
347
+ CHIP_ERROR BLEManagerImpl::UnregisterGattService ()
348
+ {
349
+ // Unregister CHIPoBLE GATT service
350
+ if (mFlags .Has (Flags::kChipoBleGattServiceRegister ))
351
+ {
352
+ int err = bt_gatt_service_unregister (&sChipoBleService );
353
+ if (err != 0 )
354
+ {
355
+ ChipLogError (DeviceLayer, " Failed to unregister CHIPoBLE GATT service: %d" , err);
356
+ }
357
+
358
+ VerifyOrReturnError (err == 0 , MapErrorZephyr (err));
359
+ mFlags .Clear (Flags::kChipoBleGattServiceRegister );
360
+ }
361
+ return CHIP_NO_ERROR;
362
+ }
363
+
364
+ CHIP_ERROR BLEManagerImpl::StartAdvertising ()
365
+ {
366
+ // Prepare advertising request
367
+ ReturnErrorOnFailure (PrepareAdvertisingRequest ());
368
+ // We need to register GATT service before issuing the advertising to start
369
+ ReturnErrorOnFailure (RegisterGattService ());
342
370
343
371
// Initialize C3 characteristic data
344
372
#if CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING
345
373
ReturnErrorOnFailure (PrepareC3CharData ());
346
374
#endif
347
375
348
376
// Request advertising
349
- ReturnErrorOnFailure (BLEAdvertisingArbiter::InsertRequest (mAdvertisingRequest ));
377
+ CHIP_ERROR err = BLEAdvertisingArbiter::InsertRequest (mAdvertisingRequest );
378
+ if (CHIP_NO_ERROR != err)
379
+ {
380
+ // It makes not sense to keep GATT services registered after the advertising request failed
381
+ (void ) UnregisterGattService ();
382
+ return err;
383
+ }
350
384
351
385
// Transition to the Advertising state...
352
386
if (!mFlags .Has (Flags::kAdvertising ))
@@ -396,19 +430,20 @@ CHIP_ERROR BLEManagerImpl::StopAdvertising()
396
430
// Cancel timer event changing CHIPoBLE advertisement interval
397
431
DeviceLayer::SystemLayer ().CancelTimer (HandleBLEAdvertisementIntervalChange, this );
398
432
}
433
+ else
434
+ {
435
+ ChipLogProgress (DeviceLayer, " CHIPoBLE advertising already stopped" );
436
+ }
399
437
400
438
return CHIP_NO_ERROR;
401
439
}
402
440
403
441
CHIP_ERROR BLEManagerImpl::_SetAdvertisingEnabled (bool val)
404
442
{
405
- if (mFlags .Has (Flags::kAdvertisingEnabled ) != val)
406
- {
407
- ChipLogDetail (DeviceLayer, " CHIPoBLE advertising set to %s" , val ? " on" : " off" );
443
+ ChipLogDetail (DeviceLayer, " CHIPoBLE advertising set to %s" , val ? " on" : " off" );
408
444
409
- mFlags .Set (Flags::kAdvertisingEnabled , val);
410
- PlatformMgr ().ScheduleWork (DriveBLEState, 0 );
411
- }
445
+ mFlags .Set (Flags::kAdvertisingEnabled , val);
446
+ PlatformMgr ().ScheduleWork (DriveBLEState, 0 );
412
447
413
448
return CHIP_NO_ERROR;
414
449
}
@@ -472,7 +507,10 @@ CHIP_ERROR BLEManagerImpl::HandleGAPDisconnect(const ChipDeviceEvent * event)
472
507
473
508
ChipLogProgress (DeviceLayer, " BLE GAP connection terminated (reason 0x%02x)" , connEvent->HciResult );
474
509
475
- mMatterConnNum --;
510
+ if (mMatterConnNum > 0 )
511
+ {
512
+ mMatterConnNum --;
513
+ }
476
514
477
515
// If indications were enabled for this connection, record that they are now disabled and
478
516
// notify the BLE Layer of a disconnect.
@@ -858,7 +896,11 @@ void BLEManagerImpl::HandleDisconnect(struct bt_conn * conId, uint8_t reason)
858
896
859
897
PlatformMgr ().LockChipStack ();
860
898
861
- sInstance .mTotalConnNum --;
899
+ if (sInstance .mTotalConnNum > 0 )
900
+ {
901
+ sInstance .mTotalConnNum --;
902
+ }
903
+
862
904
ChipLogProgress (DeviceLayer, " Current number of connections: %u/%u" , sInstance .mTotalConnNum , CONFIG_BT_MAX_CONN);
863
905
864
906
VerifyOrExit (bt_conn_get_info (conId, &bt_info) == 0 , );
0 commit comments