Skip to content

Commit

Permalink
ndisc: Introduce __ipv6_neigh_lookup_noref().
Browse files Browse the repository at this point in the history
This function, which looks up neighbour entry for an IPv6 address
without touching refcnt, will be used for patches to remove
dependency on rt->n (neighbour entry in rt6_info).

Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
YOSHIFUJI Hideaki / 吉藤英明 authored and David S. Miller committed Jan 17, 2013
1 parent dd0cbf2 commit ac3175f
Showing 1 changed file with 15 additions and 7 deletions.
22 changes: 15 additions & 7 deletions include/net/ndisc.h
Original file line number Diff line number Diff line change
Expand Up @@ -148,14 +148,13 @@ static inline u32 ndisc_hashfn(const void *pkey, const struct net_device *dev, _
(p32[3] * hash_rnd[3]));
}

static inline struct neighbour *__ipv6_neigh_lookup(struct net_device *dev, const void *pkey)
static inline struct neighbour *__ipv6_neigh_lookup_noref(struct net_device *dev, const void *pkey)
{
struct neigh_hash_table *nht;
const u32 *p32 = pkey;
struct neighbour *n;
u32 hash_val;

rcu_read_lock_bh();
nht = rcu_dereference_bh(nd_tbl.nht);
hash_val = ndisc_hashfn(pkey, dev, nht->hash_rnd) >> (32 - nht->hash_shift);
for (n = rcu_dereference_bh(nht->hash_buckets[hash_val]);
Expand All @@ -164,12 +163,21 @@ static inline struct neighbour *__ipv6_neigh_lookup(struct net_device *dev, cons
u32 *n32 = (u32 *) n->primary_key;
if (n->dev == dev &&
((n32[0] ^ p32[0]) | (n32[1] ^ p32[1]) |
(n32[2] ^ p32[2]) | (n32[3] ^ p32[3])) == 0) {
if (!atomic_inc_not_zero(&n->refcnt))
n = NULL;
break;
}
(n32[2] ^ p32[2]) | (n32[3] ^ p32[3])) == 0)
return n;
}

return NULL;
}

static inline struct neighbour *__ipv6_neigh_lookup(struct net_device *dev, const void *pkey)
{
struct neighbour *n;

rcu_read_lock_bh();
n = __ipv6_neigh_lookup_noref(dev, pkey);
if (n && !atomic_inc_not_zero(&n->refcnt))
n = NULL;
rcu_read_unlock_bh();

return n;
Expand Down

0 comments on commit ac3175f

Please sign in to comment.