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