SPRINT_BUF(b1);
- if (n->nlmsg_type != RTM_NEWADDR && n->nlmsg_type != RTM_DELADDR)
+ if (n->nlmsg_type != RTM_NEWADDR &&
+ n->nlmsg_type != RTM_DELADDR &&
+ n->nlmsg_type != RTM_NEWMULTICAST &&
+ n->nlmsg_type != RTM_DELMULTICAST)
return 0;
len -= NLMSG_LENGTH(sizeof(*ifa));
if (len < 0) {
print_headers(fp, "[ADDR]");
- if (n->nlmsg_type == RTM_DELADDR)
+ if (n->nlmsg_type == RTM_DELADDR || n->nlmsg_type == RTM_DELMULTICAST)
print_bool(PRINT_ANY, "deleted", "Deleted ", true);
if (!brief) {
rta_tb[IFA_ANYCAST]));
}
+ if (rta_tb[IFA_MULTICAST]) {
+ print_string(PRINT_FP, NULL, "%s ", "mcast");
+ print_color_string(PRINT_ANY,
+ ifa_family_color(ifa->ifa_family),
+ "multicast",
+ "%s ",
+ format_host_rta(ifa->ifa_family,
+ rta_tb[IFA_MULTICAST]));
+ }
+
print_string(PRINT_ANY,
"scope",
"scope %s ",
fprintf(stderr,
"Usage: ip monitor [ all | OBJECTS ] [ FILE ] [ label ] [ all-nsid ]\n"
" [ dev DEVICE ]\n"
- "OBJECTS := address | link | mroute | neigh | netconf |\n"
+ "OBJECTS := address | link | mroute | maddress | neigh | netconf |\n"
" nexthop | nsid | prefix | route | rule | stats\n"
"FILE := file FILENAME\n");
exit(-1);
ipstats_print(n, arg);
return 0;
+ case RTM_DELMULTICAST:
+ case RTM_NEWMULTICAST:
+ print_addrinfo(n, arg);
+ return 0;
+
case NLMSG_ERROR:
case NLMSG_NOOP:
case NLMSG_DONE:
#define IPMON_LRULE BIT(8)
#define IPMON_LNSID BIT(9)
#define IPMON_LNEXTHOP BIT(10)
+#define IPMON_LMADDR BIT(11)
#define IPMON_L_ALL (~0)
lmask |= IPMON_LLINK;
} else if (matches(*argv, "address") == 0) {
lmask |= IPMON_LADDR;
+ } else if (matches(*argv, "maddress") == 0) {
+ lmask |= IPMON_LMADDR;
} else if (matches(*argv, "route") == 0) {
lmask |= IPMON_LROUTE;
} else if (matches(*argv, "mroute") == 0) {
exit(1);
}
+ if (lmask & IPMON_LMADDR) {
+ if ((!preferred_family || preferred_family == AF_INET) &&
+ rtnl_add_nl_group(&rth, RTNLGRP_IPV4_MCADDR) < 0) {
+ fprintf(stderr,
+ "Failed to add ipv4 mcaddr group to list\n");
+ exit(1);
+ }
+ if ((!preferred_family || preferred_family == AF_INET6) &&
+ rtnl_add_nl_group(&rth, RTNLGRP_IPV6_MCADDR) < 0) {
+ fprintf(stderr,
+ "Failed to add ipv6 mcaddr group to list\n");
+ exit(1);
+ }
+ }
+
if (listen_all_nsid && rtnl_listen_all_nsid(&rth) < 0)
exit(1);
.I OBJECT-LIST
is the list of object types that we want to monitor.
It may contain
-.BR link ", " address ", " route ", " mroute ", " prefix ", "
+.BR link ", " address ", " route ", " mroute ", " maddress ", " prefix ", "
.BR neigh ", " netconf ", " rule ", " stats ", " nsid " and " nexthop "."
If no
.B file