From: James Prestwood <prestwoj@gmail.com>
To: iwd@lists.linux.dev
Cc: James Prestwood <prestwoj@gmail.com>
Subject: [PATCH 1/4] monitor: add --time-format,-t option
Date: Wed, 27 Nov 2024 09:33:25 -0800 [thread overview]
Message-ID: <20241127173328.158354-1-prestwoj@gmail.com> (raw)
For syncing iwmon captures with other logging its useful to
timestamp in some absolute format like UTC. This adds an
option which allows the user to specify what time format to
show. For now support:
delta - (default) The time delta between the first packet
and the current packet.
utc - The packet time in UTC
---
monitor/main.c | 56 ++++++++++++++++++++++++++++++-------------------
monitor/nlmon.c | 40 +++++++++++++++++++++++++++++------
monitor/nlmon.h | 6 ++++++
3 files changed, 75 insertions(+), 27 deletions(-)
diff --git a/monitor/main.c b/monitor/main.c
index fc22c777..fe40e301 100644
--- a/monitor/main.c
+++ b/monitor/main.c
@@ -718,29 +718,32 @@ static void usage(void)
"Usage:\n");
printf("\tiwmon [options]\n");
printf("Options:\n"
- "\t-r, --read <file> Read netlink PCAP trace file\n"
- "\t-w, --write <file> Write netlink PCAP trace file\n"
- "\t-a, --analyze <file> Analyze netlink PCAP trace file\n"
- "\t-i, --interface <dev> Use specified netlink monitor\n"
- "\t-n, --nortnl Don't show RTNL output\n"
- "\t-y, --nowiphy Don't show 'New Wiphy' output\n"
- "\t-s, --noscan Don't show scan result output\n"
- "\t-e, --noies Don't show IEs except SSID\n"
- "\t-h, --help Show help options\n");
+ "\t-r, --read <file> Read netlink PCAP trace file\n"
+ "\t-w, --write <file> Write netlink PCAP trace file\n"
+ "\t-a, --analyze <file> Analyze netlink PCAP trace file\n"
+ "\t-i, --interface <dev> Use specified netlink monitor\n"
+ "\t-n, --nortnl Don't show RTNL output\n"
+ "\t-y, --nowiphy Don't show 'New Wiphy' output\n"
+ "\t-s, --noscan Don't show scan result output\n"
+ "\t-e, --noies Don't show IEs except SSID\n"
+ "\t-t, --time-format <format> Time format to display. Either\n"
+ "\t\t\t\t 'delta' or 'utc'.\n"
+ "\t-h, --help Show help options\n");
}
static const struct option main_options[] = {
- { "read", required_argument, NULL, 'r' },
- { "write", required_argument, NULL, 'w' },
- { "analyze", required_argument, NULL, 'a' },
- { "nl80211", required_argument, NULL, 'F' },
- { "interface", required_argument, NULL, 'i' },
- { "nortnl", no_argument, NULL, 'n' },
- { "nowiphy", no_argument, NULL, 'y' },
- { "noscan", no_argument, NULL, 's' },
- { "noies", no_argument, NULL, 'e' },
- { "version", no_argument, NULL, 'v' },
- { "help", no_argument, NULL, 'h' },
+ { "read", required_argument, NULL, 'r' },
+ { "write", required_argument, NULL, 'w' },
+ { "analyze", required_argument, NULL, 'a' },
+ { "nl80211", required_argument, NULL, 'F' },
+ { "interface", required_argument, NULL, 'i' },
+ { "nortnl", no_argument, NULL, 'n' },
+ { "nowiphy", no_argument, NULL, 'y' },
+ { "noscan", no_argument, NULL, 's' },
+ { "noies", no_argument, NULL, 'e' },
+ { "time-format", required_argument, NULL, 't' },
+ { "version", no_argument, NULL, 'v' },
+ { "help", no_argument, NULL, 'h' },
{ }
};
@@ -754,7 +757,7 @@ int main(int argc, char *argv[])
for (;;) {
int opt;
- opt = getopt_long(argc, argv, "r:w:a:i:nvhyse",
+ opt = getopt_long(argc, argv, "r:w:a:i:t:nvhyse",
main_options, NULL);
if (opt < 0)
break;
@@ -784,6 +787,17 @@ int main(int argc, char *argv[])
break;
case 'e':
config.noies = true;
+ break;
+ case 't':
+ if (!strcmp(optarg, "delta"))
+ config.time_format = TIME_FORMAT_DELTA;
+ else if (!strcmp(optarg, "utc"))
+ config.time_format = TIME_FORMAT_UTC;
+ else {
+ printf("Invalid time format '%s'", optarg);
+ return EXIT_FAILURE;
+ }
+
break;
case 'v':
printf("%s\n", VERSION);
diff --git a/monitor/nlmon.c b/monitor/nlmon.c
index 60adddc5..4ecbc5f0 100644
--- a/monitor/nlmon.c
+++ b/monitor/nlmon.c
@@ -29,6 +29,7 @@
#include <errno.h>
#include <ctype.h>
#include <unistd.h>
+#include <time.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <arpa/inet.h>
@@ -113,6 +114,7 @@ struct nlmon {
bool noscan;
bool noies;
bool read;
+ enum time_format time_format;
};
struct nlmon_req {
@@ -185,11 +187,15 @@ static void nlmon_req_free(void *data)
}
static time_t time_offset = ((time_t) -1);
+static enum time_format time_format;
-static inline void update_time_offset(const struct timeval *tv)
+static inline void update_time_offset(const struct timeval *tv,
+ enum time_format tf)
{
- if (tv && time_offset == ((time_t) -1))
+ if (tv && time_offset == ((time_t) -1)) {
time_offset = tv->tv_sec;
+ time_format = tf;
+ }
}
#define print_indent(indent, color1, prefix, title, color2, fmt, args...) \
@@ -225,15 +231,33 @@ static void print_packet(const struct timeval *tv, char ident,
int n, ts_len = 0, ts_pos = 0, len = 0, pos = 0;
if (tv) {
+ struct tm *tm;
+
if (use_color()) {
n = sprintf(ts_str + ts_pos, "%s", COLOR_TIMESTAMP);
if (n > 0)
ts_pos += n;
}
- n = sprintf(ts_str + ts_pos, " %" PRId64 ".%06" PRId64,
+ switch (time_format) {
+ case TIME_FORMAT_DELTA:
+ n = sprintf(ts_str + ts_pos, " %" PRId64 ".%06" PRId64,
(int64_t)tv->tv_sec - time_offset,
(int64_t)tv->tv_usec);
+ break;
+ case TIME_FORMAT_UTC:
+ tm = gmtime(&tv->tv_sec);
+ if (!tm) {
+ n = sprintf(ts_str + ts_pos, "%s",
+ "Time error");
+ break;
+ }
+
+ n = strftime(ts_str + ts_pos, sizeof(ts_str) - ts_pos,
+ "%b %d %H:%M:%S", tm);
+ break;
+ }
+
if (n > 0) {
ts_pos += n;
ts_len += n;
@@ -7497,6 +7521,7 @@ struct nlmon *nlmon_create(uint16_t id, const struct nlmon_config *config)
nlmon->noscan = config->noscan;
nlmon->noies = config->noies;
nlmon->read = config->read_only;
+ nlmon->time_format = config->time_format;
return nlmon;
}
@@ -8333,7 +8358,10 @@ void nlmon_print_rtnl(struct nlmon *nlmon, const struct timeval *tv,
int64_t aligned_size = NLMSG_ALIGN(size);
const struct nlmsghdr *nlmsg;
- update_time_offset(tv);
+ if (nlmon->nortnl)
+ return;
+
+ update_time_offset(tv, nlmon->time_format);
for (nlmsg = data; NLMSG_OK(nlmsg, aligned_size);
nlmsg = NLMSG_NEXT(nlmsg, aligned_size)) {
@@ -8371,7 +8399,7 @@ void nlmon_print_genl(struct nlmon *nlmon, const struct timeval *tv,
{
const struct nlmsghdr *nlmsg;
- update_time_offset(tv);
+ update_time_offset(tv, nlmon->time_format);
for (nlmsg = data; NLMSG_OK(nlmsg, size);
nlmsg = NLMSG_NEXT(nlmsg, size)) {
@@ -8394,7 +8422,7 @@ void nlmon_print_pae(struct nlmon *nlmon, const struct timeval *tv,
{
char extra_str[16];
- update_time_offset(tv);
+ update_time_offset(tv, nlmon->time_format);
sprintf(extra_str, "len %u", size);
diff --git a/monitor/nlmon.h b/monitor/nlmon.h
index bb1a7c58..bbc5d250 100644
--- a/monitor/nlmon.h
+++ b/monitor/nlmon.h
@@ -25,12 +25,18 @@
struct nlmon;
+enum time_format {
+ TIME_FORMAT_DELTA,
+ TIME_FORMAT_UTC,
+};
+
struct nlmon_config {
bool nortnl;
bool nowiphy;
bool noscan;
bool noies;
bool read_only;
+ enum time_format time_format;
};
struct nlmon *nlmon_open(uint16_t id, const char *pathname,
--
2.34.1
next reply other threads:[~2024-11-27 17:33 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-11-27 17:33 James Prestwood [this message]
2024-11-27 17:33 ` [PATCH 2/4] monitor: track current PCAP size James Prestwood
2024-11-27 17:33 ` [PATCH 3/4] monitor: add support for limiting PCAP size/count James Prestwood
2024-11-27 17:33 ` [PATCH 4/4] monitor: add --pcap-size,--pcap-count James Prestwood
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=20241127173328.158354-1-prestwoj@gmail.com \
--to=prestwoj@gmail.com \
--cc=iwd@lists.linux.dev \
/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