[PATCH BlueZ v1] monitor: Add support for -K/--kernel

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx>

This adds support for -K/--kernel that open /proc/kmsg and attempts
to print messages starting with 'Bluetooth:':

> monitor/btmon -K
= Note: Bluetooth: BNEP (Ethernet Emulation) ver 1.3
= Note: Bluetooth: BNEP filters: protocol multicast
= Note: Bluetooth: BNEP socket layer initialized
= Note: Bluetooth: MGMT ver 1.23
= Note: Bluetooth: RFCOMM TTY layer initialized
= Note: Bluetooth: RFCOMM socket layer initialized
= Note: Bluetooth: RFCOMM ver 1.11
---
 monitor/btmon.rst |  2 ++
 monitor/control.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++
 monitor/main.c    |  7 +++++-
 monitor/packet.h  |  1 +
 4 files changed, 68 insertions(+), 1 deletion(-)

diff --git a/monitor/btmon.rst b/monitor/btmon.rst
index eb5e25182f0f..39c185fd5e41 100644
--- a/monitor/btmon.rst
+++ b/monitor/btmon.rst
@@ -77,6 +77,8 @@ OPTIONS
 
 -M, --mgmt                  Open channel for mgmt events.
 
+-K, --kernel                Open kmsg for kernel messages.
+
 -t, --time                  Show a time instead of time offset.
 
 -T, --date                  Show a time and date information instead of
diff --git a/monitor/control.c b/monitor/control.c
index cb8e9fe731fb..83347d5dbc3e 100644
--- a/monitor/control.c
+++ b/monitor/control.c
@@ -1081,6 +1081,62 @@ static int open_channel(uint16_t channel)
 	return 0;
 }
 
+static void kmsg_callback(int fd, uint32_t events, void *user_data)
+{
+	char buf[1024], *msg;
+	ssize_t len;
+	struct timeval tv;
+
+	if (events & (EPOLLERR | EPOLLHUP)) {
+		mainloop_remove_fd(fd);
+		return;
+	}
+
+	memset(buf, 0, sizeof(buf));
+
+	len = read(fd, buf, sizeof(buf));
+	if (len < 0)
+		return;
+
+	/* Check if the kernel message is from Bluetooth */
+	msg = strcasestr(buf, "Bluetooth:");
+	if (!msg)
+		return;
+
+	/* Replace Bluetooth with Kernel to avoid possible confusions */
+	msg += 3;
+	memcpy(msg, "Kernel", 6);
+
+	/* Adjust the actual length since part of the message is skipped and
+	 * replace the \n with \0 at the end.
+	 */
+	len = len - (msg - buf);
+	msg[len - 1] = '\0';
+
+	gettimeofday(&tv, NULL);
+
+	btsnoop_write_hci(btsnoop_file, &tv, HCI_DEV_NONE,
+				BTSNOOP_OPCODE_SYSTEM_NOTE, 0, msg, len);
+	packet_monitor(&tv, NULL, HCI_DEV_NONE,
+				BTSNOOP_OPCODE_SYSTEM_NOTE, msg, len);
+}
+
+static int open_kmsg(void)
+{
+	int fd;
+
+	fd = open("/dev/kmsg", O_RDONLY);
+	if (fd < 0)
+		return -1;
+
+	if (mainloop_add_fd(fd, EPOLLIN, kmsg_callback, NULL, NULL) < 0) {
+		close(fd);
+		return -1;
+	}
+
+	return 0;
+}
+
 static void client_callback(int fd, uint32_t events, void *user_data)
 {
 	struct control_data *data = user_data;
@@ -1556,6 +1612,9 @@ int control_tracing(void)
 	if (packet_has_filter(PACKET_FILTER_SHOW_MGMT_SOCKET))
 		open_channel(HCI_CHANNEL_CONTROL);
 
+	if (packet_has_filter(PACKET_FILTER_SHOW_KMSG))
+		open_kmsg();
+
 	return 0;
 }
 
diff --git a/monitor/main.c b/monitor/main.c
index fa56fcb29f38..cc947af1ffc4 100644
--- a/monitor/main.c
+++ b/monitor/main.c
@@ -61,6 +61,7 @@ static void usage(void)
 		"\t-B, --tty-speed <rate> Set TTY speed (default 115200)\n"
 		"\t-V, --vendor <compid>  Set default company identifier\n"
 		"\t-M, --mgmt             Open channel for mgmt events\n"
+		"\t-K, --kernel           Open kmsg for kernel messages\n"
 		"\t-t, --time             Show time instead of time offset\n"
 		"\t-T, --date             Show time and date information\n"
 		"\t-S, --sco              Dump SCO traffic\n"
@@ -88,6 +89,7 @@ static const struct option main_options[] = {
 	{ "tty-speed", required_argument, NULL, 'B' },
 	{ "vendor",    required_argument, NULL, 'V' },
 	{ "mgmt",      no_argument,       NULL, 'M' },
+	{ "kernel",    no_argument,       NULL, 'K' },
 	{ "no-time",   no_argument,       NULL, 'N' },
 	{ "time",      no_argument,       NULL, 't' },
 	{ "date",      no_argument,       NULL, 'T' },
@@ -131,7 +133,7 @@ int main(int argc, char *argv[])
 		struct sockaddr_un addr;
 
 		opt = getopt_long(argc, argv,
-				"r:w:a:s:p:i:d:B:V:MNtTSAIE:PJ:R:C:c:vh",
+				"r:w:a:s:p:i:d:B:V:MKNtTSAIE:PJ:R:C:c:vh",
 				main_options, NULL);
 		if (opt < 0)
 			break;
@@ -184,6 +186,9 @@ int main(int argc, char *argv[])
 		case 'M':
 			filter_mask |= PACKET_FILTER_SHOW_MGMT_SOCKET;
 			break;
+		case 'K':
+			filter_mask |= PACKET_FILTER_SHOW_KMSG;
+			break;
 		case 'N':
 			filter_mask &= ~PACKET_FILTER_SHOW_TIME_OFFSET;
 			break;
diff --git a/monitor/packet.h b/monitor/packet.h
index 964b9a7219fa..154a08efacc5 100644
--- a/monitor/packet.h
+++ b/monitor/packet.h
@@ -23,6 +23,7 @@
 #define PACKET_FILTER_SHOW_A2DP_STREAM	(1 << 6)
 #define PACKET_FILTER_SHOW_MGMT_SOCKET	(1 << 7)
 #define PACKET_FILTER_SHOW_ISO_DATA	(1 << 8)
+#define PACKET_FILTER_SHOW_KMSG		(1 << 9)
 #define TV_MSEC(_tv) (long long)((_tv).tv_sec * 1000 + (_tv).tv_usec / 1000)
 
 struct packet_latency {
-- 
2.50.1





[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux