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