Skip to content

Commit

Permalink
nimble/ll: Drop received PDU if it is handled after scan was stopped
Browse files Browse the repository at this point in the history
When doing continuous scan and channel is changed close to scan stop
it is possible that PDU is received before interval timer is cancelled
and RX is disabled. This may lead to processing received PDU only after
scanner is already stopped. While this case was already handled in LL
task it was not correctly handled in ISR. If this happen simply mark
PDU to be ignored by LL and don't process it in ISR.

This is more likely to happen when small scan window is used.

Mostly affects initiator state as this may lead to assert when happen
after CONNECTION_IND was already sent.
  • Loading branch information
sjanc committed Sep 15, 2023
1 parent 170728f commit 4710347
Show file tree
Hide file tree
Showing 3 changed files with 7 additions and 0 deletions.
1 change: 1 addition & 0 deletions nimble/controller/include/controller/ble_ll.h
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,7 @@ STATS_SECT_START(ble_ll_stats)
STATS_SECT_ENTRY(rx_connect_reqs)
STATS_SECT_ENTRY(rx_scan_ind)
STATS_SECT_ENTRY(rx_aux_connect_rsp)
STATS_SECT_ENTRY(rx_pdu_on_scan_disabled)
STATS_SECT_ENTRY(adv_txg)
STATS_SECT_ENTRY(adv_late_starts)
STATS_SECT_ENTRY(adv_resched_pdu_fail)
Expand Down
1 change: 1 addition & 0 deletions nimble/controller/src/ble_ll.c
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,7 @@ STATS_NAME_START(ble_ll_stats)
STATS_NAME(ble_ll_stats, rx_connect_reqs)
STATS_NAME(ble_ll_stats, rx_scan_ind)
STATS_NAME(ble_ll_stats, rx_aux_connect_rsp)
STATS_NAME(ble_ll_stats, rx_pdu_on_scan_disabled)
STATS_NAME(ble_ll_stats, adv_txg)
STATS_NAME(ble_ll_stats, adv_late_starts)
STATS_NAME(ble_ll_stats, adv_resched_pdu_fail)
Expand Down
5 changes: 5 additions & 0 deletions nimble/controller/src/ble_ll_scan.c
Original file line number Diff line number Diff line change
Expand Up @@ -1610,6 +1610,11 @@ ble_ll_scan_rx_isr_end(struct os_mbuf *rxpdu, uint8_t crcok)
goto scan_rx_isr_ignore;
}

if (!scansm->scan_enabled) {
STATS_INC(ble_ll_stats, rx_pdu_on_scan_disabled);
goto scan_rx_isr_ignore;
}

rxbuf = rxpdu->om_data;
pdu_type = rxbuf[0] & BLE_ADV_PDU_HDR_TYPE_MASK;

Expand Down

0 comments on commit 4710347

Please sign in to comment.