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 f9161f375565c44df7362f8ed53b0b74ab0d9813 Author: Andrzej Kaczmarek <[email protected]> AuthorDate: Mon Feb 17 19:06:33 2025 +0100 nimble/ll: Fix connection update HCI event HCI LE Connection Update Complete event shall only be sent if this is a result of request issued by host or if any connection parameter has changed. We should not send the event if this was just an anchor move requested by peripheral. --- nimble/controller/include/controller/ble_ll_conn.h | 1 + nimble/controller/src/ble_ll_conn.c | 9 +++++---- nimble/controller/src/ble_ll_conn_hci.c | 3 +++ 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/nimble/controller/include/controller/ble_ll_conn.h b/nimble/controller/include/controller/ble_ll_conn.h index 347f4653e..2b0c606dd 100644 --- a/nimble/controller/include/controller/ble_ll_conn.h +++ b/nimble/controller/include/controller/ble_ll_conn.h @@ -119,6 +119,7 @@ struct ble_ll_conn_sm_flags { uint32_t terminate_ind_rxd_acked : 1; uint32_t conn_update_sched : 1; uint32_t conn_update_use_cp : 1; + uint32_t conn_update_host_initd : 1; uint32_t conn_update_host_w4reply : 1; uint32_t conn_update_host_w4event : 1; uint32_t chanmap_update_sched : 1; diff --git a/nimble/controller/src/ble_ll_conn.c b/nimble/controller/src/ble_ll_conn.c index 1864f8f36..52446b647 100644 --- a/nimble/controller/src/ble_ll_conn.c +++ b/nimble/controller/src/ble_ll_conn.c @@ -2542,15 +2542,16 @@ ble_ll_conn_next_event(struct ble_ll_conn_sm *connsm) if (connsm->flags.conn_update_sched && (connsm->event_cntr == connsm->conn_update_req.instant)) { - /* Set flag so we send connection update event */ + /* Set flag to send event to host if request was issued by host or + * any of parameters changed (i.e. skip on anchor moves) + */ upd = &connsm->conn_update_req; - if (CONN_IS_CENTRAL(connsm) || - (CONN_IS_PERIPHERAL(connsm) && - IS_PENDING_CTRL_PROC(connsm, BLE_LL_CTRL_PROC_CONN_PARAM_REQ)) || + if (connsm->flags.conn_update_host_initd || (connsm->conn_itvl != upd->interval) || (connsm->periph_latency != upd->latency) || (connsm->supervision_tmo != upd->timeout)) { connsm->flags.conn_update_host_w4event = 1; + connsm->flags.conn_update_host_initd = 0; } #if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_ENHANCED_CONN_UPDATE) diff --git a/nimble/controller/src/ble_ll_conn_hci.c b/nimble/controller/src/ble_ll_conn_hci.c index fae4b31a9..158464ed5 100644 --- a/nimble/controller/src/ble_ll_conn_hci.c +++ b/nimble/controller/src/ble_ll_conn_hci.c @@ -1134,6 +1134,9 @@ ble_ll_conn_hci_update(const uint8_t *cmdbuf, uint8_t len) connsm->css_slot_idx_pending = connsm->css_slot_idx; #endif + /* Mark procedure as host initiated */ + connsm->flags.conn_update_host_initd = 1; + /* Start the control procedure */ ble_ll_ctrl_proc_start(connsm, ctrl_proc, NULL); }
