From 273cb94c0dc41c286547301648cd8664269c7488 Mon Sep 17 00:00:00 2001 From: Andrzej Kaczmarek Date: Thu, 13 Aug 2020 12:53:43 +0200 Subject: [PATCH] Bluetooth: controller: Resolve AdvA in ADV_EXT_IND properly Since ADV_EXT_IND is received on primary channel, the AR is configured to resolve AdvA in legacy PDU (assuming on 1M) and it will not resolve AdvA properly. In such case, we should resolve AdvA manually in LLL. Signed-off-by: Andrzej Kaczmarek --- .../ll_sw/nordic/hal/nrf5/radio/radio.c | 2 +- .../controller/ll_sw/nordic/lll/lll_scan.c | 44 +++++++++++-------- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio.c b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio.c index b709250b08b..a7e50811c4d 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio.c +++ b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio.c @@ -1255,7 +1255,7 @@ void radio_ar_resolve(uint8_t *addr) NRF_AAR->EVENTS_RESOLVED = 0; NRF_AAR->EVENTS_NOTRESOLVED = 0; - NRF_AAR->TASKS_START = 1; + nrf_aar_task_trigger(NRF_AAR, NRF_AAR_TASK_START); nrf_aar_int_enable(NRF_AAR, AAR_INTENSET_END_Msk); while (NRF_AAR->EVENTS_END == 0) { diff --git a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_scan.c b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_scan.c index 8bfe59ed622..c27f64b4497 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_scan.c +++ b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_scan.c @@ -59,10 +59,10 @@ static void isr_cleanup(void *param); static inline bool isr_rx_scan_check(struct lll_scan *lll, uint8_t irkmatch_ok, uint8_t devmatch_ok, uint8_t rl_idx); -static inline int isr_rx_pdu(struct lll_scan *lll, uint8_t devmatch_ok, - uint8_t devmatch_id, uint8_t irkmatch_ok, - uint8_t irkmatch_id, uint8_t rl_idx, - uint8_t rssi_ready); +static inline int isr_rx_pdu(struct lll_scan *lll, struct pdu_adv *pdu_adv_rx, + uint8_t devmatch_ok, uint8_t devmatch_id, + uint8_t irkmatch_ok, uint8_t irkmatch_id, + uint8_t rl_idx, uint8_t rssi_ready); static inline bool isr_scan_init_check(struct lll_scan *lll, struct pdu_adv *pdu, uint8_t rl_idx); static inline bool isr_scan_init_adva_check(struct lll_scan *lll, @@ -397,6 +397,8 @@ static void ticker_op_start_cb(uint32_t status, void *param) static void isr_rx(void *param) { struct lll_scan *lll; + struct node_rx_pdu *node_rx; + struct pdu_adv *pdu_adv_rx; uint8_t devmatch_ok; uint8_t devmatch_id; uint8_t irkmatch_ok; @@ -434,7 +436,20 @@ static void isr_rx(void *param) goto isr_rx_do_close; } + node_rx = ull_pdu_rx_alloc_peek(1); + LL_ASSERT(node_rx); + + pdu_adv_rx = (void *)node_rx->pdu; + #if defined(CONFIG_BT_CTLR_PRIVACY) +#if defined(CONFIG_BT_CTLR_ADV_EXT) + if (!irkmatch_ok && (pdu_adv_rx->type == PDU_ADV_TYPE_EXT_IND) && + (pdu_adv_rx->tx_addr)) { + radio_ar_resolve(&pdu_adv_rx->payload[2]); + irkmatch_ok = radio_ar_has_match(); + irkmatch_id = radio_ar_match_get(); + } +#endif /* CONFIG_BT_CTLR_ADV_EXT */ rl_idx = devmatch_ok ? ull_filter_lll_rl_idx(!!(lll->filter_policy & 0x01), devmatch_id) : @@ -442,13 +457,13 @@ static void isr_rx(void *param) FILTER_IDX_NONE; #else rl_idx = FILTER_IDX_NONE; -#endif +#endif /* CONFIG_BT_CTLR_PRIVACY */ if (crc_ok && isr_rx_scan_check(lll, irkmatch_ok, devmatch_ok, rl_idx)) { int err; - err = isr_rx_pdu(lll, devmatch_ok, devmatch_id, irkmatch_ok, - irkmatch_id, rl_idx, rssi_ready); + err = isr_rx_pdu(lll, pdu_adv_rx, devmatch_ok, devmatch_id, + irkmatch_ok, irkmatch_id, rl_idx, rssi_ready); if (!err) { if (IS_ENABLED(CONFIG_BT_CTLR_PROFILE_ISR)) { lll_prof_send(); @@ -700,20 +715,13 @@ static inline bool isr_rx_scan_check(struct lll_scan *lll, uint8_t irkmatch_ok, #endif /* CONFIG_BT_CTLR_PRIVACY */ } -static inline int isr_rx_pdu(struct lll_scan *lll, uint8_t devmatch_ok, - uint8_t devmatch_id, uint8_t irkmatch_ok, - uint8_t irkmatch_id, uint8_t rl_idx, - uint8_t rssi_ready) +static inline int isr_rx_pdu(struct lll_scan *lll, struct pdu_adv *pdu_adv_rx, + uint8_t devmatch_ok, uint8_t devmatch_id, + uint8_t irkmatch_ok, uint8_t irkmatch_id, + uint8_t rl_idx, uint8_t rssi_ready) { - struct node_rx_pdu *node_rx; - struct pdu_adv *pdu_adv_rx; bool dir_report = false; - node_rx = ull_pdu_rx_alloc_peek(1); - LL_ASSERT(node_rx); - - pdu_adv_rx = (void *)node_rx->pdu; - if (0) { #if defined(CONFIG_BT_CENTRAL) /* Initiator */