]> git.proxmox.com Git - mirror_iproute2.git/commitdiff
ip monitor: Allow to filter events by dev
authorvadimk <vadim4j@gmail.com>
Mon, 20 Oct 2014 09:25:17 +0000 (12:25 +0300)
committerStephen Hemminger <shemming@brocade.com>
Sat, 29 Nov 2014 19:15:40 +0000 (11:15 -0800)
Added 'dev' option to allow filtering events by device.

Signed-off-by: Vadim Kochan <vadim4j@gmail.com>
ip/ip_common.h
ip/ipaddress.c
ip/ipmonitor.c
ip/ipmroute.c
ip/ipneigh.c
ip/ipnetconf.c
ip/iproute.c
man/man8/ip-monitor.8

index 095c92dc6d61e9ab535c85087b3946a3a2bf0f11..75bfb824ab1f8a5c678f928a819261eb005a180e 100644 (file)
@@ -13,14 +13,17 @@ extern int print_ntable(const struct sockaddr_nl *who,
                        struct nlmsghdr *n, void *arg);
 extern int ipaddr_list(int argc, char **argv);
 extern int ipaddr_list_link(int argc, char **argv);
+void ipaddr_get_vf_rate(int, int *, int *, int);
 extern int iproute_monitor(int argc, char **argv);
 extern void iplink_usage(void) __attribute__((noreturn));
-extern void iproute_reset_filter(void);
-extern void ipmroute_reset_filter(void);
-void ipaddr_get_vf_rate(int, int *, int *, int);
-extern void ipaddr_reset_filter(int);
-extern void ipneigh_reset_filter(void);
+
+extern void iproute_reset_filter(int ifindex);
+extern void ipmroute_reset_filter(int ifindex);
+extern void ipaddr_reset_filter(int oneline, int ifindex);
+extern void ipneigh_reset_filter(int ifindex);
 extern void ipntable_reset_filter(void);
+extern void ipnetconf_reset_filter(int ifindex);
+
 extern int print_route(const struct sockaddr_nl *who,
                       struct nlmsghdr *n, void *arg);
 extern int print_mroute(const struct sockaddr_nl *who,
index db39437305a9a05d77c0c58dac799c23dfe33f5f..c95aa6d5bf6fb2cfcd51cf9f440d3b7b971c0c32 100644 (file)
@@ -1197,7 +1197,7 @@ static int ipaddr_list_flush_or_save(int argc, char **argv, int action)
        char *filter_dev = NULL;
        int no_link = 0;
 
-       ipaddr_reset_filter(oneline);
+       ipaddr_reset_filter(oneline, 0);
        filter.showqueue = 1;
 
        if (filter.family == AF_UNSPEC)
@@ -1442,10 +1442,11 @@ int ipaddr_list_link(int argc, char **argv)
        return ipaddr_list_flush_or_save(argc, argv, IPADD_LIST);
 }
 
-void ipaddr_reset_filter(int oneline)
+void ipaddr_reset_filter(int oneline, int ifindex)
 {
        memset(&filter, 0, sizeof(filter));
        filter.oneline = oneline;
+       filter.ifindex = ifindex;
 }
 
 static int default_scope(inet_prefix *lcl)
index b7b2d98d80fe9a16dd350bfe511e8ac69846d46b..4cc75f4ce3f127520c7fbb3458438db710dedebb 100644 (file)
@@ -29,7 +29,8 @@ int prefix_banner;
 
 static void usage(void)
 {
-       fprintf(stderr, "Usage: ip monitor [ all | LISTofOBJECTS ] [ FILE ] [ label ]\n");
+       fprintf(stderr, "Usage: ip monitor [ all | LISTofOBJECTS ] [ FILE ]"
+                       "[ label ] [dev DEVICE]\n");
        fprintf(stderr, "LISTofOBJECTS := link | address | route | mroute | prefix |\n");
        fprintf(stderr, "                 neigh | netconf\n");
        fprintf(stderr, "FILE := file FILENAME\n");
@@ -162,12 +163,9 @@ int do_ipmonitor(int argc, char **argv)
        int lprefix=0;
        int lneigh=0;
        int lnetconf=0;
+       int ifindex=0;
 
        rtnl_close(&rth);
-       ipaddr_reset_filter(1);
-       iproute_reset_filter();
-       ipmroute_reset_filter();
-       ipneigh_reset_filter();
 
        while (argc > 0) {
                if (matches(*argv, "file") == 0) {
@@ -201,6 +199,12 @@ int do_ipmonitor(int argc, char **argv)
                        prefix_banner=1;
                } else if (matches(*argv, "help") == 0) {
                        usage();
+               } else if (strcmp(*argv, "dev") == 0) {
+                       NEXT_ARG();
+
+                       ifindex = ll_name_to_index(*argv);
+                       if (!ifindex)
+                               invarg("Device does not exist\n", *argv);
                } else {
                        fprintf(stderr, "Argument \"%s\" is unknown, try \"ip monitor help\".\n", *argv);
                        exit(-1);
@@ -208,6 +212,12 @@ int do_ipmonitor(int argc, char **argv)
                argc--; argv++;
        }
 
+       ipaddr_reset_filter(1, ifindex);
+       iproute_reset_filter(ifindex);
+       ipmroute_reset_filter(ifindex);
+       ipneigh_reset_filter(ifindex);
+       ipnetconf_reset_filter(ifindex);
+
        if (llink)
                groups |= nl_mgrp(RTNLGRP_LINK);
        if (laddr) {
index be93a988b18ce671eaa70a47a213c7d1355e49e6..b4ed9f15fda5e8349fa6188c77d8f105888cabb0 100644 (file)
@@ -174,11 +174,12 @@ int print_mroute(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
        return 0;
 }
 
-void ipmroute_reset_filter(void)
+void ipmroute_reset_filter(int ifindex)
 {
        memset(&filter, 0, sizeof(filter));
        filter.mdst.bitlen = -1;
        filter.msrc.bitlen = -1;
+       filter.iif = ifindex;
 }
 
 static int mroute_list(int argc, char **argv)
@@ -186,7 +187,7 @@ static int mroute_list(int argc, char **argv)
        char *id = NULL;
        int family;
 
-       ipmroute_reset_filter();
+       ipmroute_reset_filter(0);
        if (preferred_family == AF_UNSPEC)
                family = AF_INET;
        else
index 71a4100f0b595f82b1641960b1f7ce42ea81fc2a..6be79e1ae7853cce1a59caf7cc73d91220eb203d 100644 (file)
@@ -313,10 +313,11 @@ int print_neigh(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
        return 0;
 }
 
-void ipneigh_reset_filter(void)
+void ipneigh_reset_filter(int ifindex)
 {
        memset(&filter, 0, sizeof(filter));
        filter.state = ~0;
+       filter.index = ifindex;
 }
 
 static int do_show_or_flush(int argc, char **argv, int flush)
@@ -325,7 +326,7 @@ static int do_show_or_flush(int argc, char **argv, int flush)
        int state_given = 0;
        struct ndmsg ndm = { 0 };
 
-       ipneigh_reset_filter();
+       ipneigh_reset_filter(0);
 
        if (!filter.family)
                filter.family = preferred_family;
index 0e44cc8cc0dbacc815ea866f47dd21e3a617a087..aa31ead0686311a7db127b1bdb4e05f9f1fddaee 100644 (file)
@@ -123,9 +123,10 @@ int print_netconf(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
        return 0;
 }
 
-static void ipnetconf_reset_filter(void)
+void ipnetconf_reset_filter(int ifindex)
 {
        memset(&filter, 0, sizeof(filter));
+       filter.ifindex = ifindex;
 }
 
 static int do_show(int argc, char **argv)
@@ -136,7 +137,7 @@ static int do_show(int argc, char **argv)
                char                    buf[1024];
        } req;
 
-       ipnetconf_reset_filter();
+       ipnetconf_reset_filter(0);
        filter.family = preferred_family;
        if (filter.family == AF_UNSPEC)
                filter.family = AF_INET;
index d77b1e3585d9ce109e51d4125541631da623b8b1..c9cf5d6ab20b702ec641d45d3c3a87a77d0b972a 100644 (file)
@@ -1137,7 +1137,7 @@ static int iproute_list_flush_or_save(int argc, char **argv, int action)
        } else
                filter_fn = print_route;
 
-       iproute_reset_filter();
+       iproute_reset_filter(0);
        filter.tb = RT_TABLE_MAIN;
 
        if ((action == IPROUTE_FLUSH) && argc <= 0) {
@@ -1385,7 +1385,7 @@ static int iproute_get(int argc, char **argv)
 
        memset(&req, 0, sizeof(req));
 
-       iproute_reset_filter();
+       iproute_reset_filter(0);
        filter.cloned = 2;
 
        req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg));
@@ -1590,11 +1590,14 @@ static int iproute_showdump(void)
        exit(rtnl_from_file(stdin, &show_handler, NULL));
 }
 
-void iproute_reset_filter(void)
+void iproute_reset_filter(int ifindex)
 {
        memset(&filter, 0, sizeof(filter));
        filter.mdst.bitlen = -1;
        filter.msrc.bitlen = -1;
+       filter.oif = ifindex;
+       if (filter.oif > 0)
+               filter.oifmask = -1;
 }
 
 int do_iproute(int argc, char **argv)
index b6e8d1ddeab110972ef95f3318d1e282286daf12..68e83f1c9c20203b6054738f2352b362945e08f1 100644 (file)
@@ -11,6 +11,8 @@ ip-monitor, rtmon \- state monitoring
 .BR  "monitor" " [ " all " |"
 .IR OBJECT-LIST " ] ["
 .BI file " FILENAME "
+] [
+.BI dev " DEVICE "
 ]
 .sp
 
@@ -26,6 +28,8 @@ command is the first in the command line and then the object list follows:
 .BR "ip monitor" " [ " all " |"
 .IR OBJECT-LIST " ] ["
 .BI file " FILENAME "
+] [
+.BI dev " DEVICE "
 ]
 
 .I OBJECT-LIST
@@ -69,6 +73,11 @@ at any time.
 It prepends the history with the state snapshot dumped at the moment
 of starting.
 
+.P
+If the
+.BI dev
+option is given, the program prints only events related to this device.
+
 .SH SEE ALSO
 .br
 .BR ip (8)