Skip to content

Commit 9c23fe0

Browse files
ppryga-nordiccfriedt
authored andcommitted
Bluetooth: controller: Add release of chains when get latest adv pdu
Add release of chained PDUs by lll_adv_pdu_and_extra_data_- latest_get function. It is requier to release unused PDUs from a chain to avoid PDUs leakage. It maight happen when chained PDUs were used by Direction Finding, then lll_adv_pdu_and_extra_data_lates_get is used instead of lll_adv_pdu_lates_get. Signed-off-by: Piotr Pryga <[email protected]>
1 parent 467d132 commit 9c23fe0

File tree

1 file changed

+27
-8
lines changed
  • subsys/bluetooth/controller/ll_sw/nordic/lll

1 file changed

+27
-8
lines changed

subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv.c

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -507,13 +507,36 @@ struct pdu_adv *lll_adv_pdu_and_extra_data_latest_get(struct lll_adv_pdu *pdu,
507507
uint8_t pdu_idx;
508508
void *p;
509509

510-
if (!MFIFO_ENQUEUE_IDX_GET(pdu_free, &pdu_free_idx)) {
511-
return NULL;
512-
}
513-
514510
pdu_idx = first;
511+
p = pdu->pdu[pdu_idx];
515512
ed = pdu->extra_data[pdu_idx];
516513

514+
do {
515+
void *next;
516+
517+
/* Store partial list in current data index if there is
518+
* no free slot in mfifo. It can be released on next
519+
* switch attempt (on next event).
520+
*/
521+
if (!MFIFO_ENQUEUE_IDX_GET(pdu_free, &pdu_free_idx)) {
522+
pdu->pdu[pdu_idx] = p;
523+
return NULL;
524+
}
525+
526+
#if defined(CONFIG_BT_CTLR_ADV_PDU_LINK)
527+
next = lll_adv_pdu_linked_next_get(p);
528+
#else
529+
next = NULL;
530+
#endif
531+
532+
MFIFO_BY_IDX_ENQUEUE(pdu_free, pdu_free_idx, p);
533+
k_sem_give(&sem_pdu_free);
534+
535+
p = next;
536+
} while (p);
537+
538+
pdu->pdu[pdu_idx] = NULL;
539+
517540
if (ed && (!MFIFO_ENQUEUE_IDX_GET(extra_data_free,
518541
&ed_free_idx))) {
519542
/* No pdu_free_idx clean up is required, sobsequent
@@ -530,12 +553,8 @@ struct pdu_adv *lll_adv_pdu_and_extra_data_latest_get(struct lll_adv_pdu *pdu,
530553
pdu->first = first;
531554
*is_modified = 1U;
532555

533-
p = pdu->pdu[pdu_idx];
534556
pdu->pdu[pdu_idx] = NULL;
535557

536-
MFIFO_BY_IDX_ENQUEUE(pdu_free, pdu_free_idx, p);
537-
k_sem_give(&sem_pdu_free);
538-
539558
if (ed) {
540559
pdu->extra_data[pdu_idx] = NULL;
541560

0 commit comments

Comments
 (0)