@@ -3430,6 +3430,7 @@ int
34303430ble_gap_ext_adv_set_addr (uint8_t instance , const ble_addr_t * addr )
34313431{
34323432 int rc ;
3433+ ble_addr_t invalid_non_rpa_addr , invalid_static_rand_addr ;
34333434
34343435 if (instance >= BLE_ADV_INSTANCES || addr -> type != BLE_ADDR_RANDOM ) {
34353436 return BLE_HS_EINVAL ;
@@ -3439,6 +3440,36 @@ ble_gap_ext_adv_set_addr(uint8_t instance, const ble_addr_t *addr)
34393440 return BLE_HS_EDISABLED ;
34403441 }
34413442
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 ] =
3455+ invalid_static_rand_addr .val [5 ] | BLE_STATIC_RAND_ADDR_MASK ;
3456+
3457+ if (memcmp (invalid_non_rpa_addr .val , addr -> val , BLE_DEV_ADDR_LEN ) == 0 ||
3458+ memcmp (invalid_static_rand_addr .val , addr -> val , BLE_DEV_ADDR_LEN ) == 0 ) {
3459+ return BLE_HS_EINVAL ;
3460+ }
3461+
3462+ } else if ((addr -> val [5 ] | BLE_NON_RPA_MASK ) == BLE_NON_RPA_MASK ) {
3463+ invalid_non_rpa_addr .val [5 ] = invalid_non_rpa_addr .val [5 ] & BLE_NON_RPA_MASK ;
3464+ if (memcmp (invalid_non_rpa_addr .val , addr -> val , BLE_DEV_ADDR_LEN ) == 0 ||
3465+ memcmp (invalid_static_rand_addr .val , addr -> val , BLE_DEV_ADDR_LEN ) == 0 ) {
3466+ return BLE_HS_EINVAL ;
3467+ }
3468+ } else {
3469+ BLE_HS_LOG (ERROR , "Invalid random address \n" );
3470+ return BLE_HS_EINVAL ;
3471+ }
3472+
34423473 ble_hs_lock ();
34433474 rc = ble_gap_ext_adv_set_addr_no_lock (instance , addr -> val );
34443475 ble_hs_unlock ();
0 commit comments