@@ -40,6 +40,8 @@ extern "C" {
40
40
#include " sl_bt_stack_init.h"
41
41
#include " timers.h"
42
42
#include < ble/CHIPBleServiceData.h>
43
+ #include < crypto/RandUtils.h>
44
+ #include < cstring>
43
45
#include < lib/support/CodeUtils.h>
44
46
#include < lib/support/logging/CHIPLogging.h>
45
47
#include < platform/CommissionableDataProvider.h>
@@ -106,17 +108,16 @@ const ChipBleUUID ChipUUID_CHIPoBLEChar_RX = { { 0x18, 0xEE, 0x2E, 0xF5, 0x26, 0
106
108
const ChipBleUUID ChipUUID_CHIPoBLEChar_TX = { { 0x18 , 0xEE , 0x2E , 0xF5 , 0x26 , 0x3D , 0x45 , 0x59 , 0x95 , 0x9F , 0x4F , 0x9C , 0x42 , 0x9F ,
107
109
0x9D , 0x12 } };
108
110
111
+ bd_addr randomizedAddr = { 0 };
112
+
109
113
} // namespace
110
114
111
115
BLEManagerImpl BLEManagerImpl::sInstance ;
112
116
113
117
CHIP_ERROR BLEManagerImpl::_Init ()
114
118
{
115
- CHIP_ERROR err;
116
-
117
119
// Initialize the CHIP BleLayer.
118
- err = BleLayer::Init (this , this , &DeviceLayer::SystemLayer ());
119
- SuccessOrExit (err);
120
+ ReturnErrorOnFailure (BleLayer::Init (this , this , &DeviceLayer::SystemLayer ()));
120
121
121
122
memset (mBleConnections , 0 , sizeof (mBleConnections ));
122
123
memset (mIndConfId , kUnusedIndex , sizeof (mIndConfId ));
@@ -132,10 +133,23 @@ CHIP_ERROR BLEManagerImpl::_Init()
132
133
133
134
mFlags .ClearAll ().Set (Flags::kAdvertisingEnabled , CHIP_DEVICE_CONFIG_CHIPOBLE_ENABLE_ADVERTISING_AUTOSTART);
134
135
mFlags .Set (Flags::kFastAdvertisingEnabled , true );
135
- PlatformMgr ().ScheduleWork (DriveBLEState, 0 );
136
136
137
- exit :
138
- return err;
137
+ // Check that an address was not already configured at boot.
138
+ // This covers the init-shutdown-init case to comply with the BLE address change at boot only requirement
139
+ bd_addr temp = { 0 };
140
+ if (memcmp (&randomizedAddr, &temp, sizeof (bd_addr)) == 0 )
141
+ {
142
+ // Since a random address is not configured, configure one
143
+ uint64_t random = Crypto::GetRandU64 ();
144
+ // Copy random value to address. We don't care of the ordering since it's a random value.
145
+ memcpy (&randomizedAddr, &random , sizeof (randomizedAddr));
146
+
147
+ // Set two MSBs to 11 to properly the address - BLE Static Device Address requirement
148
+ randomizedAddr.addr [5 ] |= 0xC0 ;
149
+ }
150
+
151
+ PlatformMgr ().ScheduleWork (DriveBLEState, 0 );
152
+ return CHIP_NO_ERROR;
139
153
}
140
154
141
155
uint16_t BLEManagerImpl::_NumConnections (void )
@@ -484,14 +498,13 @@ CHIP_ERROR BLEManagerImpl::ConfigureAdvertisingData(void)
484
498
ChipLogError (DeviceLayer, " sl_bt_advertiser_create_set() failed: %s" , ErrorStr (err));
485
499
});
486
500
487
- bd_addr randomizedAddr = {};
488
- ret = sl_bt_advertiser_set_random_address (advertising_set_handle, sl_bt_gap_random_resolvable_address, randomizedAddr,
489
- &randomizedAddr);
501
+ ret =
502
+ sl_bt_advertiser_set_random_address (advertising_set_handle, sl_bt_gap_static_address, randomizedAddr, &randomizedAddr);
490
503
VerifyOrExit (ret == SL_STATUS_OK, {
491
504
err = MapBLEError (ret);
492
505
ChipLogError (DeviceLayer, " sl_bt_advertiser_set_random_address() failed: %s" , ErrorStr (err));
493
506
});
494
- ChipLogDetail (DeviceLayer, " BLE Resolvable private random address %02X:%02X:%02X:%02X:%02X:%02X" , randomizedAddr.addr [5 ],
507
+ ChipLogDetail (DeviceLayer, " BLE Static Device Address %02X:%02X:%02X:%02X:%02X:%02X" , randomizedAddr.addr [5 ],
495
508
randomizedAddr.addr [4 ], randomizedAddr.addr [3 ], randomizedAddr.addr [2 ], randomizedAddr.addr [1 ],
496
509
randomizedAddr.addr [0 ]);
497
510
}
@@ -625,6 +638,8 @@ CHIP_ERROR BLEManagerImpl::StopAdvertising(void)
625
638
mFlags .Set (Flags::kFastAdvertisingEnabled , true );
626
639
627
640
ret = sl_bt_advertiser_stop (advertising_set_handle);
641
+ sl_bt_advertiser_clear_random_address (advertising_set_handle);
642
+
628
643
sl_bt_advertiser_delete_set (advertising_set_handle);
629
644
advertising_set_handle = 0xff ;
630
645
err = MapBLEError (ret);
0 commit comments