From: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx> This enables decoding of ISO packets. --- monitor/bt.h | 2 +- monitor/packet.c | 53 ++++++++++++++++++++++++++++++++++++++++++++ monitor/packet.h | 2 ++ src/shared/btsnoop.h | 2 ++ 4 files changed, 58 insertions(+), 1 deletion(-) diff --git a/monitor/bt.h b/monitor/bt.h index b1b24afeb..c2e6964ff 100644 --- a/monitor/bt.h +++ b/monitor/bt.h @@ -514,7 +514,7 @@ struct bt_hci_sco_hdr { struct bt_hci_iso_hdr { uint16_t handle; - uint8_t dlen; + uint16_t dlen; } __attribute__ ((packed)); struct bt_hci_iso_data_start { diff --git a/monitor/packet.c b/monitor/packet.c index 007887181..a6d958910 100644 --- a/monitor/packet.c +++ b/monitor/packet.c @@ -3934,6 +3934,12 @@ void packet_monitor(struct timeval *tv, struct ucred *cred, case BTSNOOP_OPCODE_SCO_RX_PKT: packet_hci_scodata(tv, cred, index, true, data, size); break; + case BTSNOOP_OPCODE_ISO_TX_PKT: + packet_hci_isodata(tv, cred, index, false, data, size); + break; + case BTSNOOP_OPCODE_ISO_RX_PKT: + packet_hci_isodata(tv, cred, index, true, data, size); + break; case BTSNOOP_OPCODE_OPEN_INDEX: if (index < MAX_INDEX) addr2str(index_list[index].bdaddr, str); @@ -11336,6 +11342,53 @@ void packet_hci_scodata(struct timeval *tv, struct ucred *cred, uint16_t index, packet_hexdump(data, size); } +void packet_hci_isodata(struct timeval *tv, struct ucred *cred, uint16_t index, + bool in, const void *data, uint16_t size) +{ + const struct bt_hci_iso_hdr *hdr = data; + uint16_t handle = le16_to_cpu(hdr->handle); + uint8_t flags = acl_flags(handle); + char handle_str[16], extra_str[32]; + + if (index > MAX_INDEX) { + print_field("Invalid index (%d).", index); + return; + } + + index_list[index].frame++; + + if (size < sizeof(*hdr)) { + if (in) + print_packet(tv, cred, '*', index, NULL, COLOR_ERROR, + "Malformed ISO Data RX packet", NULL, NULL); + else + print_packet(tv, cred, '*', index, NULL, COLOR_ERROR, + "Malformed ISO Data TX packet", NULL, NULL); + packet_hexdump(data, size); + return; + } + + data += sizeof(*hdr); + size -= sizeof(*hdr); + + sprintf(handle_str, "Handle %d", acl_handle(handle)); + sprintf(extra_str, "flags 0x%2.2x dlen %d", flags, hdr->dlen); + + print_packet(tv, cred, in ? '>' : '<', index, NULL, COLOR_HCI_SCODATA, + in ? "ISO Data RX" : "ISO Data TX", + handle_str, extra_str); + + if (size != hdr->dlen) { + print_text(COLOR_ERROR, "invalid packet size (%d != %d)", + size, hdr->dlen); + packet_hexdump(data, size); + return; + } + + if (filter_mask & PACKET_FILTER_SHOW_SCO_DATA) + packet_hexdump(data, size); +} + void packet_ctrl_open(struct timeval *tv, struct ucred *cred, uint16_t index, const void *data, uint16_t size) { diff --git a/monitor/packet.h b/monitor/packet.h index 199e15e58..19ea04c68 100644 --- a/monitor/packet.h +++ b/monitor/packet.h @@ -94,6 +94,8 @@ void packet_hci_acldata(struct timeval *tv, struct ucred *cred, uint16_t index, bool in, const void *data, uint16_t size); void packet_hci_scodata(struct timeval *tv, struct ucred *cred, uint16_t index, bool in, const void *data, uint16_t size); +void packet_hci_isodata(struct timeval *tv, struct ucred *cred, uint16_t index, + bool in, const void *data, uint16_t size); void packet_ctrl_open(struct timeval *tv, struct ucred *cred, uint16_t index, const void *data, uint16_t size); diff --git a/src/shared/btsnoop.h b/src/shared/btsnoop.h index 3043d33e2..5fb084aa2 100644 --- a/src/shared/btsnoop.h +++ b/src/shared/btsnoop.h @@ -53,6 +53,8 @@ #define BTSNOOP_OPCODE_CTRL_CLOSE 15 #define BTSNOOP_OPCODE_CTRL_COMMAND 16 #define BTSNOOP_OPCODE_CTRL_EVENT 17 +#define BTSNOOP_OPCODE_ISO_TX_PKT 18 +#define BTSNOOP_OPCODE_ISO_RX_PKT 19 #define BTSNOOP_MAX_PACKET_SIZE (1486 + 4) -- 2.21.0