| From foo@baz Wed Apr 11 10:26:56 CEST 2018 |
| From: Miguel Fadon Perlines <mfadon@teldat.com> |
| Date: Thu, 5 Apr 2018 10:25:38 +0200 |
| Subject: arp: fix arp_filter on l3slave devices |
| |
| From: Miguel Fadon Perlines <mfadon@teldat.com> |
| |
| |
| [ Upstream commit 58b35f27689b5eb514fc293c332966c226b1b6e4 ] |
| |
| arp_filter performs an ip_route_output search for arp source address and |
| checks if output device is the same where the arp request was received, |
| if it is not, the arp request is not answered. |
| |
| This route lookup is always done on main route table so l3slave devices |
| never find the proper route and arp is not answered. |
| |
| Passing l3mdev_master_ifindex_rcu(dev) return value as oif fixes the |
| lookup for l3slave devices while maintaining same behavior for non |
| l3slave devices as this function returns 0 in that case. |
| |
| Fixes: 613d09b30f8b ("net: Use VRF device index for lookups on TX") |
| Signed-off-by: Miguel Fadon Perlines <mfadon@teldat.com> |
| Acked-by: David Ahern <dsa@cumulusnetworks.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/ipv4/arp.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/net/ipv4/arp.c |
| +++ b/net/ipv4/arp.c |
| @@ -437,7 +437,7 @@ static int arp_filter(__be32 sip, __be32 |
| /*unsigned long now; */ |
| struct net *net = dev_net(dev); |
| |
| - rt = ip_route_output(net, sip, tip, 0, 0); |
| + rt = ip_route_output(net, sip, tip, 0, l3mdev_master_ifindex_rcu(dev)); |
| if (IS_ERR(rt)) |
| return 1; |
| if (rt->dst.dev != dev) { |