Skip to content

Commit 7296a6e

Browse files
committed
Bluetooth: controller: Use set/clear to add/remove ACAD
Use the set/clear function to modify the common extended header format in the PDU to add/remove ACAD. Signed-off-by: Vinayak Kariappa Chettimada <[email protected]>
1 parent b1653b8 commit 7296a6e

File tree

5 files changed

+87
-182
lines changed

5 files changed

+87
-182
lines changed

subsys/bluetooth/controller/ll_sw/ull_adv_aux.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ uint8_t ll_adv_aux_ad_data_set(uint8_t handle, uint8_t op, uint8_t frag_pref, ui
9393
uint8_t const *const data)
9494
{
9595
struct ll_adv_set *adv;
96-
uint8_t value[5];
96+
uint8_t value[1 + sizeof(data)];
9797
uint8_t *val_ptr;
9898
uint8_t pri_idx;
9999
uint8_t err;
@@ -122,7 +122,7 @@ uint8_t ll_adv_aux_ad_data_set(uint8_t handle, uint8_t op, uint8_t frag_pref, ui
122122

123123
val_ptr = value;
124124
*val_ptr++ = len;
125-
sys_put_le32((uint32_t)data, val_ptr);
125+
memcpy(val_ptr, &data, sizeof(data));
126126
err = ull_adv_aux_hdr_set_clear(adv, ULL_ADV_PDU_HDR_FIELD_AD_DATA,
127127
0, value, NULL, &pri_idx);
128128
if (err) {

subsys/bluetooth/controller/ll_sw/ull_adv_internal.h

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,20 +46,24 @@ const uint8_t *ull_adv_pdu_update_addrs(struct ll_adv_set *adv,
4646

4747
#if defined(CONFIG_BT_CTLR_ADV_EXT)
4848

49+
/* Below are BT Spec v5.2, Vol 6, Part B Section 2.3.4 Table 2.12 defined */
4950
#define ULL_ADV_PDU_HDR_FIELD_ADVA BIT(0)
5051
#define ULL_ADV_PDU_HDR_FIELD_TARGETA BIT(1)
5152
#define ULL_ADV_PDU_HDR_FIELD_CTE_INFO BIT(2)
5253
#define ULL_ADV_PDU_HDR_FIELD_ADI BIT(3)
5354
#define ULL_ADV_PDU_HDR_FIELD_AUX_PTR BIT(4)
5455
#define ULL_ADV_PDU_HDR_FIELD_SYNC_INFO BIT(5)
55-
#define ULL_ADV_PDU_HDR_FIELD_TX_POWER BIT(7)
56-
#define ULL_ADV_PDU_HDR_FIELD_AD_DATA BIT(8)
56+
#define ULL_ADV_PDU_HDR_FIELD_TX_POWER BIT(6)
57+
#define ULL_ADV_PDU_HDR_FIELD_RFU BIT(7)
58+
/* Below are implementation defined bit fields */
59+
#define ULL_ADV_PDU_HDR_FIELD_ACAD BIT(8)
60+
#define ULL_ADV_PDU_HDR_FIELD_AD_DATA BIT(9)
5761

5862
/* Helper type to store data for extended advertising
5963
* header fields and extra data.
6064
*/
61-
struct adv_pdu_field_data {
62-
uint8_t *field_data;
65+
struct ull_adv_ext_hdr_data {
66+
void *field_data;
6367

6468
#if defined(CONFIG_BT_CTLR_ADV_EXT_PDU_EXTRA_DATA_MEMORY)
6569
void *extra_data;
@@ -116,7 +120,7 @@ void ull_adv_sync_release(struct ll_adv_sync_set *sync);
116120
uint8_t ull_adv_sync_pdu_alloc(struct ll_adv_set *adv,
117121
uint16_t hdr_add_fields,
118122
uint16_t hdr_rem_fields,
119-
struct adv_pdu_field_data *data,
123+
struct ull_adv_ext_hdr_data *hdr_data,
120124
struct pdu_adv **ter_pdu_prev,
121125
struct pdu_adv **ter_pdu_new,
122126
void **extra_data_prev,
@@ -131,7 +135,7 @@ uint8_t ull_adv_sync_pdu_set_clear(struct lll_adv_sync *lll_sync,
131135
struct pdu_adv *ter_pdu,
132136
uint16_t hdr_add_fields,
133137
uint16_t hdr_rem_fields,
134-
struct adv_pdu_field_data *data);
138+
struct ull_adv_ext_hdr_data *hdr_data);
135139

136140
/* helper function to update extra_data field */
137141
void ull_adv_sync_extra_data_set_clear(void *extra_data_prev,
@@ -187,10 +191,6 @@ void ull_adv_sync_update(struct ll_adv_sync_set *sync, uint32_t slot_plus_us,
187191
/* helper function to schedule a mayfly to get sync offset */
188192
void ull_adv_sync_offset_get(struct ll_adv_set *adv);
189193

190-
/* helper function to reserve ACAD field in PDU buffer */
191-
uint8_t ull_adv_sync_acad_enable(struct lll_adv_sync *lll_sync,
192-
uint8_t acad_len, void **acad);
193-
194194
int ull_adv_iso_init(void);
195195
int ull_adv_iso_reset(void);
196196

subsys/bluetooth/controller/ll_sw/ull_adv_iso.c

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,16 @@ uint8_t ll_big_create(uint8_t big_handle, uint8_t adv_handle, uint8_t num_bis,
5858
uint8_t packing, uint8_t framing, uint8_t encryption,
5959
uint8_t *bcode)
6060
{
61+
uint8_t field_data[1 + sizeof(uint8_t *)];
62+
struct ull_adv_ext_hdr_data hdr_data;
63+
void *extra_data_prev, *extra_data;
6164
struct lll_adv_sync *lll_adv_sync;
6265
struct lll_adv_iso *lll_adv_iso;
66+
struct pdu_adv *pdu_prev, *pdu;
6367
struct node_rx_pdu *node_rx;
6468
struct ll_adv_iso *adv_iso;
6569
struct ll_adv_set *adv;
70+
uint8_t ter_idx;
6671
uint8_t *acad;
6772
uint8_t err;
6873

@@ -133,16 +138,29 @@ uint8_t ll_big_create(uint8_t big_handle, uint8_t adv_handle, uint8_t num_bis,
133138
return BT_HCI_ERR_MEM_CAPACITY_EXCEEDED;
134139
}
135140

141+
/* Allocate next PDU */
142+
err = ull_adv_sync_pdu_alloc(adv, 0, 0, NULL, &pdu_prev, &pdu,
143+
&extra_data_prev, &extra_data, &ter_idx);
144+
if (err) {
145+
return err;
146+
}
147+
136148
/* Add ACAD to AUX_SYNC_IND */
137-
err = ull_adv_sync_acad_enable(lll_adv_sync,
138-
(sizeof(struct pdu_big_info) + 2),
139-
(void **)&acad);
149+
hdr_data.field_data = field_data;
150+
field_data[0] = sizeof(struct pdu_big_info) + 2;
151+
err = ull_adv_sync_pdu_set_clear(lll_adv_sync, pdu_prev, pdu,
152+
ULL_ADV_PDU_HDR_FIELD_ACAD, 0U,
153+
&hdr_data);
140154
if (err) {
141155
return err;
142156
}
157+
158+
memcpy(&acad, &field_data[1], sizeof(acad));
143159
acad[0] = sizeof(struct pdu_big_info) + 1;
144160
acad[1] = BT_DATA_BIG_INFO;
145161

162+
lll_adv_sync_data_enqueue(lll_adv_sync, ter_idx);
163+
146164
/* TODO: For now we can just use the unique BIG handle as the BIS
147165
* handle until we support multiple BIS
148166
*/
@@ -209,11 +227,15 @@ uint8_t ll_big_test_create(uint8_t big_handle, uint8_t adv_handle,
209227

210228
uint8_t ll_big_terminate(uint8_t big_handle, uint8_t reason)
211229
{
230+
void *extra_data_prev, *extra_data;
212231
struct lll_adv_sync *lll_adv_sync;
213232
struct lll_adv_iso *lll_adv_iso;
233+
struct pdu_adv *pdu_prev, *pdu;
214234
struct node_rx_pdu *node_rx;
215235
struct ll_adv_iso *adv_iso;
216236
struct lll_adv *lll_adv;
237+
struct ll_adv_set *adv;
238+
uint8_t ter_idx;
217239
uint32_t ret;
218240
uint8_t err;
219241

@@ -229,13 +251,24 @@ uint8_t ll_big_terminate(uint8_t big_handle, uint8_t reason)
229251
}
230252

231253
lll_adv_sync = lll_adv->sync;
254+
adv = HDR_LLL2ULL(lll_adv);
255+
256+
/* Allocate next PDU */
257+
err = ull_adv_sync_pdu_alloc(adv, 0, 0, NULL, &pdu_prev, &pdu,
258+
&extra_data_prev, &extra_data, &ter_idx);
259+
if (err) {
260+
return err;
261+
}
232262

233263
/* Remove ACAD to AUX_SYNC_IND */
234-
err = ull_adv_sync_acad_enable(lll_adv_sync, 0, NULL);
264+
err = ull_adv_sync_pdu_set_clear(lll_adv_sync, pdu_prev, pdu,
265+
0U, ULL_ADV_PDU_HDR_FIELD_ACAD, NULL);
235266
if (err) {
236267
return err;
237268
}
238269

270+
lll_adv_sync_data_enqueue(lll_adv_sync, ter_idx);
271+
239272
/* TODO: Terminate all BIS data paths */
240273

241274
ret = ticker_stop(TICKER_INSTANCE_ID_CTLR, TICKER_USER_ID_ULL_HIGH,

0 commit comments

Comments
 (0)