From: Mazhar Rana Date: Thu, 11 Jun 2015 16:07:36 +0000 (+0530) Subject: mroute: "ip mroute show" not working when "to" and/or "from" is given X-Git-Tag: v4.1.0~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=45b01c46d420ed790f7733763060af1725735c05;p=thirdparty%2Fiproute2.git mroute: "ip mroute show" not working when "to" and/or "from" is given The command "ip mroute show" is not showing routes when "to" and/or "from" filter is applied. root@mazhar:~# ip mroute show (10.202.30.101, 235.1.2.3) Iif: eth0 Oifs: eth1 But When I applied filter, it does not show anything. root@mazhar:~# ip mroute show 235.1.2.3 from 10.202.30.101 root@mazhar:~# Signed-off-by: Mazhar Rana --- diff --git a/ip/ipmroute.c b/ip/ipmroute.c index 125a13f8c..fffa9e2c7 100644 --- a/ip/ipmroute.c +++ b/ip/ipmroute.c @@ -97,15 +97,25 @@ int print_mroute(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) if (filter.af && filter.af != r->rtm_family) return 0; - if (tb[RTA_DST] && - filter.mdst.bitlen > 0 && - inet_addr_match(RTA_DATA(tb[RTA_DST]), &filter.mdst, filter.mdst.bitlen)) - return 0; + if (tb[RTA_DST] && filter.mdst.bitlen > 0) { + inet_prefix dst; + + memset(&dst, 0, sizeof(dst)); + dst.family = r->rtm_family; + memcpy(&dst.data, RTA_DATA(tb[RTA_DST]), RTA_PAYLOAD(tb[RTA_DST])); + if (inet_addr_match(&dst, &filter.mdst, filter.mdst.bitlen)) + return 0; + } - if (tb[RTA_SRC] && - filter.msrc.bitlen > 0 && - inet_addr_match(RTA_DATA(tb[RTA_SRC]), &filter.msrc, filter.msrc.bitlen)) - return 0; + if (tb[RTA_SRC] && filter.msrc.bitlen > 0) { + inet_prefix src; + + memset(&src, 0, sizeof(src)); + src.family = r->rtm_family; + memcpy(&src.data, RTA_DATA(tb[RTA_SRC]), RTA_PAYLOAD(tb[RTA_SRC])); + if (inet_addr_match(&src, &filter.msrc, filter.msrc.bitlen)) + return 0; + } family = r->rtm_family == RTNL_FAMILY_IPMR ? AF_INET : AF_INET6;