From 5357bd5d0fdd0764b496e91ee2209b1d7a739fed Mon Sep 17 00:00:00 2001 From: Emil Gydesen Date: Wed, 14 Dec 2022 23:53:24 +0100 Subject: [PATCH] Bluetooth: Shell: add pa_ad_init for cmd_per_adv_data Similar to the ad_init that automatically adds advertising data from other modules, pa_ad_init has been added to do the same for periodic advertising. The only use case so far is the BAP broadcast source data, if enabled. Signed-off-by: Emil Gydesen --- subsys/bluetooth/shell/audio.c | 31 ++++++++++++++++++ subsys/bluetooth/shell/bt.c | 58 +++++++++++++++++++++++++++------- subsys/bluetooth/shell/bt.h | 2 ++ 3 files changed, 80 insertions(+), 11 deletions(-) diff --git a/subsys/bluetooth/shell/audio.c b/subsys/bluetooth/shell/audio.c index 29727a5e169..fba6228969b 100644 --- a/subsys/bluetooth/shell/audio.c +++ b/subsys/bluetooth/shell/audio.c @@ -2286,3 +2286,34 @@ ssize_t audio_ad_data_add(struct bt_data *data_array, const size_t data_array_si return nonconnectable_ad_data_add(data_array, data_array_size); } } + +ssize_t audio_pa_data_add(struct bt_data *data_array, + const size_t data_array_size) +{ + size_t ad_len = 0; + +#if defined(CONFIG_BT_AUDIO_BROADCAST_SOURCE) + if (default_source) { + /* Required size of the buffer depends on what has been + * configured. We just use the maximum size possible. + */ + NET_BUF_SIMPLE_DEFINE_STATIC(base_buf, UINT8_MAX); + int err; + + err = bt_audio_broadcast_source_get_base(default_source, + &base_buf); + if (err != 0) { + printk("Unable to get BASE: %d\n", err); + + return -1; + } + + data_array[ad_len].type = BT_DATA_SVC_DATA16; + data_array[ad_len].data_len = base_buf.len; + data_array[ad_len].data = base_buf.data; + ad_len++; + } +#endif /* CONFIG_BT_AUDIO_BROADCAST_SOURCE */ + + return ad_len; +} diff --git a/subsys/bluetooth/shell/bt.c b/subsys/bluetooth/shell/bt.c index 1d2eac1df71..61dd30f304d 100644 --- a/subsys/bluetooth/shell/bt.c +++ b/subsys/bluetooth/shell/bt.c @@ -1977,12 +1977,33 @@ static int cmd_per_adv_param(const struct shell *sh, size_t argc, return 0; } +static ssize_t pa_ad_init(struct bt_data *data_array, + const size_t data_array_size) +{ + size_t ad_len = 0; + + if (IS_ENABLED(CONFIG_BT_AUDIO)) { + ssize_t audio_pa_ad_len; + + audio_pa_ad_len = audio_pa_data_add(&data_array[ad_len], + data_array_size - ad_len); + if (audio_pa_ad_len < 0U) { + return audio_pa_ad_len; + } + + ad_len += audio_pa_ad_len; + } + + return ad_len; +} + static int cmd_per_adv_data(const struct shell *sh, size_t argc, char *argv[]) { struct bt_le_ext_adv *adv = adv_sets[selected_adv]; - static struct bt_data ad; static uint8_t hex_data[256]; + static struct bt_data ad[2U]; + ssize_t stack_ad_len; uint8_t ad_len = 0; int err; @@ -1991,19 +2012,34 @@ static int cmd_per_adv_data(const struct shell *sh, size_t argc, return -EINVAL; } - memset(hex_data, 0, sizeof(hex_data)); - ad_len = hex2bin(argv[1], strlen(argv[1]), hex_data, sizeof(hex_data)); + if (argc > 1) { + size_t hex_len = 0U; - if (!ad_len) { - shell_error(sh, "Could not parse adv data"); - return -ENOEXEC; + (void)memset(hex_data, 0, sizeof(hex_data)); + hex_len = hex2bin(argv[1U], strlen(argv[1U]), hex_data, + sizeof(hex_data)); + + if (hex_len == 0U) { + shell_error(sh, "Could not parse adv data"); + + return -ENOEXEC; + } + + ad[ad_len].data_len = hex_data[0U]; + ad[ad_len].type = hex_data[1U]; + ad[ad_len].data = &hex_data[2U]; + ad_len++; } - ad.data_len = hex_data[0]; - ad.type = hex_data[1]; - ad.data = &hex_data[2]; + stack_ad_len = pa_ad_init(&ad[ad_len], ARRAY_SIZE(ad) - ad_len); + if (stack_ad_len < 0) { + shell_error(sh, "Failed to get stack PA data"); - err = bt_le_per_adv_set_data(adv, &ad, 1); + return -ENOEXEC; + } + ad_len += stack_ad_len; + + err = bt_le_per_adv_set_data(adv, ad, ad_len); if (err) { shell_error(sh, "Failed to set periodic advertising data (%d)", @@ -3670,7 +3706,7 @@ SHELL_STATIC_SUBCMD_SET_CREATE(bt_cmds, SHELL_CMD_ARG(per-adv-param, NULL, "[ [ [tx_power]]]", cmd_per_adv_param, 1, 3), - SHELL_CMD_ARG(per-adv-data, NULL, "", cmd_per_adv_data, 2, 0), + SHELL_CMD_ARG(per-adv-data, NULL, "[data]", cmd_per_adv_data, 1, 1), #endif /* CONFIG_BT_PER_ADV */ #endif /* CONFIG_BT_EXT_ADV */ #endif /* CONFIG_BT_BROADCASTER */ diff --git a/subsys/bluetooth/shell/bt.h b/subsys/bluetooth/shell/bt.h index 0618f45add1..9c0a2a408a2 100644 --- a/subsys/bluetooth/shell/bt.h +++ b/subsys/bluetooth/shell/bt.h @@ -35,6 +35,8 @@ extern struct bt_le_per_adv_sync *per_adv_syncs[CONFIG_BT_PER_ADV_SYNC_MAX]; void conn_addr_str(struct bt_conn *conn, char *addr, size_t len); ssize_t audio_ad_data_add(struct bt_data *data, const size_t data_size, const bool discoverable, const bool connectable); +ssize_t audio_pa_data_add(struct bt_data *data_array, + const size_t data_array_size); ssize_t csis_ad_data_add(struct bt_data *data, const size_t data_size, const bool discoverable); #endif /* __BT_H */