From 34fbc5910dd6c4e751370f77fd8907640510d745 Mon Sep 17 00:00:00 2001 From: Andrzej Kaczmarek Date: Thu, 12 Oct 2023 19:06:04 +0200 Subject: [PATCH] nimble/ll: Add option to discard excessive ISO SDUs See syscfg description for details. --- nimble/controller/src/ble_ll_isoal.c | 16 +++++++++++++++- nimble/controller/syscfg.yml | 12 ++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/nimble/controller/src/ble_ll_isoal.c b/nimble/controller/src/ble_ll_isoal.c index 372dbb2ec4..fd9d205fe5 100644 --- a/nimble/controller/src/ble_ll_isoal.c +++ b/nimble/controller/src/ble_ll_isoal.c @@ -152,10 +152,24 @@ ble_ll_isoal_mux_event_done(struct ble_ll_isoal_mux *mux) mux->last_tx_packet_seq_num = blehdr->txiso.packet_seq_num; } +#if MYNEWT_VAL(BLE_LL_ISO_HCI_DISCARD_THRESHOLD) + /* Drop queued SDUs if number of queued SDUs exceeds defined threshold. + * Threshold is defined as number of ISO events. If number of queued SDUs + * exceeds number of SDUs required for single event (i.e. including pt) + * and number of subsequent ISO events defined by threshold value, we'll + * drop any excessive SDUs and notify host as if they were sent. + */ + uint32_t thr = MYNEWT_VAL(BLE_LL_ISO_HCI_DISCARD_THRESHOLD); + if (mux->sdu_q_len > mux->sdu_per_event + thr * mux->sdu_per_interval) { + num_sdu = mux->sdu_q_len - mux->sdu_per_event - + thr * mux->sdu_per_interval; + } +#endif + while (pkthdr && num_sdu--) { OS_ENTER_CRITICAL(sr); STAILQ_REMOVE_HEAD(&mux->sdu_q, omp_next); - assert(mux->sdu_q_len > 0); + BLE_LL_ASSERT(mux->sdu_q_len > 0); mux->sdu_q_len--; OS_EXIT_CRITICAL(sr); diff --git a/nimble/controller/syscfg.yml b/nimble/controller/syscfg.yml index ad364884d0..944987139a 100644 --- a/nimble/controller/syscfg.yml +++ b/nimble/controller/syscfg.yml @@ -505,6 +505,18 @@ syscfg.defs: experimental: 1 restrictions: - BLE_LL_HCI_VS || BLE_LL_ISO_HCI_FEEDBACK_INTERVAL_MS == 0 + BLE_LL_ISO_HCI_DISCARD_THRESHOLD: + description: > + Enables automatic discarding of excessive ISO SDUs to avoid exhaustion + of HCI ISO buffers in case host sends too many SDUs. + Threshold is defined as number of ISO events. If number of queued + SDUs exceeds number of SDUs required for single event (i.e. including + pre-transmissions) and number of subsequent ISO events defined by + threshold value, the controller will drop any excessive SDUs and + notify to host as if they were already sent. + Set to 0 to disable. + value: 0 + experimental: 1 BLE_LL_SYSINIT_STAGE: description: >