mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
ipv4: reset rt_iif for recirculated mcast/bcast out pkts
Multicast or broadcast egress packets have rt_iif set to the oif. These packets might be recirculated back as input and lookup to the raw sockets may fail because they are bound to the incoming interface (skb_iif). If rt_iif is not zero, during the lookup, inet_iif() function returns rt_iif instead of skb_iif. Hence, the lookup fails. v2: Make it non vrf specific (David Ahern). Reword the changelog to reflect it. Signed-off-by: Stephen Suryaputra <ssuryaextr@gmail.com> Reviewed-by: David Ahern <dsahern@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
ee4297420d
commit
5b18f12898
3 changed files with 46 additions and 0 deletions
|
@ -1647,6 +1647,39 @@ struct rtable *rt_dst_alloc(struct net_device *dev,
|
|||
}
|
||||
EXPORT_SYMBOL(rt_dst_alloc);
|
||||
|
||||
struct rtable *rt_dst_clone(struct net_device *dev, struct rtable *rt)
|
||||
{
|
||||
struct rtable *new_rt;
|
||||
|
||||
new_rt = dst_alloc(&ipv4_dst_ops, dev, 1, DST_OBSOLETE_FORCE_CHK,
|
||||
rt->dst.flags);
|
||||
|
||||
if (new_rt) {
|
||||
new_rt->rt_genid = rt_genid_ipv4(dev_net(dev));
|
||||
new_rt->rt_flags = rt->rt_flags;
|
||||
new_rt->rt_type = rt->rt_type;
|
||||
new_rt->rt_is_input = rt->rt_is_input;
|
||||
new_rt->rt_iif = rt->rt_iif;
|
||||
new_rt->rt_pmtu = rt->rt_pmtu;
|
||||
new_rt->rt_mtu_locked = rt->rt_mtu_locked;
|
||||
new_rt->rt_gw_family = rt->rt_gw_family;
|
||||
if (rt->rt_gw_family == AF_INET)
|
||||
new_rt->rt_gw4 = rt->rt_gw4;
|
||||
else if (rt->rt_gw_family == AF_INET6)
|
||||
new_rt->rt_gw6 = rt->rt_gw6;
|
||||
INIT_LIST_HEAD(&new_rt->rt_uncached);
|
||||
|
||||
new_rt->dst.flags |= DST_HOST;
|
||||
new_rt->dst.input = rt->dst.input;
|
||||
new_rt->dst.output = rt->dst.output;
|
||||
new_rt->dst.error = rt->dst.error;
|
||||
new_rt->dst.lastuse = jiffies;
|
||||
new_rt->dst.lwtstate = lwtstate_get(rt->dst.lwtstate);
|
||||
}
|
||||
return new_rt;
|
||||
}
|
||||
EXPORT_SYMBOL(rt_dst_clone);
|
||||
|
||||
/* called in rcu_read_lock() section */
|
||||
int ip_mc_validate_source(struct sk_buff *skb, __be32 daddr, __be32 saddr,
|
||||
u8 tos, struct net_device *dev,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue