diff options
Diffstat (limited to 'net/ipv4/arp.c')
-rw-r--r-- | net/ipv4/arp.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c index cda37be02f8d..a0124eb7dbea 100644 --- a/net/ipv4/arp.c +++ b/net/ipv4/arp.c | |||
@@ -475,8 +475,7 @@ int arp_find(unsigned char *haddr, struct sk_buff *skb) | |||
475 | return 1; | 475 | return 1; |
476 | } | 476 | } |
477 | 477 | ||
478 | paddr = skb_rtable(skb)->rt_gateway; | 478 | paddr = rt_nexthop(skb_rtable(skb), ip_hdr(skb)->daddr); |
479 | |||
480 | if (arp_set_predefined(inet_addr_type(dev_net(dev), paddr), haddr, | 479 | if (arp_set_predefined(inet_addr_type(dev_net(dev), paddr), haddr, |
481 | paddr, dev)) | 480 | paddr, dev)) |
482 | return 0; | 481 | return 0; |
@@ -790,7 +789,8 @@ static int arp_process(struct sk_buff *skb) | |||
790 | * Check for bad requests for 127.x.x.x and requests for multicast | 789 | * Check for bad requests for 127.x.x.x and requests for multicast |
791 | * addresses. If this is one such, delete it. | 790 | * addresses. If this is one such, delete it. |
792 | */ | 791 | */ |
793 | if (ipv4_is_loopback(tip) || ipv4_is_multicast(tip)) | 792 | if (ipv4_is_multicast(tip) || |
793 | (!IN_DEV_ROUTE_LOCALNET(in_dev) && ipv4_is_loopback(tip))) | ||
794 | goto out; | 794 | goto out; |
795 | 795 | ||
796 | /* | 796 | /* |
@@ -827,7 +827,7 @@ static int arp_process(struct sk_buff *skb) | |||
827 | } | 827 | } |
828 | 828 | ||
829 | if (arp->ar_op == htons(ARPOP_REQUEST) && | 829 | if (arp->ar_op == htons(ARPOP_REQUEST) && |
830 | ip_route_input_noref(skb, tip, sip, 0, dev) == 0) { | 830 | ip_route_input(skb, tip, sip, 0, dev) == 0) { |
831 | 831 | ||
832 | rt = skb_rtable(skb); | 832 | rt = skb_rtable(skb); |
833 | addr_type = rt->rt_type; | 833 | addr_type = rt->rt_type; |