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 */
3333extern enum bst_result_t bst_result ;
3434
3535/* BASS variables */
36- static volatile uint8_t g_src_id ;
3736static volatile uint32_t g_broadcast_id ;
3837static volatile uint8_t g_recv_state_count ;
38+ static struct bt_bap_scan_delegator_recv_state recv_state ;
3939CREATE_FLAG (flag_discovery_complete );
4040CREATE_FLAG (flag_write_complete );
4141CREATE_FLAG (flag_cb_called );
4242CREATE_FLAG (flag_broadcaster_found );
4343CREATE_FLAG (flag_pa_synced );
4444CREATE_FLAG (flag_pa_terminated );
45- CREATE_FLAG (flag_state_synced );
4645CREATE_FLAG (flag_mtu_exchanged );
4746CREATE_FLAG (flag_recv_state_read );
4847CREATE_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
489594static 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
520656static 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 );
0 commit comments