@@ -39,7 +39,9 @@ extern "C" {
39
39
#include " sl_bt_stack_config.h"
40
40
#include " sl_bt_stack_init.h"
41
41
#include " timers.h"
42
+ #include < algorithm>
42
43
#include < ble/CHIPBleServiceData.h>
44
+ #include < crypto/RandUtils.h>
43
45
#include < lib/support/CodeUtils.h>
44
46
#include < lib/support/logging/CHIPLogging.h>
45
47
#include < platform/CommissionableDataProvider.h>
@@ -106,6 +108,8 @@ 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 ;
@@ -132,6 +136,19 @@ CHIP_ERROR BLEManagerImpl::_Init()
132
136
133
137
mFlags .ClearAll ().Set (Flags::kAdvertisingEnabled , CHIP_DEVICE_CONFIG_CHIPOBLE_ENABLE_ADVERTISING_AUTOSTART);
134
138
mFlags .Set (Flags::kFastAdvertisingEnabled , true );
139
+
140
+ if (std::all_of (randomizedAddr.addr , randomizedAddr.addr + (sizeof (randomizedAddr.addr ) / sizeof (uint8_t )),
141
+ [](uint8_t i) { return i == 0 ; }))
142
+ {
143
+ // Since random address configured, generate one
144
+ // Copy random value to address. We don't care of the ordering since it's a random value.
145
+ uint64_t random = Crypto::GetRandU64 ();
146
+ memcpy (&randomizedAddr, &random , sizeof (randomizedAddr));
147
+
148
+ // Set MSB to 11 to properly - BLE Static Device Address requirement
149
+ randomizedAddr.addr [5 ] |= 0xC0 ;
150
+ }
151
+
135
152
PlatformMgr ().ScheduleWork (DriveBLEState, 0 );
136
153
137
154
exit :
@@ -484,14 +501,13 @@ CHIP_ERROR BLEManagerImpl::ConfigureAdvertisingData(void)
484
501
ChipLogError (DeviceLayer, " sl_bt_advertiser_create_set() failed: %s" , ErrorStr (err));
485
502
});
486
503
487
- bd_addr randomizedAddr = {};
488
- ret = sl_bt_advertiser_set_random_address (advertising_set_handle, sl_bt_gap_random_resolvable_address, randomizedAddr,
489
- &randomizedAddr);
504
+ ret =
505
+ sl_bt_advertiser_set_random_address (advertising_set_handle, sl_bt_gap_static_address, randomizedAddr, &randomizedAddr);
490
506
VerifyOrExit (ret == SL_STATUS_OK, {
491
507
err = MapBLEError (ret);
492
508
ChipLogError (DeviceLayer, " sl_bt_advertiser_set_random_address() failed: %s" , ErrorStr (err));
493
509
});
494
- ChipLogDetail (DeviceLayer, " BLE Resolvable private random address %02X:%02X:%02X:%02X:%02X:%02X" , randomizedAddr.addr [5 ],
510
+ ChipLogDetail (DeviceLayer, " BLE Static Device Address %02X:%02X:%02X:%02X:%02X:%02X" , randomizedAddr.addr [5 ],
495
511
randomizedAddr.addr [4 ], randomizedAddr.addr [3 ], randomizedAddr.addr [2 ], randomizedAddr.addr [1 ],
496
512
randomizedAddr.addr [0 ]);
497
513
}
@@ -625,6 +641,8 @@ CHIP_ERROR BLEManagerImpl::StopAdvertising(void)
625
641
mFlags .Set (Flags::kFastAdvertisingEnabled , true );
626
642
627
643
ret = sl_bt_advertiser_stop (advertising_set_handle);
644
+ sl_bt_advertiser_clear_random_address (advertising_set_handle);
645
+
628
646
sl_bt_advertiser_delete_set (advertising_set_handle);
629
647
advertising_set_handle = 0xff ;
630
648
err = MapBLEError (ret);
0 commit comments