This is an automated email from the ASF dual-hosted git repository.
rymek pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git
The following commit(s) were added to refs/heads/master by this push:
new 34bb0af nimble/ll: Fix handling TERMINATE_IND as a Master
34bb0af is described below
commit 34bb0af41d3d234f43418eeda6b64cd480398a04
Author: Ćukasz Rymanowski <[email protected]>
AuthorDate: Wed Dec 19 15:34:38 2018 +0100
nimble/ll: Fix handling TERMINATE_IND as a Master
When slave sends TERMINATE_IND and MD flag is set to 0, Nimble needs to
wait to next connection event to send Empty Packet to ACK this
TERMINATE_IND.
At the moment Nimble corretly checks MD flag but stop scheduling
connection event which leads to un acked TERMINATE_IND.
This patch fixes that.
This shall fix LL/CON/INI/BV-06-C
---
nimble/controller/include/controller/ble_ll_conn.h | 1 +
nimble/controller/src/ble_ll_conn.c | 6 +++++-
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/nimble/controller/include/controller/ble_ll_conn.h
b/nimble/controller/include/controller/ble_ll_conn.h
index 38289a0..8652a11 100644
--- a/nimble/controller/include/controller/ble_ll_conn.h
+++ b/nimble/controller/include/controller/ble_ll_conn.h
@@ -101,6 +101,7 @@ union ble_ll_conn_sm_flags {
uint32_t pkt_rxd:1;
uint32_t terminate_ind_txd:1;
uint32_t terminate_ind_rxd:1;
+ uint32_t terminate_ind_rxd_acked:1;
uint32_t allow_slave_latency:1;
uint32_t slave_set_last_anchor:1;
uint32_t awaiting_host_reply:1;
diff --git a/nimble/controller/src/ble_ll_conn.c
b/nimble/controller/src/ble_ll_conn.c
index abdd90c..bd2e19b 100644
--- a/nimble/controller/src/ble_ll_conn.c
+++ b/nimble/controller/src/ble_ll_conn.c
@@ -1410,6 +1410,9 @@ conn_tx_pdu:
/* Increment packets transmitted */
if (CONN_F_EMPTY_PDU_TXD(connsm)) {
+ if (connsm->csmflags.cfbit.terminate_ind_rxd) {
+ connsm->csmflags.cfbit.terminate_ind_rxd_acked = 1;
+ }
STATS_INC(ble_ll_conn_stats, tx_empty_pdus);
} else if ((hdr_byte & BLE_LL_DATA_HDR_LLID_MASK) == BLE_LL_LLID_CTRL)
{
STATS_INC(ble_ll_conn_stats, tx_ctrl_pdus);
@@ -2573,7 +2576,8 @@ ble_ll_conn_event_end(struct ble_npl_event *ev)
/* If we have transmitted the terminate IND successfully, we are done */
if ((connsm->csmflags.cfbit.terminate_ind_txd) ||
- (connsm->csmflags.cfbit.terminate_ind_rxd)) {
+ (connsm->csmflags.cfbit.terminate_ind_rxd &&
+ connsm->csmflags.cfbit.terminate_ind_rxd_acked)) {
if (connsm->csmflags.cfbit.terminate_ind_txd) {
ble_err = BLE_ERR_CONN_TERM_LOCAL;
} else {