diff options
author | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2022-06-16 15:59:12 -0700 |
---|---|---|
committer | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2022-06-16 17:49:03 -0700 |
commit | bf5a7c604ff7aa312c8f98c19c0cb2b00d95e482 (patch) | |
tree | e898445f7cff7358bf5d8b9dc071acfe1eed4081 /monitor/packet.c | |
parent | 2bdb79cf8173daa0c44d692fcbd7d7408b4fd994 (diff) | |
download | bluez-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.c | 39 |
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++) { |