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 <emil.gydesen@nordicsemi.no>
This commit is contained in:
Emil Gydesen 2024-11-11 15:35:55 +01:00 committed by Benjamin Cabé
parent f25a8aaf1a
commit 4d60f0a51b

View file

@ -12,6 +12,7 @@
#include <zephyr/console/console.h> #include <zephyr/console/console.h>
#include <zephyr/bluetooth/bluetooth.h> #include <zephyr/bluetooth/bluetooth.h>
#include <zephyr/bluetooth/iso.h> #include <zephyr/bluetooth/iso.h>
#include <zephyr/kernel.h>
#include <zephyr/sys/byteorder.h> #include <zephyr/sys/byteorder.h>
#include <zephyr/logging/log.h> #include <zephyr/logging/log.h>
@ -86,7 +87,7 @@ static void iso_disconnected(struct bt_iso_chan *chan, uint8_t reason)
chan, reason); chan, reason);
connected_bis--; connected_bis--;
if (connected_bis == big_create_param.num_bis) { if (connected_bis == 0) {
k_sem_give(&sem_big_term); k_sem_give(&sem_big_term);
} }
} }
@ -681,7 +682,7 @@ static int create_big(struct bt_le_ext_adv **adv, struct bt_iso_big **big)
err = bt_le_ext_adv_set_data(*adv, ad, ARRAY_SIZE(ad), NULL, 0); err = bt_le_ext_adv_set_data(*adv, ad, ARRAY_SIZE(ad), NULL, 0);
if (err) { if (err) {
LOG_ERR("Failed to set advertising data (err %d)", err); LOG_ERR("Failed to set advertising data (err %d)", err);
return 0; return err;
} }
LOG_INF("Setting Periodic Advertising parameters"); 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)
{ {
int err; int err;
err = bt_iso_big_terminate(*big); if (*big != NULL) {
if (err != 0) { err = bt_iso_big_terminate(*big);
LOG_ERR("Failed to terminate BIG (err %d)", err); if (err != 0) {
return err; LOG_ERR("Failed to terminate BIG (err %d)", err);
} return err;
*big = NULL; }
err = k_sem_take(&sem_big_term, K_FOREVER);
err = bt_le_per_adv_stop(*adv); if (err != 0) {
if (err != 0) { LOG_ERR("failed to take sem_big_term (err %d)", err);
LOG_ERR("Failed to stop periodic advertising (err %d)", err); return err;
return err; }
*big = NULL;
} }
err = bt_le_ext_adv_stop(*adv); if (*adv != NULL) {
if (err != 0) { err = bt_le_per_adv_stop(*adv);
LOG_ERR("Failed to stop advertising (err %d)", err); if (err != 0) {
return err; LOG_ERR("Failed to stop periodic advertising (err %d)", err);
} return err;
}
err = bt_le_ext_adv_delete(*adv); err = bt_le_ext_adv_stop(*adv);
if (err != 0) { if (err != 0) {
LOG_ERR("Failed to delete advertiser (err %d)", err); LOG_ERR("Failed to stop advertising (err %d)", err);
return err; return err;
} }
*adv = NULL; err = bt_le_ext_adv_delete(*adv);
if (err != 0) {
LOG_ERR("Failed to delete advertiser (err %d)", err);
return err;
}
*adv = NULL;
}
return 0; return 0;
} }
@ -810,7 +820,15 @@ int test_run_broadcaster(void)
err = create_big(&adv, &big); err = create_big(&adv, &big);
if (err) { if (err) {
int del_err;
LOG_ERR("Could not create BIG: %d", err); LOG_ERR("Could not create BIG: %d", err);
del_err = delete_big(&adv, &big);
if (del_err) {
LOG_ERR("Could not delete BIG: %d", del_err);
}
return err; return err;
} }