monitor: Make use of util_debug_tlv to decode TLV entries

This uses util_debug_tlv to decode TLV entries.
This commit is contained in:
Luiz Augusto von Dentz 2023-10-17 17:05:07 -07:00
parent ffc5819ce4
commit e1ec086614
3 changed files with 75 additions and 121 deletions

View File

@ -675,8 +675,15 @@ static bool print_ase_codec(const struct l2cap_frame *frame)
return true;
}
static void print_ltv(const char *str, void *user_data)
{
const char *label = user_data;
print_field("%s: %s", label, str);
}
static bool print_ase_lv(const struct l2cap_frame *frame, const char *label,
struct packet_ltv_decoder *decoder, size_t decoder_len)
struct util_ltv_debugger *decoder, size_t decoder_len)
{
struct bt_hci_lv_data *lv;
@ -691,13 +698,14 @@ static bool print_ase_lv(const struct l2cap_frame *frame, const char *label,
return false;
}
packet_print_ltv(label, lv->data, lv->len, decoder, decoder_len);
util_debug_ltv(lv->data, lv->len, decoder, decoder_len, print_ltv,
(void *) label);
return true;
}
static bool print_ase_cc(const struct l2cap_frame *frame, const char *label,
struct packet_ltv_decoder *decoder, size_t decoder_len)
struct util_ltv_debugger *decoder, size_t decoder_len)
{
return print_ase_lv(frame, label, decoder, decoder_len);
}
@ -744,7 +752,8 @@ done:
print_hex_field(" Data", frame->data, frame->size);
}
static void ase_decode_preferred_context(const uint8_t *data, uint8_t len)
static void ase_debug_preferred_context(const uint8_t *data, uint8_t len,
util_debug_func_t func, void *user_data)
{
struct l2cap_frame frame;
@ -753,7 +762,8 @@ static void ase_decode_preferred_context(const uint8_t *data, uint8_t len)
print_context(&frame, " Preferred Context");
}
static void ase_decode_context(const uint8_t *data, uint8_t len)
static void ase_debug_context(const uint8_t *data, uint8_t len,
util_debug_func_t func, void *user_data)
{
struct l2cap_frame frame;
@ -762,7 +772,8 @@ static void ase_decode_context(const uint8_t *data, uint8_t len)
print_context(&frame, " Context");
}
static void ase_decode_program_info(const uint8_t *data, uint8_t len)
static void ase_debug_program_info(const uint8_t *data, uint8_t len,
util_debug_func_t func, void *user_data)
{
struct l2cap_frame frame;
const char *str;
@ -782,7 +793,8 @@ done:
print_hex_field(" Data", frame.data, frame.size);
}
static void ase_decode_language(const uint8_t *data, uint8_t len)
static void ase_debug_language(const uint8_t *data, uint8_t len,
util_debug_func_t func, void *user_data)
{
struct l2cap_frame frame;
uint32_t value;
@ -801,16 +813,17 @@ done:
print_hex_field(" Data", frame.data, frame.size);
}
struct packet_ltv_decoder ase_metadata_table[] = {
LTV_DEC(0x01, ase_decode_preferred_context),
LTV_DEC(0x02, ase_decode_context),
LTV_DEC(0x03, ase_decode_program_info),
LTV_DEC(0x04, ase_decode_language)
struct util_ltv_debugger ase_metadata_table[] = {
UTIL_LTV_DEBUG(0x01, ase_debug_preferred_context),
UTIL_LTV_DEBUG(0x02, ase_debug_context),
UTIL_LTV_DEBUG(0x03, ase_debug_program_info),
UTIL_LTV_DEBUG(0x04, ase_debug_language)
};
static bool print_ase_metadata(const struct l2cap_frame *frame)
{
return print_ase_lv(frame, " Metadata", NULL, 0);
return print_ase_lv(frame, " Metadata", ase_metadata_table,
ARRAY_SIZE(ase_metadata_table));
}
static const struct bitfield_data pac_freq_table[] = {
@ -833,7 +846,8 @@ static const struct bitfield_data pac_freq_table[] = {
{ }
};
static void pac_decode_freq(const uint8_t *data, uint8_t len)
static void pac_decode_freq(const uint8_t *data, uint8_t len,
util_debug_func_t func, void *user_data)
{
struct l2cap_frame frame;
uint16_t value;
@ -870,7 +884,8 @@ static const struct bitfield_data pac_duration_table[] = {
{ }
};
static void pac_decode_duration(const uint8_t *data, uint8_t len)
static void pac_decode_duration(const uint8_t *data, uint8_t len,
util_debug_func_t func, void *user_data)
{
struct l2cap_frame frame;
uint8_t value;
@ -907,7 +922,8 @@ static const struct bitfield_data pac_channel_table[] = {
{ }
};
static void pac_decode_channels(const uint8_t *data, uint8_t len)
static void pac_decode_channels(const uint8_t *data, uint8_t len,
util_debug_func_t func, void *user_data)
{
struct l2cap_frame frame;
uint8_t value;
@ -932,7 +948,8 @@ done:
print_hex_field(" Data", frame.data, frame.size);
}
static void pac_decode_frame_length(const uint8_t *data, uint8_t len)
static void pac_decode_frame_length(const uint8_t *data, uint8_t len,
util_debug_func_t func, void *user_data)
{
struct l2cap_frame frame;
uint16_t min, max;
@ -957,7 +974,8 @@ done:
print_hex_field(" Data", frame.data, frame.size);
}
static void pac_decode_sdu(const uint8_t *data, uint8_t len)
static void pac_decode_sdu(const uint8_t *data, uint8_t len,
util_debug_func_t func, void *user_data)
{
struct l2cap_frame frame;
uint8_t value;
@ -976,12 +994,12 @@ done:
print_hex_field(" Data", frame.data, frame.size);
}
struct packet_ltv_decoder pac_cap_table[] = {
LTV_DEC(0x01, pac_decode_freq),
LTV_DEC(0x02, pac_decode_duration),
LTV_DEC(0x03, pac_decode_channels),
LTV_DEC(0x04, pac_decode_frame_length),
LTV_DEC(0x05, pac_decode_sdu)
struct util_ltv_debugger pac_cap_table[] = {
UTIL_LTV_DEBUG(0x01, pac_decode_freq),
UTIL_LTV_DEBUG(0x02, pac_decode_duration),
UTIL_LTV_DEBUG(0x03, pac_decode_channels),
UTIL_LTV_DEBUG(0x04, pac_decode_frame_length),
UTIL_LTV_DEBUG(0x05, pac_decode_sdu)
};
static void print_pac(const struct l2cap_frame *frame)
@ -1117,7 +1135,8 @@ static bool print_ase_pd(const struct l2cap_frame *frame, const char *label)
return true;
}
static void ase_decode_freq(const uint8_t *data, uint8_t len)
static void ase_debug_freq(const uint8_t *data, uint8_t len,
util_debug_func_t func, void *user_data)
{
struct l2cap_frame frame;
uint8_t value;
@ -1179,7 +1198,8 @@ done:
print_hex_field(" Data", frame.data, frame.size);
}
static void ase_decode_duration(const uint8_t *data, uint8_t len)
static void ase_debug_duration(const uint8_t *data, uint8_t len,
util_debug_func_t func, void *user_data)
{
struct l2cap_frame frame;
uint8_t value;
@ -1266,7 +1286,8 @@ done:
print_hex_field(" Data", frame->data, frame->size);
}
static void ase_decode_location(const uint8_t *data, uint8_t len)
static void ase_debug_location(const uint8_t *data, uint8_t len,
util_debug_func_t func, void *user_data)
{
struct l2cap_frame frame;
@ -1275,7 +1296,8 @@ static void ase_decode_location(const uint8_t *data, uint8_t len)
print_location(&frame);
}
static void ase_decode_frame_length(const uint8_t *data, uint8_t len)
static void ase_debug_frame_length(const uint8_t *data, uint8_t len,
util_debug_func_t func, void *user_data)
{
struct l2cap_frame frame;
uint16_t value;
@ -1294,7 +1316,8 @@ done:
print_hex_field(" Data", frame.data, frame.size);
}
static void ase_decode_blocks(const uint8_t *data, uint8_t len)
static void ase_debug_blocks(const uint8_t *data, uint8_t len,
util_debug_func_t func, void *user_data)
{
struct l2cap_frame frame;
uint8_t value;
@ -1313,12 +1336,12 @@ done:
print_hex_field(" Data", frame.data, frame.size);
}
struct packet_ltv_decoder ase_cc_table[] = {
LTV_DEC(0x01, ase_decode_freq),
LTV_DEC(0x02, ase_decode_duration),
LTV_DEC(0x03, ase_decode_location),
LTV_DEC(0x04, ase_decode_frame_length),
LTV_DEC(0x05, ase_decode_blocks)
struct util_ltv_debugger ase_cc_table[] = {
UTIL_LTV_DEBUG(0x01, ase_debug_freq),
UTIL_LTV_DEBUG(0x02, ase_debug_duration),
UTIL_LTV_DEBUG(0x03, ase_debug_location),
UTIL_LTV_DEBUG(0x04, ase_debug_frame_length),
UTIL_LTV_DEBUG(0x05, ase_debug_blocks)
};
static void print_ase_config(const struct l2cap_frame *frame)
@ -2745,8 +2768,9 @@ static const struct big_enc_decoder {
};
static bool print_subgroup_lv(const struct l2cap_frame *frame,
const char *label, struct packet_ltv_decoder *decoder,
size_t decoder_len)
const char *label,
struct util_ltv_debugger *debugger,
size_t debugger_len)
{
struct bt_hci_lv_data *lv;
@ -2761,7 +2785,8 @@ static bool print_subgroup_lv(const struct l2cap_frame *frame,
return false;
}
packet_print_ltv(label, lv->data, lv->len, decoder, decoder_len);
util_debug_ltv(lv->data, lv->len, debugger, debugger_len,
print_ltv, (void *)label);
return true;
}

View File

@ -3419,72 +3419,11 @@ static void *iov_pull(struct iovec *iov, size_t len)
return data;
}
static struct packet_ltv_decoder*
get_ltv_decoder(struct packet_ltv_decoder *decoder, size_t num, uint8_t type)
static void print_ltv(const char *str, void *user_data)
{
size_t i;
const char *label = user_data;
if (!decoder || !num)
return NULL;
for (i = 0; i < num; i++) {
struct packet_ltv_decoder *dec = &decoder[i];
if (dec->type == type)
return dec;
}
return NULL;
}
static void print_ltv(const char *label, const uint8_t *data, uint8_t len,
struct packet_ltv_decoder *decoder, size_t num)
{
struct iovec iov;
int i;
iov.iov_base = (void *) data;
iov.iov_len = len;
for (i = 0; iov.iov_len; i++) {
uint8_t l, t, *v;
struct packet_ltv_decoder *dec;
l = get_u8(iov_pull(&iov, sizeof(l)));
if (!l) {
print_field("%s #%d: len 0x%02x", label, i, l);
break;
}
v = iov_pull(&iov, sizeof(*v));
if (!v)
break;
t = get_u8(v);
print_field("%s #%d: len 0x%02x type 0x%02x", label, i, l, t);
l -= 1;
v = iov_pull(&iov, l);
if (!v)
break;
dec = get_ltv_decoder(decoder, num, t);
if (dec)
dec->func(v, l);
else
print_hex_field(label, v, l);
}
if (iov.iov_len)
print_hex_field(label, iov.iov_base, iov.iov_len);
}
void packet_print_ltv(const char *label, const uint8_t *data, uint8_t len,
struct packet_ltv_decoder *decoder, size_t decoder_len)
{
print_ltv(label, data, len, decoder, decoder_len);
print_field("%s: %s", label, str);
}
static void print_base_annoucement(const uint8_t *data, uint8_t data_len)
@ -3510,6 +3449,7 @@ static void print_base_annoucement(const uint8_t *data, uint8_t data_len)
struct bt_hci_lv_data *codec_cfg;
struct bt_hci_lv_data *metadata;
uint8_t j;
const char *label;
print_field(" Subgroup #%u:", i);
@ -3537,9 +3477,10 @@ static void print_base_annoucement(const uint8_t *data, uint8_t data_len)
if (!iov_pull(&iov, codec_cfg->len))
goto done;
print_ltv(" Codec Specific Configuration",
codec_cfg->data, codec_cfg->len,
NULL, 0);
label = " Codec Specific Configuration";
util_debug_ltv(codec_cfg->data, codec_cfg->len, NULL, 0,
print_ltv, (void *)label);
metadata = iov_pull(&iov, sizeof(*metadata));
if (!metadata)
@ -3548,8 +3489,10 @@ static void print_base_annoucement(const uint8_t *data, uint8_t data_len)
if (!iov_pull(&iov, metadata->len))
goto done;
print_ltv(" Metadata", metadata->data, metadata->len,
NULL, 0);
label = " Metadata";
util_debug_ltv(metadata->data, metadata->len, NULL, 0,
print_ltv, (void *)label);
/* Level 3 - BIS(s)*/
for (j = 0; j < subgroup->num_bis; j++) {

View File

@ -84,20 +84,6 @@ void packet_print_io_capability(uint8_t capability);
void packet_print_io_authentication(uint8_t authentication);
void packet_print_codec_id(const char *label, uint8_t codec);
#define LTV_DEC(_type, _func) \
{ \
.type = _type, \
.func = _func, \
}
struct packet_ltv_decoder {
uint8_t type;
void (*func)(const uint8_t *data, uint8_t len);
};
void packet_print_ltv(const char *label, const uint8_t *data, uint8_t len,
struct packet_ltv_decoder *decoder, size_t num);
void packet_control(struct timeval *tv, struct ucred *cred,
uint16_t index, uint16_t opcode,
const void *data, uint16_t size);