On 6/29/19 1:05 AM, David Ahern wrote: > On 6/28/19 3:06 AM, Miaohe Lin wrote: > > diff --git a/net/ipv6/netfilter/ip6t_rpfilter.c > > b/net/ipv6/netfilter/ip6t_rpfilter.c > > index 6bcaf7357183..3c4a1772c15f 100644 > > --- a/net/ipv6/netfilter/ip6t_rpfilter.c > > +++ b/net/ipv6/netfilter/ip6t_rpfilter.c > > @@ -55,6 +55,10 @@ static bool rpfilter_lookup_reverse6(struct net *net, const struct sk_buff *skb, > > if (rpfilter_addr_linklocal(&iph->saddr)) { > > lookup_flags |= RT6_LOOKUP_F_IFACE; > > fl6.flowi6_oif = dev->ifindex; > > + /* Set flowi6_oif for vrf devices to lookup route in l3mdev domain. */ > > + } else if (netif_is_l3_master(dev) || netif_is_l3_slave(dev)) { > > + lookup_flags |= FLOWI_FLAG_SKIP_NH_OIF; > > you don't need to set that flag here. It is done by the fib_rules code as needed. > You're right. Fib rules code would set FLOWI_FLAG_SKIP_NH_OIF flag. But I set it here for distinguish with the flags & XT_RPFILTER_LOOSE branch. Without this, they do the same work and maybe should be combined. I don't want to do that as that makes code confusing. Is this code snipet below ok ? If so, I would delete this flag setting. } else if (netif_is_l3_master(dev) || netif_is_l3_slave(dev)) { fl6.flowi6_oif = dev->ifindex; } else if ((flags & XT_RPFILTER_LOOSE) == 0) fl6.flowi6_oif = dev->ifindex;