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