Skip to content

Commit 81a4474

Browse files
committed
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 e4c3909 commit 81a4474

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
@@ -494,13 +494,36 @@ struct pdu_adv *lll_adv_pdu_and_extra_data_latest_get(struct lll_adv_pdu *pdu,
494494
uint8_t pdu_idx;
495495
void *p;
496496

497-
if (!MFIFO_ENQUEUE_IDX_GET(pdu_free, &pdu_free_idx)) {
498-
return NULL;
499-
}
500-
501497
pdu_idx = first;
498+
p = pdu->pdu[pdu_idx];
502499
ed = pdu->extra_data[pdu_idx];
503500

501+
do {
502+
void *next;
503+
504+
/* Store partial list in current data index if there is
505+
* no free slot in mfifo. It can be released on next
506+
* switch attempt (on next event).
507+
*/
508+
if (!MFIFO_ENQUEUE_IDX_GET(pdu_free, &pdu_free_idx)) {
509+
pdu->pdu[pdu_idx] = p;
510+
return NULL;
511+
}
512+
513+
#if defined(CONFIG_BT_CTLR_ADV_PDU_LINK)
514+
next = lll_adv_pdu_linked_next_get(p);
515+
#else
516+
next = NULL;
517+
#endif
518+
519+
MFIFO_BY_IDX_ENQUEUE(pdu_free, pdu_free_idx, p);
520+
k_sem_give(&sem_pdu_free);
521+
522+
p = next;
523+
} while (p);
524+
525+
pdu->pdu[pdu_idx] = NULL;
526+
504527
if (ed && (!MFIFO_ENQUEUE_IDX_GET(extra_data_free,
505528
&ed_free_idx))) {
506529
/* No pdu_free_idx clean up is required, sobsequent
@@ -517,12 +540,8 @@ struct pdu_adv *lll_adv_pdu_and_extra_data_latest_get(struct lll_adv_pdu *pdu,
517540
pdu->first = first;
518541
*is_modified = 1U;
519542

520-
p = pdu->pdu[pdu_idx];
521543
pdu->pdu[pdu_idx] = NULL;
522544

523-
MFIFO_BY_IDX_ENQUEUE(pdu_free, pdu_free_idx, p);
524-
k_sem_give(&sem_pdu_free);
525-
526545
if (ed) {
527546
pdu->extra_data[pdu_idx] = NULL;
528547

0 commit comments

Comments
 (0)