batman-adv: Use common Jenkins Hash implementation
authorSven Eckelmann <sven@narfation.org>
Sun, 1 Mar 2015 08:46:18 +0000 (09:46 +0100)
committerAntonio Quartulli <antonio@meshcoding.com>
Sun, 7 Jun 2015 15:07:17 +0000 (17:07 +0200)
An unoptimized version of the Jenkins one-at-a-time hash function is used
and partially copied all over the code wherever an hashtable is used.
Instead the optimized version shared between the whole kernel should be
used to reduce code duplication and use better optimized code.

Only the DAT code must use the old implementation because it is used as
distributed hash function which has to be common for all nodes.

Signed-off-by: Sven Eckelmann <sven@narfation.org>
Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch>
net/batman-adv/bridge_loop_avoidance.c
net/batman-adv/distributed-arp-table.c
net/batman-adv/hash.h
net/batman-adv/main.h
net/batman-adv/network-coding.c
net/batman-adv/originator.h
net/batman-adv/translation-table.c

index fa941cd7d8adb978a2d854cf8fe8f4044a693203..f2ac903e091efb1be56f48dc31f49c6116a90f02 100644 (file)
@@ -42,12 +42,8 @@ static inline uint32_t batadv_choose_claim(const void *data, uint32_t size)
        struct batadv_bla_claim *claim = (struct batadv_bla_claim *)data;
        uint32_t hash = 0;
 
-       hash = batadv_hash_bytes(hash, &claim->addr, sizeof(claim->addr));
-       hash = batadv_hash_bytes(hash, &claim->vid, sizeof(claim->vid));
-
-       hash += (hash << 3);
-       hash ^= (hash >> 11);
-       hash += (hash << 15);
+       hash = jhash(&claim->addr, sizeof(claim->addr), hash);
+       hash = jhash(&claim->vid, sizeof(claim->vid), hash);
 
        return hash % size;
 }
@@ -59,12 +55,8 @@ static inline uint32_t batadv_choose_backbone_gw(const void *data,
        const struct batadv_bla_claim *claim = (struct batadv_bla_claim *)data;
        uint32_t hash = 0;
 
-       hash = batadv_hash_bytes(hash, &claim->addr, sizeof(claim->addr));
-       hash = batadv_hash_bytes(hash, &claim->vid, sizeof(claim->vid));
-
-       hash += (hash << 3);
-       hash ^= (hash >> 11);
-       hash += (hash << 15);
+       hash = jhash(&claim->addr, sizeof(claim->addr), hash);
+       hash = jhash(&claim->vid, sizeof(claim->vid), hash);
 
        return hash % size;
 }
index da1742d9059fd46ed57165ab1ebdec10348d6c1f..2e6198ecc07d569435d8c5353ba7fa98ebce6332 100644 (file)
@@ -206,9 +206,22 @@ static uint32_t batadv_hash_dat(const void *data, uint32_t size)
 {
        uint32_t hash = 0;
        const struct batadv_dat_entry *dat = data;
+       const unsigned char *key;
+       uint32_t i;
+
+       key = (const unsigned char *)&dat->ip;
+       for (i = 0; i < sizeof(dat->ip); i++) {
+               hash += key[i];
+               hash += (hash << 10);
+               hash ^= (hash >> 6);
+       }
 
-       hash = batadv_hash_bytes(hash, &dat->ip, sizeof(dat->ip));
-       hash = batadv_hash_bytes(hash, &dat->vid, sizeof(dat->vid));
+       key = (const unsigned char *)&dat->vid;
+       for (i = 0; i < sizeof(dat->vid); i++) {
+               hash += key[i];
+               hash += (hash << 10);
+               hash ^= (hash >> 6);
+       }
 
        hash += (hash << 3);
        hash ^= (hash >> 11);
index 379e32acf2b49ebadf226a347040d6b1e2378d02..bcf427cafe49bde4dce009943eb64447a71104c9 100644 (file)
@@ -79,28 +79,6 @@ static inline void batadv_hash_delete(struct batadv_hashtable *hash,
        batadv_hash_destroy(hash);
 }
 
-/**
- *     batadv_hash_bytes - hash some bytes and add them to the previous hash
- *     @hash: previous hash value
- *     @data: data to be hashed
- *     @size: number of bytes to be hashed
- *
- *     Returns the new hash value.
- */
-static inline uint32_t batadv_hash_bytes(uint32_t hash, const void *data,
-                                        uint32_t size)
-{
-       const unsigned char *key = data;
-       int i;
-
-       for (i = 0; i < size; i++) {
-               hash += key[i];
-               hash += (hash << 10);
-               hash ^= (hash >> 6);
-       }
-       return hash;
-}
-
 /**
  *     batadv_hash_add - adds data to the hashtable
  *     @hash: storage hash table
index af0a3361d4b2dd6139d1b3b3daed637cbde1a8b0..985d017920d54e8afec2cd6834fe323bae273953 100644 (file)
@@ -174,6 +174,7 @@ enum batadv_uev_type {
 #include <linux/workqueue.h>   /* workqueue */
 #include <linux/percpu.h>
 #include <linux/slab.h>
+#include <linux/jhash.h>
 #include <net/sock.h>          /* struct sock */
 #include <net/addrconf.h>      /* ipv6 address stuff */
 #include <linux/ip.h>
index b984bc49deaf22c5de736665005999154b4a6321..fb54319abff3b8b7a790f0194c109e4d530fe6ec 100644 (file)
@@ -453,14 +453,8 @@ static uint32_t batadv_nc_hash_choose(const void *data, uint32_t size)
        const struct batadv_nc_path *nc_path = data;
        uint32_t hash = 0;
 
-       hash = batadv_hash_bytes(hash, &nc_path->prev_hop,
-                                sizeof(nc_path->prev_hop));
-       hash = batadv_hash_bytes(hash, &nc_path->next_hop,
-                                sizeof(nc_path->next_hop));
-
-       hash += (hash << 3);
-       hash ^= (hash >> 11);
-       hash += (hash << 15);
+       hash = jhash(&nc_path->prev_hop, sizeof(nc_path->prev_hop), hash);
+       hash = jhash(&nc_path->next_hop, sizeof(nc_path->next_hop), hash);
 
        return hash % size;
 }
index 91339143a2f7ee6638a575386c7495e79a5a7e58..0b716fe1db99a5dc3df61d061045b9ae0d45febe 100644 (file)
@@ -75,20 +75,9 @@ void batadv_orig_node_vlan_free_ref(struct batadv_orig_node_vlan *orig_vlan);
  */
 static inline uint32_t batadv_choose_orig(const void *data, uint32_t size)
 {
-       const unsigned char *key = data;
        uint32_t hash = 0;
-       size_t i;
-
-       for (i = 0; i < 6; i++) {
-               hash += key[i];
-               hash += (hash << 10);
-               hash ^= (hash >> 6);
-       }
-
-       hash += (hash << 3);
-       hash ^= (hash >> 11);
-       hash += (hash << 15);
 
+       hash = jhash(data, ETH_ALEN, hash);
        return hash % size;
 }
 
index b098e53edded8a8ea6d6f563a8142880992e5d30..fe9f8244ac0a743e46b34841d1026bc7319e0bb6 100644 (file)
@@ -67,12 +67,8 @@ static inline uint32_t batadv_choose_tt(const void *data, uint32_t size)
        uint32_t hash = 0;
 
        tt = (struct batadv_tt_common_entry *)data;
-       hash = batadv_hash_bytes(hash, &tt->addr, ETH_ALEN);
-       hash = batadv_hash_bytes(hash, &tt->vid, sizeof(tt->vid));
-
-       hash += (hash << 3);
-       hash ^= (hash >> 11);
-       hash += (hash << 15);
+       hash = jhash(&tt->addr, ETH_ALEN, hash);
+       hash = jhash(&tt->vid, sizeof(tt->vid), hash);
 
        return hash % size;
 }