Bluetooth: controller: Avoid adv data set on ADV_EXT_IND PDU
Added fix to avoid adv data set function call from corrupting a ADV_EXT_IND PDU under LE Extended Advertising. Also, avoid redundant code execution under directed advertising. Signed-off-by: Vinayak Kariappa Chettimada <vich@nordicsemi.no>
This commit is contained in:
parent
0a1efac161
commit
799757a81f
1 changed files with 13 additions and 11 deletions
|
@ -245,10 +245,19 @@ void ll_adv_data_set(u8_t len, u8_t const *const data)
|
|||
struct pdu_adv *pdu;
|
||||
u8_t last;
|
||||
|
||||
/* TODO: dont update data if directed adv type. */
|
||||
/* Dont update data if directed or extended advertising. */
|
||||
radio_adv_data = radio_adv_data_get();
|
||||
prev = (struct pdu_adv *)&radio_adv_data->data[radio_adv_data->last][0];
|
||||
if ((prev->type == PDU_ADV_TYPE_DIRECT_IND) ||
|
||||
(IS_ENABLED(CONFIG_BLUETOOTH_CONTROLLER_ADV_EXT) &&
|
||||
(prev->type == PDU_ADV_TYPE_EXT_IND))) {
|
||||
/* TODO: remember data, to be used if type is changed using
|
||||
* parameter set function ll_adv_params_set afterwards.
|
||||
*/
|
||||
return;
|
||||
}
|
||||
|
||||
/* use the last index in double buffer, */
|
||||
radio_adv_data = radio_adv_data_get();
|
||||
if (radio_adv_data->first == radio_adv_data->last) {
|
||||
last = radio_adv_data->last + 1;
|
||||
if (last == DOUBLE_BUFFER_SIZE) {
|
||||
|
@ -259,7 +268,6 @@ void ll_adv_data_set(u8_t len, u8_t const *const data)
|
|||
}
|
||||
|
||||
/* update adv pdu fields. */
|
||||
prev = (struct pdu_adv *)&radio_adv_data->data[radio_adv_data->last][0];
|
||||
pdu = (struct pdu_adv *)&radio_adv_data->data[last][0];
|
||||
pdu->type = prev->type;
|
||||
pdu->rfu = 0;
|
||||
|
@ -274,14 +282,8 @@ void ll_adv_data_set(u8_t len, u8_t const *const data)
|
|||
pdu->rx_addr = prev->rx_addr;
|
||||
memcpy(&pdu->payload.adv_ind.addr[0],
|
||||
&prev->payload.adv_ind.addr[0], BDADDR_SIZE);
|
||||
if (pdu->type == PDU_ADV_TYPE_DIRECT_IND) {
|
||||
memcpy(&pdu->payload.direct_ind.tgt_addr[0],
|
||||
&prev->payload.direct_ind.tgt_addr[0], BDADDR_SIZE);
|
||||
pdu->len = sizeof(struct pdu_adv_payload_direct_ind);
|
||||
} else {
|
||||
memcpy(&pdu->payload.adv_ind.data[0], data, len);
|
||||
pdu->len = BDADDR_SIZE + len;
|
||||
}
|
||||
memcpy(&pdu->payload.adv_ind.data[0], data, len);
|
||||
pdu->len = BDADDR_SIZE + len;
|
||||
|
||||
/* commit the update so controller picks it. */
|
||||
radio_adv_data->last = last;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue