From: Luiz Augusto von Dentz <luiz.dentz@gmail.com>
To: linux-bluetooth@vger.kernel.org
Subject: [PATCH BlueZ v2 09/12] monitor: Print connection type in Disconnect Complete
Date: Fri, 20 Feb 2026 12:31:13 -0500 [thread overview]
Message-ID: <20260220173120.3418666-9-luiz.dentz@gmail.com> (raw)
In-Reply-To: <20260220173120.3418666-1-luiz.dentz@gmail.com>
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
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
next prev parent reply other threads:[~2026-02-20 17:31 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-20 17:31 [PATCH BlueZ v2 01/12] doc/btmon: Add missing documentation Luiz Augusto von Dentz
2026-02-20 17:31 ` [PATCH BlueZ v2 02/12] doc/btmon: Add dedicate sections for timestamp and frame number Luiz Augusto von Dentz
2026-02-20 17:31 ` [PATCH BlueZ v2 03/12] doc/btmon: Add connection tracking section Luiz Augusto von Dentz
2026-02-20 17:31 ` [PATCH BlueZ v2 04/12] doc/btmon: Add a dedicated section for analyze mode Luiz Augusto von Dentz
2026-02-20 17:31 ` [PATCH BlueZ v2 05/12] doc/btmon: Add a section for automated trace analysis Luiz Augusto von Dentz
2026-02-20 17:31 ` [PATCH BlueZ v2 06/12] doc: add btsnoop protocol manpage Luiz Augusto von Dentz
2026-02-20 17:31 ` [PATCH BlueZ v2 07/12] doc/btmon: Add reference to btsnoop documention Luiz Augusto von Dentz
2026-02-20 17:31 ` [PATCH BlueZ v2 08/12] monitor: Annotate ACL/SCO/ISO data with device address Luiz Augusto von Dentz
2026-02-20 17:31 ` Luiz Augusto von Dentz [this message]
2026-02-20 17:31 ` [PATCH BlueZ v2 10/12] monitor: Add connection lifecycle to analyze summary Luiz Augusto von Dentz
2026-02-20 17:31 ` [PATCH BlueZ v2 11/12] monitor: Prefix data packets with proper type Luiz Augusto von Dentz
2026-02-20 17:31 ` [PATCH BlueZ v2 12/12] doc/btmon: Update documentation to reflect lastest changes Luiz Augusto von Dentz
2026-02-20 18:25 ` [BlueZ,v2,01/12] doc/btmon: Add missing documentation bluez.test.bot
2026-02-20 20:20 ` [PATCH BlueZ v2 01/12] " patchwork-bot+bluetooth
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260220173120.3418666-9-luiz.dentz@gmail.com \
--to=luiz.dentz@gmail.com \
--cc=linux-bluetooth@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox