|
@@ -233,7 +233,7 @@ static int arp_constructor(struct neighbour *neigh)
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
- neigh->type = inet_addr_type(dev_net(dev), addr);
|
|
|
+ neigh->type = inet_addr_type_dev_table(dev_net(dev), dev, addr);
|
|
|
|
|
|
parms = in_dev->arp_parms;
|
|
|
__neigh_parms_put(neigh->parms);
|
|
@@ -343,7 +343,7 @@ static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb)
|
|
|
switch (IN_DEV_ARP_ANNOUNCE(in_dev)) {
|
|
|
default:
|
|
|
case 0: /* By default announce any local IP */
|
|
|
- if (skb && inet_addr_type(dev_net(dev),
|
|
|
+ if (skb && inet_addr_type_dev_table(dev_net(dev), dev,
|
|
|
ip_hdr(skb)->saddr) == RTN_LOCAL)
|
|
|
saddr = ip_hdr(skb)->saddr;
|
|
|
break;
|
|
@@ -351,7 +351,8 @@ static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb)
|
|
|
if (!skb)
|
|
|
break;
|
|
|
saddr = ip_hdr(skb)->saddr;
|
|
|
- if (inet_addr_type(dev_net(dev), saddr) == RTN_LOCAL) {
|
|
|
+ if (inet_addr_type_dev_table(dev_net(dev), dev,
|
|
|
+ saddr) == RTN_LOCAL) {
|
|
|
/* saddr should be known to target */
|
|
|
if (inet_addr_onlink(in_dev, target, saddr))
|
|
|
break;
|
|
@@ -751,7 +752,7 @@ static int arp_process(struct sock *sk, struct sk_buff *skb)
|
|
|
/* Special case: IPv4 duplicate address detection packet (RFC2131) */
|
|
|
if (sip == 0) {
|
|
|
if (arp->ar_op == htons(ARPOP_REQUEST) &&
|
|
|
- inet_addr_type(net, tip) == RTN_LOCAL &&
|
|
|
+ inet_addr_type_dev_table(net, dev, tip) == RTN_LOCAL &&
|
|
|
!arp_ignore(in_dev, sip, tip))
|
|
|
arp_send(ARPOP_REPLY, ETH_P_ARP, sip, dev, tip, sha,
|
|
|
dev->dev_addr, sha);
|
|
@@ -811,16 +812,18 @@ static int arp_process(struct sock *sk, struct sk_buff *skb)
|
|
|
n = __neigh_lookup(&arp_tbl, &sip, dev, 0);
|
|
|
|
|
|
if (IN_DEV_ARP_ACCEPT(in_dev)) {
|
|
|
+ unsigned int addr_type = inet_addr_type_dev_table(net, dev, sip);
|
|
|
+
|
|
|
/* Unsolicited ARP is not accepted by default.
|
|
|
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;
|
|
|
+ addr_type == RTN_UNICAST;
|
|
|
|
|
|
if (!n &&
|
|
|
((arp->ar_op == htons(ARPOP_REPLY) &&
|
|
|
- inet_addr_type(net, sip) == RTN_UNICAST) || is_garp))
|
|
|
+ addr_type == RTN_UNICAST) || is_garp))
|
|
|
n = __neigh_lookup(&arp_tbl, &sip, dev, 1);
|
|
|
}
|
|
|
|