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 2021/10/07 09:43:23 UTC

[mynewt-nimble] branch master updated (6c9f709 -> a892c8f)

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

andk pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git.


    from 6c9f709  nimble/ll: Fix scanning with LL Privacy disabled
     new 6c9f95a  nimble/ll: Optimize AUX_CONNECT_REQ tx
     new a892c8f  nimble/ll: Allow 2M params as fallback for ext conn create

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 nimble/controller/include/controller/ble_ll_conn.h |  5 +-
 nimble/controller/src/ble_ll_conn.c                | 38 ++++++++-------
 nimble/controller/src/ble_ll_conn_hci.c            | 57 +++++++++++++++++-----
 3 files changed, 69 insertions(+), 31 deletions(-)

[mynewt-nimble] 02/02: nimble/ll: Allow 2M params as fallback for ext conn create

Posted by an...@apache.org.
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 a892c8f78952907c88b9ff714a446a73348cef5c
Author: Andrzej Kaczmarek <an...@codecoup.pl>
AuthorDate: Tue Oct 5 17:21:39 2021 +0200

    nimble/ll: Allow 2M params as fallback for ext conn create
    
    We ignore 2M values only for scanning since we do not scan on 2M when
    ext conn create is pending, but there's nothing wrong in using those
    parameters as fallback in case we established connection on phy that
    was not in phy mask.
---
 nimble/controller/src/ble_ll_conn_hci.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/nimble/controller/src/ble_ll_conn_hci.c b/nimble/controller/src/ble_ll_conn_hci.c
index aa6de54..fe384c4 100644
--- a/nimble/controller/src/ble_ll_conn_hci.c
+++ b/nimble/controller/src/ble_ll_conn_hci.c
@@ -707,6 +707,9 @@ ble_ll_ext_conn_create(const uint8_t *cmdbuf, uint8_t len)
         ble_ll_conn_itvl_to_ticks(conn_itvl_max, &hcc.params[1].conn_itvl_ticks,
                                   &hcc.params[1].conn_itvl_usecs);
 
+        if (!fallback_params) {
+            fallback_params = &hcc.params[1];
+        }
         params++;
     }
 #endif

[mynewt-nimble] 01/02: nimble/ll: Optimize AUX_CONNECT_REQ tx

Posted by an...@apache.org.
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 6c9f95ad23c5ed8703ee7e35107a246b3e287dcd
Author: Andrzej Kaczmarek <an...@codecoup.pl>
AuthorDate: Tue Oct 5 17:17:39 2021 +0200

    nimble/ll: Optimize AUX_CONNECT_REQ tx
    
    Currently we initialize a lot of connsm settings prior to scheduling
    1st connection event and this takes some time. However, we only need
    connection interval, latency and supervision timeout to be initialized
    in order to schedule event properly and send AUX_CONNECT_REQ, other
    stuff can be done after tx has already started.
    
    This is especially important on slower MCU like CMAC as with old code
    it was barely possible to make tx within Tifs even on speed build.
    
    New code saves ~15us on CMAC prior to tx so we have quite a good margin
    to complete on time.
---
 nimble/controller/include/controller/ble_ll_conn.h |  5 +-
 nimble/controller/src/ble_ll_conn.c                | 38 ++++++++-------
 nimble/controller/src/ble_ll_conn_hci.c            | 54 +++++++++++++++++-----
 3 files changed, 66 insertions(+), 31 deletions(-)

diff --git a/nimble/controller/include/controller/ble_ll_conn.h b/nimble/controller/include/controller/ble_ll_conn.h
index d7db687..daf7db5 100644
--- a/nimble/controller/include/controller/ble_ll_conn.h
+++ b/nimble/controller/include/controller/ble_ll_conn.h
@@ -192,8 +192,9 @@ struct hci_ext_conn_params
 {
     uint16_t scan_itvl;
     uint16_t scan_window;
-    uint16_t conn_itvl_min;
-    uint16_t conn_itvl_max;
+    uint32_t conn_itvl;
+    uint16_t conn_itvl_ticks;
+    uint8_t conn_itvl_usecs;
     uint16_t conn_latency;
     uint16_t supervision_timeout;
     uint16_t min_ce_len;
diff --git a/nimble/controller/src/ble_ll_conn.c b/nimble/controller/src/ble_ll_conn.c
index af610b5..5330378 100644
--- a/nimble/controller/src/ble_ll_conn.c
+++ b/nimble/controller/src/ble_ll_conn.c
@@ -1755,14 +1755,6 @@ void
 ble_ll_conn_ext_set_params(struct ble_ll_conn_sm *connsm,
                            struct hci_ext_conn_params *hcc_params, int phy)
 {
-    /* Set slave latency and supervision timeout */
-    connsm->slave_latency = hcc_params->conn_latency;
-    connsm->supervision_tmo = hcc_params->supervision_timeout;
-
-    /* XXX: for now, just make connection interval equal to max */
-    connsm->conn_itvl = hcc_params->conn_itvl_max;
-
-
     /* Check the min/max CE lengths are less than connection interval */
     if (hcc_params->min_ce_len > (connsm->conn_itvl * 2)) {
         connsm->min_ce_len = connsm->conn_itvl * 2;
@@ -1776,8 +1768,6 @@ ble_ll_conn_ext_set_params(struct ble_ll_conn_sm *connsm,
         connsm->max_ce_len = hcc_params->max_ce_len;
     }
 
-    ble_ll_conn_calc_itvl_ticks(connsm);
-
 #if (BLE_LL_BT5_PHY_SUPPORTED == 1)
     ble_ll_conn_init_phy(connsm, phy);
 #endif
@@ -3176,6 +3166,7 @@ ble_ll_init_rx_isr_end(uint8_t *rxbuf, uint8_t crcok,
     struct ble_ll_resolv_entry *rl;
 #endif
 #if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV)
+    struct hci_ext_conn_params *hcp;
     struct ble_ll_scan_sm *scansm;
     uint8_t phy;
 #endif
@@ -3425,15 +3416,16 @@ ble_ll_init_rx_isr_end(uint8_t *rxbuf, uint8_t crcok,
     }
 
     if (connsm->scansm->ext_scanning) {
-            phy = ble_hdr->rxinfo.phy;
+        phy = ble_hdr->rxinfo.phy;
 
-            /* Update connection state machine with appropriate parameters for
-             * certain PHY
-             */
-            ble_ll_conn_ext_set_params(connsm,
-                                       &connsm->initial_params.params[phy - 1],
-                                       phy);
+        hcp = &connsm->initial_params.params[phy - 1];
 
+        connsm->slave_latency = hcp->conn_latency;
+        connsm->supervision_tmo = hcp->supervision_timeout;
+
+        connsm->conn_itvl = hcp->conn_itvl;
+        connsm->conn_itvl_ticks = hcp->conn_itvl_ticks;
+        connsm->conn_itvl_usecs = hcp->conn_itvl_usecs;
     }
 #endif
 
@@ -3472,6 +3464,18 @@ ble_ll_init_rx_isr_end(uint8_t *rxbuf, uint8_t crcok,
         ble_hdr->rxinfo.user_data = NULL;
         STATS_INC(ble_ll_stats, aux_conn_req_tx);
     }
+
+    if (connsm->scansm->ext_scanning) {
+        phy = ble_hdr->rxinfo.phy;
+
+        /* Update connection state machine with appropriate parameters for
+         * certain PHY
+         */
+        ble_ll_conn_ext_set_params(connsm,
+                                   &connsm->initial_params.params[phy - 1],
+                                   phy);
+
+    }
 #endif
 
     STATS_INC(ble_ll_conn_stats, conn_req_txd);
diff --git a/nimble/controller/src/ble_ll_conn_hci.c b/nimble/controller/src/ble_ll_conn_hci.c
index 9936b9d..aa6de54 100644
--- a/nimble/controller/src/ble_ll_conn_hci.c
+++ b/nimble/controller/src/ble_ll_conn_hci.c
@@ -556,6 +556,25 @@ ble_ll_conn_hcc_params_set_fallback(struct hci_ext_create_conn *hcc,
 #endif
 }
 
+static void
+ble_ll_conn_itvl_to_ticks(uint32_t itvl, uint16_t *itvl_ticks,
+                          uint8_t *itvl_usecs)
+{
+    uint32_t ticks;
+    uint32_t usecs;
+
+    usecs = itvl * BLE_LL_CONN_ITVL_USECS;
+    ticks = os_cputime_usecs_to_ticks(usecs);
+    usecs = usecs - os_cputime_ticks_to_usecs(ticks);
+    if (usecs == 31) {
+        usecs = 0;
+        ++ticks;
+    }
+
+    *itvl_ticks = ticks;
+    *itvl_usecs = usecs;
+}
+
 int
 ble_ll_ext_conn_create(const uint8_t *cmdbuf, uint8_t len)
 {
@@ -564,6 +583,8 @@ ble_ll_ext_conn_create(const uint8_t *cmdbuf, uint8_t len)
     const struct hci_ext_conn_params *fallback_params = NULL;
     struct hci_ext_create_conn hcc = { 0 };
     struct ble_ll_conn_sm *connsm;
+    uint16_t conn_itvl_min;
+    uint16_t conn_itvl_max;
     int rc;
 
     /* validate length */
@@ -629,13 +650,12 @@ ble_ll_ext_conn_create(const uint8_t *cmdbuf, uint8_t len)
             return rc;
         }
 
-        hcc.params[0].conn_itvl_min = le16toh(params->conn_min_itvl);
-        hcc.params[0].conn_itvl_max = le16toh(params->conn_min_itvl);
+        conn_itvl_min = le16toh(params->conn_min_itvl);
+        conn_itvl_max = le16toh(params->conn_max_itvl);
         hcc.params[0].conn_latency = le16toh(params->conn_latency);
         hcc.params[0].supervision_timeout = le16toh(params->supervision_timeout);
 
-        rc = ble_ll_conn_hci_chk_conn_params(hcc.params[0].conn_itvl_min,
-                                             hcc.params[0].conn_itvl_max,
+        rc = ble_ll_conn_hci_chk_conn_params(conn_itvl_min, conn_itvl_max,
                                              hcc.params[0].conn_latency,
                                              hcc.params[0].supervision_timeout);
         if (rc) {
@@ -649,6 +669,10 @@ ble_ll_ext_conn_create(const uint8_t *cmdbuf, uint8_t len)
             return BLE_ERR_INV_HCI_CMD_PARMS;
         }
 
+        hcc.params[0].conn_itvl = conn_itvl_max;
+        ble_ll_conn_itvl_to_ticks(conn_itvl_max, &hcc.params[0].conn_itvl_ticks,
+                                  &hcc.params[0].conn_itvl_usecs);
+
         fallback_params = &hcc.params[0];
         params++;
     }
@@ -660,13 +684,12 @@ ble_ll_ext_conn_create(const uint8_t *cmdbuf, uint8_t len)
         }
         len -= sizeof(*params);
 
-        hcc.params[1].conn_itvl_min = le16toh(params->conn_min_itvl);
-        hcc.params[1].conn_itvl_max = le16toh(params->conn_min_itvl);
+        conn_itvl_min = le16toh(params->conn_min_itvl);
+        conn_itvl_max = le16toh(params->conn_max_itvl);
         hcc.params[1].conn_latency = le16toh(params->conn_latency);
         hcc.params[1].supervision_timeout = le16toh(params->supervision_timeout);
 
-        rc = ble_ll_conn_hci_chk_conn_params(hcc.params[1].conn_itvl_min,
-                                             hcc.params[1].conn_itvl_max,
+        rc = ble_ll_conn_hci_chk_conn_params(conn_itvl_min, conn_itvl_max,
                                              hcc.params[1].conn_latency,
                                              hcc.params[1].supervision_timeout);
         if (rc) {
@@ -680,6 +703,10 @@ ble_ll_ext_conn_create(const uint8_t *cmdbuf, uint8_t len)
             return BLE_ERR_INV_HCI_CMD_PARMS;
         }
 
+        hcc.params[1].conn_itvl = conn_itvl_max;
+        ble_ll_conn_itvl_to_ticks(conn_itvl_max, &hcc.params[1].conn_itvl_ticks,
+                                  &hcc.params[1].conn_itvl_usecs);
+
         params++;
     }
 #endif
@@ -700,13 +727,12 @@ ble_ll_ext_conn_create(const uint8_t *cmdbuf, uint8_t len)
             return rc;
         }
 
-        hcc.params[2].conn_itvl_min = le16toh(params->conn_min_itvl);
-        hcc.params[2].conn_itvl_max = le16toh(params->conn_min_itvl);
+        conn_itvl_min = le16toh(params->conn_min_itvl);
+        conn_itvl_max = le16toh(params->conn_max_itvl);
         hcc.params[2].conn_latency = le16toh(params->conn_latency);
         hcc.params[2].supervision_timeout = le16toh(params->supervision_timeout);
 
-        rc = ble_ll_conn_hci_chk_conn_params(hcc.params[2].conn_itvl_min,
-                                             hcc.params[2].conn_itvl_max,
+        rc = ble_ll_conn_hci_chk_conn_params(conn_itvl_min, conn_itvl_max,
                                              hcc.params[2].conn_latency,
                                              hcc.params[2].supervision_timeout);
         if (rc) {
@@ -720,6 +746,10 @@ ble_ll_ext_conn_create(const uint8_t *cmdbuf, uint8_t len)
             return BLE_ERR_INV_HCI_CMD_PARMS;
         }
 
+        hcc.params[2].conn_itvl = conn_itvl_max;
+        ble_ll_conn_itvl_to_ticks(conn_itvl_max, &hcc.params[2].conn_itvl_ticks,
+                                  &hcc.params[2].conn_itvl_usecs);
+
         if (!fallback_params) {
             fallback_params = &hcc.params[2];
         }