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.
This commit is contained in:
Szymon Janc
2020-01-27 20:16:16 +01:00
parent 8f4b9b4f1b
commit e390de8676
+46 -6
View File
@@ -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;