Skip to content

Commit 16deb82

Browse files
Bluetooth: controller: Add helper to initialize adv PDU from scratch
This adds adv_sync_pdu_init helper which initializes pdu_adv buffer with contents of AUX_SYNC_IND/AUX_CHAIN_IND PDU. Extended header flags can be specified to reserve required space for corresponding fields if necessary. Signed-off-by: Andrzej Kaczmarek <[email protected]>
1 parent 634177e commit 16deb82

File tree

3 files changed

+50
-25
lines changed

3 files changed

+50
-25
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,7 @@ static void pdu_b2b_aux_ptr_update(struct pdu_adv *pdu, uint8_t phy,
381381
dptr = hdr->data;
382382

383383
if (!hdr->aux_ptr) {
384-
return pdu;
384+
return;
385385
}
386386

387387
LL_ASSERT(!hdr->adv_addr);

subsys/bluetooth/controller/ll_sw/ull_adv_internal.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,12 @@ const uint8_t *ull_adv_pdu_update_addrs(struct ll_adv_set *adv,
4747
#if defined(CONFIG_BT_CTLR_ADV_EXT)
4848

4949
#define ULL_ADV_PDU_HDR_FIELD_ADVA BIT(0)
50+
#define ULL_ADV_PDU_HDR_FIELD_TARGETA BIT(1)
5051
#define ULL_ADV_PDU_HDR_FIELD_CTE_INFO BIT(2)
52+
#define ULL_ADV_PDU_HDR_FIELD_ADI BIT(3)
5153
#define ULL_ADV_PDU_HDR_FIELD_AUX_PTR BIT(4)
5254
#define ULL_ADV_PDU_HDR_FIELD_SYNC_INFO BIT(5)
55+
#define ULL_ADV_PDU_HDR_FIELD_TX_POWER BIT(7)
5356
#define ULL_ADV_PDU_HDR_FIELD_AD_DATA BIT(8)
5457

5558
/* Helper type to store data for extended advertising

subsys/bluetooth/controller/ll_sw/ull_adv_sync.c

Lines changed: 46 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,51 @@ static void ticker_op_cb(uint32_t status, void *param);
7676
static struct ll_adv_sync_set ll_adv_sync_pool[CONFIG_BT_CTLR_ADV_SYNC_SET];
7777
static void *adv_sync_free;
7878

79+
static uint8_t adv_sync_pdu_init(struct pdu_adv *pdu, uint8_t ext_hdr_flags)
80+
{
81+
struct pdu_adv_com_ext_adv *com_hdr;
82+
struct pdu_adv_ext_hdr *ext_hdr;
83+
uint8_t *dptr;
84+
uint8_t len;
85+
86+
pdu->type = PDU_ADV_TYPE_AUX_SYNC_IND;
87+
pdu->rfu = 0U;
88+
pdu->chan_sel = 0U;
89+
90+
pdu->tx_addr = 0U;
91+
pdu->rx_addr = 0U;
92+
93+
com_hdr = &pdu->adv_ext_ind;
94+
/* Non-connectable and Non-scannable adv mode */
95+
com_hdr->adv_mode = 0U;
96+
97+
ext_hdr = &com_hdr->ext_hdr;
98+
*(uint8_t *)ext_hdr = ext_hdr_flags;
99+
dptr = ext_hdr->data;
100+
101+
LL_ASSERT(!(ext_hdr_flags & (ULL_ADV_PDU_HDR_FIELD_ADVA |
102+
ULL_ADV_PDU_HDR_FIELD_TARGETA |
103+
ULL_ADV_PDU_HDR_FIELD_ADI |
104+
ULL_ADV_PDU_HDR_FIELD_SYNC_INFO)));
105+
106+
if (ext_hdr_flags & ULL_ADV_PDU_HDR_FIELD_CTE_INFO) {
107+
dptr += sizeof(struct pdu_cte_info);
108+
}
109+
if (ext_hdr_flags & ULL_ADV_PDU_HDR_FIELD_AUX_PTR) {
110+
dptr += sizeof(struct pdu_adv_aux_ptr);
111+
}
112+
if (ext_hdr_flags & ULL_ADV_PDU_HDR_FIELD_TX_POWER) {
113+
dptr += sizeof(uint8_t);
114+
}
115+
116+
/* Calc tertiary PDU len */
117+
len = ull_adv_aux_hdr_len_calc(com_hdr, &dptr);
118+
ull_adv_aux_hdr_len_fill(com_hdr, len);
119+
120+
pdu->len = len;
121+
122+
return 0;
123+
}
79124
uint8_t ll_adv_sync_param_set(uint8_t handle, uint16_t interval, uint16_t flags)
80125
{
81126
struct lll_adv_sync *lll_sync;
@@ -90,12 +135,8 @@ uint8_t ll_adv_sync_param_set(uint8_t handle, uint16_t interval, uint16_t flags)
90135

91136
lll_sync = adv->lll.sync;
92137
if (!lll_sync) {
93-
struct pdu_adv_com_ext_adv *ter_com_hdr;
94-
struct pdu_adv_ext_hdr *ter_hdr;
95138
struct pdu_adv *ter_pdu;
96139
struct lll_adv *lll;
97-
uint8_t *ter_dptr;
98-
uint8_t ter_len;
99140
int err;
100141

101142
sync = sync_acquire();
@@ -134,26 +175,7 @@ uint8_t ll_adv_sync_param_set(uint8_t handle, uint16_t interval, uint16_t flags)
134175
sync->is_started = 0U;
135176

136177
ter_pdu = lll_adv_sync_data_peek(lll_sync, NULL);
137-
ter_pdu->type = PDU_ADV_TYPE_AUX_SYNC_IND;
138-
ter_pdu->rfu = 0U;
139-
ter_pdu->chan_sel = 0U;
140-
141-
ter_pdu->tx_addr = 0U;
142-
ter_pdu->rx_addr = 0U;
143-
144-
ter_com_hdr = (void *)&ter_pdu->adv_ext_ind;
145-
ter_hdr = (void *)ter_com_hdr->ext_hdr_adv_data;
146-
ter_dptr = ter_hdr->data;
147-
*(uint8_t *)ter_hdr = 0U;
148-
149-
/* Non-connectable and Non-scannable adv mode */
150-
ter_com_hdr->adv_mode = 0U;
151-
152-
/* Calc tertiary PDU len */
153-
ter_len = ull_adv_aux_hdr_len_calc(ter_com_hdr, &ter_dptr);
154-
ull_adv_aux_hdr_len_fill(ter_com_hdr, ter_len);
155-
156-
ter_pdu->len = ter_len;
178+
adv_sync_pdu_init(ter_pdu, 0);
157179
} else {
158180
sync = (void *)HDR_LLL2EVT(lll_sync);
159181
}

0 commit comments

Comments
 (0)