rhashtable: provide len to obj_hashfn
authorPatrick McHardy <kaber@trash.net>
Wed, 25 Mar 2015 13:07:45 +0000 (13:07 +0000)
committerPablo Neira Ayuso <pablo@netfilter.org>
Wed, 25 Mar 2015 16:18:33 +0000 (17:18 +0100)
nftables sets will be converted to use so called setextensions, moving
the key to a non-fixed position. To hash it, the obj_hashfn must be used,
however it so far doesn't receive the length parameter.

Pass the key length to obj_hashfn() and convert existing users.

Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
include/linux/rhashtable.h
lib/rhashtable.c
net/netlink/af_netlink.c

index 99f2e49a8a07889b7e4ef0321c779dfaba7c9b13..e23d242d1230ff899f37478bcb3a8b92769129d2 100644 (file)
@@ -88,7 +88,7 @@ struct rhashtable_compare_arg {
 };
 
 typedef u32 (*rht_hashfn_t)(const void *data, u32 len, u32 seed);
-typedef u32 (*rht_obj_hashfn_t)(const void *data, u32 seed);
+typedef u32 (*rht_obj_hashfn_t)(const void *data, u32 len, u32 seed);
 typedef int (*rht_obj_cmpfn_t)(struct rhashtable_compare_arg *arg,
                               const void *obj);
 
@@ -242,7 +242,9 @@ static inline unsigned int rht_head_hashfn(
        const char *ptr = rht_obj(ht, he);
 
        return likely(params.obj_hashfn) ?
-              rht_bucket_index(tbl, params.obj_hashfn(ptr, tbl->hash_rnd)) :
+              rht_bucket_index(tbl, params.obj_hashfn(ptr, params.key_len ?:
+                                                           ht->p.key_len,
+                                                      tbl->hash_rnd)) :
               rht_key_hashfn(ht, tbl, ptr + params.key_offset, params);
 }
 
index 4b7b7e672b934842e9252726d9d1fef6b75f0214..4898442b837fbd715f8d5079a1060e43c4b7a367 100644 (file)
@@ -691,7 +691,7 @@ static u32 rhashtable_jhash2(const void *key, u32 length, u32 seed)
  *     struct rhash_head       node;
  * };
  *
- * u32 my_hash_fn(const void *data, u32 seed)
+ * u32 my_hash_fn(const void *data, u32 len, u32 seed)
  * {
  *     struct test_obj *obj = data;
  *
index 4caa809dbbe0332ca32b7b0279e61289b01574e3..19909d0786a2e60574ba623d343193ca212ed2be 100644 (file)
@@ -3127,7 +3127,7 @@ static struct pernet_operations __net_initdata netlink_net_ops = {
        .exit = netlink_net_exit,
 };
 
-static inline u32 netlink_hash(const void *data, u32 seed)
+static inline u32 netlink_hash(const void *data, u32 len, u32 seed)
 {
        const struct netlink_sock *nlk = data;
        struct netlink_compare_arg arg;