diff options
| author | Hideaki Yoshifuji <yoshfuji@linux-ipv6.org> | 2004-09-14 09:50:00 +0900 |
|---|---|---|
| committer | Hideaki Yoshifuji <yoshfuji@linux-ipv6.org> | 2004-09-14 09:50:00 +0900 |
| commit | 089fcdeeb50831fc9663b0de689b1a1e6573e666 (patch) | |
| tree | 4b110eed2354cb16143e43b24b7f05e01d12a48d | |
| parent | 8a690d16e64e76f884d74128dc10ac6b28c135d2 (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.h | 7 | ||||
| -rw-r--r-- | net/atm/clip.c | 6 | ||||
| -rw-r--r-- | net/core/neighbour.c | 23 | ||||
| -rw-r--r-- | net/ipv4/arp.c | 10 | ||||
| -rw-r--r-- | net/ipv6/ndisc.c | 6 |
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 |
