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;
|
struct pdu_adv *pdu;
|
||||||
u8_t last;
|
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, */
|
/* use the last index in double buffer, */
|
||||||
radio_adv_data = radio_adv_data_get();
|
|
||||||
if (radio_adv_data->first == radio_adv_data->last) {
|
if (radio_adv_data->first == radio_adv_data->last) {
|
||||||
last = radio_adv_data->last + 1;
|
last = radio_adv_data->last + 1;
|
||||||
if (last == DOUBLE_BUFFER_SIZE) {
|
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. */
|
/* 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 = (struct pdu_adv *)&radio_adv_data->data[last][0];
|
||||||
pdu->type = prev->type;
|
pdu->type = prev->type;
|
||||||
pdu->rfu = 0;
|
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;
|
pdu->rx_addr = prev->rx_addr;
|
||||||
memcpy(&pdu->payload.adv_ind.addr[0],
|
memcpy(&pdu->payload.adv_ind.addr[0],
|
||||||
&prev->payload.adv_ind.addr[0], BDADDR_SIZE);
|
&prev->payload.adv_ind.addr[0], BDADDR_SIZE);
|
||||||
if (pdu->type == PDU_ADV_TYPE_DIRECT_IND) {
|
memcpy(&pdu->payload.adv_ind.data[0], data, len);
|
||||||
memcpy(&pdu->payload.direct_ind.tgt_addr[0],
|
pdu->len = BDADDR_SIZE + len;
|
||||||
&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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* commit the update so controller picks it. */
|
/* commit the update so controller picks it. */
|
||||||
radio_adv_data->last = last;
|
radio_adv_data->last = last;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue