summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHideaki Yoshifuji <yoshfuji@linux-ipv6.org>2004-09-14 09:50:00 +0900
committerHideaki Yoshifuji <yoshfuji@linux-ipv6.org>2004-09-14 09:50:00 +0900
commit089fcdeeb50831fc9663b0de689b1a1e6573e666 (patch)
tree4b110eed2354cb16143e43b24b7f05e01d12a48d
parent8a690d16e64e76f884d74128dc10ac6b28c135d2 (diff)
[NET] NEIGHBOUR: save number of arguments for neigh_update() by flags.
Signed-off-by: Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>
-rw-r--r--include/net/neighbour.h7
-rw-r--r--net/atm/clip.c6
-rw-r--r--net/core/neighbour.c23
-rw-r--r--net/ipv4/arp.c10
-rw-r--r--net/ipv6/ndisc.c6
5 files changed, 35 insertions, 17 deletions
diff --git a/include/net/neighbour.h b/include/net/neighbour.h
index 8c97932a98e7..030497aeb254 100644
--- a/include/net/neighbour.h
+++ b/include/net/neighbour.h
@@ -179,6 +179,10 @@ struct neigh_table
struct pneigh_entry *phash_buckets[PNEIGH_HASHMASK+1];
};
+/* flags for neigh_update() */
+#define NEIGH_UPDATE_F_OVERRIDE 0x00000001
+#define NEIGH_UPDATE_F_ADMIN 0x80000000
+
extern void neigh_table_init(struct neigh_table *tbl);
extern int neigh_table_clear(struct neigh_table *tbl);
extern struct neighbour * neigh_lookup(struct neigh_table *tbl,
@@ -189,7 +193,8 @@ extern struct neighbour * neigh_create(struct neigh_table *tbl,
struct net_device *dev);
extern void neigh_destroy(struct neighbour *neigh);
extern int __neigh_event_send(struct neighbour *neigh, struct sk_buff *skb);
-extern int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new, int override, int arp);
+extern int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new,
+ u32 flags);
extern void neigh_changeaddr(struct neigh_table *tbl, struct net_device *dev);
extern int neigh_ifdown(struct neigh_table *tbl, struct net_device *dev);
extern int neigh_resolve_output(struct sk_buff *skb);
diff --git a/net/atm/clip.c b/net/atm/clip.c
index 104dd4d19da4..f447aa949ca7 100644
--- a/net/atm/clip.c
+++ b/net/atm/clip.c
@@ -110,7 +110,8 @@ static void unlink_clip_vcc(struct clip_vcc *clip_vcc)
goto out;
entry->expires = jiffies-1;
/* force resolution or expiration */
- error = neigh_update(entry->neigh,NULL,NUD_NONE,0,0);
+ error = neigh_update(entry->neigh, NULL, NUD_NONE,
+ NEIGH_UPDATE_F_ADMIN);
if (error)
printk(KERN_CRIT "unlink_clip_vcc: "
"neigh_update failed with %d\n",error);
@@ -570,7 +571,8 @@ static int clip_setentry(struct atm_vcc *vcc,u32 ip)
}
link_vcc(clip_vcc,entry);
}
- error = neigh_update(neigh,llc_oui,NUD_PERMANENT,1,0);
+ error = neigh_update(neigh, llc_oui, NUD_PERMANENT,
+ NEIGH_UPDATE_F_OVERRIDE|NEIGH_UPDATE_F_ADMIN);
neigh_release(neigh);
return error;
}
diff --git a/net/core/neighbour.c b/net/core/neighbour.c
index c9a747e89e5d..b6b7fec239ae 100644
--- a/net/core/neighbour.c
+++ b/net/core/neighbour.c
@@ -800,14 +800,16 @@ static __inline__ void neigh_update_hhs(struct neighbour *neigh)
/* Generic update routine.
-- lladdr is new lladdr or NULL, if it is not supplied.
-- new is new state.
- -- override == 1 allows to override existing lladdr, if it is different.
- -- arp == 0 means that the change is administrative.
+ -- flags
+ NEIGH_UPDATE_F_OVERRIDE allows to override existing lladdr,
+ if it is different.
+ NEIGH_UPDATE_F_ADMIN means that the change is administrative.
Caller MUST hold reference count on the entry.
*/
int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new,
- int override, int arp)
+ u32 flags)
{
u8 old;
int err;
@@ -822,7 +824,8 @@ int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new,
old = neigh->nud_state;
err = -EPERM;
- if (arp && (old & (NUD_NOARP | NUD_PERMANENT)))
+ if (!(flags & NEIGH_UPDATE_F_ADMIN) &&
+ (old & (NUD_NOARP | NUD_PERMANENT)))
goto out;
if (!(new & NUD_VALID)) {
@@ -850,7 +853,7 @@ int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new,
if (old & NUD_VALID) {
if (!memcmp(lladdr, neigh->ha, dev->addr_len))
lladdr = neigh->ha;
- else if (!override)
+ else if (!(flags & NEIGH_UPDATE_F_OVERRIDE))
goto out;
}
} else {
@@ -928,7 +931,8 @@ struct neighbour *neigh_event_ns(struct neigh_table *tbl,
struct neighbour *neigh = __neigh_lookup(tbl, saddr, dev,
lladdr || !dev->addr_len);
if (neigh)
- neigh_update(neigh, lladdr, NUD_STALE, 1, 1);
+ neigh_update(neigh, lladdr, NUD_STALE,
+ NEIGH_UPDATE_F_OVERRIDE);
return neigh;
}
@@ -1274,7 +1278,9 @@ int neigh_delete(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
n = neigh_lookup(tbl, RTA_DATA(nda[NDA_DST - 1]), dev);
if (n) {
- err = neigh_update(n, NULL, NUD_FAILED, 1, 0);
+ err = neigh_update(n, NULL, NUD_FAILED,
+ NEIGH_UPDATE_F_OVERRIDE|
+ NEIGH_UPDATE_F_ADMIN);
neigh_release(n);
}
goto out_dev_put;
@@ -1347,7 +1353,8 @@ int neigh_add(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
RTA_DATA(nda[NDA_LLADDR - 1]) :
NULL,
ndm->ndm_state,
- override, 0);
+ (override ? NEIGH_UPDATE_F_OVERRIDE : 0) |
+ NEIGH_UPDATE_F_ADMIN);
}
if (n)
neigh_release(n);
diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c
index 41e726ac3337..35e5038bcdc4 100644
--- a/net/ipv4/arp.c
+++ b/net/ipv4/arp.c
@@ -914,7 +914,7 @@ int arp_process(struct sk_buff *skb)
if (arp->ar_op != htons(ARPOP_REPLY) ||
skb->pkt_type != PACKET_HOST)
state = NUD_STALE;
- neigh_update(n, sha, state, override, 1);
+ neigh_update(n, sha, state, override ? NEIGH_UPDATE_F_OVERRIDE : 0);
neigh_release(n);
}
@@ -1021,7 +1021,9 @@ int arp_req_set(struct arpreq *r, struct net_device * dev)
if (r->arp_flags & ATF_PERM)
state = NUD_PERMANENT;
err = neigh_update(neigh, (r->arp_flags&ATF_COM) ?
- r->arp_ha.sa_data : NULL, state, 1, 0);
+ r->arp_ha.sa_data : NULL, state,
+ NEIGH_UPDATE_F_OVERRIDE|
+ NEIGH_UPDATE_F_ADMIN);
neigh_release(neigh);
}
return err;
@@ -1101,7 +1103,9 @@ int arp_req_delete(struct arpreq *r, struct net_device * dev)
neigh = neigh_lookup(&arp_tbl, &ip, dev);
if (neigh) {
if (neigh->nud_state&~NUD_NOARP)
- err = neigh_update(neigh, NULL, NUD_FAILED, 1, 0);
+ err = neigh_update(neigh, NULL, NUD_FAILED,
+ NEIGH_UPDATE_F_OVERRIDE|
+ NEIGH_UPDATE_F_ADMIN);
neigh_release(neigh);
}
return err;
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c
index e1f5aeb79258..186d3030356b 100644
--- a/net/ipv6/ndisc.c
+++ b/net/ipv6/ndisc.c
@@ -911,7 +911,7 @@ static void ndisc_recv_na(struct sk_buff *skb)
neigh_update(neigh, lladdr,
msg->icmph.icmp6_solicited ? NUD_REACHABLE : NUD_STALE,
- msg->icmph.icmp6_override, 1);
+ msg->icmph.icmp6_override ? NEIGH_UPDATE_F_OVERRIDE : 0);
neigh_release(neigh);
}
}
@@ -1079,7 +1079,7 @@ static void ndisc_router_discovery(struct sk_buff *skb)
goto out;
}
}
- neigh_update(neigh, lladdr, NUD_STALE, 1, 1);
+ neigh_update(neigh, lladdr, NUD_STALE, NEIGH_UPDATE_F_OVERRIDE);
}
if (ndopts.nd_opts_pi) {
@@ -1204,7 +1204,7 @@ static void ndisc_redirect_rcv(struct sk_buff *skb)
neigh = __neigh_lookup(&nd_tbl, target, skb->dev, 1);
if (neigh) {
- neigh_update(neigh, lladdr, NUD_STALE, 1, 1);
+ neigh_update(neigh, lladdr, NUD_STALE, NEIGH_UPDATE_F_OVERRIDE);
if (neigh->nud_state&NUD_VALID)
rt6_redirect(dest, &skb->nh.ipv6h->saddr, neigh, on_link);
else