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 bc1f354ea nimble/host: Wrap extended advertising with legacy API
bc1f354ea is described below

commit bc1f354ea4c646be5035b9ebdec11b7306c42c18
Author: Szymon Janc <szymon.j...@codecoup.pl>
AuthorDate: Fri Apr 5 14:36:17 2024 +0200

    nimble/host: Wrap extended advertising with legacy API
    
    This allows to use extended advertising along legacy GAP API. This
    will make it easier for applications to port to using EXT ADV.
---
 nimble/host/src/ble_gap.c                          | 138 +++++++++++++++++++--
 nimble/host/syscfg.yml                             |   7 ++
 porting/examples/linux/include/syscfg/syscfg.h     |   4 +
 .../examples/linux_blemesh/include/syscfg/syscfg.h |   6 +-
 porting/examples/nuttx/include/syscfg/syscfg.h     |   4 +
 porting/nimble/include/syscfg/syscfg.h             |   4 +
 porting/npl/riot/include/syscfg/syscfg.h           |   7 +-
 7 files changed, 161 insertions(+), 9 deletions(-)

diff --git a/nimble/host/src/ble_gap.c b/nimble/host/src/ble_gap.c
index b935eface..b264efd5c 100644
--- a/nimble/host/src/ble_gap.c
+++ b/nimble/host/src/ble_gap.c
@@ -2514,7 +2514,17 @@ done:
 int
 ble_gap_adv_stop(void)
 {
-#if NIMBLE_BLE_ADVERTISE && !MYNEWT_VAL(BLE_EXT_ADV)
+#if NIMBLE_BLE_ADVERTISE
+#if MYNEWT_VAL(BLE_EXT_ADV)
+    int rc;
+
+    rc = ble_gap_ext_adv_stop(MYNEWT_VAL(BLE_HS_EXT_ADV_LEGACY_INSTANCE));
+    if (rc) {
+        return rc;
+    }
+
+    return ble_gap_ext_adv_remove(MYNEWT_VAL(BLE_HS_EXT_ADV_LEGACY_INSTANCE));
+#else
     int rc;
 
     if (!ble_hs_is_enabled()) {
@@ -2526,6 +2536,7 @@ ble_gap_adv_stop(void)
     ble_hs_unlock();
 
     return rc;
+#endif
 #else
     return BLE_HS_ENOTSUP;
 #endif
@@ -2712,7 +2723,73 @@ ble_gap_adv_start(uint8_t own_addr_type, const 
ble_addr_t *direct_addr,
                   const struct ble_gap_adv_params *adv_params,
                   ble_gap_event_fn *cb, void *cb_arg)
 {
-#if NIMBLE_BLE_ADVERTISE && !MYNEWT_VAL(BLE_EXT_ADV)
+#if NIMBLE_BLE_ADVERTISE
+#if MYNEWT_VAL(BLE_EXT_ADV)
+    struct ble_gap_ext_adv_params ext_params;
+    int duration;
+    int rc;
+
+    STATS_INC(ble_gap_stats, adv_start);
+
+    if (!ble_hs_is_enabled()) {
+        return BLE_HS_EDISABLED;
+    }
+
+    memset(&ext_params, 0, sizeof(ext_params));
+
+    ext_params.own_addr_type = own_addr_type;
+    ext_params.primary_phy = BLE_HCI_LE_PHY_1M;
+    ext_params.secondary_phy = BLE_HCI_LE_PHY_1M;
+    ext_params.tx_power = 127;
+    ext_params.sid = 0;
+    ext_params.legacy_pdu = 1;
+
+    switch (adv_params->conn_mode) {
+    case BLE_GAP_CONN_MODE_NON:
+        if (adv_params->disc_mode != BLE_GAP_DISC_MODE_NON) {
+            ext_params.scannable = 1;
+        }
+        break;
+    case BLE_GAP_CONN_MODE_DIR:
+        if (!direct_addr) {
+            return BLE_HS_EINVAL;
+        }
+
+        ext_params.peer = *direct_addr;
+        ext_params.directed = 1;
+        if (adv_params->high_duty_cycle) {
+            ext_params.high_duty_directed = 1;
+        }
+        break;
+    case BLE_GAP_CONN_MODE_UND:
+        ext_params.connectable = 1;
+        ext_params.scannable = 1;
+        break;
+    default:
+        return BLE_HS_EINVAL;
+    }
+
+    ext_params.itvl_min = adv_params->itvl_min;
+    ext_params.itvl_max = adv_params->itvl_max;
+    ext_params.channel_map = adv_params->channel_map;
+    ext_params.filter_policy = adv_params->filter_policy;
+    ext_params.high_duty_directed = adv_params->high_duty_cycle;
+
+    /* configure instance 0 */
+    rc = ble_gap_ext_adv_configure(MYNEWT_VAL(BLE_HS_EXT_ADV_LEGACY_INSTANCE),
+                                   &ext_params, NULL, cb, cb_arg);
+    if (rc) {
+        return rc;
+    }
+
+    if (duration_ms == BLE_HS_FOREVER) {
+        duration = 0;
+    } else {
+        duration = duration_ms / 10;
+    }
+
+    return ble_gap_ext_adv_start(MYNEWT_VAL(BLE_HS_EXT_ADV_LEGACY_INSTANCE), 
duration, 0);
+#else
     uint32_t duration_ticks;
     int rc;
 
@@ -2788,6 +2865,7 @@ done:
         STATS_INC(ble_gap_stats, adv_start_fail);
     }
     return rc;
+#endif
 #else
     return BLE_HS_ENOTSUP;
 #endif
@@ -2796,7 +2874,29 @@ done:
 int
 ble_gap_adv_set_data(const uint8_t *data, int data_len)
 {
-#if NIMBLE_BLE_ADVERTISE && !MYNEWT_VAL(BLE_EXT_ADV)
+#if NIMBLE_BLE_ADVERTISE
+#if MYNEWT_VAL(BLE_EXT_ADV)
+    struct os_mbuf *mbuf;
+    int rc;
+
+    if (((data == NULL) && (data_len != 0)) ||
+        (data_len > BLE_HCI_MAX_ADV_DATA_LEN)) {
+        return BLE_HS_EINVAL;
+    }
+
+    mbuf = os_msys_get_pkthdr(data_len, 0);
+    if (!mbuf) {
+        return BLE_HS_ENOMEM;
+    }
+
+    rc = os_mbuf_append(mbuf, data, data_len);
+    if (rc) {
+        os_mbuf_free_chain(mbuf);
+        return BLE_HS_ENOMEM;
+    }
+
+    return 
ble_gap_ext_adv_set_data(MYNEWT_VAL(BLE_HS_EXT_ADV_LEGACY_INSTANCE), mbuf);
+#else
     struct ble_hci_le_set_adv_data_cp cmd;
     uint16_t opcode;
 
@@ -2818,6 +2918,7 @@ ble_gap_adv_set_data(const uint8_t *data, int data_len)
     opcode = BLE_HCI_OP(BLE_HCI_OGF_LE, BLE_HCI_OCF_LE_SET_ADV_DATA);
 
     return ble_hs_hci_cmd_tx(opcode, &cmd, sizeof(cmd), NULL, 0);
+#endif
 #else
     return BLE_HS_ENOTSUP;
 #endif
@@ -2826,7 +2927,29 @@ ble_gap_adv_set_data(const uint8_t *data, int data_len)
 int
 ble_gap_adv_rsp_set_data(const uint8_t *data, int data_len)
 {
-#if NIMBLE_BLE_ADVERTISE && !MYNEWT_VAL(BLE_EXT_ADV)
+#if NIMBLE_BLE_ADVERTISE
+#if MYNEWT_VAL(BLE_EXT_ADV)
+    struct os_mbuf *mbuf;
+    int rc;
+
+    if (((data == NULL) && (data_len != 0)) ||
+        (data_len > BLE_HCI_MAX_ADV_DATA_LEN)) {
+        return BLE_HS_EINVAL;
+    }
+
+    mbuf = os_msys_get_pkthdr(data_len, 0);
+    if (!mbuf) {
+        return BLE_HS_ENOMEM;
+    }
+
+    rc = os_mbuf_append(mbuf, data, data_len);
+    if (rc) {
+        os_mbuf_free_chain(mbuf);
+        return BLE_HS_ENOMEM;
+    }
+
+    return 
ble_gap_ext_adv_rsp_set_data(MYNEWT_VAL(BLE_HS_EXT_ADV_LEGACY_INSTANCE), mbuf);
+#else
     struct ble_hci_le_set_scan_rsp_data_cp cmd;
     uint16_t opcode;
 
@@ -2846,6 +2969,7 @@ ble_gap_adv_rsp_set_data(const uint8_t *data, int 
data_len)
     opcode = BLE_HCI_OP(BLE_HCI_OGF_LE, BLE_HCI_OCF_LE_SET_SCAN_RSP_DATA);
 
     return ble_hs_hci_cmd_tx(opcode, &cmd, sizeof(cmd), NULL, 0);
+#endif
 #else
     return BLE_HS_ENOTSUP;
 #endif
@@ -2854,7 +2978,7 @@ ble_gap_adv_rsp_set_data(const uint8_t *data, int 
data_len)
 int
 ble_gap_adv_set_fields(const struct ble_hs_adv_fields *adv_fields)
 {
-#if NIMBLE_BLE_ADVERTISE && !MYNEWT_VAL(BLE_EXT_ADV)
+#if NIMBLE_BLE_ADVERTISE
     uint8_t buf[BLE_HS_ADV_MAX_SZ];
     uint8_t buf_sz;
     int rc;
@@ -2882,7 +3006,7 @@ ble_gap_adv_set_fields(const struct ble_hs_adv_fields 
*adv_fields)
 int
 ble_gap_adv_rsp_set_fields(const struct ble_hs_adv_fields *rsp_fields)
 {
-#if NIMBLE_BLE_ADVERTISE && !MYNEWT_VAL(BLE_EXT_ADV)
+#if NIMBLE_BLE_ADVERTISE
     uint8_t buf[BLE_HS_ADV_MAX_SZ];
     uint8_t buf_sz;
     int rc;
@@ -2907,7 +3031,7 @@ int
 ble_gap_adv_active(void)
 {
 #if NIMBLE_BLE_ADVERTISE
-    return ble_gap_adv_active_instance(0);
+    return 
ble_gap_adv_active_instance(MYNEWT_VAL(BLE_HS_EXT_ADV_LEGACY_INSTANCE));
 #else
     return 0;
 #endif
diff --git a/nimble/host/syscfg.yml b/nimble/host/syscfg.yml
index 69db7dfd3..93dbcd2ed 100644
--- a/nimble/host/syscfg.yml
+++ b/nimble/host/syscfg.yml
@@ -27,6 +27,13 @@ syscfg.defs:
                 initialization.
         value: 1
 
+    BLE_HS_EXT_ADV_LEGACY_INSTANCE:
+        description: >
+            Advertising instance that is used when extended advertising
+            support is enabled but legacy GAP API is used.
+        range: 0..BLE_MULTI_ADV_INSTANCES
+        value: 0
+
     # Debug settings.
     BLE_HS_DEBUG:
         description: 'Enables extra runtime assertions.'
diff --git a/porting/examples/linux/include/syscfg/syscfg.h 
b/porting/examples/linux/include/syscfg/syscfg.h
index c7230e416..3c62cc3ca 100644
--- a/porting/examples/linux/include/syscfg/syscfg.h
+++ b/porting/examples/linux/include/syscfg/syscfg.h
@@ -728,6 +728,10 @@
 #define MYNEWT_VAL_BLE_HS_DEBUG (0)
 #endif
 
+#ifndef MYNEWT_VAL_BLE_HS_EXT_ADV_LEGACY_INSTANCE
+#define MYNEWT_VAL_BLE_HS_EXT_ADV_LEGACY_INSTANCE (0)
+#endif
+
 #ifndef MYNEWT_VAL_BLE_HS_FLOW_CTRL
 #define MYNEWT_VAL_BLE_HS_FLOW_CTRL (0)
 #endif
diff --git a/porting/examples/linux_blemesh/include/syscfg/syscfg.h 
b/porting/examples/linux_blemesh/include/syscfg/syscfg.h
index ee1db3c94..e16ecb5b1 100644
--- a/porting/examples/linux_blemesh/include/syscfg/syscfg.h
+++ b/porting/examples/linux_blemesh/include/syscfg/syscfg.h
@@ -729,6 +729,10 @@
 #define MYNEWT_VAL_BLE_HS_DEBUG (0)
 #endif
 
+#ifndef MYNEWT_VAL_BLE_HS_EXT_ADV_LEGACY_INSTANCE
+#define MYNEWT_VAL_BLE_HS_EXT_ADV_LEGACY_INSTANCE (0)
+#endif
+
 #ifndef MYNEWT_VAL_BLE_HS_FLOW_CTRL
 #define MYNEWT_VAL_BLE_HS_FLOW_CTRL (0)
 #endif
@@ -1329,7 +1333,7 @@
 
 /* Overridden by @apache-mynewt-nimble/nimble/host/mesh (defined by 
@apache-mynewt-nimble/nimble/host/mesh) */
 #ifndef MYNEWT_VAL_BLE_MESH_PROXY_MSG_LEN
-#define MYNEWT_VAL_BLE_MESH_PROXY_MSG_LEN (66)
+#define MYNEWT_VAL_BLE_MESH_PROXY_MSG_LEN (33)
 #endif
 
 #ifndef MYNEWT_VAL_BLE_MESH_PROXY_USE_DEVICE_NAME
diff --git a/porting/examples/nuttx/include/syscfg/syscfg.h 
b/porting/examples/nuttx/include/syscfg/syscfg.h
index 48a830a60..4740c348c 100644
--- a/porting/examples/nuttx/include/syscfg/syscfg.h
+++ b/porting/examples/nuttx/include/syscfg/syscfg.h
@@ -728,6 +728,10 @@
 #define MYNEWT_VAL_BLE_HS_DEBUG (0)
 #endif
 
+#ifndef MYNEWT_VAL_BLE_HS_EXT_ADV_LEGACY_INSTANCE
+#define MYNEWT_VAL_BLE_HS_EXT_ADV_LEGACY_INSTANCE (0)
+#endif
+
 #ifndef MYNEWT_VAL_BLE_HS_FLOW_CTRL
 #define MYNEWT_VAL_BLE_HS_FLOW_CTRL (0)
 #endif
diff --git a/porting/nimble/include/syscfg/syscfg.h 
b/porting/nimble/include/syscfg/syscfg.h
index 37fe32dd8..766a5e46e 100644
--- a/porting/nimble/include/syscfg/syscfg.h
+++ b/porting/nimble/include/syscfg/syscfg.h
@@ -727,6 +727,10 @@
 #define MYNEWT_VAL_BLE_HS_DEBUG (0)
 #endif
 
+#ifndef MYNEWT_VAL_BLE_HS_EXT_ADV_LEGACY_INSTANCE
+#define MYNEWT_VAL_BLE_HS_EXT_ADV_LEGACY_INSTANCE (0)
+#endif
+
 #ifndef MYNEWT_VAL_BLE_HS_FLOW_CTRL
 #define MYNEWT_VAL_BLE_HS_FLOW_CTRL (0)
 #endif
diff --git a/porting/npl/riot/include/syscfg/syscfg.h 
b/porting/npl/riot/include/syscfg/syscfg.h
index 236e8cfe4..d07ca8a17 100644
--- a/porting/npl/riot/include/syscfg/syscfg.h
+++ b/porting/npl/riot/include/syscfg/syscfg.h
@@ -84,8 +84,9 @@
 #define MYNEWT_VAL_CRYPTO (0)
 #endif
 
+/* Overridden by @apache-mynewt-core/hw/bsp/nordic_pca10056 (defined by 
@apache-mynewt-core/hw/mcu/nordic/nrf52xxx) */
 #ifndef MYNEWT_VAL_GPIO_AS_PIN_RESET
-#define MYNEWT_VAL_GPIO_AS_PIN_RESET (0)
+#define MYNEWT_VAL_GPIO_AS_PIN_RESET (1)
 #endif
 
 #ifndef MYNEWT_VAL_I2C_0
@@ -1643,6 +1644,10 @@
 #define MYNEWT_VAL_BLE_HS_DEBUG (0)
 #endif
 
+#ifndef MYNEWT_VAL_BLE_HS_EXT_ADV_LEGACY_INSTANCE
+#define MYNEWT_VAL_BLE_HS_EXT_ADV_LEGACY_INSTANCE (0)
+#endif
+
 #ifndef MYNEWT_VAL_BLE_HS_FLOW_CTRL
 #define MYNEWT_VAL_BLE_HS_FLOW_CTRL (0)
 #endif

Reply via email to