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
|
@ -318,6 +318,7 @@ static int ip_finish_output(struct net *net, struct sock *sk, struct sk_buff *sk
|
|||
static int ip_mc_finish_output(struct net *net, struct sock *sk,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
struct rtable *new_rt;
|
||||
int ret;
|
||||
|
||||
ret = BPF_CGROUP_RUN_PROG_INET_EGRESS(sk, skb);
|
||||
|
@ -326,6 +327,17 @@ static int ip_mc_finish_output(struct net *net, struct sock *sk,
|
|||
return ret;
|
||||
}
|
||||
|
||||
/* Reset rt_iif so that inet_iif() will return skb->skb_iif. Setting
|
||||
* this to non-zero causes ipi_ifindex in in_pktinfo to be overwritten,
|
||||
* see ipv4_pktinfo_prepare().
|
||||
*/
|
||||
new_rt = rt_dst_clone(net->loopback_dev, skb_rtable(skb));
|
||||
if (new_rt) {
|
||||
new_rt->rt_iif = 0;
|
||||
skb_dst_drop(skb);
|
||||
skb_dst_set(skb, &new_rt->dst);
|
||||
}
|
||||
|
||||
return dev_loopback_xmit(net, sk, skb);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue