On 3/7/18 9:51 AM, Stephen Hemminger wrote: > On Tue, 6 Mar 2018 17:03:54 -0800 > Stephen Hemminger <step...@networkplumber.org> wrote: > >> From: Stephen Hemminger <sthem...@microsoft.com> >> >> Every non-multicast route prints an error message. >> Kernel doesn't filter out unicast routes, it is up to filter function >> to do this. >> >> Signed-off-by: Stephen Hemminger <step...@networkplumber.org> > > I found the issue (in kernel) but not sure how to deal with it. > If kernel is built without multicast routing configured !CONFIG_IP_MROUTE > then the netlink request to return multicast routes will return all routes! > > This is because in the kernel the way route dump works is that each > address family registers a callback to dump routes for a specific address > family. If that address family is not registered then the fall back > is to address family PF_UNSPEC which has a handler that dumps all > routes.
If I ask the kernel for IP{6}MR address family and the kernel returns a dump of all address families, that seems like a kernel bug to me. From a short review it seems to be that way for a long time. I guess iproute2 has no choice but to adapt to the kernel design. Are you going to resubmit this series? > > Unfortunately, changing that behavior in kernel will certainly break > some user. And there is no direct way to determine multicast routing > is enabled in ip mroute code. > > Maybe just change the message in ip mroute to do: > > diff --git a/ip/ipmroute.c b/ip/ipmroute.c > index aa5029b44f41..31b9bfe95596 100644 > --- a/ip/ipmroute.c > +++ b/ip/ipmroute.c > @@ -76,9 +76,8 @@ int print_mroute(const struct sockaddr_nl *who, struct > nlmsghdr *n, void *arg) > return -1; > } > if (r->rtm_type != RTN_MULTICAST) { > - fprintf(stderr, "Not a multicast route (type: %s)\n", > - rtnl_rtntype_n2a(r->rtm_type, b1, sizeof(b1))); > - return 0; > + fprintf(stderr, "Multicast routing does not appear to be > enabled\n"); > + return -1; > } > > parse_rtattr(tb, RTA_MAX, RTM_RTA(r), len); >