You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by an...@apache.org on 2022/08/08 09:53:40 UTC

[mynewt-nimble] branch master updated: nimble/ll: Use OTA max rx time for connection event calculations

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


The following commit(s) were added to refs/heads/master by this push:
     new 9b3feb5e nimble/ll: Use OTA max rx time for connection event calculations
9b3feb5e is described below

commit 9b3feb5ee12e4d50b86c522b2e8b0780ca6bc291
Author: Andrzej Kaczmarek <an...@codecoup.pl>
AuthorDate: Fri Aug 5 14:04:26 2022 +0200

    nimble/ll: Use OTA max rx time for connection event calculations
    
    Using effective max rx time for connection event calculations is not
    optimal since it's possible that time to rx packet with max octets
    payload is shorter that effective max rx time. Instead, we should
    calculate time it takes to rx packaet with effectiva max octets payload
    and use it if less than effective max rx time.
---
 nimble/controller/include/controller/ble_ll_conn.h |  1 +
 nimble/controller/src/ble_ll_conn.c                | 28 +++++++++++++++++++---
 2 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/nimble/controller/include/controller/ble_ll_conn.h b/nimble/controller/include/controller/ble_ll_conn.h
index 413ae9ec..3872406f 100644
--- a/nimble/controller/include/controller/ble_ll_conn.h
+++ b/nimble/controller/include/controller/ble_ll_conn.h
@@ -227,6 +227,7 @@ struct ble_ll_conn_sm
     uint16_t rem_max_rx_time;
     uint16_t eff_max_tx_time;
     uint16_t eff_max_rx_time;
+    uint16_t ota_max_rx_time;
 #if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CODED_PHY)
     uint16_t host_req_max_tx_time;
 #endif
diff --git a/nimble/controller/src/ble_ll_conn.c b/nimble/controller/src/ble_ll_conn.c
index 564c6cf8..2a8c0c05 100644
--- a/nimble/controller/src/ble_ll_conn.c
+++ b/nimble/controller/src/ble_ll_conn.c
@@ -1259,13 +1259,13 @@ ble_ll_conn_tx_pdu(struct ble_ll_conn_sm *connsm)
         tx_phy_mode = BLE_PHY_MODE_1M;
 #endif
 
-        ticks = (BLE_LL_IFS * 3) + connsm->eff_max_rx_time +
+        ticks = (BLE_LL_IFS * 3) + connsm->ota_max_rx_time +
             ble_ll_pdu_tx_time_get(next_txlen, tx_phy_mode) +
             ble_ll_pdu_tx_time_get(cur_txlen, tx_phy_mode);
 
 #if MYNEWT_VAL(BLE_LL_ROLE_CENTRAL)
         if (connsm->conn_role == BLE_LL_CONN_ROLE_CENTRAL) {
-            ticks += (BLE_LL_IFS + connsm->eff_max_rx_time);
+            ticks += (BLE_LL_IFS + connsm->ota_max_rx_time);
         }
 #endif
 
@@ -1674,7 +1674,7 @@ ble_ll_conn_can_send_next_pdu(struct ble_ll_conn_sm *connsm, uint32_t begtime,
             /* We will send empty pdu (just a LL header) */
             usecs = ble_ll_pdu_tx_time_get(0, tx_phy_mode);
         }
-        usecs += (BLE_LL_IFS * 2) + connsm->eff_max_rx_time;
+        usecs += (BLE_LL_IFS * 2) + connsm->ota_max_rx_time;
 
         ticks = (uint32_t)(next_sched_time - begtime);
         allowed_usecs = ble_ll_tmr_t2u(ticks);
@@ -1981,6 +1981,7 @@ ble_ll_conn_sm_new(struct ble_ll_conn_sm *connsm)
     connsm->rem_max_rx_time = BLE_LL_CONN_SUPP_TIME_MIN;
     connsm->eff_max_tx_time = BLE_LL_CONN_SUPP_TIME_MIN;
     connsm->eff_max_rx_time = BLE_LL_CONN_SUPP_TIME_MIN;
+    connsm->ota_max_rx_time = BLE_LL_CONN_SUPP_TIME_MIN;
     connsm->rem_max_tx_octets = BLE_LL_CONN_SUPP_BYTES_MIN;
     connsm->rem_max_rx_octets = BLE_LL_CONN_SUPP_BYTES_MIN;
     connsm->eff_max_tx_octets = BLE_LL_CONN_SUPP_BYTES_MIN;
@@ -2013,9 +2014,12 @@ ble_ll_conn_sm_new(struct ble_ll_conn_sm *connsm)
 void
 ble_ll_conn_update_eff_data_len(struct ble_ll_conn_sm *connsm)
 {
+    int ota_max_rx_time_calc = 0;
     int send_event;
     uint16_t eff_time;
     uint16_t eff_bytes;
+    uint16_t ota_time;
+    uint8_t phy_mode;
 
     /* Assume no event sent */
     send_event = 0;
@@ -2029,6 +2033,7 @@ ble_ll_conn_update_eff_data_len(struct ble_ll_conn_sm *connsm)
 #endif
     if (eff_time != connsm->eff_max_rx_time) {
         connsm->eff_max_rx_time = eff_time;
+        ota_max_rx_time_calc = 1;
         send_event = 1;
     }
     eff_time = min(connsm->rem_max_rx_time, connsm->max_tx_time);
@@ -2044,6 +2049,7 @@ ble_ll_conn_update_eff_data_len(struct ble_ll_conn_sm *connsm)
     eff_bytes = min(connsm->rem_max_tx_octets, connsm->max_rx_octets);
     if (eff_bytes != connsm->eff_max_rx_octets) {
         connsm->eff_max_rx_octets = eff_bytes;
+        ota_max_rx_time_calc = 1;
         send_event = 1;
     }
     eff_bytes = min(connsm->rem_max_rx_octets, connsm->max_tx_octets);
@@ -2052,6 +2058,22 @@ ble_ll_conn_update_eff_data_len(struct ble_ll_conn_sm *connsm)
         send_event = 1;
     }
 
+    /* If effective rx octets and/or time value changes, we need to calculate
+     * actual OTA max rx time, i.e. lesser of effective max rx time and rx time
+     * of PDU containing max rx octets of payload. This is then used to calculate
+     * connection events timings.
+     */
+    if (ota_max_rx_time_calc) {
+#if BLE_LL_BT5_PHY_SUPPORTED
+        phy_mode = ble_ll_phy_to_phy_mode(connsm->phy_data.cur_rx_phy,
+                                          BLE_HCI_LE_PHY_CODED_S8_PREF);
+#else
+        phy_mode = BLE_PHY_MODE_1M;
+#endif
+        ota_time = ble_ll_pdu_tx_time_get(connsm->eff_max_rx_octets, phy_mode);
+        connsm->ota_max_rx_time = min(ota_time, connsm->eff_max_rx_time);
+    }
+
     if (send_event) {
         ble_ll_hci_ev_datalen_chg(connsm);
     }