summaryrefslogtreecommitdiff
path: root/monitor/packet.c
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2022-06-16 15:59:12 -0700
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2022-06-16 17:49:03 -0700
commitbf5a7c604ff7aa312c8f98c19c0cb2b00d95e482 (patch)
treee898445f7cff7358bf5d8b9dc071acfe1eed4081 /monitor/packet.c
parent2bdb79cf8173daa0c44d692fcbd7d7408b4fd994 (diff)
downloadbluez-bf5a7c604ff7aa312c8f98c19c0cb2b00d95e482.tar.gz
monitor/att: Add LTV deconding support for PAC/ASE
This adds decoding support for PAC/ASE attributes: > ACL Data RX: Handle 42 flags 0x02 dlen 31 Channel: 65 len 27 sdu 25 [PSM 39 mode Enhanced Credit (0x81)] {chan 1} ATT: Read Response (0x0b) len 24 Value: 010600000000100301ff0002020302030305041e00f00000 Number of PAC(s): 1 PAC #0: Codec: LC3 (0x06) Codec Specific Capabilities #0: len 0x03 type 0x01 Sampling Frequencies: 0x00ff 8 Khz (0x0001) 11.25 Khz (0x0002) 16 Khz (0x0004) 22.05 Khz (0x0008) 24 Khz (0x0010) 32 Khz (0x0020) 44.1 Khz (0x0040) 48 Khz (0x0080) Codec Specific Capabilities #1: len 0x02 type 0x02 Frame Duration: 0x0003 7.5 ms (0x01) 10 ms (0x02) Codec Specific Capabilities #2: len 0x02 type 0x03 Audio Channel Count: 0x03 1 channel (0x01) 2 channels (0x02) Codec Specific Capabilities #3: len 0x05 type 0x04 Frame Length: 30 (0x001e) - 240 (0x00f0) > ACL Data RX: Handle 42 flags 0x02 dlen 30 Channel: 64 len 26 sdu 24 [PSM 39 mode Enhanced Credit (0x81)] {chan 0} ATT: Write Command (0x52) len 23 Handle: 0x0036 Type: ASE Control Point (0x2bc6) Data: 010101020206000000000a02010302020103042800 Opcode: Codec Configuration (0x01) Number of ASE(s): 1 ASE: #0 ASE ID: 0x01 Target Latency: Balance Latency/Reliability (0x02) PHY: 0x02 LE 2M PHY (0x02) Codec: LC3 (0x06) Codec Specific Configuration #0: len 0x02 type 0x01 Sampling Frequency: 16 Khz (0x03) Codec Specific Configuration #1: len 0x02 type 0x02 Frame Duration: 10 ms (0x01) Codec Specific Configuration #2: len 0x03 type 0x04 Frame Length: 40 (0x0028)
Diffstat (limited to 'monitor/packet.c')
-rw-r--r--monitor/packet.c39
1 files changed, 33 insertions, 6 deletions
diff --git a/monitor/packet.c b/monitor/packet.c
index bd9efd2c7..3efa5a25d 100644
--- a/monitor/packet.c
+++ b/monitor/packet.c
@@ -3338,7 +3338,26 @@ static void *iov_pull(struct iovec *iov, size_t len)
return data;
}
-static void print_ltv(const char *label, const uint8_t *data, uint8_t len)
+static struct packet_ltv_decoder*
+get_ltv_decoder(struct packet_ltv_decoder *decoder, size_t num, uint8_t type)
+{
+ size_t i;
+
+ 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;
@@ -3348,6 +3367,7 @@ static void print_ltv(const char *label, const uint8_t *data, uint8_t 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) {
@@ -3369,16 +3389,21 @@ static void print_ltv(const char *label, const uint8_t *data, uint8_t len)
if (!v)
break;
- print_hex_field(label, v, l);
+ 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)
+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);
+ print_ltv(label, data, len, decoder, decoder_len);
}
static void print_base_annoucement(const uint8_t *data, uint8_t data_len)
@@ -3432,7 +3457,8 @@ static void print_base_annoucement(const uint8_t *data, uint8_t data_len)
goto done;
print_ltv(" Codec Specific Configuration",
- codec_cfg->data, codec_cfg->len);
+ codec_cfg->data, codec_cfg->len,
+ NULL, 0);
metadata = iov_pull(&iov, sizeof(*metadata));
if (!metadata)
@@ -3441,7 +3467,8 @@ 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);
+ print_ltv(" Metadata", metadata->data, metadata->len,
+ NULL, 0);
/* Level 3 - BIS(s)*/
for (j = 0; j < subgroup->num_bis; j++) {