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 2019/12/03 22:37:25 UTC

[mynewt-nimble] 07/08: nimble/ll: Allow host to assign advertising instances

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

commit 734c26fdd0597e2e1f8f62f3396ed7eef8da57e6
Author: Szymon Janc <sz...@codecoup.pl>
AuthorDate: Wed Nov 20 15:11:21 2019 +0100

    nimble/ll: Allow host to assign advertising instances
    
    This allows host to assign own instances when configuring extended
    advertising. Before this change host could use only 0-max_adv_instances
    values as instance number.
---
 nimble/controller/src/ble_ll_adv.c | 168 +++++++++++++++++--------------------
 1 file changed, 79 insertions(+), 89 deletions(-)

diff --git a/nimble/controller/src/ble_ll_adv.c b/nimble/controller/src/ble_ll_adv.c
index db83ba4..79e250f 100644
--- a/nimble/controller/src/ble_ll_adv.c
+++ b/nimble/controller/src/ble_ll_adv.c
@@ -202,6 +202,34 @@ struct ble_ll_adv_sm
 #define SYNC_DATA_LEN(_advsm) \
                 (_advsm->periodic_adv_data ? OS_MBUF_PKTLEN(advsm->periodic_adv_data) : 0)
 
+/* The advertising state machine global object */
+struct ble_ll_adv_sm g_ble_ll_adv_sm[BLE_ADV_INSTANCES];
+struct ble_ll_adv_sm *g_ble_ll_cur_adv_sm;
+
+static struct ble_ll_adv_sm *
+ble_ll_adv_sm_find_configured(uint8_t instance)
+{
+    struct ble_ll_adv_sm *advsm;
+    int i;
+
+    /* in legacy mode we only allow instance 0 */
+    if (!ble_ll_hci_adv_mode_ext()) {
+        BLE_LL_ASSERT(instance == 0);
+        return &g_ble_ll_adv_sm[0];
+    }
+
+    for (i = 0; i < ARRAY_SIZE(g_ble_ll_adv_sm); i++) {
+        advsm = &g_ble_ll_adv_sm[i];
+
+        if ((advsm->flags & BLE_LL_ADV_SM_FLAG_CONFIGURED) &&
+                (advsm->adv_instance == instance)) {
+            return advsm;
+        }
+    }
+
+    return NULL;
+}
+
 static int
 ble_ll_adv_active_chanset_is_pri(struct ble_ll_adv_sm *advsm)
 {
@@ -272,10 +300,6 @@ ble_ll_adv_flags_clear(struct ble_ll_adv_sm *advsm, uint16_t flags)
     OS_EXIT_CRITICAL(sr);
 }
 
-/* The advertising state machine global object */
-struct ble_ll_adv_sm g_ble_ll_adv_sm[BLE_ADV_INSTANCES];
-struct ble_ll_adv_sm *g_ble_ll_cur_adv_sm;
-
 static void ble_ll_adv_make_done(struct ble_ll_adv_sm *advsm, struct ble_mbuf_hdr *hdr);
 static void ble_ll_adv_sm_init(struct ble_ll_adv_sm *advsm);
 static void ble_ll_adv_sm_stop_timeout(struct ble_ll_adv_sm *advsm);
@@ -2717,12 +2741,11 @@ ble_ll_adv_set_enable(uint8_t instance, uint8_t enable, int duration,
     int rc;
     struct ble_ll_adv_sm *advsm;
 
-    if (instance >= BLE_ADV_INSTANCES) {
-        return BLE_ERR_INV_HCI_CMD_PARMS;
+    advsm = ble_ll_adv_sm_find_configured(instance);
+    if (!advsm) {
+        return BLE_ERR_UNK_ADV_INDENT;
     }
 
-    advsm = &g_ble_ll_adv_sm[instance];
-
     rc = BLE_ERR_SUCCESS;
     if (enable == 1) {
 #if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV)
@@ -2814,19 +2837,6 @@ done:
     *omp = om;
 }
 
-static bool
-instance_configured(struct ble_ll_adv_sm *advsm)
-{
-#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV)
-    if (ble_ll_hci_adv_mode_ext()) {
-        return advsm->flags & BLE_LL_ADV_SM_FLAG_CONFIGURED;
-    }
-#endif
-
-    /* legacy HCI instance is always configured */
-    return true;
-}
-
 /**
  * Set the scan response data that the controller will send.
  *
@@ -2842,13 +2852,8 @@ ble_ll_adv_set_scan_rsp_data(const uint8_t *data, uint8_t datalen,
     struct ble_ll_adv_sm *advsm;
     bool new_data;
 
-    if (instance >= BLE_ADV_INSTANCES) {
-        return BLE_ERR_INV_HCI_CMD_PARMS;
-    }
-
-    advsm = &g_ble_ll_adv_sm[instance];
-
-    if (!instance_configured(advsm)) {
+    advsm = ble_ll_adv_sm_find_configured(instance);
+    if (!advsm) {
         return BLE_ERR_UNK_ADV_INDENT;
     }
 
@@ -2968,13 +2973,8 @@ ble_ll_adv_set_adv_data(const uint8_t *data, uint8_t datalen, uint8_t instance,
     struct ble_ll_adv_sm *advsm;
     bool new_data;
 
-    if (instance >= BLE_ADV_INSTANCES) {
-        return BLE_ERR_INV_HCI_CMD_PARMS;
-    }
-
-    advsm = &g_ble_ll_adv_sm[instance];
-
-    if (!instance_configured(advsm)) {
+    advsm = ble_ll_adv_sm_find_configured(instance);
+    if (!advsm) {
         return BLE_ERR_UNK_ADV_INDENT;
     }
 
@@ -3132,6 +3132,32 @@ sec_phy_valid(uint8_t phy)
     }
 }
 
+static struct ble_ll_adv_sm *
+ble_ll_adv_sm_get(uint8_t instance)
+{
+    struct ble_ll_adv_sm *advsm;
+    int i;
+
+    advsm = ble_ll_adv_sm_find_configured(instance);
+    if (advsm) {
+        return advsm;
+    }
+
+    for (i = 0; i < ARRAY_SIZE(g_ble_ll_adv_sm); i++) {
+        advsm = &g_ble_ll_adv_sm[i];
+
+        if (!(advsm->flags & BLE_LL_ADV_SM_FLAG_CONFIGURED)) {
+            ble_ll_adv_sm_init(advsm);
+
+           /* configured flag is set by caller on success config */
+           advsm->adv_instance = instance;
+           return advsm;
+        }
+    }
+
+    return NULL;
+}
+
 int
 ble_ll_adv_ext_set_param(const uint8_t *cmdbuf, uint8_t len,
                          uint8_t *rspbuf, uint8_t *rsplen)
@@ -3149,12 +3175,12 @@ ble_ll_adv_ext_set_param(const uint8_t *cmdbuf, uint8_t len,
         goto done;
     }
 
-    if (cmd->adv_handle >= BLE_ADV_INSTANCES) {
-        rc = BLE_ERR_INV_HCI_CMD_PARMS;
+    advsm = ble_ll_adv_sm_get(cmd->adv_handle);
+    if (!advsm) {
+        rc = BLE_ERR_MEM_CAPACITY;
         goto done;
     }
 
-    advsm = &g_ble_ll_adv_sm[cmd->adv_handle];
     if (advsm->adv_enabled) {
         rc = BLE_ERR_CMD_DISALLOWED;
         goto done;
@@ -3453,10 +3479,6 @@ ble_ll_adv_ext_set_enable(const uint8_t *cmdbuf, uint8_t len)
 
     /* validate instances */
     for (i = 0; i < cmd->num_sets; i++) {
-        if (cmd->sets[i].adv_handle >= BLE_ADV_INSTANCES) {
-            return BLE_ERR_INV_HCI_CMD_PARMS;
-        }
-
         /* validate duplicated sets */
         for (j = i + 1; j < cmd->num_sets; j++) {
             if (cmd->sets[i].adv_handle == cmd->sets[j].adv_handle) {
@@ -3464,9 +3486,8 @@ ble_ll_adv_ext_set_enable(const uint8_t *cmdbuf, uint8_t len)
             }
         }
 
-        advsm = &g_ble_ll_adv_sm[cmd->sets[i].adv_handle];
-
-        if (!instance_configured(advsm)) {
+        advsm = ble_ll_adv_sm_find_configured(cmd->sets[i].adv_handle);
+        if (!advsm) {
             return BLE_ERR_UNK_ADV_INDENT;
         }
 
@@ -3497,12 +3518,11 @@ ble_ll_adv_set_random_addr(const uint8_t *addr, uint8_t instance)
 {
     struct ble_ll_adv_sm *advsm;
 
-    if (instance >= BLE_ADV_INSTANCES) {
-        return BLE_ERR_INV_HCI_CMD_PARMS;
+    advsm = ble_ll_adv_sm_find_configured(instance);
+    if (!advsm) {
+        return BLE_ERR_UNK_ADV_INDENT;
     }
 
-    advsm = &g_ble_ll_adv_sm[instance];
-
     /*
      * Reject if connectable advertising is on
      * Core Spec Vol. 2 Part E 7.8.52
@@ -3543,17 +3563,8 @@ ble_ll_adv_remove(const uint8_t *cmdbuf, uint8_t len)
         return BLE_ERR_INV_HCI_CMD_PARMS;
     }
 
-    /* TODO
-     * Should we allow any value for instance ID?
-     */
-
-    if (cmd->adv_handle >= BLE_ADV_INSTANCES) {
-        return BLE_ERR_INV_HCI_CMD_PARMS;
-    }
-
-    advsm = &g_ble_ll_adv_sm[cmd->adv_handle];
-
-    if (!instance_configured(advsm)) {
+    advsm = ble_ll_adv_sm_find_configured(cmd->adv_handle);
+    if (!advsm) {
         return BLE_ERR_UNK_ADV_INDENT;
     }
 
@@ -3627,12 +3638,8 @@ ble_ll_adv_periodic_set_param(const uint8_t *cmdbuf, uint8_t len)
     adv_itvl_max = le16toh(cmd->max_itvl);
     props = le16toh(cmd->props);
 
-    if (cmd->adv_handle >= BLE_ADV_INSTANCES) {
-        return BLE_ERR_INV_HCI_CMD_PARMS;
-    }
-
-    advsm = &g_ble_ll_adv_sm[cmd->adv_handle];
-    if (!(advsm->flags & BLE_LL_ADV_SM_FLAG_CONFIGURED)) {
+    advsm = ble_ll_adv_sm_find_configured(cmd->adv_handle);
+    if (!advsm) {
         return BLE_ERR_UNK_ADV_INDENT;
     }
 
@@ -3694,12 +3701,8 @@ ble_ll_adv_periodic_set_data(const uint8_t *cmdbuf, uint8_t len)
         return BLE_ERR_INV_HCI_CMD_PARMS;
     }
 
-    if (cmd->adv_handle >= BLE_ADV_INSTANCES) {
-        return BLE_ERR_INV_HCI_CMD_PARMS;
-    }
-
-    advsm = &g_ble_ll_adv_sm[cmd->adv_handle];
-    if (!(advsm->flags & BLE_LL_ADV_SM_FLAG_CONFIGURED)) {
+    advsm = ble_ll_adv_sm_find_configured(cmd->adv_handle);
+    if (!advsm) {
         return BLE_ERR_UNK_ADV_INDENT;
     }
 
@@ -3787,12 +3790,8 @@ ble_ll_adv_periodic_enable(const uint8_t *cmdbuf, uint8_t len)
         return BLE_ERR_INV_HCI_CMD_PARMS;
     }
 
-    if (cmd->adv_handle >= BLE_ADV_INSTANCES) {
-        return BLE_ERR_INV_HCI_CMD_PARMS;
-    }
-
-    advsm = &g_ble_ll_adv_sm[cmd->adv_handle];
-    if (!(advsm->flags & BLE_LL_ADV_SM_FLAG_CONFIGURED)) {
+    advsm = ble_ll_adv_sm_find_configured(cmd->adv_handle);
+    if (!advsm) {
         return BLE_ERR_UNK_ADV_INDENT;
     }
 
@@ -3886,13 +3885,8 @@ ble_ll_adv_periodic_set_info_transfer(const uint8_t *cmdbuf, uint8_t len,
          goto done;
      }
 
-     if (cmd->adv_handle >= BLE_ADV_INSTANCES) {
-         rc = BLE_ERR_INV_HCI_CMD_PARMS;
-         goto done;
-     }
-
-     advsm = &g_ble_ll_adv_sm[cmd->adv_handle];
-     if (!(advsm->flags & BLE_LL_ADV_SM_FLAG_CONFIGURED)) {
+     advsm = ble_ll_adv_sm_find_configured(cmd->adv_handle);
+     if (!advsm) {
          rc = BLE_ERR_UNK_ADV_INDENT;
          goto done;
      }
@@ -4915,11 +4909,8 @@ ble_ll_adv_enabled(void)
 static void
 ble_ll_adv_sm_init(struct ble_ll_adv_sm *advsm)
 {
-    uint8_t i = advsm->adv_instance;
-
     memset(advsm, 0, sizeof(struct ble_ll_adv_sm));
 
-    advsm->adv_instance = i;
     advsm->adv_itvl_min = BLE_HCI_ADV_ITVL_DEF;
     advsm->adv_itvl_max = BLE_HCI_ADV_ITVL_DEF;
     advsm->adv_chanmask = BLE_HCI_ADV_CHANMASK_DEF;
@@ -4972,7 +4963,6 @@ ble_ll_adv_init(void)
 
     /* Set default advertising parameters */
     for (i = 0; i < BLE_ADV_INSTANCES; ++i) {
-        g_ble_ll_adv_sm[i].adv_instance = i;
         ble_ll_adv_sm_init(&g_ble_ll_adv_sm[i]);
     }
 }