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

Commit f1543f8b authored by Florian Zumbiehl's avatar Florian Zumbiehl Committed by David S. Miller
Browse files

[PPPOE]: Improve hashing function in hash_item().



The new code produces the same results as the old version and is
~ 3 to 6 times faster for 4-bit hashes on the CPUs I tested.

Signed-off-by: default avatarFlorian Zumbiehl <florz@florz.de>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 48b8d783
Loading
Loading
Loading
Loading
+15 −10
Original line number Diff line number Diff line
@@ -108,19 +108,24 @@ static inline int cmp_addr(struct pppoe_addr *a, unsigned long sid, char *addr)
		(memcmp(a->remote,addr,ETH_ALEN) == 0));
}

static int hash_item(unsigned long sid, unsigned char *addr)
#if 8%PPPOE_HASH_BITS
#error 8 must be a multiple of PPPOE_HASH_BITS
#endif

static int hash_item(unsigned int sid, unsigned char *addr)
{
	char hash = 0;
	int i, j;
	unsigned char hash = 0;
	unsigned int i;

	for (i = 0; i < ETH_ALEN ; ++i) {
		for (j = 0; j < 8/PPPOE_HASH_BITS ; ++j) {
			hash ^= addr[i] >> ( j * PPPOE_HASH_BITS );
	for (i = 0 ; i < ETH_ALEN ; i++) {
		hash ^= addr[i];
	}
	for (i = 0 ; i < sizeof(sid_t)*8 ; i += 8 ){
		hash ^= sid>>i;
	}
	for (i = 8 ; (i>>=1) >= PPPOE_HASH_BITS ; ) {
		hash ^= hash>>i;
	}

	for (i = 0; i < (sizeof(unsigned long)*8) / PPPOE_HASH_BITS ; ++i)
		hash ^= sid >> (i*PPPOE_HASH_BITS);

	return hash & ( PPPOE_HASH_SIZE - 1 );
}