From c1d52a2cc813dc0b4757cf83fba9488157aa819d Mon Sep 17 00:00:00 2001 From: Szymon Janc Date: Mon, 23 Feb 2026 11:59:31 +0100 Subject: [PATCH] nimble/ll: Fix infinite loop on RPA rotation ble_ll_resolv_gen_priv_addr must not be called with IRQs disabled since it may require additional random data and thus requires HW random source. Otherwise it may end up in infinite poll-loop waiting for more random data. --- nimble/controller/src/ble_ll_resolv.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/nimble/controller/src/ble_ll_resolv.c b/nimble/controller/src/ble_ll_resolv.c index 3566876e0..f6ededc63 100644 --- a/nimble/controller/src/ble_ll_resolv.c +++ b/nimble/controller/src/ble_ll_resolv.c @@ -138,25 +138,23 @@ static void ble_ll_resolv_rpa_timer_cb(struct ble_npl_event *ev) { int i; - os_sr_t sr; + uint8_t rpa[6]; struct ble_ll_resolv_entry *rl; #if MYNEWT_VAL(BLE_LL_HCI_VS_LOCAL_IRK) struct local_irk_data *irk_data; - uint8_t rpa[6]; + os_sr_t sr; #endif rl = &g_ble_ll_resolv_list[0]; for (i = 0; i < g_ble_ll_resolv_data.rl_cnt; ++i) { if (rl->rl_has_local) { - OS_ENTER_CRITICAL(sr); - ble_ll_resolv_gen_priv_addr(rl, 1); - OS_EXIT_CRITICAL(sr); + generate_rpa(rl->rl_local_irk, rpa); + ble_ll_resolv_set_local_rpa(i, rpa); } if (rl->rl_has_peer) { - OS_ENTER_CRITICAL(sr); - ble_ll_resolv_gen_priv_addr(rl, 0); - OS_EXIT_CRITICAL(sr); + generate_rpa(rl->rl_peer_irk, rpa); + ble_ll_resolv_set_peer_rpa(i, rpa); } ++rl; }