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/04/13 08:29:36 UTC

[mynewt-nimble] branch master updated: nimble/ll: Move global channel map out of ble_ll_conn

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 14b43a45 nimble/ll: Move global channel map out of ble_ll_conn
14b43a45 is described below

commit 14b43a457a2938f8cb9b7a3b6da380eb4486eadc
Author: Andrzej Kaczmarek <an...@codecoup.pl>
AuthorDate: Tue Apr 5 16:15:34 2022 +0200

    nimble/ll: Move global channel map out of ble_ll_conn
    
    Global channels map is also used by adv code. This fixes build without
    central/peripheral roles enabled.
---
 nimble/controller/include/controller/ble_ll.h      |  6 ++++++
 nimble/controller/include/controller/ble_ll_conn.h |  8 +++-----
 nimble/controller/src/ble_ll.c                     |  4 ++++
 nimble/controller/src/ble_ll_adv.c                 | 11 +++++-----
 nimble/controller/src/ble_ll_conn.c                | 24 ++++++++--------------
 nimble/controller/src/ble_ll_conn_hci.c            |  4 ++--
 nimble/controller/src/ble_ll_conn_priv.h           |  2 --
 nimble/controller/src/ble_ll_ctrl.c                | 10 ++++-----
 8 files changed, 33 insertions(+), 36 deletions(-)

diff --git a/nimble/controller/include/controller/ble_ll.h b/nimble/controller/include/controller/ble_ll.h
index 14fdcc7d..18468d43 100644
--- a/nimble/controller/include/controller/ble_ll.h
+++ b/nimble/controller/include/controller/ble_ll.h
@@ -91,6 +91,8 @@ void ble_ll_assert(const char *file, unsigned line) __attribute((noreturn));
 /* Packet queue header definition */
 STAILQ_HEAD(ble_ll_pkt_q, os_mbuf_pkthdr);
 
+#define BLE_LL_CHAN_MAP_LEN (5)
+
 /*
  * Global Link Layer data object. There is only one Link Layer data object
  * per controller although there may be many instances of the link layer state
@@ -104,6 +106,10 @@ struct ble_ll_obj
     /* Current Link Layer state */
     uint8_t ll_state;
 
+    /* Global channel map */
+    uint8_t chan_map_num_used;
+    uint8_t chan_map[BLE_LL_CHAN_MAP_LEN];
+
 #if MYNEWT_VAL(BLE_LL_ROLE_CENTRAL) || MYNEWT_VAL(BLE_LL_ROLE_PERIPHERAL)
     /* Number of ACL data packets supported */
     uint8_t ll_num_acl_pkts;
diff --git a/nimble/controller/include/controller/ble_ll_conn.h b/nimble/controller/include/controller/ble_ll_conn.h
index 269d881c..437d7c25 100644
--- a/nimble/controller/include/controller/ble_ll_conn.h
+++ b/nimble/controller/include/controller/ble_ll_conn.h
@@ -24,6 +24,7 @@
 #include "nimble/ble.h"
 #include "nimble/hci_common.h"
 #include "nimble/nimble_npl.h"
+#include "controller/ble_ll.h"
 #include "controller/ble_ll_sched.h"
 #include "controller/ble_ll_ctrl.h"
 #include "controller/ble_phy.h"
@@ -47,9 +48,6 @@ extern "C" {
 #define BLE_LL_CONN_STATE_CREATED       (1)
 #define BLE_LL_CONN_STATE_ESTABLISHED   (2)
 
-/* Channel map size */
-#define BLE_LL_CONN_CHMAP_LEN           (5)
-
 /* Definition for RSSI when the RSSI is unknown */
 #define BLE_LL_CONN_UNKNOWN_RSSI        (127)
 
@@ -240,8 +238,8 @@ struct ble_ll_conn_sm
 #endif
 
     /* Used to calculate data channel index for connection */
-    uint8_t chanmap[BLE_LL_CONN_CHMAP_LEN];
-    uint8_t req_chanmap[BLE_LL_CONN_CHMAP_LEN];
+    uint8_t chanmap[BLE_LL_CHAN_MAP_LEN];
+    uint8_t req_chanmap[BLE_LL_CHAN_MAP_LEN];
     uint16_t chanmap_instant;
     uint16_t channel_id; /* TODO could be union with hop and last chan used */
     uint8_t hop_inc;
diff --git a/nimble/controller/src/ble_ll.c b/nimble/controller/src/ble_ll.c
index b9d9d7b1..185fb583 100644
--- a/nimble/controller/src/ble_ll.c
+++ b/nimble/controller/src/ble_ll.c
@@ -1640,6 +1640,10 @@ ble_ll_reset(void)
     g_ble_ll_data.ll_pref_tx_phys = phy_mask;
     g_ble_ll_data.ll_pref_rx_phys = phy_mask;
 
+    /* Enable all channels in channel map */
+    g_ble_ll_data.chan_map_num_used = BLE_PHY_NUM_DATA_CHANS;
+    memset(g_ble_ll_data.chan_map, 0xff, BLE_LL_CHAN_MAP_LEN);
+
 #if MYNEWT_VAL(BLE_LL_ROLE_PERIPHERAL) || MYNEWT_VAL(BLE_LL_ROLE_CENTRAL)
     /* Reset connection module */
     ble_ll_conn_module_reset();
diff --git a/nimble/controller/src/ble_ll_adv.c b/nimble/controller/src/ble_ll_adv.c
index 1aaeeb4d..129eeba5 100644
--- a/nimble/controller/src/ble_ll_adv.c
+++ b/nimble/controller/src/ble_ll_adv.c
@@ -162,7 +162,7 @@ struct ble_ll_adv_sm
     uint8_t periodic_sync_active : 1;
     uint8_t periodic_sync_index : 1;
     uint8_t periodic_num_used_chans;
-    uint8_t periodic_chanmap[BLE_LL_CONN_CHMAP_LEN];
+    uint8_t periodic_chanmap[BLE_LL_CHAN_MAP_LEN];
     uint32_t periodic_adv_itvl_ticks;
     uint8_t periodic_adv_itvl_rem_usec;
     uint8_t periodic_adv_event_start_time_remainder;
@@ -1372,8 +1372,8 @@ ble_ll_adv_aux_calculate(struct ble_ll_adv_sm *advsm,
 #if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CSA2)
     aux->chan = ble_ll_utils_dci_csa2(advsm->event_cntr++,
                                       advsm->channel_id,
-                                      g_ble_ll_conn_params.num_used_chans,
-                                      g_ble_ll_conn_params.central_chan_map);
+                                      g_ble_ll_data.chan_map_num_used,
+                                      g_ble_ll_data.chan_map);
 #else
     aux->chan = ble_ll_utils_remapped_channel(ble_ll_rand() % BLE_PHY_NUM_DATA_CHANS,
                                               g_ble_ll_conn_params.central_chan_map);
@@ -2545,9 +2545,8 @@ ble_ll_adv_sm_start_periodic(struct ble_ll_adv_sm *advsm)
     advsm->periodic_adv_active = 1;
 
     /* keep channel map since we cannot change it later on */
-    memcpy(advsm->periodic_chanmap, g_ble_ll_conn_params.central_chan_map,
-           BLE_LL_CONN_CHMAP_LEN);
-    advsm->periodic_num_used_chans = g_ble_ll_conn_params.num_used_chans;
+    memcpy(advsm->periodic_chanmap, g_ble_ll_data.chan_map, BLE_LL_CHAN_MAP_LEN);
+    advsm->periodic_num_used_chans = g_ble_ll_data.chan_map_num_used;
     advsm->periodic_event_cntr = 0;
     /* for chaining we start with random counter as we share access addr */
     advsm->periodic_chain_event_cntr = ble_ll_rand();
diff --git a/nimble/controller/src/ble_ll_conn.c b/nimble/controller/src/ble_ll_conn.c
index 177b3693..dc43fecc 100644
--- a/nimble/controller/src/ble_ll_conn.c
+++ b/nimble/controller/src/ble_ll_conn.c
@@ -1699,9 +1699,8 @@ ble_ll_conn_central_common_init(struct ble_ll_conn_sm *connsm)
     connsm->hop_inc = (ble_ll_rand() % 12) + 5;
 
     /* Set channel map to map requested by host */
-    connsm->num_used_chans = g_ble_ll_conn_params.num_used_chans;
-    memcpy(connsm->chanmap, g_ble_ll_conn_params.central_chan_map,
-           BLE_LL_CONN_CHMAP_LEN);
+    connsm->num_used_chans = g_ble_ll_data.chan_map_num_used;
+    memcpy(connsm->chanmap, g_ble_ll_data.chan_map, BLE_LL_CHAN_MAP_LEN);
 
 #if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_ENHANCED_CONN_UPDATE)
     connsm->acc_subrate_min = g_ble_ll_conn_params.acc_subrate_min;
@@ -2471,7 +2470,7 @@ ble_ll_conn_next_event(struct ble_ll_conn_sm *connsm)
            on peripheral side. Could ignore it or see if still enqueued. */
         connsm->num_used_chans =
             ble_ll_utils_calc_num_used_chans(connsm->req_chanmap);
-        memcpy(connsm->chanmap, connsm->req_chanmap, BLE_LL_CONN_CHMAP_LEN);
+        memcpy(connsm->chanmap, connsm->req_chanmap, BLE_LL_CHAN_MAP_LEN);
 
         connsm->csmflags.cfbit.chanmap_update_scheduled = 0;
 
@@ -3007,7 +3006,7 @@ ble_ll_conn_tx_connect_ind_pducb(uint8_t *dptr, void *pducb_arg, uint8_t *hdr_by
     put_le16(dptr + 10, connsm->conn_itvl);
     put_le16(dptr + 12, connsm->periph_latency);
     put_le16(dptr + 14, connsm->supervision_tmo);
-    memcpy(dptr + 16, &connsm->chanmap, BLE_LL_CONN_CHMAP_LEN);
+    memcpy(dptr + 16, &connsm->chanmap, BLE_LL_CHAN_MAP_LEN);
     dptr[21] = connsm->hop_inc | (connsm->central_sca << 5);
 
     *hdr_byte = pdu_data->hdr_byte;
@@ -3882,17 +3881,15 @@ ble_ll_conn_set_global_chanmap(uint8_t num_used_chans, const uint8_t *chanmap)
 #if MYNEWT_VAL(BLE_LL_ROLE_CENTRAL)
     struct ble_ll_conn_sm *connsm;
 #endif
-    struct ble_ll_conn_global_params *conn_params;
 
     /* Do nothing if same channel map */
-    conn_params = &g_ble_ll_conn_params;
-    if (!memcmp(conn_params->central_chan_map, chanmap, BLE_LL_CONN_CHMAP_LEN)) {
+    if (!memcmp(g_ble_ll_data.chan_map, chanmap, BLE_LL_CHAN_MAP_LEN)) {
         return;
     }
 
     /* Change channel map and cause channel map update procedure to start */
-    conn_params->num_used_chans = num_used_chans;
-    memcpy(conn_params->central_chan_map, chanmap, BLE_LL_CONN_CHMAP_LEN);
+    g_ble_ll_data.chan_map_num_used = num_used_chans;
+    memcpy(g_ble_ll_data.chan_map, chanmap, BLE_LL_CHAN_MAP_LEN);
 
 #if MYNEWT_VAL(BLE_LL_ROLE_CENTRAL)
     /* Perform channel map update */
@@ -3966,7 +3963,7 @@ ble_ll_conn_periph_start(uint8_t *rxbuf, uint8_t pat, struct ble_mbuf_hdr *rxhdr
     connsm->conn_itvl = get_le16(dptr + 10);
     connsm->periph_latency = get_le16(dptr + 12);
     connsm->supervision_tmo = get_le16(dptr + 14);
-    memcpy(&connsm->chanmap, dptr + 16, BLE_LL_CONN_CHMAP_LEN);
+    memcpy(&connsm->chanmap, dptr + 16, BLE_LL_CHAN_MAP_LEN);
     connsm->hop_inc = dptr[21] & 0x1F;
     connsm->central_sca = dptr[21] >> 5;
 
@@ -4268,11 +4265,6 @@ ble_ll_conn_module_reset(void)
     conn_params->sugg_tx_octets = BLE_LL_CONN_SUPP_BYTES_MIN;
     conn_params->sugg_tx_time = BLE_LL_CONN_SUPP_TIME_MIN;
 
-    /* Mask in all channels by default */
-    conn_params->num_used_chans = BLE_PHY_NUM_DATA_CHANS;
-    memset(conn_params->central_chan_map, 0xff, BLE_LL_CONN_CHMAP_LEN - 1);
-    conn_params->central_chan_map[4] = 0x1f;
-
 #if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_ENHANCED_CONN_UPDATE)
     conn_params->acc_subrate_min = 0x0001;
     conn_params->acc_subrate_max = 0x0001;
diff --git a/nimble/controller/src/ble_ll_conn_hci.c b/nimble/controller/src/ble_ll_conn_hci.c
index be41bf62..8f5771a6 100644
--- a/nimble/controller/src/ble_ll_conn_hci.c
+++ b/nimble/controller/src/ble_ll_conn_hci.c
@@ -1386,9 +1386,9 @@ ble_ll_conn_hci_rd_chan_map(const uint8_t *cmdbuf, uint8_t len,
         memset(rsp->chan_map, 0, sizeof(rsp->chan_map));
     } else {
         if (connsm->csmflags.cfbit.chanmap_update_scheduled) {
-            memcpy(rsp->chan_map, connsm->req_chanmap, BLE_LL_CONN_CHMAP_LEN);
+            memcpy(rsp->chan_map, connsm->req_chanmap, BLE_LL_CHAN_MAP_LEN);
         } else {
-            memcpy(rsp->chan_map, connsm->chanmap, BLE_LL_CONN_CHMAP_LEN);
+            memcpy(rsp->chan_map, connsm->chanmap, BLE_LL_CHAN_MAP_LEN);
         }
         rc = BLE_ERR_SUCCESS;
     }
diff --git a/nimble/controller/src/ble_ll_conn_priv.h b/nimble/controller/src/ble_ll_conn_priv.h
index 7a1e56d8..90c32c0c 100644
--- a/nimble/controller/src/ble_ll_conn_priv.h
+++ b/nimble/controller/src/ble_ll_conn_priv.h
@@ -66,8 +66,6 @@ extern "C" {
 /* Global Link Layer connection parameters */
 struct ble_ll_conn_global_params
 {
-    uint8_t central_chan_map[BLE_LL_CONN_CHMAP_LEN];
-    uint8_t num_used_chans;
 #if MYNEWT_VAL(BLE_LL_ROLE_CENTRAL) || MYNEWT_VAL(BLE_LL_ROLE_PERIPHERAL)
     uint8_t supp_max_tx_octets;
     uint8_t supp_max_rx_octets;
diff --git a/nimble/controller/src/ble_ll_ctrl.c b/nimble/controller/src/ble_ll_ctrl.c
index 5111d6d3..7ece7b1c 100644
--- a/nimble/controller/src/ble_ll_ctrl.c
+++ b/nimble/controller/src/ble_ll_ctrl.c
@@ -1868,12 +1868,12 @@ static void
 ble_ll_ctrl_chanmap_req_make(struct ble_ll_conn_sm *connsm, uint8_t *pyld)
 {
     /* Copy channel map that host desires into request */
-    memcpy(pyld, g_ble_ll_conn_params.central_chan_map, BLE_LL_CONN_CHMAP_LEN);
-    memcpy(connsm->req_chanmap, pyld, BLE_LL_CONN_CHMAP_LEN);
+    memcpy(pyld, g_ble_ll_data.chan_map, BLE_LL_CHAN_MAP_LEN);
+    memcpy(connsm->req_chanmap, pyld, BLE_LL_CHAN_MAP_LEN);
 
     /* Place instant into request */
     connsm->chanmap_instant = connsm->event_cntr + connsm->periph_latency + 6 + 1;
-    put_le16(pyld + BLE_LL_CONN_CHMAP_LEN, connsm->chanmap_instant);
+    put_le16(pyld + BLE_LL_CHAN_MAP_LEN, connsm->chanmap_instant);
 
     /* Set scheduled flag */
     connsm->csmflags.cfbit.chanmap_update_scheduled = 1;
@@ -2393,13 +2393,13 @@ ble_ll_ctrl_rx_chanmap_req(struct ble_ll_conn_sm *connsm, uint8_t *dptr)
 #endif
 
     /* If instant is in the past, we have to end the connection */
-    instant = get_le16(dptr + BLE_LL_CONN_CHMAP_LEN);
+    instant = get_le16(dptr + BLE_LL_CHAN_MAP_LEN);
     conn_events = (instant - connsm->event_cntr) & 0xFFFF;
     if (conn_events >= 32767) {
         ble_ll_conn_timeout(connsm, BLE_ERR_INSTANT_PASSED);
     } else {
         connsm->chanmap_instant = instant;
-        memcpy(connsm->req_chanmap, dptr, BLE_LL_CONN_CHMAP_LEN);
+        memcpy(connsm->req_chanmap, dptr, BLE_LL_CHAN_MAP_LEN);
         connsm->csmflags.cfbit.chanmap_update_scheduled = 1;
     }