From 68740d6427e5f942d03b11ea50eb6e32054280ad Mon Sep 17 00:00:00 2001 From: Andrzej Kaczmarek Date: Mon, 12 Feb 2018 18:02:18 +0100 Subject: [PATCH] nimble/ll: Fix generating RPA when advertising When starting SM, we always overwrite AdvA and InitA to "identity" values and then we should overwrite them again with RPAs, if necessary. However, since we call function which rotates RPA for advertising SM it will not update addresses if called before rotate timeout fired. This means that 1st time we start SM addresses are set properly, but then we may use identity addresses instead of RPAs if SM is restarted. This patch fixes this by ensuring proper RPAs are always configured in SM. X-Original-Commit: 84483464e35a4646be430519bac7f948d5f3202a --- nimble/controller/src/ble_ll_adv.c | 76 +++++++++++++++++------------- 1 file changed, 43 insertions(+), 33 deletions(-) diff --git a/nimble/controller/src/ble_ll_adv.c b/nimble/controller/src/ble_ll_adv.c index f50aea79c..e2bf15ab5 100644 --- a/nimble/controller/src/ble_ll_adv.c +++ b/nimble/controller/src/ble_ll_adv.c @@ -186,6 +186,38 @@ static void ble_ll_adv_make_done(struct ble_ll_adv_sm *advsm, struct ble_mbuf_hd static void ble_ll_adv_sm_init(struct ble_ll_adv_sm *advsm); #if (MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) == 1) +static void +ble_ll_adv_rpa_update(struct ble_ll_adv_sm *advsm) +{ + ble_ll_resolv_gen_rpa(advsm->peer_addr, advsm->peer_addr_type, + advsm->adva, 1); + + if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_DIRECTED) { + ble_ll_resolv_gen_rpa(advsm->peer_addr, advsm->peer_addr_type, + advsm->initiator_addr, 0); + if (ble_ll_is_rpa(advsm->initiator_addr, 1)) { + advsm->flags |= BLE_LL_ADV_SM_FLAG_RX_ADD; + } else { + if (advsm->own_addr_type & 1) { + advsm->flags |= BLE_LL_ADV_SM_FLAG_RX_ADD; + } else { + advsm->flags &= ~BLE_LL_ADV_SM_FLAG_RX_ADD; + } + } + } + + /* May have to reset txadd bit */ + if (ble_ll_is_rpa(advsm->adva, 1)) { + advsm->flags |= BLE_LL_ADV_SM_FLAG_TX_ADD; + } else { + if (advsm->own_addr_type & 1) { + advsm->flags |= BLE_LL_ADV_SM_FLAG_TX_ADD; + } else { + advsm->flags &= ~BLE_LL_ADV_SM_FLAG_TX_ADD; + } + } +} + /** * Called to change advertisers ADVA and INITA (for directed advertisements) * as an advertiser needs to adhere to the resolvable private address generation @@ -208,38 +240,14 @@ ble_ll_adv_chk_rpa_timeout(struct ble_ll_adv_sm *advsm) { uint32_t now; - if (advsm->own_addr_type > BLE_HCI_ADV_OWN_ADDR_RANDOM) { - now = os_time_get(); - if ((int32_t)(now - advsm->adv_rpa_timer) >= 0) { - ble_ll_resolv_gen_rpa(advsm->peer_addr, advsm->peer_addr_type, - advsm->adva, 1); + if (advsm->own_addr_type < BLE_HCI_ADV_OWN_ADDR_PRIV_PUB) { + return; + } - if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_DIRECTED) { - ble_ll_resolv_gen_rpa(advsm->peer_addr, advsm->peer_addr_type, - advsm->initiator_addr, 0); - if (ble_ll_is_rpa(advsm->initiator_addr, 1)) { - advsm->flags |= BLE_LL_ADV_SM_FLAG_RX_ADD; - } else { - if (advsm->own_addr_type & 1) { - advsm->flags |= BLE_LL_ADV_SM_FLAG_RX_ADD; - } else { - advsm->flags &= ~BLE_LL_ADV_SM_FLAG_RX_ADD; - } - } - } - advsm->adv_rpa_timer = now + ble_ll_resolv_get_rpa_tmo(); - - /* May have to reset txadd bit */ - if (ble_ll_is_rpa(advsm->adva, 1)) { - advsm->flags |= BLE_LL_ADV_SM_FLAG_TX_ADD; - } else { - if (advsm->own_addr_type & 1) { - advsm->flags |= BLE_LL_ADV_SM_FLAG_TX_ADD; - } else { - advsm->flags &= ~BLE_LL_ADV_SM_FLAG_TX_ADD; - } - } - } + now = os_time_get(); + if ((int32_t)(now - advsm->adv_rpa_timer) >= 0) { + ble_ll_adv_rpa_update(advsm); + advsm->adv_rpa_timer = now + ble_ll_resolv_get_rpa_tmo(); } } #endif @@ -1619,9 +1627,11 @@ ble_ll_adv_sm_start(struct ble_ll_adv_sm *advsm) } } - /* This will generate an RPA for both initiator addr and adva */ #if (MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) == 1) - ble_ll_adv_chk_rpa_timeout(advsm); + /* This will generate an RPA for both initiator addr and adva */ + if (advsm->own_addr_type > BLE_HCI_ADV_OWN_ADDR_RANDOM) { + ble_ll_adv_rpa_update(advsm); + } #endif /* Set flag telling us that advertising is enabled */