You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by ja...@apache.org on 2023/01/06 14:14:32 UTC

[mynewt-nimble] branch master updated: nimble/ll: Fix not being able to get back to default DLE values

This is an automated email from the ASF dual-hosted git repository.

janc 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 7fde2c7a nimble/ll: Fix not being able to get back to default DLE values
7fde2c7a is described below

commit 7fde2c7ad135a133c17aeb0cd99d557f8c0cc0f3
Author: Szymon Janc <sz...@codecoup.pl>
AuthorDate: Wed Dec 28 16:13:29 2022 +0100

    nimble/ll: Fix not being able to get back to default DLE values
    
    If new DLE parameters were matching default values DLE update procedure
    was not started.
---
 nimble/controller/include/controller/ble_ll_ctrl.h |  2 +-
 nimble/controller/src/ble_ll_conn.c                |  4 ++--
 nimble/controller/src/ble_ll_ctrl.c                | 17 ++++++++++-------
 3 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/nimble/controller/include/controller/ble_ll_ctrl.h b/nimble/controller/include/controller/ble_ll_ctrl.h
index 6e7ad13d..445ccc4f 100644
--- a/nimble/controller/include/controller/ble_ll_ctrl.h
+++ b/nimble/controller/include/controller/ble_ll_ctrl.h
@@ -333,7 +333,7 @@ void ble_ll_hci_ev_send_adv_set_terminated(uint8_t status, uint8_t adv_handle,
 int ble_ll_hci_ev_phy_update(struct ble_ll_conn_sm *connsm, uint8_t status);
 void ble_ll_calc_session_key(struct ble_ll_conn_sm *connsm);
 void ble_ll_ctrl_phy_update_proc_complete(struct ble_ll_conn_sm *connsm);
-void ble_ll_ctrl_initiate_dle(struct ble_ll_conn_sm *connsm);
+void ble_ll_ctrl_initiate_dle(struct ble_ll_conn_sm *connsm, bool initial);
 void ble_ll_hci_ev_send_vs_assert(const char *file, uint32_t line);
 void ble_ll_hci_ev_send_vs_llcp_trace(uint8_t type, uint16_t handle, uint16_t count,
                                       void *pdu, size_t length);
diff --git a/nimble/controller/src/ble_ll_conn.c b/nimble/controller/src/ble_ll_conn.c
index 408e9b8a..9b926010 100644
--- a/nimble/controller/src/ble_ll_conn.c
+++ b/nimble/controller/src/ble_ll_conn.c
@@ -1851,7 +1851,7 @@ ble_ll_conn_set_data_len(struct ble_ll_conn_sm *connsm,
     }
 
     if (init_dle) {
-        ble_ll_ctrl_initiate_dle(connsm);
+        ble_ll_ctrl_initiate_dle(connsm, false);
     }
 
     return 0;
@@ -2664,7 +2664,7 @@ ble_ll_conn_next_event(struct ble_ll_conn_sm *connsm)
             !ble_ll_conn_rem_feature_check(connsm, BLE_LL_FEAT_LE_CODED_PHY)) {
             ble_ll_conn_rem_feature_add(connsm, BLE_LL_FEAT_LE_CODED_PHY);
             connsm->max_rx_time = BLE_LL_CONN_SUPP_TIME_MAX_CODED;
-            ble_ll_ctrl_initiate_dle(connsm);
+            ble_ll_ctrl_initiate_dle(connsm, false);
         }
 #endif
     }
diff --git a/nimble/controller/src/ble_ll_ctrl.c b/nimble/controller/src/ble_ll_ctrl.c
index 948eefae..fe3c05fe 100644
--- a/nimble/controller/src/ble_ll_ctrl.c
+++ b/nimble/controller/src/ble_ll_ctrl.c
@@ -2081,7 +2081,7 @@ ble_ll_ctrl_rx_conn_update(struct ble_ll_conn_sm *connsm, uint8_t *dptr)
 }
 
 void
-ble_ll_ctrl_initiate_dle(struct ble_ll_conn_sm *connsm)
+ble_ll_ctrl_initiate_dle(struct ble_ll_conn_sm *connsm, bool initial)
 {
     if (!(connsm->conn_features & BLE_LL_FEAT_DATA_LEN_EXT)) {
         return;
@@ -2090,12 +2090,15 @@ ble_ll_ctrl_initiate_dle(struct ble_ll_conn_sm *connsm)
     /*
      * Section 4.5.10 Vol 6 PART B. If the max tx/rx time or octets
      * exceeds the minimum, data length procedure needs to occur
+     * "at the earliest practical opportunity".
      */
-    if ((connsm->max_tx_octets <= BLE_LL_CONN_SUPP_BYTES_MIN) &&
-        (connsm->max_rx_octets <= BLE_LL_CONN_SUPP_BYTES_MIN) &&
-        (connsm->max_tx_time <= BLE_LL_CONN_SUPP_TIME_MIN) &&
-        (connsm->max_rx_time <= BLE_LL_CONN_SUPP_TIME_MIN)) {
-        return;
+    if (initial) {
+        if ((connsm->max_tx_octets <= BLE_LL_CONN_SUPP_BYTES_MIN) &&
+            (connsm->max_rx_octets <= BLE_LL_CONN_SUPP_BYTES_MIN) &&
+            (connsm->max_tx_time <= BLE_LL_CONN_SUPP_TIME_MIN) &&
+            (connsm->max_rx_time <= BLE_LL_CONN_SUPP_TIME_MIN)) {
+            return;
+        }
     }
 
     ble_ll_ctrl_proc_start(connsm, BLE_LL_CTRL_PROC_DATA_LEN_UPD, NULL);
@@ -3048,7 +3051,7 @@ ll_ctrl_send_rsp:
 
     if (connsm->csmflags.cfbit.pending_initiate_dle) {
         connsm->csmflags.cfbit.pending_initiate_dle = 0;
-        ble_ll_ctrl_initiate_dle(connsm);
+        ble_ll_ctrl_initiate_dle(connsm, true);
     }
 
     return rc;