diff --git a/monitor/bt.h b/monitor/bt.h
index b1b24af..c2e6964 100644
--- a/monitor/bt.h
+++ b/monitor/bt.h
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 41153c7..994ae63 100644
--- a/monitor/packet.c
+++ b/monitor/packet.c
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);
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 199e15e..19ea04c 100644
--- a/monitor/packet.h
+++ b/monitor/packet.h
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 3043d33..5fb084a 100644
--- a/src/shared/btsnoop.h
+++ b/src/shared/btsnoop.h
#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)