From 799757a81f7229128d3b7732913f4c9f18b607fd Mon Sep 17 00:00:00 2001 From: Vinayak Kariappa Chettimada Date: Thu, 15 Jun 2017 11:40:07 +0200 Subject: [PATCH] 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 --- subsys/bluetooth/controller/ll_sw/ll_adv.c | 24 ++++++++++++---------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/subsys/bluetooth/controller/ll_sw/ll_adv.c b/subsys/bluetooth/controller/ll_sw/ll_adv.c index aca8ff7eab2..27704076b64 100644 --- a/subsys/bluetooth/controller/ll_sw/ll_adv.c +++ b/subsys/bluetooth/controller/ll_sw/ll_adv.c @@ -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;