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
This commit is contained in:
Szymon Janc
2017-07-06 00:15:03 +02:00
parent 2919576d23
commit 6284f5c22c
5 changed files with 28 additions and 15 deletions
@@ -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
@@ -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)
+9 -9
View File
@@ -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;
}
+1 -1
View File
@@ -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);
+6
View File
@@ -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