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 <emil.gydesen@nordicsemi.no>
This commit is contained in:
Emil Gydesen 2022-12-14 23:47:41 +01:00 committed by Carles Cufí
commit d115bafd40

View file

@ -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", SHELL_CMD_ARG_REGISTER(audio, &audio_cmds, "Bluetooth audio shell commands",
cmd_audio, 1, 1); cmd_audio, 1, 1);
ssize_t audio_ad_data_add(struct bt_data *data_array, const size_t data_array_size, static ssize_t connectable_ad_data_add(struct bt_data *data_array,
const bool discoverable, const bool connectable) size_t data_array_size)
{ {
static const uint8_t ad_ext_uuid16[] = { static const uint8_t ad_ext_uuid16[] = {
IF_ENABLED(CONFIG_BT_MICP_MIC_DEV, (BT_UUID_16_ENCODE(BT_UUID_MICS_VAL),)) 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; size_t ad_len = 0;
if (!discoverable) {
return 0;
}
if (IS_ENABLED(CONFIG_BT_ASCS)) { if (IS_ENABLED(CONFIG_BT_ASCS)) {
static uint8_t ad_bap_announcement[8] = { static uint8_t ad_bap_announcement[8] = {
BT_UUID_16_ENCODE(BT_UUID_ASCS_VAL), 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; 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 /* 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 * resolvable private address, the HA shall not include the Hearing Access
* Service UUID in the Service UUID AD type field of the advertising data * 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; 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);
}
}