diff options
author | Petr Machata <petrm@nvidia.com> | 2022-04-22 10:30:59 +0200 |
---|---|---|
committer | David Ahern <dsahern@kernel.org> | 2022-04-27 20:12:48 -0600 |
commit | a05a27c07cbff46c030d79df7fc9adf795bce33f (patch) | |
tree | 6226db1e59e3a737902553c0f3436a19cbd89cda | |
parent | 0f1fd40cc9e8f4fdde18b67cd48ec2445ed7dc97 (diff) | |
download | iproute2-a05a27c07cbff46c030d79df7fc9adf795bce33f.tar.gz |
ipmonitor: Add monitoring support for stats events
Toggles and offloads of HW statistics cause emission of and RTM_NEWSTATS
event. Add support to "ip monitor" for these events.
Signed-off-by: Petr Machata <petrm@nvidia.com>
Reviewed-by: Ido Schimmel <idosch@nvidia.com>
Signed-off-by: David Ahern <dsahern@kernel.org>
-rw-r--r-- | ip/ip_common.h | 1 | ||||
-rw-r--r-- | ip/ipmonitor.c | 16 | ||||
-rw-r--r-- | ip/ipstats.c | 20 |
3 files changed, 36 insertions, 1 deletions
diff --git a/ip/ip_common.h b/ip/ip_common.h index 8b0a64262..9eeeb3877 100644 --- a/ip/ip_common.h +++ b/ip/ip_common.h @@ -57,6 +57,7 @@ int print_nexthop_bucket(struct nlmsghdr *n, void *arg); void netns_map_init(void); void netns_nsid_socket_init(void); int print_nsid(struct nlmsghdr *n, void *arg); +int ipstats_print(struct nlmsghdr *n, void *arg); char *get_name_from_nsid(int nsid); int get_netnsid_from_name(const char *name); int set_netnsid_from_name(const char *name, int nsid); diff --git a/ip/ipmonitor.c b/ip/ipmonitor.c index 0badda4e7..a4326d2ae 100644 --- a/ip/ipmonitor.c +++ b/ip/ipmonitor.c @@ -34,7 +34,7 @@ static void usage(void) "Usage: ip monitor [ all | OBJECTS ] [ FILE ] [ label ] [ all-nsid ]\n" " [ dev DEVICE ]\n" "OBJECTS := address | link | mroute | neigh | netconf |\n" - " nexthop | nsid | prefix | route | rule\n" + " nexthop | nsid | prefix | route | rule | stats\n" "FILE := file FILENAME\n"); exit(-1); } @@ -158,6 +158,11 @@ static int accept_msg(struct rtnl_ctrl_data *ctrl, print_nsid(n, arg); return 0; + case RTM_NEWSTATS: + print_headers(fp, "[STATS]", ctrl); + ipstats_print(n, arg); + return 0; + case NLMSG_ERROR: case NLMSG_NOOP: case NLMSG_DONE: @@ -185,6 +190,7 @@ int do_ipmonitor(int argc, char **argv) int lprefix = 0; int lneigh = 0; int lnetconf = 0; + int lstats = 0; int lrule = 0; int lnsid = 0; int ifindex = 0; @@ -253,6 +259,9 @@ int do_ipmonitor(int argc, char **argv) } else if (matches(*argv, "nexthop") == 0) { lnexthop = 1; groups = 0; + } else if (strcmp(*argv, "stats") == 0) { + lstats = 1; + groups = 0; } else if (strcmp(*argv, "all") == 0) { prefix_banner = 1; } else if (matches(*argv, "all-nsid") == 0) { @@ -349,6 +358,11 @@ int do_ipmonitor(int argc, char **argv) exit(1); } + if (lstats && rtnl_add_nl_group(&rth, RTNLGRP_STATS) < 0) { + fprintf(stderr, "Failed to add stats group to list\n"); + exit(1); + } + if (listen_all_nsid && rtnl_listen_all_nsid(&rth) < 0) exit(1); diff --git a/ip/ipstats.c b/ip/ipstats.c index 29ca07318..39ddca01f 100644 --- a/ip/ipstats.c +++ b/ip/ipstats.c @@ -1219,3 +1219,23 @@ int do_ipstats(int argc, char **argv) return rc; } + +int ipstats_print(struct nlmsghdr *n, void *arg) +{ + struct ipstats_stat_enabled_one one = { + .desc = &ipstats_stat_desc_offload_hw_s_info, + }; + struct ipstats_stat_enabled enabled = { + .enabled = &one, + .nenabled = 1, + }; + FILE *fp = arg; + int rc; + + rc = ipstats_process_ifsm(n, &enabled); + if (rc) + return rc; + + fflush(fp); + return 0; +} |