Skip to content

Commit 4d60f0a

Browse files
Thalleykartben
authored andcommitted
samples: Bluetooth: Handle shutdown of iso broadcast benchmark
The sample did not properly handle ending the broadcast and setting it up for a new broadcast, due to missing wait for sem_big_term and a bad check in iso_disconnected. Furthermore if any did not work when setting up the BIG, the error handling did not properly clean up for a retry. Signed-off-by: Emil Gydesen <[email protected]>
1 parent f25a8aa commit 4d60f0a

File tree

1 file changed

+41
-23
lines changed

1 file changed

+41
-23
lines changed

samples/bluetooth/iso_broadcast_benchmark/src/broadcaster.c

Lines changed: 41 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include <zephyr/console/console.h>
1313
#include <zephyr/bluetooth/bluetooth.h>
1414
#include <zephyr/bluetooth/iso.h>
15+
#include <zephyr/kernel.h>
1516
#include <zephyr/sys/byteorder.h>
1617

1718
#include <zephyr/logging/log.h>
@@ -86,7 +87,7 @@ static void iso_disconnected(struct bt_iso_chan *chan, uint8_t reason)
8687
chan, reason);
8788

8889
connected_bis--;
89-
if (connected_bis == big_create_param.num_bis) {
90+
if (connected_bis == 0) {
9091
k_sem_give(&sem_big_term);
9192
}
9293
}
@@ -681,7 +682,7 @@ static int create_big(struct bt_le_ext_adv **adv, struct bt_iso_big **big)
681682
err = bt_le_ext_adv_set_data(*adv, ad, ARRAY_SIZE(ad), NULL, 0);
682683
if (err) {
683684
LOG_ERR("Failed to set advertising data (err %d)", err);
684-
return 0;
685+
return err;
685686
}
686687

687688
LOG_INF("Setting Periodic Advertising parameters");
@@ -739,32 +740,41 @@ static int delete_big(struct bt_le_ext_adv **adv, struct bt_iso_big **big)
739740
{
740741
int err;
741742

742-
err = bt_iso_big_terminate(*big);
743-
if (err != 0) {
744-
LOG_ERR("Failed to terminate BIG (err %d)", err);
745-
return err;
743+
if (*big != NULL) {
744+
err = bt_iso_big_terminate(*big);
745+
if (err != 0) {
746+
LOG_ERR("Failed to terminate BIG (err %d)", err);
747+
return err;
748+
}
749+
err = k_sem_take(&sem_big_term, K_FOREVER);
750+
if (err != 0) {
751+
LOG_ERR("failed to take sem_big_term (err %d)", err);
752+
return err;
753+
}
754+
*big = NULL;
746755
}
747-
*big = NULL;
748756

749-
err = bt_le_per_adv_stop(*adv);
750-
if (err != 0) {
751-
LOG_ERR("Failed to stop periodic advertising (err %d)", err);
752-
return err;
753-
}
757+
if (*adv != NULL) {
758+
err = bt_le_per_adv_stop(*adv);
759+
if (err != 0) {
760+
LOG_ERR("Failed to stop periodic advertising (err %d)", err);
761+
return err;
762+
}
754763

755-
err = bt_le_ext_adv_stop(*adv);
756-
if (err != 0) {
757-
LOG_ERR("Failed to stop advertising (err %d)", err);
758-
return err;
759-
}
764+
err = bt_le_ext_adv_stop(*adv);
765+
if (err != 0) {
766+
LOG_ERR("Failed to stop advertising (err %d)", err);
767+
return err;
768+
}
760769

761-
err = bt_le_ext_adv_delete(*adv);
762-
if (err != 0) {
763-
LOG_ERR("Failed to delete advertiser (err %d)", err);
764-
return err;
765-
}
770+
err = bt_le_ext_adv_delete(*adv);
771+
if (err != 0) {
772+
LOG_ERR("Failed to delete advertiser (err %d)", err);
773+
return err;
774+
}
766775

767-
*adv = NULL;
776+
*adv = NULL;
777+
}
768778

769779
return 0;
770780
}
@@ -810,7 +820,15 @@ int test_run_broadcaster(void)
810820

811821
err = create_big(&adv, &big);
812822
if (err) {
823+
int del_err;
824+
813825
LOG_ERR("Could not create BIG: %d", err);
826+
827+
del_err = delete_big(&adv, &big);
828+
if (del_err) {
829+
LOG_ERR("Could not delete BIG: %d", del_err);
830+
}
831+
814832
return err;
815833
}
816834

0 commit comments

Comments
 (0)