Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions include/zephyr/bluetooth/audio/bap.h
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,34 @@ extern "C" {
((_bis_bitfield) == 0U || (_bis_bitfield) == BT_BAP_BIS_SYNC_NO_PREF || \
BT_ISO_VALID_BIS_BITFIELD(_bis_bitfield))


/** @brief flags for Periodic Advertising Sync Transfer (PAST) */
enum bt_bap_past_flag {
/** No flag set for PAST Address matching source or ADV_EXT_IND */
BT_BAP_PAST_FLAG_NONE = 0,

/** Advertising Address does not match ADV_EXT_IND */
BT_BAP_PAST_FLAG_NO_MATCH_ADV_EXT_IND = BIT(0),

/** Advertising Address does not match the source */
BT_BAP_PAST_FLAG_NO_MATCH_SRC_ADDR = BIT(1),
};

/**
* @brief Helper to pack addr_type and src_id
*
* @param _past_flags past_addr_types bits0..7
* @param _src_id past_addr_types bits8..15
*/
#define BT_BAP_PAST_SERVICE_DATA(_past_flags, _src_id) \
((uint16_t)(_src_id) & 0xFFU) << 8U | ((uint16_t)(_past_flags) & 0xFFU)

/** Extract BAP addr_type from 16-bit Service Data */
#define BT_BAP_PAST_GET_SRC_ID(_data) (uint8_t)(((_data) & 0xFFU) >> 8U)

/** Extract the BAP flags from 16-bit Service Data */
#define BT_BAP_PAST_GET_FLAGS(_data) (uint8_t)(((_data) & 0xFFU))

/**
* @brief Helper to declare elements of bt_bap_qos_cfg
*
Expand Down
18 changes: 14 additions & 4 deletions subsys/bluetooth/audio/shell/bap_broadcast_assistant.c
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@ static void bap_broadcast_assistant_recv_state_cb(
char le_addr[BT_ADDR_LE_STR_LEN];
char bad_code[33];
bool is_bad_code;
struct bt_le_ext_adv_info info;

if (err != 0) {
bt_shell_error("BASS recv state read failed (%d)", err);
Expand Down Expand Up @@ -176,11 +177,13 @@ static void bap_broadcast_assistant_recv_state_cb(
}

if (per_adv_sync && IS_ENABLED(CONFIG_BT_PER_ADV_SYNC_TRANSFER_SENDER)) {
uint8_t past_flags = BT_BAP_PAST_FLAG_NO_MATCH_ADV_EXT_IND;

bt_shell_print("Sending PAST");

err = bt_le_per_adv_sync_transfer(per_adv_sync,
conn,
BT_UUID_BASS_VAL);
conn,
BT_BAP_PAST_SERVICE_DATA(past_flags, state->src_id));

if (err != 0) {
bt_shell_error("Could not transfer periodic adv sync: %d", err);
Expand Down Expand Up @@ -213,10 +216,17 @@ static void bap_broadcast_assistant_recv_state_cb(

if (ext_adv != NULL && IS_ENABLED(CONFIG_BT_PER_ADV) &&
IS_ENABLED(CONFIG_BT_PER_ADV_SYNC_TRANSFER_SENDER)) {
uint8_t past_flags = BT_BAP_PAST_FLAG_NO_MATCH_ADV_EXT_IND;

err = bt_le_ext_adv_get_info(ext_adv, &info);
__ASSERT(err == 0, "Failed to get adv info: %d", err);


bt_shell_print("Sending local PAST");

err = bt_le_per_adv_set_info_transfer(ext_adv, conn,
BT_UUID_BASS_VAL);
err = bt_le_per_adv_set_info_transfer(ext_adv,
conn,
BT_BAP_PAST_SERVICE_DATA(past_flags, state->src_id));

if (err != 0) {
bt_shell_error("Could not transfer per adv set info: %d", err);
Expand Down
9 changes: 6 additions & 3 deletions tests/bluetooth/tester/src/audio/btp_bap_broadcast.c
Original file line number Diff line number Diff line change
Expand Up @@ -1794,10 +1794,11 @@ uint8_t btp_bap_broadcast_assistant_send_past(const void *cmd, uint16_t cmd_len,
uint16_t *rsp_len)
{
int err;
uint16_t service_data;
struct bt_conn *conn;
struct bt_le_per_adv_sync *pa_sync;
const struct btp_bap_send_past_cmd *cp = cmd;
uint8_t past_flags = BT_BAP_PAST_FLAG_NO_MATCH_ADV_EXT_IND;
uint8_t src_id = cp->src_id;

LOG_DBG("");

Expand All @@ -1818,9 +1819,11 @@ uint8_t btp_bap_broadcast_assistant_send_past(const void *cmd, uint16_t cmd_len,
/* If octet 0 is set to 0, it means AdvA in PAST matches AdvA in ADV_EXT_IND.
* Octet 1 shall be set to Source_ID.
*/
service_data = cp->src_id << 8;

err = bt_le_per_adv_sync_transfer(pa_sync, conn, service_data);
err = bt_le_per_adv_sync_transfer(pa_sync,
conn,
BT_BAP_PAST_SERVICE_DATA(past_flags, src_id));

if (err != 0) {
LOG_DBG("Could not transfer periodic adv sync: %d", err);

Expand Down
8 changes: 6 additions & 2 deletions tests/bsim/bluetooth/audio/src/bap_broadcast_assistant_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -179,8 +179,12 @@

#if defined(CONFIG_BT_PER_ADV_SYNC_TRANSFER_SENDER)
if (state->pa_sync_state == BT_BAP_PA_STATE_INFO_REQ) {
err = bt_le_per_adv_sync_transfer(g_pa_sync, conn,
BT_UUID_BASS_VAL);
uint8_t past_flags = BT_BAP_PAST_FLAG_NO_MATCH_ADV_EXT_IND;

err = bt_le_per_adv_sync_transfer(g_pa_sync,
conn,
BT_BAP_PAST_SERVICE_DATA(past_flags, state->src_id));

if (err != 0) {
FAIL("Could not transfer periodic adv sync: %d\n", err);
return;
Expand Down Expand Up @@ -502,7 +506,7 @@
printk("Source added\n");
}

static void test_bass_mod_source(uint32_t bis_sync)

Check failure on line 509 in tests/bsim/bluetooth/audio/src/bap_broadcast_assistant_test.c

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Refactor this function to reduce its Cognitive Complexity from 27 to the 25 allowed.

See more on https://sonarcloud.io/project/issues?id=zephyrproject-rtos_zephyr&issues=AZrb3fKAKNr-QpTqhgnm&open=AZrb3fKAKNr-QpTqhgnm&pullRequest=100328
{
int err;
struct bt_bap_broadcast_assistant_mod_src_param mod_src_param = { 0 };
Expand Down
10 changes: 9 additions & 1 deletion tests/bsim/bluetooth/audio/src/cap_commander_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -488,6 +488,7 @@ bap_broadcast_assistant_recv_state_cb(struct bt_conn *conn, int err,
char bad_code[BT_ISO_BROADCAST_CODE_SIZE * 2 + 1];
size_t acceptor_count = get_dev_cnt() - 2;


if (err != 0) {
FAIL("BASS recv state read failed (%d)\n", err);
return;
Expand Down Expand Up @@ -534,7 +535,14 @@ bap_broadcast_assistant_recv_state_cb(struct bt_conn *conn, int err,

#if defined(CONFIG_BT_PER_ADV_SYNC_TRANSFER_SENDER)
if (state->pa_sync_state == BT_BAP_PA_STATE_INFO_REQ) {
err = bt_le_per_adv_sync_transfer(g_pa_sync, conn, BT_UUID_BASS_VAL);
uint8_t past_flags = BT_BAP_PAST_FLAG_NO_MATCH_ADV_EXT_IND;
struct bt_le_per_adv_sync_info per_adv_info;

bt_le_per_adv_sync_get_info(g_pa_sync, &per_adv_info);

err = bt_le_per_adv_sync_transfer(g_pa_sync,
conn,
BT_BAP_PAST_SERVICE_DATA(past_flags, state->src_id));
if (err != 0) {
FAIL("Could not transfer periodic adv sync: %d\n", err);
return;
Expand Down
Loading