|
@@ -732,6 +732,7 @@ static int arp_process(struct sk_buff *skb)
|
|
|
int addr_type;
|
|
|
struct neighbour *n;
|
|
|
struct net *net = dev_net(dev);
|
|
|
+ bool is_garp = false;
|
|
|
|
|
|
/* arp_rcv below verifies the ARP header and verifies the device
|
|
|
* is ARP'able.
|
|
@@ -898,10 +899,12 @@ static int arp_process(struct sk_buff *skb)
|
|
|
It is possible, that this option should be enabled for some
|
|
|
devices (strip is candidate)
|
|
|
*/
|
|
|
+ is_garp = arp->ar_op == htons(ARPOP_REQUEST) && tip == sip &&
|
|
|
+ inet_addr_type(net, sip) == RTN_UNICAST;
|
|
|
+
|
|
|
if (n == NULL &&
|
|
|
- (arp->ar_op == htons(ARPOP_REPLY) ||
|
|
|
- (arp->ar_op == htons(ARPOP_REQUEST) && tip == sip)) &&
|
|
|
- inet_addr_type(net, sip) == RTN_UNICAST)
|
|
|
+ ((arp->ar_op == htons(ARPOP_REPLY) &&
|
|
|
+ inet_addr_type(net, sip) == RTN_UNICAST) || is_garp))
|
|
|
n = __neigh_lookup(&arp_tbl, &sip, dev, 1);
|
|
|
}
|
|
|
|
|
@@ -914,8 +917,10 @@ static int arp_process(struct sk_buff *skb)
|
|
|
agents are active. Taking the first reply prevents
|
|
|
arp trashing and chooses the fastest router.
|
|
|
*/
|
|
|
- override = time_after(jiffies, n->updated +
|
|
|
- NEIGH_VAR(n->parms, LOCKTIME));
|
|
|
+ override = time_after(jiffies,
|
|
|
+ n->updated +
|
|
|
+ NEIGH_VAR(n->parms, LOCKTIME)) ||
|
|
|
+ is_garp;
|
|
|
|
|
|
/* Broadcast replies and request packets
|
|
|
do not assert neighbour reachability.
|