Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit be01d655 authored by YOSHIFUJI Hideaki's avatar YOSHIFUJI Hideaki
Browse files

[NET] NEIGHBOUR: Extract hash/lookup functions for pneigh entries.



Extract hash function for pneigh entries from pneigh_lookup(),
__pneigh_lookup() and pneigh_delete() as pneigh_hash().
Extract core of pneigh_lookup() and __pneigh_lookup() as
__pneigh_lookup_1().

Signed-off-by: default avatarYOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
parent 0a204500
Loading
Loading
Loading
Loading
+29 −32
Original line number Original line Diff line number Diff line
@@ -472,26 +472,40 @@ struct neighbour *neigh_create(struct neigh_table *tbl, const void *pkey,
}
}
EXPORT_SYMBOL(neigh_create);
EXPORT_SYMBOL(neigh_create);


struct pneigh_entry *__pneigh_lookup(struct neigh_table *tbl,
static u32 pneigh_hash(const void *pkey, int key_len)
		struct net *net, const void *pkey, struct net_device *dev)
{
{
	struct pneigh_entry *n;
	int key_len = tbl->key_len;
	u32 hash_val = *(u32 *)(pkey + key_len - 4);
	u32 hash_val = *(u32 *)(pkey + key_len - 4);

	hash_val ^= (hash_val >> 16);
	hash_val ^= (hash_val >> 16);
	hash_val ^= hash_val >> 8;
	hash_val ^= hash_val >> 8;
	hash_val ^= hash_val >> 4;
	hash_val ^= hash_val >> 4;
	hash_val &= PNEIGH_HASHMASK;
	hash_val &= PNEIGH_HASHMASK;
	return hash_val;
}


	for (n = tbl->phash_buckets[hash_val]; n; n = n->next) {
static struct pneigh_entry *__pneigh_lookup_1(struct pneigh_entry *n,
					      struct net *net,
					      const void *pkey,
					      int key_len,
					      struct net_device *dev)
{
	while (n) {
		if (!memcmp(n->key, pkey, key_len) &&
		if (!memcmp(n->key, pkey, key_len) &&
		    (pneigh_net(n) == net) &&
		    net_eq(pneigh_net(n), net) &&
		    (n->dev == dev || !n->dev))
		    (n->dev == dev || !n->dev))
			break;
			return n;
		n = n->next;
	}
	return NULL;
}
}


	return n;
struct pneigh_entry *__pneigh_lookup(struct neigh_table *tbl,
		struct net *net, const void *pkey, struct net_device *dev)
{
	int key_len = tbl->key_len;
	u32 hash_val = pneigh_hash(pkey, key_len);

	return __pneigh_lookup_1(tbl->phash_buckets[hash_val],
				 net, pkey, key_len, dev);
}
}
EXPORT_SYMBOL_GPL(__pneigh_lookup);
EXPORT_SYMBOL_GPL(__pneigh_lookup);


@@ -501,26 +515,14 @@ struct pneigh_entry * pneigh_lookup(struct neigh_table *tbl,
{
{
	struct pneigh_entry *n;
	struct pneigh_entry *n;
	int key_len = tbl->key_len;
	int key_len = tbl->key_len;
	u32 hash_val = *(u32 *)(pkey + key_len - 4);
	u32 hash_val = pneigh_hash(pkey, key_len);

	hash_val ^= (hash_val >> 16);
	hash_val ^= hash_val >> 8;
	hash_val ^= hash_val >> 4;
	hash_val &= PNEIGH_HASHMASK;


	read_lock_bh(&tbl->lock);
	read_lock_bh(&tbl->lock);

	n = __pneigh_lookup_1(tbl->phash_buckets[hash_val],
	for (n = tbl->phash_buckets[hash_val]; n; n = n->next) {
			      net, pkey, key_len, dev);
		if (!memcmp(n->key, pkey, key_len) &&
		    net_eq(pneigh_net(n), net) &&
		    (n->dev == dev || !n->dev)) {
	read_unlock_bh(&tbl->lock);
	read_unlock_bh(&tbl->lock);
			goto out;

		}
	if (n || !creat)
	}
	read_unlock_bh(&tbl->lock);
	n = NULL;
	if (!creat)
		goto out;
		goto out;


	ASSERT_RTNL();
	ASSERT_RTNL();
@@ -561,12 +563,7 @@ int pneigh_delete(struct neigh_table *tbl, struct net *net, const void *pkey,
{
{
	struct pneigh_entry *n, **np;
	struct pneigh_entry *n, **np;
	int key_len = tbl->key_len;
	int key_len = tbl->key_len;
	u32 hash_val = *(u32 *)(pkey + key_len - 4);
	u32 hash_val = pneigh_hash(pkey, key_len);

	hash_val ^= (hash_val >> 16);
	hash_val ^= hash_val >> 8;
	hash_val ^= hash_val >> 4;
	hash_val &= PNEIGH_HASHMASK;


	write_lock_bh(&tbl->lock);
	write_lock_bh(&tbl->lock);
	for (np = &tbl->phash_buckets[hash_val]; (n = *np) != NULL;
	for (np = &tbl->phash_buckets[hash_val]; (n = *np) != NULL;