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.
diff --git a/nimble/host/src/ble_gap.c b/nimble/host/src/ble_gap.c
index b935efa..b264efd 100644
--- a/nimble/host/src/ble_gap.c
+++ b/nimble/host/src/ble_gap.c
@@ -2514,7 +2514,17 @@
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_hs_unlock();
return rc;
+#endif
#else
return BLE_HS_ENOTSUP;
#endif
@@ -2712,7 +2723,73 @@
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 @@
STATS_INC(ble_gap_stats, adv_start_fail);
}
return rc;
+#endif
#else
return BLE_HS_ENOTSUP;
#endif
@@ -2796,7 +2874,29 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 69db7df..93dbcd2 100644
--- a/nimble/host/syscfg.yml
+++ b/nimble/host/syscfg.yml
@@ -27,6 +27,13 @@
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 c7230e4..3c62cc3 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 ee1db3c..e16ecb5 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 48a830a..4740c34 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 37fe32d..766a5e4 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 236e8cf..d07ca8a 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