diff options
author | Nicolas Dichtel <nicolas.dichtel@6wind.com> | 2012-12-03 20:03:07 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-12-07 12:24:33 -0500 |
commit | 8caaf7b608ae27f7e7d5f5df6f87039db556d4bb (patch) | |
tree | a2df2bfcc8e549e633cda4e3958d61aeb975b994 /net/ipv4/route.c | |
parent | e3d8fabee3b66ce158b2603f270479b84b6e4ba7 (diff) |
ipv4/route/rtnl: get mcast attributes when dst is multicast
Commit f1ce3062c538 (ipv4: Remove 'rt_dst' from 'struct rtable') removes the
call to ipmr_get_route(), which will get multicast parameters of the route.
I revert the part of the patch that remove this call. I think the goal was only
to get rid of rt_dst field.
The patch is only compiled-tested. My first idea was to remove ipmr_get_route()
because rt_fill_info() was the only user, but it seems the previous patch cleans
the code a bit too much ;-)
Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/route.c')
-rw-r--r-- | net/ipv4/route.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index baa9b289d7ab..844a9ef60dbd 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
@@ -2232,8 +2232,27 @@ static int rt_fill_info(struct net *net, __be32 dst, __be32 src, | |||
2232 | error = rt->dst.error; | 2232 | error = rt->dst.error; |
2233 | 2233 | ||
2234 | if (rt_is_input_route(rt)) { | 2234 | if (rt_is_input_route(rt)) { |
2235 | if (nla_put_u32(skb, RTA_IIF, rt->rt_iif)) | 2235 | #ifdef CONFIG_IP_MROUTE |
2236 | goto nla_put_failure; | 2236 | if (ipv4_is_multicast(dst) && !ipv4_is_local_multicast(dst) && |
2237 | IPV4_DEVCONF_ALL(net, MC_FORWARDING)) { | ||
2238 | int err = ipmr_get_route(net, skb, | ||
2239 | fl4->saddr, fl4->daddr, | ||
2240 | r, nowait); | ||
2241 | if (err <= 0) { | ||
2242 | if (!nowait) { | ||
2243 | if (err == 0) | ||
2244 | return 0; | ||
2245 | goto nla_put_failure; | ||
2246 | } else { | ||
2247 | if (err == -EMSGSIZE) | ||
2248 | goto nla_put_failure; | ||
2249 | error = err; | ||
2250 | } | ||
2251 | } | ||
2252 | } else | ||
2253 | #endif | ||
2254 | if (nla_put_u32(skb, RTA_IIF, rt->rt_iif)) | ||
2255 | goto nla_put_failure; | ||
2237 | } | 2256 | } |
2238 | 2257 | ||
2239 | if (rtnl_put_cacheinfo(skb, &rt->dst, 0, expires, error) < 0) | 2258 | if (rtnl_put_cacheinfo(skb, &rt->dst, 0, expires, error) < 0) |