From 6284f5c22c6747dfbaaf0f6f49426b6f9a68e293 Mon Sep 17 00:00:00 2001 From: Szymon Janc Date: Wed, 5 Jul 2017 11:15:06 +0200 Subject: [PATCH] nimble/controller: Allow to use larger advertising data Extended advertising supports to use up to 1650 bytes of advertising data or scan response data in single PDU. This patch allows to configure it. Currently this is limited to 238 bytes as chaining (fragmentation) support is not present yet. X-Original-Commit: 4cb230ac5c9771a7d9a1dd5ad202bcaea6a56384 --- .../controller/include/controller/ble_ll_adv.h | 10 ++++++++-- .../include/controller/ble_ll_scan.h | 7 ++++--- nimble/controller/src/ble_ll_adv.c | 18 +++++++++--------- nimble/controller/src/ble_ll_scan.c | 2 +- nimble/syscfg.yml | 6 ++++++ 5 files changed, 28 insertions(+), 15 deletions(-) diff --git a/nimble/controller/include/controller/ble_ll_adv.h b/nimble/controller/include/controller/ble_ll_adv.h index 259006a7a..fc7dd5074 100644 --- a/nimble/controller/include/controller/ble_ll_adv.h +++ b/nimble/controller/include/controller/ble_ll_adv.h @@ -52,8 +52,14 @@ extern "C" { #define BLE_LL_ADV_STATE_HD_MAX (1280) /* msecs */ /* Maximum advertisement data length */ -#define BLE_ADV_DATA_MAX_LEN (31) -#define BLE_ADV_MAX_PKT_LEN (37) +#define BLE_ADV_LEGACY_DATA_MAX_LEN (31) +#define BLE_ADV_LEGACY_MAX_PKT_LEN (37) + +#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) +#define BLE_ADV_DATA_MAX_LEN MYNEWT_VAL(BLE_EXT_ADV_MAX_SIZE) +#else +#define BLE_ADV_DATA_MAX_LEN BLE_ADV_LEGACY_DATA_MAX_LEN +#endif /* * ADV_IND diff --git a/nimble/controller/include/controller/ble_ll_scan.h b/nimble/controller/include/controller/ble_ll_scan.h index aee946502..1417c2690 100644 --- a/nimble/controller/include/controller/ble_ll_scan.h +++ b/nimble/controller/include/controller/ble_ll_scan.h @@ -52,16 +52,17 @@ extern "C" { * Sent by the LL in the advertising state; received by the LL in the * scanning state. */ -#define BLE_SCAN_RSP_DATA_MAX_LEN (31) -#define BLE_SCAN_MAX_PKT_LEN (37) +#define BLE_SCAN_RSP_LEGACY_DATA_MAX_LEN (31) +#define BLE_SCAN_LEGACY_MAX_PKT_LEN (37) #if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) -#define BLE_EXT_SCAN_MAX_PKT_LEN (256) +#define BLE_SCAN_RSP_DATA_MAX_LEN MYNEWT_VAL(BLE_EXT_ADV_MAX_SIZE) /* For Bluetooth 5.0 we need state machine for two PHYs*/ #define BLE_LL_SCAN_PHY_NUMBER (2) #else #define BLE_LL_SCAN_PHY_NUMBER (1) +#define BLE_SCAN_RSP_DATA_MAX_LEN BLE_SCAN_RSP_LEGACY_DATA_MAX_LEN #endif #define PHY_UNCODED (0) diff --git a/nimble/controller/src/ble_ll_adv.c b/nimble/controller/src/ble_ll_adv.c index 506e0ea74..7c47da98d 100644 --- a/nimble/controller/src/ble_ll_adv.c +++ b/nimble/controller/src/ble_ll_adv.c @@ -278,7 +278,7 @@ ble_ll_adv_legacy_pdu_make(struct ble_ll_adv_sm *advsm, struct os_mbuf *m) } /* An invalid advertising data length indicates a memory overwrite */ - assert(adv_data_len <= BLE_ADV_DATA_MAX_LEN); + assert(adv_data_len <= BLE_ADV_LEGACY_DATA_MAX_LEN); /* Set the PDU length in the state machine (includes header) */ advsm->adv_pdu_len = pdulen + BLE_LL_PDU_HDR_LEN; @@ -522,7 +522,7 @@ ble_ll_adv_scan_rsp_legacy_pdu_make(struct ble_ll_adv_sm *advsm) struct os_mbuf *m; /* Obtain scan response buffer */ - m = os_msys_get_pkthdr(BLE_SCAN_RSP_DATA_MAX_LEN + BLE_DEV_ADDR_LEN, + m = os_msys_get_pkthdr(BLE_SCAN_RSP_LEGACY_DATA_MAX_LEN + BLE_DEV_ADDR_LEN, sizeof(struct ble_mbuf_hdr)); if (!m) { return NULL; @@ -530,7 +530,7 @@ ble_ll_adv_scan_rsp_legacy_pdu_make(struct ble_ll_adv_sm *advsm) /* Make sure that the length is valid */ scan_rsp_len = advsm->scan_rsp_len; - assert(scan_rsp_len <= BLE_SCAN_RSP_DATA_MAX_LEN); + assert(scan_rsp_len <= BLE_SCAN_RSP_LEGACY_DATA_MAX_LEN); /* Set BLE transmit header */ pdulen = BLE_DEV_ADDR_LEN + scan_rsp_len; @@ -808,7 +808,7 @@ ble_ll_adv_tx_start_cb(struct ble_ll_sched_item *sch) } /* Get an advertising mbuf (packet header) */ - adv_pdu = os_msys_get_pkthdr(BLE_ADV_MAX_PKT_LEN, + adv_pdu = os_msys_get_pkthdr(BLE_ADV_LEGACY_MAX_PKT_LEN, sizeof(struct ble_mbuf_hdr)); if (!adv_pdu) { ble_phy_disable(); @@ -957,7 +957,7 @@ ble_ll_adv_secondary_tx_start_cb(struct ble_ll_sched_item *sch) } /* Get an advertising mbuf (packet header) */ - adv_pdu = os_msys_get_pkthdr(BLE_ADV_MAX_PKT_LEN, + adv_pdu = os_msys_get_pkthdr(BLE_ADV_LEGACY_MAX_PKT_LEN, sizeof(struct ble_mbuf_hdr)); if (!adv_pdu) { ble_phy_disable(); @@ -1502,7 +1502,7 @@ ble_ll_adv_set_scan_rsp_data(uint8_t *cmd, uint8_t instance, uint8_t operation) switch (operation) { case BLE_HCI_LE_SET_EXT_SCAN_RSP_DATA_OPER_COMPLETE: if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY) { - if (datalen > BLE_ADV_DATA_MAX_LEN) { + if (datalen > BLE_SCAN_RSP_LEGACY_DATA_MAX_LEN) { return BLE_ERR_INV_HCI_CMD_PARMS; } } @@ -1601,7 +1601,7 @@ ble_ll_adv_set_adv_data(uint8_t *cmd, uint8_t instance, uint8_t operation) switch (operation) { case BLE_HCI_LE_SET_EXT_ADV_DATA_OPER_COMPLETE: if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY) { - if (datalen > BLE_ADV_DATA_MAX_LEN) { + if (datalen > BLE_ADV_LEGACY_DATA_MAX_LEN) { return BLE_ERR_INV_HCI_CMD_PARMS; } } @@ -1713,8 +1713,8 @@ ble_ll_adv_ext_set_param(uint8_t *cmdbuf, uint8_t *rspbuf, uint8_t *rsplen) } if (props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY) { - if (advsm->adv_len > BLE_ADV_DATA_MAX_LEN || - advsm->scan_rsp_len > BLE_SCAN_RSP_DATA_MAX_LEN) { + if (advsm->adv_len > BLE_ADV_LEGACY_DATA_MAX_LEN || + advsm->scan_rsp_len > BLE_SCAN_RSP_LEGACY_DATA_MAX_LEN) { return BLE_ERR_INV_HCI_CMD_PARMS; } diff --git a/nimble/controller/src/ble_ll_scan.c b/nimble/controller/src/ble_ll_scan.c index dbdb34df2..a88d17c04 100644 --- a/nimble/controller/src/ble_ll_scan.c +++ b/nimble/controller/src/ble_ll_scan.c @@ -2732,7 +2732,7 @@ ble_ll_scan_init(void) os_cputime_timer_init(&scansm->scan_timer, ble_ll_scan_timer_cb, scansm); /* Get a scan request mbuf (packet header) and attach to state machine */ - scansm->scan_req_pdu = os_msys_get_pkthdr(BLE_SCAN_MAX_PKT_LEN, + scansm->scan_req_pdu = os_msys_get_pkthdr(BLE_SCAN_LEGACY_MAX_PKT_LEN, sizeof(struct ble_mbuf_hdr)); assert(scansm->scan_req_pdu != NULL); diff --git a/nimble/syscfg.yml b/nimble/syscfg.yml index 4d379571b..53d5898c3 100644 --- a/nimble/syscfg.yml +++ b/nimble/syscfg.yml @@ -52,3 +52,9 @@ syscfg.defs: description: > This enables extended advertising feature. value: 0 + BLE_EXT_ADV_MAX_SIZE: + description: > + This allows to configure maximum size of advertising data and + scan response data used in LE Advertising Extensions. + Valid range 31-238. + value: 31