From: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx> 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(-) diff --git a/monitor/bt.h b/monitor/bt.h index 0a88aff97..b08f145ab 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 { @@ -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 diff --git a/monitor/packet.c b/monitor/packet.c index 8987ed703..0ef8a5b86 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); @@ -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) { 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