[PATCH BlueZ v2 09/12] monitor: Print connection type in Disconnect Complete
STALE226d
From: Luiz Augusto von Dentz <luiz.dentz@gmail.com>
Date: 2026-02-20 17:31:41
Subsystem:
the rest · Maintainer:
Linus Torvalds
From: Luiz Augusto von Dentz <redacted> Print the connection type (BR-ACL, LE-ACL, BR-SCO, BR-ESCO, LE-CIS, LE-BIS) alongside the handle in Disconnect Complete events so the type of link being torn down is immediately visible without cross-referencing earlier connection events:
HCI Event: Disconnect Complete (0x05) plen 4
Status: Success (0x00)
Handle: 2050 (LE-ACL) Address: 6A:59:B2:90:5E:AB (Resolvable)
Reason: Remote User Terminated Connection (0x13)HCI Event: Disconnect Complete (0x05) plen 4
Status: Success (0x00)
Handle: 2304 (LE-CIS) Address: 65:0D:7B:2F:D6:E7 (Resolvable)
Reason: Connection Terminated By Local Host (0x16)
---
monitor/analyze.c | 53 +++++++++++++++++++++++-------------------
monitor/packet.c | 59 ++++++++++++++++++++++++++++++++++-------------
monitor/packet.h | 9 ++++++++
3 files changed, 81 insertions(+), 40 deletions(-)
diff --git a/monitor/analyze.c b/monitor/analyze.c
index 268ea10e29e6..2cf42f903b61 100644
--- a/monitor/analyze.c
+++ b/monitor/analyze.c@@ -53,12 +53,6 @@ struct hci_dev { struct queue *conn_list; }; -#define CONN_BR_ACL 0x01 -#define CONN_BR_SCO 0x02 -#define CONN_BR_ESCO 0x03 -#define CONN_LE_ACL 0x04 -#define CONN_LE_ISO 0x05 - struct hci_stats { size_t bytes; size_t num;
@@ -223,20 +217,23 @@ static void conn_destroy(void *data) const char *str; switch (conn->type) { - case CONN_BR_ACL: + case BTMON_CONN_ACL: str = "BR-ACL"; break; - case CONN_BR_SCO: + case BTMON_CONN_LE: str = "BR-SCO"; break; - case CONN_BR_ESCO: + case BTMON_CONN_SCO: str = "BR-ESCO"; break; - case CONN_LE_ACL: + case BTMON_CONN_ESCO: str = "LE-ACL"; break; - case CONN_LE_ISO: - str = "LE-ISO"; + case BTMON_CONN_CIS: + str = "LE-CIS"; + break; + case BTMON_CONN_BIS: + str = "LE-BIS"; break; default: str = "unknown";
@@ -476,7 +473,7 @@ static void evt_conn_complete(struct hci_dev *dev, struct timeval *tv, if (evt->status) return; - conn = conn_lookup_type(dev, le16_to_cpu(evt->handle), CONN_BR_ACL); + conn = conn_lookup_type(dev, le16_to_cpu(evt->handle), BTMON_CONN_ACL); if (!conn) return;
@@ -567,7 +564,7 @@ static void evt_le_conn_complete(struct hci_dev *dev, struct timeval *tv, if (!evt || evt->status) return; - conn = conn_lookup_type(dev, le16_to_cpu(evt->handle), CONN_LE_ACL); + conn = conn_lookup_type(dev, le16_to_cpu(evt->handle), BTMON_CONN_LE); if (!conn) return;
@@ -585,7 +582,7 @@ static void evt_le_enh_conn_complete(struct hci_dev *dev, struct timeval *tv, if (!evt || evt->status) return; - conn = conn_lookup_type(dev, le16_to_cpu(evt->handle), CONN_LE_ACL); + conn = conn_lookup_type(dev, le16_to_cpu(evt->handle), BTMON_CONN_LE); if (!conn) return;
@@ -670,7 +667,7 @@ static void evt_le_cis_established(struct hci_dev *dev, struct timeval *tv, return; conn = conn_lookup_type(dev, le16_to_cpu(evt->conn_handle), - CONN_LE_ISO); + BTMON_CONN_CIS); if (!conn) return;
@@ -715,7 +712,7 @@ static void evt_le_big_complete(struct hci_dev *dev, struct timeval *tv, if (!util_iov_pull_le16(iov, &handle)) return; - conn = conn_lookup_type(dev, handle, CONN_LE_ISO); + conn = conn_lookup_type(dev, handle, BTMON_CONN_BIS); if (conn) conn->setup_seen = true; }
@@ -738,7 +735,7 @@ static void evt_le_big_sync_established(struct hci_dev *dev, struct timeval *tv, if (!util_iov_pull_le16(iov, &handle)) return; - conn = conn_lookup_type(dev, handle, CONN_LE_ISO); + conn = conn_lookup_type(dev, handle, BTMON_CONN_BIS); if (conn) conn->setup_seen = true; }
@@ -928,9 +925,13 @@ static void sco_pkt(struct timeval *tv, uint16_t index, bool out, dev->num_sco++; conn = conn_lookup_type(dev, le16_to_cpu(hdr->handle) & 0x0fff, - CONN_BR_SCO); - if (!conn) - return; + BTMON_CONN_SCO); + if (!conn) { + conn = conn_lookup_type(dev, le16_to_cpu(hdr->handle) & 0x0fff, + BTMON_CONN_ESCO); + if (!conn) + return; + } if (out) { conn_pkt_tx(conn, tv, size - sizeof(*hdr), NULL);
@@ -1015,9 +1016,13 @@ static void iso_pkt(struct timeval *tv, uint16_t index, bool out, dev->num_iso++; conn = conn_lookup_type(dev, le16_to_cpu(hdr->handle) & 0x0fff, - CONN_LE_ISO); - if (!conn) - return; + BTMON_CONN_CIS); + if (!conn) { + conn = conn_lookup_type(dev, le16_to_cpu(hdr->handle) & 0x0fff, + BTMON_CONN_BIS); + if (!conn) + return; + } if (out) { conn_pkt_tx(conn, tv, size - sizeof(*hdr), NULL);
diff --git a/monitor/packet.c b/monitor/packet.c
index b8a48bb549af..a4930c855144 100644
--- a/monitor/packet.c
+++ b/monitor/packet.c@@ -221,22 +221,24 @@ static struct index_buf_pool *get_pool(uint16_t index, uint8_t type) return NULL; switch (type) { - case 0x00: + case BTMON_CONN_ACL: if (index_list[index].acl.total) return &index_list[index].acl; break; - case 0x01: + case BTMON_CONN_LE: if (index_list[index].le.total) return &index_list[index].le; break; - case 0x05: - if (index_list[index].iso.total) - return &index_list[index].iso; - break; - default: + case BTMON_CONN_SCO: + case BTMON_CONN_ESCO: if (index_list[index].sco.total) return &index_list[index].sco; break; + case BTMON_CONN_CIS: + case BTMON_CONN_BIS: + if (index_list[index].iso.total) + return &index_list[index].iso; + break; } return NULL;
@@ -922,10 +924,30 @@ static void print_lt_addr(uint8_t lt_addr) print_field("LT address: %d", lt_addr); } +static const char *conn_type_str(uint8_t type) +{ + switch (type) { + case BTMON_CONN_ACL: + return "BR-ACL"; + case BTMON_CONN_LE: + return "LE-ACL"; + case BTMON_CONN_SCO: + return "BR-SCO"; + case BTMON_CONN_ESCO: + return "BR-ESCO"; + case BTMON_CONN_CIS: + return "LE-CIS"; + case BTMON_CONN_BIS: + return "LE-BIS"; + default: + return "unknown"; + } +} + static void print_handle_native(uint16_t handle) { struct packet_conn_data *conn; - char label[25]; + char label[32]; conn = packet_get_conn_data(handle); if (!conn) {
@@ -933,7 +955,8 @@ static void print_handle_native(uint16_t handle) return; } - sprintf(label, "Handle: %d Address", handle); + sprintf(label, "Handle: %d (%s) Address", handle, + conn_type_str(conn->type)); print_addr(label, conn->dst, conn->dst_type); }
@@ -10996,7 +11019,7 @@ static void conn_complete_evt(struct timeval *tv, uint16_t index, print_enable("Encryption", evt->encr_mode); if (evt->status == 0x00) - assign_handle(index, le16_to_cpu(evt->handle), 0x00, + assign_handle(index, le16_to_cpu(evt->handle), BTMON_CONN_ACL, (void *)evt->bdaddr, BDADDR_BREDR); }
@@ -11583,7 +11606,9 @@ static void sync_conn_complete_evt(struct timeval *tv, uint16_t index, print_air_mode(evt->air_mode); if (evt->status == 0x00) - assign_handle(index, le16_to_cpu(evt->handle), evt->link_type, + assign_handle(index, le16_to_cpu(evt->handle), + evt->link_type ? BTMON_CONN_ESCO : + BTMON_CONN_SCO, (void *)evt->bdaddr, BDADDR_BREDR); }
@@ -12014,7 +12039,7 @@ static void le_conn_complete_evt(struct timeval *tv, uint16_t index, print_field("Central clock accuracy: 0x%2.2x", evt->clock_accuracy); if (evt->status == 0x00) - assign_handle(index, le16_to_cpu(evt->handle), 0x01, + assign_handle(index, le16_to_cpu(evt->handle), BTMON_CONN_LE, (void *)evt->peer_addr, evt->peer_addr_type); }
@@ -12145,7 +12170,7 @@ static void le_enhanced_conn_complete_evt(struct timeval *tv, uint16_t index, print_field("Central clock accuracy: 0x%2.2x", evt->clock_accuracy); if (evt->status == 0x00) - assign_handle(index, le16_to_cpu(evt->handle), 0x01, + assign_handle(index, le16_to_cpu(evt->handle), BTMON_CONN_LE, (void *)evt->peer_addr, evt->peer_addr_type); }
@@ -12545,7 +12570,8 @@ static void le_cis_established_evt(struct timeval *tv, uint16_t index, print_slot_125("ISO Interval", evt->interval); if (!evt->status) - assign_handle(index, le16_to_cpu(evt->conn_handle), 0x05, + assign_handle(index, le16_to_cpu(evt->conn_handle), + BTMON_CONN_CIS, NULL, BDADDR_LE_PUBLIC); }
@@ -12596,7 +12622,8 @@ static void le_big_complete_evt(struct timeval *tv, uint16_t index, for (i = 0; i < evt->num_bis; i++) assign_handle(index, le16_to_cpu(evt->bis_handle[i]), - 0x05, NULL, BDADDR_LE_PUBLIC); + BTMON_CONN_BIS, NULL, + BDADDR_LE_PUBLIC); } }
@@ -12631,7 +12658,7 @@ static void le_big_sync_estabilished_evt(struct timeval *tv, uint16_t index, for (i = 0; i < evt->num_bis; i++) assign_handle(index, le16_to_cpu(evt->bis[i]), - 0x05, NULL, BDADDR_LE_PUBLIC); + BTMON_CONN_BIS, NULL, BDADDR_LE_PUBLIC); } }
diff --git a/monitor/packet.h b/monitor/packet.h
index f6547ec9b594..38f3f5514dba 100644
--- a/monitor/packet.h
+++ b/monitor/packet.h@@ -39,6 +39,15 @@ struct packet_frame { size_t len; }; +enum { + BTMON_CONN_ACL = 0x00, + BTMON_CONN_LE, + BTMON_CONN_SCO, + BTMON_CONN_ESCO, + BTMON_CONN_CIS, + BTMON_CONN_BIS +}; + struct packet_conn_data { uint16_t index; uint8_t src[6];
--
2.52.0