Bluetooth: audio: ascs: Move metadata validation to stack

As the metadata has to be validated anyway, let the initial vaidation of
metadata to be done in ASCS. The application can still reject the
metadata, but the length validation and supported type validation can be
performed by the stack.

Signed-off-by: Mariusz Skamra <mariusz.skamra@codecoup.pl>
This commit is contained in:
Mariusz Skamra 2023-08-01 15:49:19 +02:00 committed by Carles Cufí
commit d28f180473
10 changed files with 102 additions and 308 deletions

View file

@ -264,45 +264,6 @@ static int lc3_start(struct bt_bap_stream *stream, struct bt_bap_ascs_rsp *rsp)
return 0;
}
static bool valid_metadata_type(uint8_t type, uint8_t len)
{
switch (type) {
case BT_AUDIO_METADATA_TYPE_PREF_CONTEXT:
case BT_AUDIO_METADATA_TYPE_STREAM_CONTEXT:
if (len != 2) {
return false;
}
return true;
case BT_AUDIO_METADATA_TYPE_STREAM_LANG:
if (len != 3) {
return false;
}
return true;
case BT_AUDIO_METADATA_TYPE_PARENTAL_RATING:
if (len != 1) {
return false;
}
return true;
case BT_AUDIO_METADATA_TYPE_EXTENDED: /* 2 - 255 octets */
case BT_AUDIO_METADATA_TYPE_VENDOR: /* 2 - 255 octets */
/* At least Extended Metadata Type / Company_ID should be there */
if (len < 2) {
return false;
}
return true;
case BT_AUDIO_METADATA_TYPE_CCID_LIST:
case BT_AUDIO_METADATA_TYPE_PROGRAM_INFO: /* 0 - 255 octets */
case BT_AUDIO_METADATA_TYPE_PROGRAM_INFO_URI: /* 0 - 255 octets */
return true;
default:
return false;
}
}
static int lc3_metadata(struct bt_bap_stream *stream, const struct bt_audio_codec_data *meta,
size_t meta_count, struct bt_bap_ascs_rsp *rsp)
{
@ -311,7 +272,7 @@ static int lc3_metadata(struct bt_bap_stream *stream, const struct bt_audio_code
for (size_t i = 0; i < meta_count; i++) {
const struct bt_audio_codec_data *data = &meta[i];
if (!valid_metadata_type(data->data.type, data->data.data_len)) {
if (!BT_AUDIO_METADATA_TYPE_IS_KNOWN(data->data.type)) {
printk("Invalid metadata type %u or length %u\n",
data->data.type, data->data.data_len);
*rsp = BT_BAP_ASCS_RSP(BT_BAP_ASCS_RSP_CODE_METADATA_REJECTED,

View file

@ -173,45 +173,6 @@ static int lc3_start(struct bt_bap_stream *stream, struct bt_bap_ascs_rsp *rsp)
return 0;
}
static bool valid_metadata_type(uint8_t type, uint8_t len)
{
switch (type) {
case BT_AUDIO_METADATA_TYPE_PREF_CONTEXT:
case BT_AUDIO_METADATA_TYPE_STREAM_CONTEXT:
if (len != 2) {
return false;
}
return true;
case BT_AUDIO_METADATA_TYPE_STREAM_LANG:
if (len != 3) {
return false;
}
return true;
case BT_AUDIO_METADATA_TYPE_PARENTAL_RATING:
if (len != 1) {
return false;
}
return true;
case BT_AUDIO_METADATA_TYPE_EXTENDED: /* 2 - 255 octets */
case BT_AUDIO_METADATA_TYPE_VENDOR: /* 2 - 255 octets */
/* At least Extended Metadata Type / Company_ID should be there */
if (len < 2) {
return false;
}
return true;
case BT_AUDIO_METADATA_TYPE_CCID_LIST:
case BT_AUDIO_METADATA_TYPE_PROGRAM_INFO: /* 0 - 255 octets */
case BT_AUDIO_METADATA_TYPE_PROGRAM_INFO_URI: /* 0 - 255 octets */
return true;
default:
return false;
}
}
static int lc3_metadata(struct bt_bap_stream *stream, const struct bt_audio_codec_data *meta,
size_t meta_count, struct bt_bap_ascs_rsp *rsp)
{
@ -221,7 +182,7 @@ static int lc3_metadata(struct bt_bap_stream *stream, const struct bt_audio_code
for (size_t i = 0; i < meta_count; i++) {
const struct bt_audio_codec_data *data = &meta[i];
if (!valid_metadata_type(data->data.type, data->data.data_len)) {
if (!BT_AUDIO_METADATA_TYPE_IS_KNOWN(data->data.type)) {
printk("Invalid metadata type %u or length %u\n",
data->data.type, data->data.data_len);
*rsp = BT_BAP_ASCS_RSP(BT_BAP_ASCS_RSP_CODE_METADATA_REJECTED,

View file

@ -408,45 +408,6 @@ static int lc3_start(struct bt_bap_stream *stream, struct bt_bap_ascs_rsp *rsp)
return 0;
}
static bool valid_metadata_type(uint8_t type, uint8_t len)
{
switch (type) {
case BT_AUDIO_METADATA_TYPE_PREF_CONTEXT:
case BT_AUDIO_METADATA_TYPE_STREAM_CONTEXT:
if (len != 2) {
return false;
}
return true;
case BT_AUDIO_METADATA_TYPE_STREAM_LANG:
if (len != 3) {
return false;
}
return true;
case BT_AUDIO_METADATA_TYPE_PARENTAL_RATING:
if (len != 1) {
return false;
}
return true;
case BT_AUDIO_METADATA_TYPE_EXTENDED: /* 2 - 255 octets */
case BT_AUDIO_METADATA_TYPE_VENDOR: /* 2 - 255 octets */
/* At least Extended Metadata Type / Company_ID should be there */
if (len < 2) {
return false;
}
return true;
case BT_AUDIO_METADATA_TYPE_CCID_LIST:
case BT_AUDIO_METADATA_TYPE_PROGRAM_INFO: /* 0 - 255 octets */
case BT_AUDIO_METADATA_TYPE_PROGRAM_INFO_URI: /* 0 - 255 octets */
return true;
default:
return false;
}
}
static int lc3_metadata(struct bt_bap_stream *stream, const struct bt_audio_codec_data *meta,
size_t meta_count, struct bt_bap_ascs_rsp *rsp)
{
@ -455,7 +416,7 @@ static int lc3_metadata(struct bt_bap_stream *stream, const struct bt_audio_code
for (size_t i = 0; i < meta_count; i++) {
const struct bt_audio_codec_data *data = &meta[i];
if (!valid_metadata_type(data->data.type, data->data.data_len)) {
if (!BT_AUDIO_METADATA_TYPE_IS_KNOWN(data->data.type)) {
printk("Invalid metadata type %u or length %u\n",
data->data.type, data->data.data_len);
*rsp = BT_BAP_ASCS_RSP(BT_BAP_ASCS_RSP_CODE_METADATA_REJECTED,