This is an automated email from the ASF dual-hosted git repository. andk pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git
commit f1379c78a3829c9360f3e5d38906c4db7389df0e Author: Andrzej Kaczmarek <[email protected]> AuthorDate: Fri Feb 21 12:32:29 2025 +0100 nimble/ll: Fix HCI Number Of Completed Packets event We can (and shall) keep sending nocp event with ncp=0 periodically but *only* if we have HCI data packets enqueued. Currently we check if txq is empty but that doesn't take into account that the only queued PDUs may be LL Control. This adds extra counter to track number of data PDUs queued in conn. --- nimble/controller/include/controller/ble_ll_conn.h | 1 + nimble/controller/src/ble_ll_conn.c | 2 ++ nimble/controller/src/ble_ll_conn_hci.c | 6 +++++- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/nimble/controller/include/controller/ble_ll_conn.h b/nimble/controller/include/controller/ble_ll_conn.h index c0ba84afa..347f4653e 100644 --- a/nimble/controller/include/controller/ble_ll_conn.h +++ b/nimble/controller/include/controller/ble_ll_conn.h @@ -344,6 +344,7 @@ struct ble_ll_conn_sm /* Packet transmit queue */ struct os_mbuf *cur_tx_pdu; STAILQ_HEAD(conn_txq_head, os_mbuf_pkthdr) conn_txq; + uint8_t conn_txq_num_data_pkt; uint8_t conn_txq_num_zero_pkt; /* List entry for active/free connection pools */ diff --git a/nimble/controller/src/ble_ll_conn.c b/nimble/controller/src/ble_ll_conn.c index dcaa3aae5..90d5a8cac 100644 --- a/nimble/controller/src/ble_ll_conn.c +++ b/nimble/controller/src/ble_ll_conn.c @@ -2034,6 +2034,7 @@ ble_ll_conn_sm_new(struct ble_ll_conn_sm *connsm) /* Initialize transmit queue and ack/flow control elements */ STAILQ_INIT(&connsm->conn_txq); + connsm->conn_txq_num_data_pkt = 0; connsm->conn_txq_num_zero_pkt = 0; connsm->cur_tx_pdu = NULL; connsm->tx_seqnum = 0; @@ -4046,6 +4047,7 @@ ble_ll_conn_enqueue_pkt(struct ble_ll_conn_sm *connsm, struct os_mbuf *om, } else { STAILQ_INSERT_TAIL(&connsm->conn_txq, pkthdr, omp_next); } + connsm->conn_txq_num_data_pkt += num_pkt; OS_EXIT_CRITICAL(sr); } diff --git a/nimble/controller/src/ble_ll_conn_hci.c b/nimble/controller/src/ble_ll_conn_hci.c index 394db6f6b..fae4b31a9 100644 --- a/nimble/controller/src/ble_ll_conn_hci.c +++ b/nimble/controller/src/ble_ll_conn_hci.c @@ -310,6 +310,8 @@ ble_ll_conn_num_comp_pkts_event_send(struct ble_ll_conn_sm *connsm) ev->completed[0].packets = htole16(connsm->completed_pkts); hci_ev->length += sizeof(ev->completed[0]); + BLE_LL_ASSERT(connsm->conn_txq_num_data_pkt >= connsm->completed_pkts); + connsm->conn_txq_num_data_pkt -= connsm->completed_pkts; connsm->completed_pkts = 0; ble_ll_hci_event_send(hci_ev); @@ -330,7 +332,7 @@ skip_conn: * event and that either has packets enqueued or has completed packets. */ if ((connsm->conn_state != BLE_LL_CONN_STATE_IDLE) && - (connsm->completed_pkts || !STAILQ_EMPTY(&connsm->conn_txq))) { + (connsm->completed_pkts || connsm->conn_txq_num_data_pkt)) { /* If no buffer, get one, If cant get one, leave. */ if (!hci_ev) { hci_ev = ble_transport_alloc_evt(0); @@ -351,6 +353,8 @@ skip_conn: hci_ev->length += sizeof(ev->completed[ev->count]); ev->count++; + BLE_LL_ASSERT(connsm->conn_txq_num_data_pkt >= connsm->completed_pkts); + connsm->conn_txq_num_data_pkt -= connsm->completed_pkts; connsm->completed_pkts = 0; /* Send now if the buffer is full. */
