rhashtable: provide len to obj_hashfn
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>
This commit is contained in:
		
					parent
					
						
							
								14d14a5d29
							
						
					
				
			
			
				commit
				
					
						49f7b33e63
					
				
			
		
					 3 changed files with 6 additions and 4 deletions
				
			
		| 
						 | 
					@ -88,7 +88,7 @@ struct rhashtable_compare_arg {
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef u32 (*rht_hashfn_t)(const void *data, u32 len, u32 seed);
 | 
					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,
 | 
					typedef int (*rht_obj_cmpfn_t)(struct rhashtable_compare_arg *arg,
 | 
				
			||||||
			       const void *obj);
 | 
								       const void *obj);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -242,7 +242,9 @@ static inline unsigned int rht_head_hashfn(
 | 
				
			||||||
	const char *ptr = rht_obj(ht, he);
 | 
						const char *ptr = rht_obj(ht, he);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return likely(params.obj_hashfn) ?
 | 
						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);
 | 
						       rht_key_hashfn(ht, tbl, ptr + params.key_offset, params);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -691,7 +691,7 @@ static u32 rhashtable_jhash2(const void *key, u32 length, u32 seed)
 | 
				
			||||||
 *	struct rhash_head	node;
 | 
					 *	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;
 | 
					 *	struct test_obj *obj = data;
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3127,7 +3127,7 @@ static struct pernet_operations __net_initdata netlink_net_ops = {
 | 
				
			||||||
	.exit = netlink_net_exit,
 | 
						.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;
 | 
						const struct netlink_sock *nlk = data;
 | 
				
			||||||
	struct netlink_compare_arg arg;
 | 
						struct netlink_compare_arg arg;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue