You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by ja...@apache.org on 2020/01/27 19:16:30 UTC
[mynewt-nimble] 03/04: nimble/ll: Make flags in Extended Header
optional
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
commit e390de8676f0a0e14b904303e2ddc294a9c9a492
Author: Szymon Janc <sz...@codecoup.pl>
AuthorDate: Fri Jan 24 10:51:58 2020 +0100
nimble/ll: Make flags in Extended Header optional
If no flags are specified there is no need to put flags into extended
header. This was affecting LL/DDI/ADV/BV-61-C qualification test case.
---
nimble/controller/src/ble_ll_adv.c | 52 +++++++++++++++++++++++++++++++++-----
1 file changed, 46 insertions(+), 6 deletions(-)
diff --git a/nimble/controller/src/ble_ll_adv.c b/nimble/controller/src/ble_ll_adv.c
index 9bfb3fb..77c66ff 100644
--- a/nimble/controller/src/ble_ll_adv.c
+++ b/nimble/controller/src/ble_ll_adv.c
@@ -703,8 +703,11 @@ ble_ll_adv_aux_pdu_make(uint8_t *dptr, void *pducb_arg, uint8_t *hdr_byte)
dptr[0] = (adv_mode << 6) | ext_hdr_len;
dptr += 1;
- dptr[0] = aux->ext_hdr;
- dptr += 1;
+ /* only put flags if needed */
+ if (aux->ext_hdr) {
+ dptr[0] = aux->ext_hdr;
+ dptr += 1;
+ }
if (aux->ext_hdr & (1 << BLE_LL_EXT_ADV_ADVA_BIT)) {
@@ -1352,7 +1355,7 @@ ble_ll_adv_aux_calculate(struct ble_ll_adv_sm *advsm,
rem_aux_data_len = AUX_DATA_LEN(advsm) - aux_data_offset;
chainable = !(advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_CONNECTABLE);
- hdr_len = BLE_LL_EXT_ADV_HDR_LEN + BLE_LL_EXT_ADV_FLAGS_SIZE;
+ hdr_len = BLE_LL_EXT_ADV_HDR_LEN;
if (!(advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_SCANNABLE)) {
/* Flags and ADI */
@@ -1404,11 +1407,26 @@ ble_ll_adv_aux_calculate(struct ble_ll_adv_sm *advsm,
}
#endif
+ /* if we have any fields in ext header we need to add flags, note that Aux
+ * PTR is handled later and it will account for flags if needed
+ */
+ if (aux->ext_hdr) {
+ hdr_len += BLE_LL_EXT_ADV_FLAGS_SIZE;
+ }
+
/* AdvData always */
aux->aux_data_len = min(BLE_LL_MAX_PAYLOAD_LEN - hdr_len, rem_aux_data_len);
/* AuxPtr if there are more AdvData remaining that we can fit here */
if (chainable && (rem_aux_data_len > aux->aux_data_len)) {
+ /* adjust for flags that needs to be added if AuxPtr is only field
+ * in Extended Header
+ */
+ if (!aux->ext_hdr) {
+ hdr_len += BLE_LL_EXT_ADV_FLAGS_SIZE;
+ aux->aux_data_len -= BLE_LL_EXT_ADV_FLAGS_SIZE;
+ }
+
aux->ext_hdr |= (1 << BLE_LL_EXT_ADV_AUX_PTR_BIT);
hdr_len += BLE_LL_EXT_ADV_AUX_PTR_SIZE;
aux->aux_data_len -= BLE_LL_EXT_ADV_AUX_PTR_SIZE;
@@ -2013,8 +2031,11 @@ ble_ll_adv_sync_pdu_make(uint8_t *dptr, void *pducb_arg, uint8_t *hdr_byte)
dptr[0] = (adv_mode << 6) | ext_hdr_len;
dptr += 1;
- dptr[0] = sync->ext_hdr;
- dptr += 1;
+ /* only put flags if needed */
+ if (sync->ext_hdr) {
+ dptr[0] = sync->ext_hdr;
+ dptr += 1;
+ }
if (sync->ext_hdr & (1 << BLE_LL_EXT_ADV_AUX_PTR_BIT)) {
if (!SYNC_NEXT(advsm)->sch.enqueued) {
@@ -2184,7 +2205,7 @@ ble_ll_adv_sync_calculate(struct ble_ll_adv_sm *advsm,
rem_sync_data_len = SYNC_DATA_LEN(advsm) - sync_data_offset;
- hdr_len = BLE_LL_EXT_ADV_HDR_LEN + BLE_LL_EXT_ADV_FLAGS_SIZE;
+ hdr_len = BLE_LL_EXT_ADV_HDR_LEN;
/* TxPower if configured
* Note: TxPower shall not be present in chain PDU for SYNC
@@ -2195,11 +2216,30 @@ ble_ll_adv_sync_calculate(struct ble_ll_adv_sm *advsm,
hdr_len += BLE_LL_EXT_ADV_TX_POWER_SIZE;
}
+ /* if we have any fields in ext header we need to add flags, note that Aux
+ * PTR is handled later and it will account for flags if needed
+ *
+ * This could be handled inside TxPower but lets keep code consistent with
+ * how Aux calculate works and this also make it easier to add more fields
+ * into flags if needed in future
+ */
+ if (sync->ext_hdr) {
+ hdr_len += BLE_LL_EXT_ADV_FLAGS_SIZE;
+ }
+
/* AdvData always */
sync->sync_data_len = min(BLE_LL_MAX_PAYLOAD_LEN - hdr_len, rem_sync_data_len);
/* AuxPtr if there are more AdvData remaining that we can fit here */
if ((rem_sync_data_len > sync->sync_data_len)) {
+ /* adjust for flags that needs to be added if AuxPtr is only field
+ * in Extended Header
+ */
+ if (!sync->ext_hdr) {
+ hdr_len += BLE_LL_EXT_ADV_FLAGS_SIZE;
+ sync->sync_data_len -= BLE_LL_EXT_ADV_FLAGS_SIZE;
+ }
+
sync->ext_hdr |= (1 << BLE_LL_EXT_ADV_AUX_PTR_BIT);
hdr_len += BLE_LL_EXT_ADV_AUX_PTR_SIZE;
sync->sync_data_len -= BLE_LL_EXT_ADV_AUX_PTR_SIZE;