@@ -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 {
@@ -3434,9 +3434,17 @@ struct bt_hci_evt_le_cis_established {
uint16_t conn_handle;
uint8_t cig_sync_delay[3];
uint8_t cis_sync_delay[3];
- uint8_t latency[3];
+ uint8_t m_latency[3];
+ uint8_t s_latency[3];
uint8_t m_phy;
uint8_t s_phy;
+ uint8_t nse;
+ uint8_t m_bn;
+ uint8_t s_bn;
+ uint8_t m_ft;
+ uint8_t s_ft;
+ uint16_t m_mtu;
+ uint16_t s_mtu;
} __attribute__ ((packed));
#define BT_HCI_EVT_LE_CIS_REQ BT_HCI_SUBEVT_5_2 + 1
@@ -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);
@@ -10275,9 +10281,17 @@ static void le_cis_established_evt(const void *data, uint8_t size)
print_field("Connection Handle: %d", le16_to_cpu(evt->status));
print_usec_interval("CIG Synchronization Delay", evt->cig_sync_delay);
print_usec_interval("CIS Synchronization Delay", evt->cis_sync_delay);
- print_usec_interval("Latency", evt->latency);
+ print_usec_interval("Master to Slave Latency", evt->m_latency);
+ print_usec_interval("Slave to Master Latency", evt->s_latency);
print_le_phy("Master to Slave PHY", evt->m_phy);
print_le_phy("Slave to Master PHY", evt->m_phy);
+ print_field("Number of Subevents: %u", evt->nse);
+ print_field("Master to Slave Burst Number: %u", evt->m_bn);
+ print_field("Slave to Master Burst Number: %u", evt->s_bn);
+ print_field("Master to Slave Flush Timeout: %u", evt->m_ft);
+ print_field("Slave to Master Flush Timeout: %u", evt->s_ft);
+ print_field("Master to Slave MTU: %u", evt->m_ft);
+ print_field("Slave to Master MTU: %u", evt->s_ft);
}
static void le_req_cis_evt(const void *data, uint8_t size)
@@ -11134,6 +11148,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)
{
@@ -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);
@@ -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)
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com> This enables decoding of ISO packets. --- monitor/bt.h | 12 +++++++-- monitor/packet.c | 63 +++++++++++++++++++++++++++++++++++++++++++- monitor/packet.h | 2 ++ src/shared/btsnoop.h | 2 ++ 4 files changed, 76 insertions(+), 3 deletions(-)