Skip to content

Commit 1213731

Browse files
cvinayaknashif
authored andcommitted
Bluetooth: Controller: Fix to use ADI flag in Periodic Adv Enable
Fix implementation to use ADI flag in Periodic Advertising enable command to add ADI field in Periodic Advertising PDUs. Related to commit 6433a6a ("Bluetooth: Controller: Add Periodic Advertising ADI support"). Signed-off-by: Vinayak Kariappa Chettimada <[email protected]>
1 parent 9d84f77 commit 1213731

File tree

1 file changed

+72
-19
lines changed

1 file changed

+72
-19
lines changed

subsys/bluetooth/controller/ll_sw/ull_adv_sync.c

Lines changed: 72 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,7 @@ uint8_t ll_adv_sync_param_set(uint8_t handle, uint16_t interval, uint16_t flags)
415415
#if defined(CONFIG_BT_CTLR_DF_ADV_CTE_TX)
416416
if (extra_data) {
417417
ull_adv_sync_extra_data_set_clear(extra_data_prev, extra_data,
418-
0, 0, NULL);
418+
0U, 0U, NULL);
419419
}
420420
#endif /* CONFIG_BT_CTLR_DF_ADV_CTE_TX */
421421

@@ -472,7 +472,7 @@ uint8_t ll_adv_sync_ad_data_set(uint8_t handle, uint8_t op, uint8_t len,
472472
#if defined(CONFIG_BT_CTLR_DF_ADV_CTE_TX)
473473
if (extra_data) {
474474
ull_adv_sync_extra_data_set_clear(extra_data_prev, extra_data,
475-
ULL_ADV_PDU_HDR_FIELD_AD_DATA, 0, NULL);
475+
0U, 0U, NULL);
476476
}
477477
#endif /* CONFIG_BT_CTLR_DF_ADV_CTE_TX */
478478

@@ -515,11 +515,14 @@ uint8_t ll_adv_sync_ad_data_set(uint8_t handle, uint8_t op, uint8_t len,
515515

516516
uint8_t ll_adv_sync_enable(uint8_t handle, uint8_t enable)
517517
{
518+
void *extra_data_prev, *extra_data;
519+
struct pdu_adv *pdu_prev, *pdu;
518520
struct lll_adv_sync *lll_sync;
519521
struct ll_adv_sync_set *sync;
520522
uint8_t sync_got_enabled;
521523
struct ll_adv_set *adv;
522524
uint8_t pri_idx;
525+
uint8_t ter_idx;
523526
uint8_t err;
524527

525528
adv = ull_adv_is_created_get(handle);
@@ -532,14 +535,16 @@ uint8_t ll_adv_sync_enable(uint8_t handle, uint8_t enable)
532535
return BT_HCI_ERR_CMD_DISALLOWED;
533536
}
534537

535-
/* TODO: Add Periodic Advertising ADI Support feature */
536-
if (enable > 1U) {
538+
if ((enable > (BT_HCI_LE_SET_PER_ADV_ENABLE_ENABLE |
539+
BT_HCI_LE_SET_PER_ADV_ENABLE_ADI)) ||
540+
(!IS_ENABLED(CONFIG_BT_CTLR_ADV_PERIODIC_ADI_SUPPORT) &&
541+
(enable > BT_HCI_LE_SET_PER_ADV_ENABLE_ENABLE))) {
537542
return BT_HCI_ERR_UNSUPP_FEATURE_PARAM_VAL;
538543
}
539544

540545
sync = HDR_LLL2ULL(lll_sync);
541546

542-
if (!enable) {
547+
if (!(enable & BT_HCI_LE_SET_PER_ADV_ENABLE_ENABLE)) {
543548
if (!sync->is_enabled) {
544549
return BT_HCI_ERR_CMD_DISALLOWED;
545550
}
@@ -567,6 +572,42 @@ uint8_t ll_adv_sync_enable(uint8_t handle, uint8_t enable)
567572
sync_got_enabled = 1U;
568573
}
569574

575+
/* Add/Remove ADI */
576+
if (IS_ENABLED(CONFIG_BT_CTLR_ADV_PERIODIC_ADI_SUPPORT)) {
577+
uint16_t hdr_add_fields;
578+
uint16_t hdr_rem_fields;
579+
580+
if (enable & BT_HCI_LE_SET_PER_ADV_ENABLE_ADI) {
581+
hdr_add_fields = ULL_ADV_PDU_HDR_FIELD_ADI;
582+
hdr_rem_fields = 0U;
583+
} else {
584+
hdr_add_fields = 0U;
585+
hdr_rem_fields = ULL_ADV_PDU_HDR_FIELD_ADI;
586+
}
587+
588+
err = ull_adv_sync_pdu_alloc(adv, ULL_ADV_PDU_EXTRA_DATA_ALLOC_IF_EXIST,
589+
&pdu_prev, &pdu, &extra_data_prev,
590+
&extra_data, &ter_idx);
591+
if (err) {
592+
return err;
593+
}
594+
595+
#if defined(CONFIG_BT_CTLR_DF_ADV_CTE_TX)
596+
if (extra_data) {
597+
ull_adv_sync_extra_data_set_clear(extra_data_prev,
598+
extra_data, 0U, 0U,
599+
NULL);
600+
}
601+
#endif /* CONFIG_BT_CTLR_DF_ADV_CTE_TX */
602+
603+
err = ull_adv_sync_pdu_set_clear(lll_sync, pdu_prev, pdu,
604+
hdr_add_fields, hdr_rem_fields,
605+
NULL);
606+
if (err) {
607+
return err;
608+
}
609+
}
610+
570611
if (adv->is_enabled && !sync->is_started) {
571612
struct pdu_adv_sync_info *sync_info;
572613
uint8_t value[1 + sizeof(sync_info)];
@@ -645,6 +686,10 @@ uint8_t ll_adv_sync_enable(uint8_t handle, uint8_t enable)
645686
}
646687
}
647688

689+
if (IS_ENABLED(CONFIG_BT_CTLR_ADV_PERIODIC_ADI_SUPPORT)) {
690+
lll_adv_sync_data_enqueue(lll_sync, ter_idx);
691+
}
692+
648693
if (sync_got_enabled) {
649694
sync->is_enabled = sync_got_enabled;
650695
}
@@ -1110,11 +1155,17 @@ uint8_t ull_adv_sync_pdu_set_clear(struct lll_adv_sync *lll_sync,
11101155
#endif /* CONFIG_BT_CTLR_DF_ADV_CTE_TX */
11111156

11121157
if (IS_ENABLED(CONFIG_BT_CTLR_ADV_PERIODIC_ADI_SUPPORT)) {
1158+
if ((hdr_add_fields & ULL_ADV_PDU_HDR_FIELD_ADI) ||
1159+
(!(hdr_rem_fields & ULL_ADV_PDU_HDR_FIELD_ADI) &&
1160+
ter_hdr_prev.adi)) {
1161+
ter_hdr.adi = 1U;
1162+
}
1163+
if (ter_hdr.adi) {
1164+
ter_dptr += sizeof(struct pdu_adv_adi);
1165+
}
11131166
if (ter_hdr_prev.adi) {
11141167
ter_dptr_prev += sizeof(struct pdu_adv_adi);
11151168
}
1116-
ter_hdr.adi = 1U;
1117-
ter_dptr += sizeof(struct pdu_adv_adi);
11181169
}
11191170

11201171
/* AuxPtr - will be added if AUX_CHAIN_IND is required */
@@ -1259,25 +1310,27 @@ uint8_t ull_adv_sync_pdu_set_clear(struct lll_adv_sync *lll_sync,
12591310
}
12601311

12611312
if (IS_ENABLED(CONFIG_BT_CTLR_ADV_PERIODIC_ADI_SUPPORT)) {
1262-
struct pdu_adv_adi *adi;
1263-
struct ll_adv_set *adv;
1264-
uint16_t did;
1265-
12661313
if (ter_hdr_prev.adi) {
12671314
ter_dptr_prev -= sizeof(struct pdu_adv_adi);
12681315
}
12691316

1270-
ter_dptr -= sizeof(struct pdu_adv_adi);
1271-
adi = (void *)ter_dptr;
1317+
if (ter_hdr.adi) {
1318+
struct pdu_adv_adi *adi;
1319+
struct ll_adv_set *adv;
1320+
uint16_t did;
12721321

1273-
adv = HDR_LLL2ULL(lll_sync->adv);
1322+
ter_dptr -= sizeof(struct pdu_adv_adi);
1323+
adi = (void *)ter_dptr;
12741324

1275-
adi->sid = adv->sid;
1325+
adv = HDR_LLL2ULL(lll_sync->adv);
12761326

1277-
/* The DID for a specific SID shall be unique.
1278-
*/
1279-
did = ull_adv_aux_did_next_unique_get(adv->sid);
1280-
adi->did = sys_cpu_to_le16(did);
1327+
adi->sid = adv->sid;
1328+
1329+
/* The DID for a specific SID shall be unique.
1330+
*/
1331+
did = ull_adv_aux_did_next_unique_get(adv->sid);
1332+
adi->did = sys_cpu_to_le16(did);
1333+
}
12811334
}
12821335

12831336
#if defined(CONFIG_BT_CTLR_DF_ADV_CTE_TX)

0 commit comments

Comments
 (0)