@@ -3430,6 +3430,7 @@ int
3430
3430
ble_gap_ext_adv_set_addr (uint8_t instance , const ble_addr_t * addr )
3431
3431
{
3432
3432
int rc ;
3433
+ ble_addr_t invalid_non_rpa_addr , invalid_static_rand_addr ;
3433
3434
3434
3435
if (instance >= BLE_ADV_INSTANCES || addr -> type != BLE_ADDR_RANDOM ) {
3435
3436
return BLE_HS_EINVAL ;
@@ -3439,6 +3440,35 @@ ble_gap_ext_adv_set_addr(uint8_t instance, const ble_addr_t *addr)
3439
3440
return BLE_HS_EDISABLED ;
3440
3441
}
3441
3442
3443
+ /*
3444
+ A static address is a 48-bit randomly generated address and shall meet the following requirements:
3445
+ The two most significant bits of the address shall be equal to 1
3446
+ All bits of the random part of the address shall not be equal to 1
3447
+ All bits of the random part of the address shall not be equal to 0
3448
+ */
3449
+
3450
+ memset (& invalid_non_rpa_addr .val , 0xff , BLE_DEV_ADDR_LEN );
3451
+ memset (& invalid_static_rand_addr .val , 0x00 , BLE_DEV_ADDR_LEN );
3452
+
3453
+ if ((addr -> val [5 ] & BLE_STATIC_RAND_ADDR_MASK ) == BLE_STATIC_RAND_ADDR_MASK ) {
3454
+ invalid_static_rand_addr .val [5 ] = invalid_static_rand_addr .val [5 ] | BLE_STATIC_RAND_ADDR_MASK ;
3455
+
3456
+ if (memcmp (invalid_non_rpa_addr .val , addr -> val , BLE_DEV_ADDR_LEN ) == 0 ||
3457
+ memcmp (invalid_static_rand_addr .val , addr -> val , BLE_DEV_ADDR_LEN ) == 0 ) {
3458
+ return BLE_HS_EINVAL ;
3459
+ }
3460
+ } else if ((addr -> val [5 ] | BLE_NON_RPA_MASK ) == BLE_NON_RPA_MASK ) {
3461
+ invalid_non_rpa_addr .val [5 ] = invalid_non_rpa_addr .val [5 ] & BLE_NON_RPA_MASK ;
3462
+
3463
+ if (memcmp (invalid_non_rpa_addr .val , addr -> val , BLE_DEV_ADDR_LEN ) == 0 ||
3464
+ memcmp (invalid_static_rand_addr .val , addr -> val , BLE_DEV_ADDR_LEN ) == 0 ) {
3465
+ return BLE_HS_EINVAL ;
3466
+ }
3467
+ } else {
3468
+ BLE_HS_LOG (ERROR , "Invalid random address \n" );
3469
+ return BLE_HS_EINVAL ;
3470
+ }
3471
+
3442
3472
ble_hs_lock ();
3443
3473
rc = ble_gap_ext_adv_set_addr_no_lock (instance , addr -> val );
3444
3474
ble_hs_unlock ();
0 commit comments