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);
     }

Reply via email to