Skip to content

Commit 4addf73

Browse files
Change BLE address from random resolvable address to static address
1 parent b4a6213 commit 4addf73

File tree

1 file changed

+22
-4
lines changed

1 file changed

+22
-4
lines changed

src/platform/silabs/efr32/BLEManagerImpl.cpp

+22-4
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,9 @@ extern "C" {
3939
#include "sl_bt_stack_config.h"
4040
#include "sl_bt_stack_init.h"
4141
#include "timers.h"
42+
#include <algorithm>
4243
#include <ble/CHIPBleServiceData.h>
44+
#include <crypto/RandUtils.h>
4345
#include <lib/support/CodeUtils.h>
4446
#include <lib/support/logging/CHIPLogging.h>
4547
#include <platform/CommissionableDataProvider.h>
@@ -106,6 +108,8 @@ const ChipBleUUID ChipUUID_CHIPoBLEChar_RX = { { 0x18, 0xEE, 0x2E, 0xF5, 0x26, 0
106108
const ChipBleUUID ChipUUID_CHIPoBLEChar_TX = { { 0x18, 0xEE, 0x2E, 0xF5, 0x26, 0x3D, 0x45, 0x59, 0x95, 0x9F, 0x4F, 0x9C, 0x42, 0x9F,
107109
0x9D, 0x12 } };
108110

111+
bd_addr randomizedAddr = { 0 };
112+
109113
} // namespace
110114

111115
BLEManagerImpl BLEManagerImpl::sInstance;
@@ -132,6 +136,19 @@ CHIP_ERROR BLEManagerImpl::_Init()
132136

133137
mFlags.ClearAll().Set(Flags::kAdvertisingEnabled, CHIP_DEVICE_CONFIG_CHIPOBLE_ENABLE_ADVERTISING_AUTOSTART);
134138
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+
135152
PlatformMgr().ScheduleWork(DriveBLEState, 0);
136153

137154
exit:
@@ -484,14 +501,13 @@ CHIP_ERROR BLEManagerImpl::ConfigureAdvertisingData(void)
484501
ChipLogError(DeviceLayer, "sl_bt_advertiser_create_set() failed: %s", ErrorStr(err));
485502
});
486503

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);
490506
VerifyOrExit(ret == SL_STATUS_OK, {
491507
err = MapBLEError(ret);
492508
ChipLogError(DeviceLayer, "sl_bt_advertiser_set_random_address() failed: %s", ErrorStr(err));
493509
});
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],
495511
randomizedAddr.addr[4], randomizedAddr.addr[3], randomizedAddr.addr[2], randomizedAddr.addr[1],
496512
randomizedAddr.addr[0]);
497513
}
@@ -625,6 +641,8 @@ CHIP_ERROR BLEManagerImpl::StopAdvertising(void)
625641
mFlags.Set(Flags::kFastAdvertisingEnabled, true);
626642

627643
ret = sl_bt_advertiser_stop(advertising_set_handle);
644+
sl_bt_advertiser_clear_random_address(advertising_set_handle);
645+
628646
sl_bt_advertiser_delete_set(advertising_set_handle);
629647
advertising_set_handle = 0xff;
630648
err = MapBLEError(ret);

0 commit comments

Comments
 (0)