|
@@ -45,6 +45,7 @@
|
|
|
#include <net/ip_fib.h>
|
|
|
#include <net/rtnetlink.h>
|
|
|
#include <net/xfrm.h>
|
|
|
+#include <net/vrf.h>
|
|
|
|
|
|
#ifndef CONFIG_IP_MULTIPLE_TABLES
|
|
|
|
|
@@ -309,7 +310,9 @@ static int __fib_validate_source(struct sk_buff *skb, __be32 src, __be32 dst,
|
|
|
bool dev_match;
|
|
|
|
|
|
fl4.flowi4_oif = 0;
|
|
|
- fl4.flowi4_iif = oif ? : LOOPBACK_IFINDEX;
|
|
|
+ fl4.flowi4_iif = vrf_master_ifindex_rcu(dev);
|
|
|
+ if (!fl4.flowi4_iif)
|
|
|
+ fl4.flowi4_iif = oif ? : LOOPBACK_IFINDEX;
|
|
|
fl4.daddr = src;
|
|
|
fl4.saddr = dst;
|
|
|
fl4.flowi4_tos = tos;
|
|
@@ -339,6 +342,9 @@ static int __fib_validate_source(struct sk_buff *skb, __be32 src, __be32 dst,
|
|
|
if (nh->nh_dev == dev) {
|
|
|
dev_match = true;
|
|
|
break;
|
|
|
+ } else if (vrf_master_ifindex_rcu(nh->nh_dev) == dev->ifindex) {
|
|
|
+ dev_match = true;
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
#else
|