From d115bafd40bf12b5b620293817b22381310a96d2 Mon Sep 17 00:00:00 2001 From: Emil Gydesen Date: Wed, 14 Dec 2022 23:47:41 +0100 Subject: [PATCH] Bluetooth: Audio: Shell: Split audio_ad_data_add into two The call to audio_ad_data_add will now either call connectable_ad_data_add for connectable advertising, or unconnectable_ad_data_add for unconnectbale advertising. Most service UUIDs etc. does not make sense to advertise if not connectable. This also adds the BAP broadcast advertising data to unconnectable. Signed-off-by: Emil Gydesen --- subsys/bluetooth/shell/audio.c | 87 +++++++++++++++++++++++++++++++--- 1 file changed, 80 insertions(+), 7 deletions(-) diff --git a/subsys/bluetooth/shell/audio.c b/subsys/bluetooth/shell/audio.c index dc29b771091..29727a5e169 100644 --- a/subsys/bluetooth/shell/audio.c +++ b/subsys/bluetooth/shell/audio.c @@ -2133,8 +2133,8 @@ static int cmd_audio(const struct shell *sh, size_t argc, char **argv) SHELL_CMD_ARG_REGISTER(audio, &audio_cmds, "Bluetooth audio shell commands", cmd_audio, 1, 1); -ssize_t audio_ad_data_add(struct bt_data *data_array, const size_t data_array_size, - const bool discoverable, const bool connectable) +static ssize_t connectable_ad_data_add(struct bt_data *data_array, + size_t data_array_size) { static const uint8_t ad_ext_uuid16[] = { IF_ENABLED(CONFIG_BT_MICP_MIC_DEV, (BT_UUID_16_ENCODE(BT_UUID_MICS_VAL),)) @@ -2148,10 +2148,6 @@ ssize_t audio_ad_data_add(struct bt_data *data_array, const size_t data_array_si }; size_t ad_len = 0; - if (!discoverable) { - return 0; - } - if (IS_ENABLED(CONFIG_BT_ASCS)) { static uint8_t ad_bap_announcement[8] = { BT_UUID_16_ENCODE(BT_UUID_ASCS_VAL), @@ -2196,7 +2192,7 @@ ssize_t audio_ad_data_add(struct bt_data *data_array, const size_t data_array_si data_array[ad_len].type = BT_DATA_UUID16_SOME; - if (IS_ENABLED(CONFIG_BT_HAS) && IS_ENABLED(CONFIG_BT_PRIVACY) && connectable) { + if (IS_ENABLED(CONFIG_BT_HAS) && IS_ENABLED(CONFIG_BT_PRIVACY)) { /* If the HA is in one of the GAP connectable modes and is using a * resolvable private address, the HA shall not include the Hearing Access * Service UUID in the Service UUID AD type field of the advertising data @@ -2213,3 +2209,80 @@ ssize_t audio_ad_data_add(struct bt_data *data_array, const size_t data_array_si return ad_len; } + +static ssize_t nonconnectable_ad_data_add(struct bt_data *data_array, + const size_t data_array_size) +{ + static const uint8_t ad_ext_uuid16[] = { + IF_ENABLED(CONFIG_BT_PACS, (BT_UUID_16_ENCODE(BT_UUID_PACS_VAL),)) + IF_ENABLED(CONFIG_BT_CAP_ACCEPTOR, (BT_UUID_16_ENCODE(BT_UUID_CAS_VAL),)) + }; + size_t ad_len = 0; + + if (IS_ENABLED(CONFIG_BT_CAP_ACCEPTOR)) { + static const uint8_t ad_cap_announcement[3] = { + BT_UUID_16_ENCODE(BT_UUID_CAS_VAL), + BT_AUDIO_UNICAST_ANNOUNCEMENT_TARGETED, + }; + + __ASSERT(data_array_size > ad_len, "No space for AD_CAP_ANNOUNCEMENT"); + data_array[ad_len].type = BT_DATA_SVC_DATA16; + data_array[ad_len].data_len = ARRAY_SIZE(ad_cap_announcement); + data_array[ad_len].data = &ad_cap_announcement[0]; + ad_len++; + } + +#if defined(CONFIG_BT_AUDIO_BROADCAST_SOURCE) + if (default_source) { + static uint8_t ad_bap_broadcast_announcement[5] = { + BT_UUID_16_ENCODE(BT_UUID_BROADCAST_AUDIO_VAL), + }; + uint32_t broadcast_id; + int err; + + err = bt_audio_broadcast_source_get_id(default_source, + &broadcast_id); + if (err != 0) { + printk("Unable to get broadcast ID: %d\n", err); + + return -1; + } + + ad_bap_broadcast_announcement[2] = (uint8_t)(broadcast_id >> 16); + ad_bap_broadcast_announcement[3] = (uint8_t)(broadcast_id >> 8); + ad_bap_broadcast_announcement[4] = (uint8_t)(broadcast_id >> 0); + data_array[ad_len].type = BT_DATA_SVC_DATA16; + data_array[ad_len].data_len = ARRAY_SIZE(ad_bap_broadcast_announcement); + data_array[ad_len].data = ad_bap_broadcast_announcement; + ad_len++; + } +#endif /* CONFIG_BT_AUDIO_BROADCAST_SOURCE */ + + if (ARRAY_SIZE(ad_ext_uuid16) > 0) { + if (data_array_size <= ad_len) { + shell_warn(ctx_shell, "No space for AD_UUID16"); + return ad_len; + } + + data_array[ad_len].type = BT_DATA_UUID16_SOME; + data_array[ad_len].data_len = ARRAY_SIZE(ad_ext_uuid16); + data_array[ad_len].data = &ad_ext_uuid16[0]; + ad_len++; + } + + return ad_len; +} + +ssize_t audio_ad_data_add(struct bt_data *data_array, const size_t data_array_size, + const bool discoverable, const bool connectable) +{ + if (!discoverable) { + return 0; + } + + if (connectable) { + return connectable_ad_data_add(data_array, data_array_size); + } else { + return nonconnectable_ad_data_add(data_array, data_array_size); + } +}