Bluetooth: controller: Add ext_hdr member to pdu_adv_com_ext_adv

'ext_hdr' member only covers extended header part of 'ext_hdr_adv_data'
and with addition of 'data' member to 'pdu_adv_ext_hdr' those can be
used to quickly access both extended header flags and data directly
from 'pdu_adv' without need for extra local variables and casts.

Signed-off-by: Andrzej Kaczmarek <andrzej.kaczmarek@codecoup.pl>
This commit is contained in:
Andrzej Kaczmarek 2020-11-09 15:22:49 +01:00 committed by Anas Nashif
commit 99226e1e95
7 changed files with 41 additions and 37 deletions

View file

@ -4519,7 +4519,7 @@ static void le_ext_adv_report(struct pdu_data *pdu_data,
goto no_ext_hdr;
}
ptr += sizeof(*h);
ptr = h->data;
if (h->adv_addr) {
bt_addr_le_t addr;

View file

@ -129,7 +129,7 @@ static int prepare_cb(struct lll_prepare_param *p)
/* Get reference to extended header */
pri_com_hdr = (void *)&pri_pdu->adv_ext_ind;
pri_hdr = (void *)pri_com_hdr->ext_hdr_adv_data;
pri_dptr = (uint8_t *)pri_hdr + sizeof(*pri_hdr);
pri_dptr = pri_hdr->data;
/* traverse through adv_addr, if present */
if (pri_hdr->adv_addr) {
@ -196,8 +196,8 @@ static int prepare_cb(struct lll_prepare_param *p)
/* Copy the address from the adv packet we will send
* into the scan response.
*/
memcpy(&scan_pdu->adv_ext_ind.ext_hdr_adv_data[1],
&sec_pdu->adv_ext_ind.ext_hdr_adv_data[1],
memcpy(&scan_pdu->adv_ext_ind.ext_hdr.data[0],
&sec_pdu->adv_ext_ind.ext_hdr.data[0],
BDADDR_SIZE);
}
#else
@ -421,8 +421,8 @@ static inline int isr_rx_pdu(struct lll_adv_aux *lll_aux,
pdu_adv = lll_adv_data_curr_get(lll);
pdu_aux = lll_adv_aux_data_latest_get(lll_aux, &upd);
/* AdvA is placed at 2nd byte of ext hdr data */
addr = &pdu_aux->adv_ext_ind.ext_hdr_adv_data[1];
/* AdvA is placed at the beginning of extended header data */
addr = pdu_aux->adv_ext_ind.ext_hdr.data;
tx_addr = pdu_aux->tx_addr;
if ((pdu_rx->type == PDU_ADV_TYPE_AUX_SCAN_REQ) &&

View file

@ -213,25 +213,6 @@ struct pdu_adv_connect_ind {
} __packed;
} __packed;
struct pdu_adv_com_ext_adv {
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
uint8_t ext_hdr_len:6;
uint8_t adv_mode:2;
#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
uint8_t adv_mode:2;
uint8_t ext_hdr_len:6;
#else
#error "Unsupported endianness"
#endif
uint8_t ext_hdr_adv_data[254];
} __packed;
enum pdu_adv_mode {
EXT_ADV_MODE_NON_CONN_NON_SCAN = 0x00,
EXT_ADV_MODE_CONN_NON_SCAN = 0x01,
EXT_ADV_MODE_NON_CONN_SCAN = 0x02,
};
struct pdu_adv_ext_hdr {
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
uint8_t adv_addr:1;
@ -254,8 +235,31 @@ struct pdu_adv_ext_hdr {
#else
#error "Unsupported endianness"
#endif
uint8_t data[0];
} __packed;
struct pdu_adv_com_ext_adv {
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
uint8_t ext_hdr_len:6;
uint8_t adv_mode:2;
#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
uint8_t adv_mode:2;
uint8_t ext_hdr_len:6;
#else
#error "Unsupported endianness"
#endif
union {
struct pdu_adv_ext_hdr ext_hdr;
uint8_t ext_hdr_adv_data[254];
};
} __packed;
enum pdu_adv_mode {
EXT_ADV_MODE_NON_CONN_NON_SCAN = 0x00,
EXT_ADV_MODE_CONN_NON_SCAN = 0x01,
EXT_ADV_MODE_NON_CONN_SCAN = 0x02,
};
struct pdu_adv_adi {
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
uint16_t did:12;

View file

@ -368,7 +368,7 @@ uint8_t ll_adv_params_set(uint16_t interval, uint8_t adv_type,
pri_com_hdr = (void *)&pdu->adv_ext_ind;
pri_hdr = (void *)pri_com_hdr->ext_hdr_adv_data;
pri_dptr = (uint8_t *)pri_hdr + sizeof(*pri_hdr);
pri_dptr = pri_hdr->data;
pri_dptr_prev = pri_dptr;
/* No ACAD and no AdvData */

View file

@ -273,7 +273,7 @@ uint8_t ll_adv_aux_sr_data_set(uint8_t handle, uint8_t op, uint8_t frag_pref, ui
sr_prev = lll_adv_scan_rsp_peek(lll);
/* AdvA */
memcpy(sr_dptr, &sr_prev->adv_ext_ind.ext_hdr_adv_data[1],
memcpy(sr_dptr, &sr_prev->adv_ext_ind.ext_hdr.data[0],
BDADDR_SIZE);
sr_dptr += BDADDR_SIZE;
@ -459,7 +459,7 @@ uint8_t ull_adv_aux_hdr_set_clear(struct ll_adv_set *adv,
pri_com_hdr_prev = (void *)&pri_pdu_prev->adv_ext_ind;
pri_hdr = (void *)pri_com_hdr_prev->ext_hdr_adv_data;
pri_hdr_prev = *pri_hdr;
pri_dptr_prev = (uint8_t *)pri_hdr + sizeof(*pri_hdr);
pri_dptr_prev = pri_hdr->data;
/* Advertising data are not supported by scannable instances */
if ((sec_hdr_add_fields & ULL_ADV_PDU_HDR_FIELD_AD_DATA) &&
@ -475,7 +475,7 @@ uint8_t ull_adv_aux_hdr_set_clear(struct ll_adv_set *adv,
pri_com_hdr = (void *)&pri_pdu->adv_ext_ind;
pri_com_hdr->adv_mode = pri_com_hdr_prev->adv_mode;
pri_hdr = (void *)pri_com_hdr->ext_hdr_adv_data;
pri_dptr = (uint8_t *)pri_hdr + sizeof(*pri_hdr);
pri_dptr = pri_hdr->data;
*(uint8_t *)pri_hdr = 0U;
/* Get the reference to aux instance */
@ -511,7 +511,7 @@ uint8_t ull_adv_aux_hdr_set_clear(struct ll_adv_set *adv,
ext_hdr_adv_data);
*(uint8_t *)&sec_hdr_prev = 0U;
}
sec_dptr_prev = (uint8_t *)sec_hdr + sizeof(*sec_hdr);
sec_dptr_prev = sec_hdr->data;
/* Get reference to new secondary PDU data buffer */
sec_pdu = lll_adv_aux_data_alloc(lll_aux, &sec_idx);
@ -525,7 +525,7 @@ uint8_t ull_adv_aux_hdr_set_clear(struct ll_adv_set *adv,
sec_com_hdr = (void *)&sec_pdu->adv_ext_ind;
sec_com_hdr->adv_mode = pri_com_hdr->adv_mode;
sec_hdr = (void *)sec_com_hdr->ext_hdr_adv_data;
sec_dptr = (uint8_t *)sec_hdr + sizeof(*sec_hdr);
sec_dptr = sec_hdr->data;
*(uint8_t *)sec_hdr = 0U;
/* AdvA flag */
@ -940,7 +940,7 @@ struct pdu_adv_aux_ptr *ull_adv_aux_lll_offset_fill(uint32_t ticks_offset,
pri_com_hdr = (void *)&pdu->adv_ext_ind;
h = (void *)pri_com_hdr->ext_hdr_adv_data;
ptr = (uint8_t *)h + sizeof(*h);
ptr = h->data;
if (h->adv_addr) {
ptr += BDADDR_SIZE;

View file

@ -126,7 +126,7 @@ uint8_t ll_adv_sync_param_set(uint8_t handle, uint16_t interval, uint16_t flags)
ter_com_hdr = (void *)&ter_pdu->adv_ext_ind;
ter_hdr = (void *)ter_com_hdr->ext_hdr_adv_data;
ter_dptr = (uint8_t *)ter_hdr + sizeof(*ter_hdr);
ter_dptr = ter_hdr->data;
ter_hdr_prev = *ter_hdr;
*(uint8_t *)ter_hdr = 0U;
ter_dptr_prev = ter_dptr;
@ -191,7 +191,7 @@ uint8_t ll_adv_sync_ad_data_set(uint8_t handle, uint8_t op, uint8_t len,
ter_com_hdr_prev = (void *)&ter_pdu_prev->adv_ext_ind;
ter_hdr = (void *)ter_com_hdr_prev->ext_hdr_adv_data;
ter_hdr_prev = *ter_hdr;
ter_dptr_prev = (uint8_t *)ter_hdr + sizeof(*ter_hdr);
ter_dptr_prev = ter_hdr->data;
/* Get reference to new tertiary PDU data buffer */
ter_pdu = lll_adv_sync_data_alloc(lll_sync, &ter_idx);
@ -201,7 +201,7 @@ uint8_t ll_adv_sync_ad_data_set(uint8_t handle, uint8_t op, uint8_t len,
ter_com_hdr = (void *)&ter_pdu->adv_ext_ind;
ter_com_hdr->adv_mode = ter_com_hdr_prev->adv_mode;
ter_hdr = (void *)ter_com_hdr->ext_hdr_adv_data;
ter_dptr = (uint8_t *)ter_hdr + sizeof(*ter_hdr);
ter_dptr = ter_hdr->data;
*(uint8_t *)ter_hdr = 0U;
/* No AdvA */
@ -652,7 +652,7 @@ static inline struct pdu_adv_sync_info *sync_info_get(struct pdu_adv *pdu)
p = (void *)&pdu->adv_ext_ind;
h = (void *)p->ext_hdr_adv_data;
ptr = (uint8_t *)h + sizeof(*h);
ptr = h->data;
if (h->adv_addr) {
ptr += BDADDR_SIZE;

View file

@ -192,7 +192,7 @@ void ull_scan_aux_setup(memq_link_t *link, struct node_rx_hdr *rx)
goto ull_scan_aux_rx_flush;
}
ptr = (uint8_t *)h + sizeof(*h);
ptr = h->data;
if (h->adv_addr) {
#if defined(CONFIG_BT_CTLR_SYNC_PERIODIC)