|
|
@@ -58,7 +58,9 @@ 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;
|
|
|
- } else if ((flags & XT_RPFILTER_LOOSE) == 0)
|
|
|
+ /* Set flowi6_oif for vrf devices to lookup route in l3mdev domain. */
|
|
|
+ } else if (netif_is_l3_master(dev) || netif_is_l3_slave(dev) ||
|
|
|
+ (flags & XT_RPFILTER_LOOSE) == 0)
|
|
|
fl6.flowi6_oif = dev->ifindex;
|
|
|
|
|
|
rt = (void *)ip6_route_lookup(net, &fl6, skb, lookup_flags);
|
|
|
@@ -73,7 +75,9 @@ static bool rpfilter_lookup_reverse6(struct net *net, const struct sk_buff *skb,
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- if (rt->rt6i_idev->dev == dev || (flags & XT_RPFILTER_LOOSE))
|
|
|
+ if (rt->rt6i_idev->dev == dev ||
|
|
|
+ l3mdev_master_ifindex_rcu(rt->rt6i_idev->dev) == dev->ifindex ||
|
|
|
+ (flags & XT_RPFILTER_LOOSE))
|
|
|
ret = true;
|
|
|
out:
|
|
|
ip6_rt_put(rt);
|