diff options
Diffstat (limited to 'net/ipv4/arp.c')
-rw-r--r-- | net/ipv4/arp.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c index 29a74c01d8de..f11931c18381 100644 --- a/net/ipv4/arp.c +++ b/net/ipv4/arp.c | |||
@@ -801,8 +801,11 @@ static int arp_process(struct sk_buff *skb) | |||
801 | * cache. | 801 | * cache. |
802 | */ | 802 | */ |
803 | 803 | ||
804 | /* Special case: IPv4 duplicate address detection packet (RFC2131) */ | 804 | /* |
805 | if (sip == 0) { | 805 | * Special case: IPv4 duplicate address detection packet (RFC2131) |
806 | * and Gratuitous ARP/ARP Announce. (RFC3927, Section 2.4) | ||
807 | */ | ||
808 | if (sip == 0 || tip == sip) { | ||
806 | if (arp->ar_op == htons(ARPOP_REQUEST) && | 809 | if (arp->ar_op == htons(ARPOP_REQUEST) && |
807 | inet_addr_type(net, tip) == RTN_LOCAL && | 810 | inet_addr_type(net, tip) == RTN_LOCAL && |
808 | !arp_ignore(in_dev, sip, tip)) | 811 | !arp_ignore(in_dev, sip, tip)) |
@@ -892,7 +895,7 @@ static int arp_process(struct sk_buff *skb) | |||
892 | out: | 895 | out: |
893 | if (in_dev) | 896 | if (in_dev) |
894 | in_dev_put(in_dev); | 897 | in_dev_put(in_dev); |
895 | kfree_skb(skb); | 898 | consume_skb(skb); |
896 | return 0; | 899 | return 0; |
897 | } | 900 | } |
898 | 901 | ||
@@ -1225,8 +1228,8 @@ void arp_ifdown(struct net_device *dev) | |||
1225 | * Called once on startup. | 1228 | * Called once on startup. |
1226 | */ | 1229 | */ |
1227 | 1230 | ||
1228 | static struct packet_type arp_packet_type = { | 1231 | static struct packet_type arp_packet_type __read_mostly = { |
1229 | .type = __constant_htons(ETH_P_ARP), | 1232 | .type = cpu_to_be16(ETH_P_ARP), |
1230 | .func = arp_rcv, | 1233 | .func = arp_rcv, |
1231 | }; | 1234 | }; |
1232 | 1235 | ||