summaryrefslogtreecommitdiff
path: root/monitor/packet.c
diff options
context:
space:
mode:
authorJoseph Hwang <josephsih@chromium.org>2021-07-15 17:50:16 +0800
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2021-07-20 10:59:05 -0700
commitde6c0c77e55da5ddfd5c7aefbfecef68c4677853 (patch)
treef3e0e08ad5b504b01fb93a93ce66fc05ec01bbfb /monitor/packet.c
parentcb53d86be62e61d4de615fda6453f96015abb837 (diff)
downloadbluez-de6c0c77e55da5ddfd5c7aefbfecef68c4677853.tar.gz
monitor: add new Intel extended telemetry events
This patch adds new Intel extended telemetry events for both ACL and SCO/eSCO audio link quality reports. For SCO/eSCO audio link quality report, it shows something like > HCI Event: Vendor (0xff) plen 190 #120 [hci0] 2021-05-31 20:27:50.257 Vendor Prefix (0x8780) Intel Extended Telemetry (0x87) Extended Telemetry (0x80): SubOpcode (0x03) Extended event type (0x01): Audio Link Quality Report Type(0x05) SCO/eSCO connection handle (0x6a): 0x0101 Packets from host (0x6b): 399 Tx packets (0x6c): 403 Rx payload lost (0x6d): 3 Tx payload lost (0x6e): 0 Rx No SYNC errors (0x6f): 3 2 3 3 0 Rx HEC errors (0x70): 0 0 0 0 0 Rx CRC errors (0x71): 2 0 0 0 0 Rx NAK errors (0x72): 6 0 0 0 0 Failed Tx due to Wifi coex (0x73): 6 0 0 0 0 Failed Rx due to Wifi coex (0x74): 0 0 0 0 0 Late samples inserted based on CDC (0x75): 0 Samples dropped (0x76): 0 Mute samples sent at initial connection (0x77): 0 PLC injection data (0x78): 0 For ACL audio link quality report, it shows something like > HCI Event: Vendor (0xff) plen 142 #120 [hci0] 2021-05-31 20:27:50.261 Vendor Prefix (0x8780) Intel Extended Telemetry (0x87) Extended Telemetry (0x80): SubOpcode (0x03) Extended event type (0x01): Audio Link Quality Report Type(0x05) ACL connection handle (0x4a): 0x0100 Rx HEC errors (0x4b): 0 Rx CRC errors (0x4c): 0 Packets from host (0x4d): 100 Tx packets (0x4e): 101 Tx packets 0 retries (0x4f): 89 Tx packets 1 retries (0x50): 11 Tx packets 2 retries (0x51): 1 Tx packets 3 retries (0x52): 0 Tx packets 4 retries and more (0x53): 0 Tx DH1 packets (0x54): 0 Tx DH3 packets (0x55): 0 Tx DH5 packets (0x56): 0 Tx 2DH1 packets (0x57): 0 Tx 2DH3 packets (0x58): 0 Tx 2DH5 packets (0x59): 0 Tx 3DH1 packets (0x5a): 6 Tx 3DH3 packets (0x5b): 0 Tx 3DH5 packets (0x5c): 94 Rx packets (0x5d): 272 ACL link throughput (KBps) (0x5e): 343815 ACL max packet latency (ms) (0x5f): 20625 ACL avg packet latency (ms) (0x60): 12 Reviewed-by: Miao-chen Chou <mcchou@chromium.org>
Diffstat (limited to 'monitor/packet.c')
-rw-r--r--monitor/packet.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/monitor/packet.c b/monitor/packet.c
index 65f84c152..52d22ab21 100644
--- a/monitor/packet.c
+++ b/monitor/packet.c
@@ -9371,9 +9371,14 @@ static const struct vendor_ocf *current_vendor_ocf(uint16_t ocf)
return NULL;
}
-static const struct vendor_evt *current_vendor_evt(uint8_t evt)
+static const struct vendor_evt *current_vendor_evt(const void *data,
+ int *consumed_size)
{
uint16_t manufacturer, msft_opcode;
+ uint8_t evt = *((const uint8_t *) data);
+
+ /* A regular vendor event consumes 1 byte. */
+ *consumed_size = 1;
if (index_current < MAX_INDEX) {
manufacturer = index_list[index_current].manufacturer;
@@ -9388,7 +9393,7 @@ static const struct vendor_evt *current_vendor_evt(uint8_t evt)
switch (manufacturer) {
case 2:
- return intel_vendor_evt(evt);
+ return intel_vendor_evt(data, consumed_size);
case 15:
return broadcom_vendor_evt(evt);
}
@@ -11007,10 +11012,10 @@ static void le_meta_event_evt(const void *data, uint8_t size)
static void vendor_evt(const void *data, uint8_t size)
{
- uint8_t subevent = *((const uint8_t *) data);
struct subevent_data vendor_data;
char vendor_str[150];
- const struct vendor_evt *vnd = current_vendor_evt(subevent);
+ int consumed_size;
+ const struct vendor_evt *vnd = current_vendor_evt(data, &consumed_size);
if (vnd) {
const char *str = current_vendor_str();
@@ -11021,12 +11026,13 @@ static void vendor_evt(const void *data, uint8_t size)
vendor_data.str = vendor_str;
} else
vendor_data.str = vnd->str;
- vendor_data.subevent = subevent;
+ vendor_data.subevent = vnd->evt;
vendor_data.func = vnd->evt_func;
vendor_data.size = vnd->evt_size;
vendor_data.fixed = vnd->evt_fixed;
- print_subevent(&vendor_data, data + 1, size - 1);
+ print_subevent(&vendor_data, data + consumed_size,
+ size - consumed_size);
} else {
uint16_t manufacturer;