Skip to content

Commit b361c95

Browse files
Thalleyfabiobaltieri
authored andcommitted
tests: Bluetooth: BAP: Add verification of receive state for the BA
The broadcast assistant will now validate the content of the received receive states. Some modifications were done to the tests to properly pass these new validations. Signed-off-by: Emil Gydesen <[email protected]>
1 parent ebbdb10 commit b361c95

File tree

7 files changed

+221
-53
lines changed

7 files changed

+221
-53
lines changed

tests/bsim/bluetooth/audio/src/bap_broadcast_assistant_test.c

Lines changed: 167 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2021-2023 Nordic Semiconductor ASA
2+
* Copyright (c) 2021-2025 Nordic Semiconductor ASA
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -33,16 +33,15 @@
3333
extern enum bst_result_t bst_result;
3434

3535
/* BASS variables */
36-
static volatile uint8_t g_src_id;
3736
static volatile uint32_t g_broadcast_id;
3837
static volatile uint8_t g_recv_state_count;
38+
static struct bt_bap_scan_delegator_recv_state recv_state;
3939
CREATE_FLAG(flag_discovery_complete);
4040
CREATE_FLAG(flag_write_complete);
4141
CREATE_FLAG(flag_cb_called);
4242
CREATE_FLAG(flag_broadcaster_found);
4343
CREATE_FLAG(flag_pa_synced);
4444
CREATE_FLAG(flag_pa_terminated);
45-
CREATE_FLAG(flag_state_synced);
4645
CREATE_FLAG(flag_mtu_exchanged);
4746
CREATE_FLAG(flag_recv_state_read);
4847
CREATE_FLAG(flag_recv_state_updated);
@@ -135,23 +134,23 @@ static void bap_broadcast_assistant_recv_state_cb(
135134
printk("BASS recv state: src_id %u, addr %s, sid %u, sync_state %u, encrypt_state %u%s%s\n",
136135
state->src_id, le_addr, state->adv_sid, state->pa_sync_state, state->encrypt_state,
137136
state->encrypt_state == BT_BAP_BIG_ENC_STATE_BAD_CODE ? ", bad code: " : "",
138-
bad_code);
137+
state->encrypt_state == BT_BAP_BIG_ENC_STATE_BAD_CODE ? bad_code : "");
139138

140139
if (state->encrypt_state == BT_BAP_BIG_ENC_STATE_BCODE_REQ) {
141140
SET_FLAG(flag_broadcast_code_requested);
142141
} else if (state->encrypt_state == BT_BAP_BIG_ENC_STATE_BAD_CODE) {
143142
SET_FLAG(flag_incorrect_broadcast_code);
144143
if (memcmp(state->bad_code, INCORRECT_BROADCAST_CODE, BT_ISO_BROADCAST_CODE_SIZE) !=
145144
0) {
146-
FAIL("Bad code is not what we sent");
145+
FAIL("Bad code is not what we sent\n");
147146
return;
148147
}
149148

150149
for (uint8_t i = 0; i < state->num_subgroups; i++) {
151150
const struct bt_bap_bass_subgroup *subgroup = &state->subgroups[i];
152151

153152
if (subgroup->bis_sync != BT_BAP_BIS_SYNC_FAILED) {
154-
FAIL("Invalid BIS sync value 0x%08X for failed sync",
153+
FAIL("Invalid BIS sync value 0x%08X for failed sync\n",
155154
subgroup->bis_sync);
156155
return;
157156
}
@@ -185,13 +184,8 @@ static void bap_broadcast_assistant_recv_state_cb(
185184
}
186185
#endif /* CONFIG_BT_PER_ADV_SYNC_TRANSFER_SENDER */
187186

188-
if (state->pa_sync_state == BT_BAP_PA_STATE_SYNCED) {
189-
SET_FLAG(flag_state_synced);
190-
}
191-
192-
g_src_id = state->src_id;
187+
memcpy(&recv_state, state, sizeof(recv_state));
193188
SET_FLAG(flag_cb_called);
194-
195189
SET_FLAG(flag_recv_state_updated);
196190
}
197191

@@ -451,56 +445,169 @@ static void test_bass_add_source(void)
451445
return;
452446
}
453447

448+
WAIT_FOR_FLAG(flag_recv_state_updated);
449+
450+
if (!bt_addr_le_eq(&recv_state.addr, &add_src_param.addr)) {
451+
char addr[BT_ADDR_LE_STR_LEN];
452+
char expected_addr[BT_ADDR_LE_STR_LEN];
453+
454+
bt_addr_le_to_str(&recv_state.addr, addr, sizeof(addr));
455+
bt_addr_le_to_str(&add_src_param.addr, expected_addr, sizeof(expected_addr));
456+
457+
FAIL("Unexpected addr %s != %s\n", addr, expected_addr);
458+
return;
459+
}
460+
461+
if (recv_state.adv_sid != add_src_param.adv_sid) {
462+
FAIL("Unexpected SID: %u\n", recv_state.adv_sid);
463+
return;
464+
}
465+
466+
if (recv_state.pa_sync_state != BT_BAP_PA_STATE_NOT_SYNCED) {
467+
FAIL("Unexpected PA sync state: %d\n", recv_state.pa_sync_state);
468+
return;
469+
}
470+
471+
if (recv_state.encrypt_state != BT_BAP_BIG_ENC_STATE_NO_ENC) {
472+
FAIL("Unexpected BIG encryption state: %d\n", recv_state.pa_sync_state);
473+
return;
474+
}
475+
476+
if (recv_state.broadcast_id != add_src_param.broadcast_id) {
477+
FAIL("Unexpected broadcast ID: 0x%06X != 0x%06X\n", recv_state.broadcast_id,
478+
add_src_param.broadcast_id);
479+
return;
480+
}
481+
482+
if (recv_state.num_subgroups != add_src_param.num_subgroups) {
483+
FAIL("Unexpected number of subgroups: %u\n", recv_state.num_subgroups);
484+
return;
485+
}
486+
454487
WAIT_FOR_FLAG(flag_cb_called);
455488
WAIT_FOR_FLAG(flag_write_complete);
489+
456490
printk("Source added\n");
457491
}
458492

459-
static void test_bass_mod_source(void)
493+
static void test_bass_mod_source(uint32_t bis_sync)
460494
{
461495
int err;
462496
struct bt_bap_broadcast_assistant_mod_src_param mod_src_param = { 0 };
463-
struct bt_bap_bass_subgroup subgroup = { 0 };
497+
struct bt_bap_bass_subgroup subgroup = {0};
498+
uint32_t remote_bis_sync;
464499

465500
printk("Modify source\n");
466501
UNSET_FLAG(flag_cb_called);
467502
UNSET_FLAG(flag_write_complete);
468-
mod_src_param.src_id = g_src_id;
503+
UNSET_FLAG(flag_recv_state_updated);
504+
mod_src_param.src_id = recv_state.src_id;
469505
mod_src_param.num_subgroups = 1;
470506
mod_src_param.pa_sync = true;
471507
mod_src_param.subgroups = &subgroup;
472508
mod_src_param.pa_interval = g_broadcaster_info.interval;
473-
subgroup.bis_sync = BT_ISO_BIS_INDEX_BIT(1) | BT_ISO_BIS_INDEX_BIT(2); /* Indexes 1 and 2 */
474-
subgroup.metadata_len = 0;
509+
subgroup.bis_sync = bis_sync;
510+
511+
/* Leave metadata as is */
512+
subgroup.metadata_len = recv_state.subgroups[0].metadata_len;
513+
memcpy(subgroup.metadata, recv_state.subgroups[0].metadata, sizeof(metadata));
475514

476515
err = bt_bap_broadcast_assistant_mod_src(default_conn, &mod_src_param);
477516
if (err != 0) {
478517
FAIL("Could not modify source (err %d)\n", err);
479518
return;
480519
}
520+
printk("Source modified, waiting for server to PA sync\n");
521+
522+
WAIT_FOR_AND_CLEAR_FLAG(flag_recv_state_updated);
523+
524+
if (recv_state.pa_sync_state == BT_BAP_PA_STATE_INFO_REQ) {
525+
/* Wait for PAST to finish and then a new receive state */
526+
printk("Waiting for PAST sync\n");
527+
WAIT_FOR_AND_CLEAR_FLAG(flag_recv_state_updated);
528+
}
529+
530+
if (recv_state.pa_sync_state != BT_BAP_PA_STATE_SYNCED) {
531+
FAIL("Unexpected PA sync state: %d\n", recv_state.pa_sync_state);
532+
return;
533+
}
534+
535+
if (recv_state.encrypt_state != BT_BAP_BIG_ENC_STATE_NO_ENC) {
536+
FAIL("Unexpected BIG encryption state: %d\n", recv_state.pa_sync_state);
537+
return;
538+
}
539+
540+
if (recv_state.num_subgroups != mod_src_param.num_subgroups) {
541+
FAIL("Unexpected number of subgroups: %u\n", recv_state.num_subgroups);
542+
return;
543+
}
544+
545+
/* Wait for another notification that updates the metadata of the subgroups */
546+
if (recv_state.subgroups[0].metadata_len == 0U) {
547+
printk("Waiting for another receive state update with metadata\n");
548+
WAIT_FOR_AND_CLEAR_FLAG(flag_recv_state_updated);
549+
}
550+
551+
remote_bis_sync = recv_state.subgroups[0].bis_sync;
552+
if (subgroup.bis_sync == 0) {
553+
if (remote_bis_sync != 0U) {
554+
FAIL("Unexpected BIS sync value: %u\n", remote_bis_sync);
555+
return;
556+
}
557+
} else {
558+
printk("Waiting for BIS sync\n");
559+
560+
if (remote_bis_sync == 0U &&
561+
recv_state.encrypt_state == BT_BAP_BIG_ENC_STATE_NO_ENC) {
562+
/* Wait for another notification, which will either request a broadcast code
563+
* for encrypted broadcasts, or have the BIS sync values set
564+
*/
565+
printk("Waiting for another receive state update with BIS sync\n");
566+
WAIT_FOR_AND_CLEAR_FLAG(flag_recv_state_updated);
567+
remote_bis_sync = recv_state.subgroups[0].bis_sync;
568+
}
569+
570+
if (recv_state.encrypt_state == BT_BAP_BIG_ENC_STATE_BCODE_REQ) {
571+
printk("Remote is requesting broadcast code\n");
572+
if (remote_bis_sync != 0U) {
573+
FAIL("Unexpected BIS sync value: %u", remote_bis_sync);
574+
return;
575+
}
576+
} else if (recv_state.encrypt_state == BT_BAP_BIG_ENC_STATE_BAD_CODE) {
577+
printk("Remote responded with bad code\n");
578+
if (remote_bis_sync != 0U) {
579+
FAIL("Unexpected BIS sync value: %u", remote_bis_sync);
580+
return;
581+
}
582+
} else if (remote_bis_sync != subgroup.bis_sync) {
583+
FAIL("Unexpected BIS sync value: %u != %u\n", remote_bis_sync,
584+
subgroup.bis_sync);
585+
return;
586+
}
587+
}
481588

482589
WAIT_FOR_FLAG(flag_cb_called);
483590
WAIT_FOR_FLAG(flag_write_complete);
484-
printk("Source added, waiting for server to PA sync\n");
485-
WAIT_FOR_FLAG(flag_state_synced)
486-
printk("Server PA synced\n");
591+
printk("Source modified\n");
487592
}
488593

489594
static void test_bass_mod_source_long_meta(void)
490595
{
491596
int err;
492597
struct bt_bap_broadcast_assistant_mod_src_param mod_src_param = { 0 };
493598
struct bt_bap_bass_subgroup subgroup = { 0 };
599+
uint32_t remote_bis_sync;
494600

495601
printk("Long write\n");
496602
UNSET_FLAG(flag_cb_called);
497603
UNSET_FLAG(flag_write_complete);
498-
mod_src_param.src_id = g_src_id;
604+
UNSET_FLAG(flag_recv_state_updated);
605+
mod_src_param.src_id = recv_state.src_id;
499606
mod_src_param.num_subgroups = 1;
500607
mod_src_param.pa_sync = true;
501608
mod_src_param.subgroups = &subgroup;
502609
mod_src_param.pa_interval = g_broadcaster_info.interval;
503-
subgroup.bis_sync = BT_ISO_BIS_INDEX_BIT(1) | BT_ISO_BIS_INDEX_BIT(2);
610+
subgroup.bis_sync = recv_state.subgroups[0].bis_sync;
504611

505612
subgroup.metadata_len = sizeof(metadata);
506613
memcpy(subgroup.metadata, metadata, sizeof(metadata));
@@ -509,12 +616,41 @@ static void test_bass_mod_source_long_meta(void)
509616
FAIL("Could not modify source (err %d)\n", err);
510617
return;
511618
}
619+
printk("Source modified, waiting for receive state\n");
620+
621+
WAIT_FOR_FLAG(flag_recv_state_updated);
622+
623+
remote_bis_sync = recv_state.subgroups[0].bis_sync;
624+
if (recv_state.pa_sync_state != BT_BAP_PA_STATE_SYNCED) {
625+
FAIL("Unexpected PA sync state: %d\n", recv_state.pa_sync_state);
626+
return;
627+
}
628+
629+
if (recv_state.encrypt_state != BT_BAP_BIG_ENC_STATE_NO_ENC) {
630+
FAIL("Unexpected BIG encryption state: %d\n", recv_state.pa_sync_state);
631+
return;
632+
}
633+
634+
if (recv_state.num_subgroups != mod_src_param.num_subgroups) {
635+
FAIL("Unexpected number of subgroups: %u\n", recv_state.num_subgroups);
636+
return;
637+
}
638+
639+
if (remote_bis_sync != 0U && remote_bis_sync != subgroup.bis_sync) {
640+
FAIL("Unexpected BIS sync value: %u\n", remote_bis_sync);
641+
return;
642+
}
643+
644+
if (memcmp(recv_state.subgroups[0].metadata, subgroup.metadata, subgroup.metadata_len) !=
645+
0) {
646+
FAIL("Unexpected metadata (len %u / %u)\n", recv_state.subgroups[0].metadata_len,
647+
subgroup.metadata_len);
648+
return;
649+
}
512650

513651
WAIT_FOR_FLAG(flag_cb_called);
514652
WAIT_FOR_FLAG(flag_write_complete);
515-
printk("Source added, waiting for server to PA sync\n");
516-
WAIT_FOR_FLAG(flag_state_synced)
517-
printk("Server PA synced\n");
653+
printk("Source modified with long meta\n");
518654
}
519655

520656
static void test_bass_broadcast_code(const uint8_t broadcast_code[BT_ISO_BROADCAST_CODE_SIZE])
@@ -523,7 +659,8 @@ static void test_bass_broadcast_code(const uint8_t broadcast_code[BT_ISO_BROADCA
523659

524660
printk("Adding broadcast code\n");
525661
UNSET_FLAG(flag_write_complete);
526-
err = bt_bap_broadcast_assistant_set_broadcast_code(default_conn, g_src_id, broadcast_code);
662+
err = bt_bap_broadcast_assistant_set_broadcast_code(default_conn, recv_state.src_id,
663+
broadcast_code);
527664
if (err != 0) {
528665
FAIL("Could not add broadcast code (err %d)\n", err);
529666
return;
@@ -540,7 +677,7 @@ static void test_bass_remove_source(void)
540677
printk("Removing source\n");
541678
UNSET_FLAG(flag_cb_called);
542679
UNSET_FLAG(flag_write_complete);
543-
err = bt_bap_broadcast_assistant_rem_src(default_conn, g_src_id);
680+
err = bt_bap_broadcast_assistant_rem_src(default_conn, recv_state.src_id);
544681
if (err != 0) {
545682
FAIL("Could not remove source (err %d)\n", err);
546683
return;
@@ -599,8 +736,9 @@ static void test_main_client_sync(void)
599736
test_bass_scan_stop();
600737
test_bass_create_pa_sync();
601738
test_bass_add_source();
602-
test_bass_mod_source();
739+
test_bass_mod_source(0);
603740
test_bass_mod_source_long_meta();
741+
test_bass_mod_source(BT_ISO_BIS_INDEX_BIT(1) | BT_ISO_BIS_INDEX_BIT(2));
604742
test_bass_broadcast_code(BROADCAST_CODE);
605743

606744
printk("Waiting for receive state with BIS sync\n");
@@ -625,7 +763,7 @@ static void test_main_client_sync_incorrect_code(void)
625763
test_bass_scan_stop();
626764
test_bass_create_pa_sync();
627765
test_bass_add_source();
628-
test_bass_mod_source();
766+
test_bass_mod_source(BT_ISO_BIS_INDEX_BIT(1));
629767
WAIT_FOR_FLAG(flag_broadcast_code_requested);
630768
test_bass_broadcast_code(INCORRECT_BROADCAST_CODE);
631769
WAIT_FOR_FLAG(flag_incorrect_broadcast_code);

tests/bsim/bluetooth/audio/src/bap_broadcast_sink_test.c

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2021-2024 Nordic Semiconductor ASA
2+
* Copyright (c) 2021-2025 Nordic Semiconductor ASA
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -250,7 +250,18 @@ static void base_recv_cb(struct bt_bap_broadcast_sink *sink, const struct bt_bap
250250
return;
251251
}
252252

253-
bis_index_bitfield = base_bis_index_bitfield & bis_index_mask;
253+
if (requested_bis_sync == 0) {
254+
bis_index_bitfield = base_bis_index_bitfield & bis_index_mask;
255+
} else {
256+
if ((requested_bis_sync & base_bis_index_bitfield) != requested_bis_sync) {
257+
FAIL("Assistant has request BIS indexes 0x%08x that is not in the BASE "
258+
"0x%08x\n",
259+
requested_bis_sync, base_bis_index_bitfield);
260+
return;
261+
}
262+
263+
bis_index_bitfield = requested_bis_sync & bis_index_mask;
264+
}
254265

255266
SET_FLAG(flag_base_received);
256267
}
@@ -770,7 +781,7 @@ static void test_broadcast_sync(const uint8_t broadcast_code[BT_ISO_BROADCAST_CO
770781
{
771782
int err;
772783

773-
printk("Syncing sink %p\n", g_sink);
784+
printk("Syncing sink %p to 0x%08x\n", g_sink, bis_index_bitfield);
774785
err = bt_bap_broadcast_sink_sync(g_sink, bis_index_bitfield, streams, broadcast_code);
775786
if (err != 0) {
776787
FAIL("Unable to sync the sink: %d\n", err);

0 commit comments

Comments
 (0)