Skip to content

Commit c1d52a2

Browse files
committed
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.
1 parent b18cbe2 commit c1d52a2

File tree

1 file changed

+6
-8
lines changed

1 file changed

+6
-8
lines changed

nimble/controller/src/ble_ll_resolv.c

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -138,25 +138,23 @@ static void
138138
ble_ll_resolv_rpa_timer_cb(struct ble_npl_event *ev)
139139
{
140140
int i;
141-
os_sr_t sr;
141+
uint8_t rpa[6];
142142
struct ble_ll_resolv_entry *rl;
143143
#if MYNEWT_VAL(BLE_LL_HCI_VS_LOCAL_IRK)
144144
struct local_irk_data *irk_data;
145-
uint8_t rpa[6];
145+
os_sr_t sr;
146146
#endif
147147

148148
rl = &g_ble_ll_resolv_list[0];
149149
for (i = 0; i < g_ble_ll_resolv_data.rl_cnt; ++i) {
150150
if (rl->rl_has_local) {
151-
OS_ENTER_CRITICAL(sr);
152-
ble_ll_resolv_gen_priv_addr(rl, 1);
153-
OS_EXIT_CRITICAL(sr);
151+
generate_rpa(rl->rl_local_irk, rpa);
152+
ble_ll_resolv_set_local_rpa(i, rpa);
154153
}
155154

156155
if (rl->rl_has_peer) {
157-
OS_ENTER_CRITICAL(sr);
158-
ble_ll_resolv_gen_priv_addr(rl, 0);
159-
OS_EXIT_CRITICAL(sr);
156+
generate_rpa(rl->rl_peer_irk, rpa);
157+
ble_ll_resolv_set_peer_rpa(i, rpa);
160158
}
161159
++rl;
162160
}

0 commit comments

Comments
 (0)