aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/ipv4/arp.c5
-rw-r--r--net/ipv4/route.c4
2 files changed, 4 insertions, 5 deletions
diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c
index 9eb6d3ab2977..46edf1c32a40 100644
--- a/net/ipv4/arp.c
+++ b/net/ipv4/arp.c
@@ -835,9 +835,8 @@ static int arp_process(struct sk_buff *skb)
835 } 835 }
836 goto out; 836 goto out;
837 } else if (IN_DEV_FORWARD(in_dev)) { 837 } else if (IN_DEV_FORWARD(in_dev)) {
838 if ((rt->rt_flags&RTCF_DNAT) || 838 if (addr_type == RTN_UNICAST && rt->u.dst.dev != dev &&
839 (addr_type == RTN_UNICAST && rt->u.dst.dev != dev && 839 (arp_fwd_proxy(in_dev, rt) || pneigh_lookup(&arp_tbl, &init_net, &tip, dev, 0))) {
840 (arp_fwd_proxy(in_dev, rt) || pneigh_lookup(&arp_tbl, &init_net, &tip, dev, 0)))) {
841 n = neigh_event_ns(&arp_tbl, sha, &sip, dev); 840 n = neigh_event_ns(&arp_tbl, sha, &sip, dev);
842 if (n) 841 if (n)
843 neigh_release(n); 842 neigh_release(n);
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index 933b093721ea..78c4ce424a68 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -1768,7 +1768,7 @@ static inline int __mkroute_input(struct sk_buff *skb,
1768 if (err) 1768 if (err)
1769 flags |= RTCF_DIRECTSRC; 1769 flags |= RTCF_DIRECTSRC;
1770 1770
1771 if (out_dev == in_dev && err && !(flags & (RTCF_NAT | RTCF_MASQ)) && 1771 if (out_dev == in_dev && err && !(flags & RTCF_MASQ) &&
1772 (IN_DEV_SHARED_MEDIA(out_dev) || 1772 (IN_DEV_SHARED_MEDIA(out_dev) ||
1773 inet_addr_onlink(out_dev, saddr, FIB_RES_GW(*res)))) 1773 inet_addr_onlink(out_dev, saddr, FIB_RES_GW(*res))))
1774 flags |= RTCF_DOREDIRECT; 1774 flags |= RTCF_DOREDIRECT;
@@ -1777,7 +1777,7 @@ static inline int __mkroute_input(struct sk_buff *skb,
1777 /* Not IP (i.e. ARP). Do not create route, if it is 1777 /* Not IP (i.e. ARP). Do not create route, if it is
1778 * invalid for proxy arp. DNAT routes are always valid. 1778 * invalid for proxy arp. DNAT routes are always valid.
1779 */ 1779 */
1780 if (out_dev == in_dev && !(flags & RTCF_DNAT)) { 1780 if (out_dev == in_dev) {
1781 err = -EINVAL; 1781 err = -EINVAL;
1782 goto cleanup; 1782 goto cleanup;
1783 } 1783 }