Skip to content

Commit 361759c

Browse files
Bluetooth: controller: Add support for linked adv PDUs
This adds support to allow advertising PDUs to be linked which is required to send advertising trains, i.e. AUX_CHAIN_IND. PDUs are linked with a simple single-linked list, the pointer to next PDU is stored at the very end of PDU buffer. This prevents it from being overwritten if PDU is modified and allows for build time offset calculation. There are few helpers added to make handling easier, e.g.: - get next linked PDU - get last linked PDU - link one PDU to another - link PDU at the end - release all linked PDUs (except for 1st) Signed-off-by: Andrzej Kaczmarek <[email protected]>
1 parent b020717 commit 361759c

File tree

10 files changed

+108
-10
lines changed

10 files changed

+108
-10
lines changed

subsys/bluetooth/controller/Kconfig.ll_sw_split

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,13 @@ config BT_CTLR_ADV_SYNC_SET
165165
help
166166
Maximum supported periodic advertising sets.
167167

168+
config BT_CTLR_ADV_PDU_LINK
169+
bool "Enable linking of advertising PDU trains"
170+
help
171+
Enables extra space in each advertising PDU to allow linking PDUs. This
172+
is required to enable advertising data trains (i.e. transmission of
173+
AUX_CHAIN_IND).
174+
168175
config BT_CTLR_ADV_DATA_BUF_MAX
169176
int "Advertising Data Maximum Buffers"
170177
depends on BT_BROADCASTER

subsys/bluetooth/controller/hci/hci.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
#include "util/util.h"
2828
#include "util/memq.h"
29+
#include "util/mem.h"
2930

3031
#include "hal/ecb.h"
3132
#include "hal/ccm.h"

subsys/bluetooth/controller/ll_sw/ll_addr.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
#include "util/util.h"
1616
#include "util/memq.h"
17+
#include "util/mem.h"
1718

1819
#include "pdu.h"
1920

subsys/bluetooth/controller/ll_sw/ll_tx_pwr.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
#include "util/util.h"
1818
#include "util/memq.h"
19+
#include "util/mem.h"
1920

2021
#include "pdu.h"
2122

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

Lines changed: 50 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,7 @@ static inline bool isr_rx_ci_adva_check(uint8_t tx_addr, uint8_t *addr,
9797
#define BT_CTLR_ADV_SYNC_SET 0
9898
#endif
9999

100-
#define PDU_MEM_SIZE MROUND(PDU_AC_LL_HEADER_SIZE + \
101-
PDU_AC_PAYLOAD_SIZE_MAX)
100+
#define PDU_MEM_SIZE PDU_ADV_MEM_SIZE
102101
#define PDU_MEM_COUNT_MIN (BT_CTLR_ADV_SET + \
103102
(BT_CTLR_ADV_SET * PAYLOAD_FRAG_COUNT) + \
104103
(BT_CTLR_ADV_AUX_SET * PAYLOAD_FRAG_COUNT) + \
@@ -305,11 +304,17 @@ struct pdu_adv *lll_adv_pdu_alloc_pdu_adv(void)
305304

306305
MFIFO_DEQUEUE(pdu_free);
307306

307+
#if defined(CONFIG_BT_CTLR_ADV_PDU_LINK)
308+
PDU_ADV_NEXT_PTR(p) = NULL;
309+
#endif
308310
return p;
309311
}
310312

311313
p = mem_acquire(&mem_pdu.free);
312314
if (p) {
315+
#if defined(CONFIG_BT_CTLR_ADV_PDU_LINK)
316+
PDU_ADV_NEXT_PTR(p) = NULL;
317+
#endif
313318
return p;
314319
}
315320

@@ -319,9 +324,25 @@ struct pdu_adv *lll_adv_pdu_alloc_pdu_adv(void)
319324
p = MFIFO_DEQUEUE(pdu_free);
320325
LL_ASSERT(p);
321326

327+
#if defined(CONFIG_BT_CTLR_ADV_PDU_LINK)
328+
PDU_ADV_NEXT_PTR(p) = NULL;
329+
#endif
322330
return p;
323331
}
324332

333+
#if defined(CONFIG_BT_CTLR_ADV_PDU_LINK)
334+
void lll_adv_pdu_linked_trim(struct pdu_adv *pdu)
335+
{
336+
while (PDU_ADV_NEXT_PTR(pdu)) {
337+
struct pdu_adv *prev = pdu;
338+
339+
pdu = PDU_ADV_NEXT_PTR(pdu);
340+
PDU_ADV_NEXT_PTR(prev) = NULL;
341+
mem_release(prev, &mem_pdu.free);
342+
}
343+
}
344+
#endif
345+
325346
struct pdu_adv *lll_adv_pdu_latest_get(struct lll_adv_pdu *pdu,
326347
uint8_t *is_modified)
327348
{
@@ -333,11 +354,34 @@ struct pdu_adv *lll_adv_pdu_latest_get(struct lll_adv_pdu *pdu,
333354
uint8_t pdu_idx;
334355
void *p;
335356

336-
if (!MFIFO_ENQUEUE_IDX_GET(pdu_free, &free_idx)) {
337-
return NULL;
338-
}
339-
340357
pdu_idx = first;
358+
p = pdu->pdu[pdu_idx];
359+
360+
do {
361+
void *next;
362+
363+
/* Store partial list in current data index if there is
364+
* no free slot in mfifo. It can be released on next
365+
* switch attempt (on next event).
366+
*/
367+
if (!MFIFO_ENQUEUE_IDX_GET(pdu_free, &free_idx)) {
368+
pdu->pdu[pdu_idx] = p;
369+
return NULL;
370+
}
371+
372+
#if defined(CONFIG_BT_CTLR_ADV_PDU_LINK)
373+
next = lll_adv_pdu_linked_next_get(p);
374+
#else
375+
next = NULL;
376+
#endif
377+
378+
MFIFO_BY_IDX_ENQUEUE(pdu_free, free_idx, p);
379+
k_sem_give(&sem_pdu_free);
380+
381+
p = next;
382+
} while (p);
383+
384+
pdu->pdu[pdu_idx] = NULL;
341385

342386
first += 1U;
343387
if (first == DOUBLE_BUFFER_SIZE) {
@@ -346,11 +390,7 @@ struct pdu_adv *lll_adv_pdu_latest_get(struct lll_adv_pdu *pdu,
346390
pdu->first = first;
347391
*is_modified = 1U;
348392

349-
p = pdu->pdu[pdu_idx];
350393
pdu->pdu[pdu_idx] = NULL;
351-
352-
MFIFO_BY_IDX_ENQUEUE(pdu_free, free_idx, p);
353-
k_sem_give(&sem_pdu_free);
354394
}
355395

356396
return (void *)pdu->pdu[first];

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "hal/ticker.h"
1818

1919
#include "util/util.h"
20+
#include "util/mem.h"
2021
#include "util/memq.h"
2122

2223
#include "pdu.h"

subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv_pdu.h

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,18 @@
44
* SPDX-License-Identifier: Apache-2.0
55
*/
66

7+
#if defined(CONFIG_BT_CTLR_ADV_PDU_LINK)
8+
#define PDU_ADV_MEM_SIZE MROUND(PDU_AC_LL_HEADER_SIZE + \
9+
PDU_AC_PAYLOAD_SIZE_MAX + \
10+
sizeof(uintptr_t))
11+
#define PDU_ADV_NEXT_PTR(p) *(struct pdu_adv **)((uint8_t *)(p) + \
12+
PDU_ADV_MEM_SIZE - \
13+
sizeof(uintptr_t))
14+
#else
15+
#define PDU_ADV_MEM_SIZE MROUND(PDU_AC_LL_HEADER_SIZE + \
16+
PDU_AC_PAYLOAD_SIZE_MAX)
17+
#endif
18+
719
int lll_adv_data_init(struct lll_adv_pdu *pdu);
820
int lll_adv_data_reset(struct lll_adv_pdu *pdu);
921
int lll_adv_data_release(struct lll_adv_pdu *pdu);
@@ -124,3 +136,35 @@ static inline struct pdu_adv *lll_adv_sync_data_peek(struct lll_adv_sync *lll,
124136
}
125137
#endif /* CONFIG_BT_CTLR_ADV_PERIODIC */
126138
#endif /* CONFIG_BT_CTLR_ADV_EXT */
139+
140+
#if defined(CONFIG_BT_CTLR_ADV_PDU_LINK)
141+
void lll_adv_pdu_linked_trim(struct pdu_adv *pdu);
142+
143+
static inline struct pdu_adv *lll_adv_pdu_linked_next_get(struct pdu_adv *pdu)
144+
{
145+
return PDU_ADV_NEXT_PTR(pdu);
146+
}
147+
148+
static inline struct pdu_adv *lll_adv_pdu_linked_last_get(struct pdu_adv *pdu)
149+
{
150+
while (PDU_ADV_NEXT_PTR(pdu)) {
151+
pdu = PDU_ADV_NEXT_PTR(pdu);
152+
}
153+
return pdu;
154+
}
155+
156+
static inline void lll_adv_pdu_linked_append(struct pdu_adv *pdu,
157+
struct pdu_adv *prev)
158+
{
159+
PDU_ADV_NEXT_PTR(prev) = pdu;
160+
}
161+
162+
static inline void lll_adv_pdu_linked_append_end(struct pdu_adv *pdu,
163+
struct pdu_adv *first)
164+
{
165+
struct pdu_adv *last;
166+
167+
last = lll_adv_pdu_linked_last_get(first);
168+
lll_adv_pdu_linked_append(last, pdu);
169+
}
170+
#endif

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "hal/radio_df.h"
1616

1717
#include "util/util.h"
18+
#include "util/mem.h"
1819
#include "util/memq.h"
1920

2021
#include "pdu.h"

subsys/bluetooth/controller/ll_sw/ull_master.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
#include "util/util.h"
1313
#include "util/memq.h"
14+
#include "util/mem.h"
1415
#include "util/mayfly.h"
1516

1617
#include "hal/cpu.h"

subsys/bluetooth/controller/ll_sw/ull_slave.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
#include "util/util.h"
1313
#include "util/memq.h"
14+
#include "util/mem.h"
1415
#include "util/mayfly.h"
1516

1617
#include "hal/cpu.h"

0 commit comments

Comments
 (0)