Added 'dev' option to allow filtering events by device.
Signed-off-by: Vadim Kochan <vadim4j@gmail.com>
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,
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)
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)
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");
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) {
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);
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) {
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)
char *id = NULL;
int family;
- ipmroute_reset_filter();
+ ipmroute_reset_filter(0);
if (preferred_family == AF_UNSPEC)
family = AF_INET;
else
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)
int state_given = 0;
struct ndmsg ndm = { 0 };
- ipneigh_reset_filter();
+ ipneigh_reset_filter(0);
if (!filter.family)
filter.family = preferred_family;
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)
char buf[1024];
} req;
- ipnetconf_reset_filter();
+ ipnetconf_reset_filter(0);
filter.family = preferred_family;
if (filter.family == AF_UNSPEC)
filter.family = AF_INET;
} else
filter_fn = print_route;
- iproute_reset_filter();
+ iproute_reset_filter(0);
filter.tb = RT_TABLE_MAIN;
if ((action == IPROUTE_FLUSH) && argc <= 0) {
memset(&req, 0, sizeof(req));
- iproute_reset_filter();
+ iproute_reset_filter(0);
filter.cloned = 2;
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg));
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)
.BR "monitor" " [ " all " |"
.IR OBJECT-LIST " ] ["
.BI file " FILENAME "
+] [
+.BI dev " DEVICE "
]
.sp
.BR "ip monitor" " [ " all " |"
.IR OBJECT-LIST " ] ["
.BI file " FILENAME "
+] [
+.BI dev " DEVICE "
]
.I OBJECT-LIST
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)