Skip to content

Commit 9768d0a

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 25c8a99 commit 9768d0a

File tree

2 files changed

+47
-24
lines changed

2 files changed

+47
-24
lines changed

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: 44 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,49 @@ static void ticker_op_cb(uint32_t status, void *param);
7777
static struct ll_adv_sync_set ll_adv_sync_pool[CONFIG_BT_CTLR_ADV_SYNC_SET];
7878
static void *adv_sync_free;
7979

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

92135
lll_sync = adv->lll.sync;
93136
if (!lll_sync) {
94-
struct pdu_adv_com_ext_adv *ter_com_hdr;
95-
struct pdu_adv_ext_hdr *ter_hdr;
96137
struct pdu_adv *ter_pdu;
97138
struct lll_adv *lll;
98-
uint8_t *ter_dptr;
99-
uint8_t ter_len;
100139
int err;
101140

102141
sync = sync_acquire();
@@ -135,26 +174,7 @@ uint8_t ll_adv_sync_param_set(uint8_t handle, uint16_t interval, uint16_t flags)
135174
sync->is_started = 0U;
136175

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

0 commit comments

Comments
 (0)