btmon: Add parsing LE Read ISO link quality > HCI Event: Command Complete (0x0e) plen 34 #14 24.982811 LE Read ISO link quality (0x08|0x0075) ncmd 1 Status: Success (0x00) Handle: 98 TX unacked packets 0 TX flushed packets 257602 TX last subevent packets 0 TX retrnansmitted packets 0 TX crc error packets 2594 RX unreceived packets 0 Duplicated packets 0 --- monitor/bt.h | 18 ++++++++++++++++++ monitor/packet.c | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/monitor/bt.h b/monitor/bt.h index 4482e6e2c..dca2dc8b8 100644 --- a/monitor/bt.h +++ b/monitor/bt.h @@ -2914,6 +2914,24 @@ struct bt_hci_cmd_le_set_host_feature { uint8_t bit_value; } __attribute__ ((packed)); +#define BT_HCI_CMD_LE_READ_ISO_LINK_QUALITY 0x2075 +#define BT_HCI_BIT_LE_READ_ISO_LINK_QUALITY BT_HCI_CMD_BIT(45, 1) +struct bt_hci_cmd_le_read_iso_link_quality { + uint16_t handle; +} __attribute__ ((packed)); + +struct bt_hci_rsp_le_read_iso_link_quality { + uint8_t status; + uint16_t handle; + uint32_t tx_unacked_packets; + uint32_t tx_flushed_packets; + uint32_t tx_last_subevent_packets; + uint32_t retransmitted_packets; + uint32_t crc_error_packets; + uint32_t rx_unreceived_packets; + uint32_t duplicated_packets; +} __attribute__ ((packed)); + #define BT_HCI_EVT_INQUIRY_COMPLETE 0x01 struct bt_hci_evt_inquiry_complete { uint8_t status; diff --git a/monitor/packet.c b/monitor/packet.c index fd8df7a8b..3031b028f 100644 --- a/monitor/packet.c +++ b/monitor/packet.c @@ -8946,6 +8946,34 @@ static void le_set_host_feature_cmd(uint16_t index, const void *data, print_field("Bit Value: %u", cmd->bit_value); } +static void le_read_iso_link_quality_cmd(uint16_t index, const void *data, uint8_t size) +{ + const struct bt_hci_cmd_le_read_iso_link_quality *cmd = data; + + print_field("Handle: %d", le16_to_cpu(cmd->handle)); +} + +static void status_le_read_iso_link_quality_rsp(uint16_t index, const void *data, uint8_t size) +{ + const struct bt_hci_rsp_le_read_iso_link_quality *rsp = data; + + print_status(rsp->status); + + if (size == 1) + return; + + print_field("Handle: %d", le16_to_cpu(rsp->handle)); + print_field("TX unacked packets %d", rsp->tx_unacked_packets); + print_field("TX flushed packets %d", rsp->tx_flushed_packets); + print_field("TX last subevent packets %d", + rsp->tx_last_subevent_packets); + print_field("TX retransmitted packets %d", + rsp->retransmitted_packets); + print_field("TX crc error packets %d", rsp->crc_error_packets); + print_field("RX unreceived packets %d", rsp->rx_unreceived_packets); + print_field("Duplicated packets %d", rsp->duplicated_packets); +} + struct opcode_data { uint16_t opcode; int bit; @@ -9895,6 +9923,16 @@ static const struct opcode_data opcode_table[] = { "LE Set Host Feature", le_set_host_feature_cmd, sizeof(struct bt_hci_cmd_le_set_host_feature), true, status_rsp, 1, true }, + { BT_HCI_CMD_LE_READ_ISO_LINK_QUALITY, + BT_HCI_BIT_LE_READ_ISO_LINK_QUALITY, + "LE Read ISO link quality", + le_read_iso_link_quality_cmd, + sizeof( + struct bt_hci_cmd_le_read_iso_link_quality), + true, status_le_read_iso_link_quality_rsp, + sizeof( + struct bt_hci_rsp_le_read_iso_link_quality), + true }, { } }; -- 2.34.1