inet_prefix msrc;
} filter;
-int print_mroute(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
+int print_mroute(struct nlmsghdr *n, void *arg)
{
struct rtmsg *r = NLMSG_DATA(n);
int len = n->nlmsg_len;
if (show_stats && tb[RTA_MFC_STATS]) {
struct rta_mfc_stats *mfcs = RTA_DATA(tb[RTA_MFC_STATS]);
- print_string(PRINT_FP, NULL, "%s", _SL_);
- print_uint(PRINT_ANY, "packets", " %"PRIu64" packets,",
+ print_nl();
+ print_u64(PRINT_ANY, "packets", " %"PRIu64" packets,",
mfcs->mfcs_packets);
- print_uint(PRINT_ANY, "bytes", " %"PRIu64" bytes", mfcs->mfcs_bytes);
+ print_u64(PRINT_ANY, "bytes", " %"PRIu64" bytes", mfcs->mfcs_bytes);
if (mfcs->mfcs_wrong_if)
- print_uint(PRINT_ANY, "wrong_if",
+ print_u64(PRINT_ANY, "wrong_if",
", %"PRIu64" arrived on wrong iif.",
mfcs->mfcs_wrong_if);
}
static int mroute_list(int argc, char **argv)
{
char *id = NULL;
- int family;
+ int family = preferred_family;
ipmroute_reset_filter(0);
- if (preferred_family == AF_UNSPEC)
- family = AF_INET;
- else
- family = AF_INET6;
- if (family == AF_INET) {
+ if (family == AF_INET || family == AF_UNSPEC) {
+ family = RTNL_FAMILY_IPMR;
filter.af = RTNL_FAMILY_IPMR;
filter.tb = RT_TABLE_DEFAULT; /* for backward compatibility */
- } else
+ } else if (family == AF_INET6) {
+ family = RTNL_FAMILY_IP6MR;
filter.af = RTNL_FAMILY_IP6MR;
+ } else {
+ /* family does not have multicast routing */
+ return 0;
+ }
filter.msrc.family = filter.mdst.family = family;
filter.iif = idx;
}
- if (rtnl_wilddump_request(&rth, filter.af, RTM_GETROUTE) < 0) {
+ if (rtnl_routedump_req(&rth, filter.af, NULL) < 0) {
perror("Cannot send dump request");
return 1;
}