@@ -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,35 @@ 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 ] = 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+
34423472 ble_hs_lock ();
34433473 rc = ble_gap_ext_adv_set_addr_no_lock (instance , addr -> val );
34443474 ble_hs_unlock ();
0 commit comments