DPDK
20.05.0
|
#include <stdint.h>
#include <stddef.h>
#include <rte_compat.h>
Go to the source code of this file.
Data Structures | |
struct | rte_hash_parameters |
Macros | |
#define | RTE_HASH_ENTRIES_MAX (1 << 30) |
#define | RTE_HASH_NAMESIZE 32 |
#define | RTE_HASH_LOOKUP_BULK_MAX 64 |
#define | RTE_HASH_EXTRA_FLAGS_TRANS_MEM_SUPPORT 0x01 |
#define | RTE_HASH_EXTRA_FLAGS_MULTI_WRITER_ADD 0x02 |
#define | RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY 0x04 |
#define | RTE_HASH_EXTRA_FLAGS_EXT_TABLE 0x08 |
#define | RTE_HASH_EXTRA_FLAGS_NO_FREE_ON_DEL 0x10 |
#define | RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY_LF 0x20 |
Typedefs | |
typedef uint32_t | hash_sig_t |
typedef uint32_t(* | rte_hash_function) (const void *key, uint32_t key_len, uint32_t init_val) |
typedef int(* | rte_hash_cmp_eq_t) (const void *key1, const void *key2, size_t key_len) |
Functions | |
struct rte_hash * | rte_hash_create (const struct rte_hash_parameters *params) |
void | rte_hash_set_cmp_func (struct rte_hash *h, rte_hash_cmp_eq_t func) |
struct rte_hash * | rte_hash_find_existing (const char *name) |
void | rte_hash_free (struct rte_hash *h) |
void | rte_hash_reset (struct rte_hash *h) |
int32_t | rte_hash_count (const struct rte_hash *h) |
__rte_experimental int32_t | rte_hash_max_key_id (const struct rte_hash *h) |
int | rte_hash_add_key_data (const struct rte_hash *h, const void *key, void *data) |
int32_t | rte_hash_add_key_with_hash_data (const struct rte_hash *h, const void *key, hash_sig_t sig, void *data) |
int32_t | rte_hash_add_key (const struct rte_hash *h, const void *key) |
int32_t | rte_hash_add_key_with_hash (const struct rte_hash *h, const void *key, hash_sig_t sig) |
int32_t | rte_hash_del_key (const struct rte_hash *h, const void *key) |
int32_t | rte_hash_del_key_with_hash (const struct rte_hash *h, const void *key, hash_sig_t sig) |
int | rte_hash_get_key_with_position (const struct rte_hash *h, const int32_t position, void **key) |
__rte_experimental int | rte_hash_free_key_with_position (const struct rte_hash *h, const int32_t position) |
int | rte_hash_lookup_data (const struct rte_hash *h, const void *key, void **data) |
int | rte_hash_lookup_with_hash_data (const struct rte_hash *h, const void *key, hash_sig_t sig, void **data) |
int32_t | rte_hash_lookup (const struct rte_hash *h, const void *key) |
int32_t | rte_hash_lookup_with_hash (const struct rte_hash *h, const void *key, hash_sig_t sig) |
hash_sig_t | rte_hash_hash (const struct rte_hash *h, const void *key) |
int | rte_hash_lookup_bulk_data (const struct rte_hash *h, const void **keys, uint32_t num_keys, uint64_t *hit_mask, void *data[]) |
__rte_experimental int | rte_hash_lookup_with_hash_bulk (const struct rte_hash *h, const void **keys, hash_sig_t *sig, uint32_t num_keys, int32_t *positions) |
__rte_experimental int | rte_hash_lookup_with_hash_bulk_data (const struct rte_hash *h, const void **keys, hash_sig_t *sig, uint32_t num_keys, uint64_t *hit_mask, void *data[]) |
int | rte_hash_lookup_bulk (const struct rte_hash *h, const void **keys, uint32_t num_keys, int32_t *positions) |
int32_t | rte_hash_iterate (const struct rte_hash *h, const void **key, void **data, uint32_t *next) |
RTE Hash Table
Definition in file rte_hash.h.
#define RTE_HASH_ENTRIES_MAX (1 << 30) |
Maximum size of hash table that can be created.
Definition at line 24 of file rte_hash.h.
#define RTE_HASH_NAMESIZE 32 |
Maximum number of characters in hash name.
Definition at line 27 of file rte_hash.h.
#define RTE_HASH_LOOKUP_BULK_MAX 64 |
Maximum number of keys that can be searched for using rte_hash_lookup_bulk.
Definition at line 30 of file rte_hash.h.
#define RTE_HASH_EXTRA_FLAGS_TRANS_MEM_SUPPORT 0x01 |
Enable Hardware transactional memory support.
Definition at line 34 of file rte_hash.h.
#define RTE_HASH_EXTRA_FLAGS_MULTI_WRITER_ADD 0x02 |
Default behavior of insertion, single writer/multi writer
Definition at line 37 of file rte_hash.h.
#define RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY 0x04 |
Flag to support reader writer concurrency
Definition at line 40 of file rte_hash.h.
#define RTE_HASH_EXTRA_FLAGS_EXT_TABLE 0x08 |
Flag to indicate the extendable bucket table feature should be used
Definition at line 43 of file rte_hash.h.
#define RTE_HASH_EXTRA_FLAGS_NO_FREE_ON_DEL 0x10 |
Flag to disable freeing of key index on hash delete. Refer to rte_hash_del_xxx APIs for more details. This is enabled by default when RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY_LF is enabled.
Definition at line 50 of file rte_hash.h.
#define RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY_LF 0x20 |
Flag to support lock free reader writer concurrency. Both single writer and multi writer use cases are supported.
Definition at line 55 of file rte_hash.h.
typedef uint32_t hash_sig_t |
The type of hash value of a key. It should be a value of at least 32bit with fully random pattern.
Definition at line 61 of file rte_hash.h.
typedef uint32_t(* rte_hash_function) (const void *key, uint32_t key_len, uint32_t init_val) |
Type of function that can be used for calculating the hash value.
Definition at line 64 of file rte_hash.h.
typedef int(* rte_hash_cmp_eq_t) (const void *key1, const void *key2, size_t key_len) |
Type of function used to compare the hash key.
Definition at line 68 of file rte_hash.h.
struct rte_hash* rte_hash_create | ( | const struct rte_hash_parameters * | params | ) |
Create a new hash table.
params | Parameters used to create and initialise the hash table. |
void rte_hash_set_cmp_func | ( | struct rte_hash * | h, |
rte_hash_cmp_eq_t | func | ||
) |
Set a new hash compare function other than the default one.
h | Hash table for which the function is to be changed |
func | New compare function |
struct rte_hash* rte_hash_find_existing | ( | const char * | name | ) |
Find an existing hash table object and return a pointer to it.
name | Name of the hash table as passed to rte_hash_create() |
void rte_hash_free | ( | struct rte_hash * | h | ) |
De-allocate all memory used by hash table.
h | Hash table to free |
void rte_hash_reset | ( | struct rte_hash * | h | ) |
Reset all hash structure, by zeroing all entries. When RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY_LF is enabled, it is application's responsibility to make sure that none of the readers are referencing the hash table while calling this API.
h | Hash table to reset |
int32_t rte_hash_count | ( | const struct rte_hash * | h | ) |
Return the number of keys in the hash table
h | Hash table to query from |
__rte_experimental int32_t rte_hash_max_key_id | ( | const struct rte_hash * | h | ) |
Return the maximum key value ID that could possibly be returned by rte_hash_add_key function.
h | Hash table to query from |
int rte_hash_add_key_data | ( | const struct rte_hash * | h, |
const void * | key, | ||
void * | data | ||
) |
Add a key-value pair to an existing hash table. This operation is not multi-thread safe and should only be called from one thread by default. Thread safety can be enabled by setting flag during table creation. If the key exists already in the table, this API updates its value with 'data' passed in this API. It is the responsibility of the application to manage any memory associated with the old value. The readers might still be using the old value even after this API has returned.
h | Hash table to add the key to. |
key | Key to add to the hash table. |
data | Data to add to the hash table. |
int32_t rte_hash_add_key_with_hash_data | ( | const struct rte_hash * | h, |
const void * | key, | ||
hash_sig_t | sig, | ||
void * | data | ||
) |
Add a key-value pair with a pre-computed hash value to an existing hash table. This operation is not multi-thread safe and should only be called from one thread by default. Thread safety can be enabled by setting flag during table creation. If the key exists already in the table, this API updates its value with 'data' passed in this API. It is the responsibility of the application to manage any memory associated with the old value. The readers might still be using the old value even after this API has returned.
h | Hash table to add the key to. |
key | Key to add to the hash table. |
sig | Precomputed hash value for 'key' |
data | Data to add to the hash table. |
int32_t rte_hash_add_key | ( | const struct rte_hash * | h, |
const void * | key | ||
) |
Add a key to an existing hash table. This operation is not multi-thread safe and should only be called from one thread by default. Thread safety can be enabled by setting flag during table creation.
h | Hash table to add the key to. |
key | Key to add to the hash table. |
int32_t rte_hash_add_key_with_hash | ( | const struct rte_hash * | h, |
const void * | key, | ||
hash_sig_t | sig | ||
) |
Add a key to an existing hash table. This operation is not multi-thread safe and should only be called from one thread by default. Thread safety can be enabled by setting flag during table creation.
h | Hash table to add the key to. |
key | Key to add to the hash table. |
sig | Precomputed hash value for 'key'. |
int32_t rte_hash_del_key | ( | const struct rte_hash * | h, |
const void * | key | ||
) |
Remove a key from an existing hash table. This operation is not multi-thread safe and should only be called from one thread by default. Thread safety can be enabled by setting flag during table creation. If RTE_HASH_EXTRA_FLAGS_NO_FREE_ON_DEL or RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY_LF is enabled, the key index returned by rte_hash_add_key_xxx APIs will not be freed by this API. rte_hash_free_key_with_position API must be called additionally to free the index associated with the key. rte_hash_free_key_with_position API should be called after all the readers have stopped referencing the entry corresponding to this key. RCU mechanisms could be used to determine such a state.
h | Hash table to remove the key from. |
key | Key to remove from the hash table. |
int32_t rte_hash_del_key_with_hash | ( | const struct rte_hash * | h, |
const void * | key, | ||
hash_sig_t | sig | ||
) |
Remove a key from an existing hash table. This operation is not multi-thread safe and should only be called from one thread by default. Thread safety can be enabled by setting flag during table creation. If RTE_HASH_EXTRA_FLAGS_NO_FREE_ON_DEL or RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY_LF is enabled, the key index returned by rte_hash_add_key_xxx APIs will not be freed by this API. rte_hash_free_key_with_position API must be called additionally to free the index associated with the key. rte_hash_free_key_with_position API should be called after all the readers have stopped referencing the entry corresponding to this key. RCU mechanisms could be used to determine such a state.
h | Hash table to remove the key from. |
key | Key to remove from the hash table. |
sig | Precomputed hash value for 'key'. |
int rte_hash_get_key_with_position | ( | const struct rte_hash * | h, |
const int32_t | position, | ||
void ** | key | ||
) |
Find a key in the hash table given the position. This operation is multi-thread safe with regarding to other lookup threads. Read-write concurrency can be enabled by setting flag during table creation.
h | Hash table to get the key from. |
position | Position returned when the key was inserted. |
key | Output containing a pointer to the key |
__rte_experimental int rte_hash_free_key_with_position | ( | const struct rte_hash * | h, |
const int32_t | position | ||
) |
Free a hash key in the hash table given the position of the key. This operation is not multi-thread safe and should only be called from one thread by default. Thread safety can be enabled by setting flag during table creation. If RTE_HASH_EXTRA_FLAGS_NO_FREE_ON_DEL or RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY_LF is enabled, the key index returned by rte_hash_del_key_xxx APIs must be freed using this API. This API should be called after all the readers have stopped referencing the entry corresponding to this key. RCU mechanisms could be used to determine such a state. This API does not validate if the key is already freed.
h | Hash table to free the key from. |
position | Position returned when the key was deleted. |
int rte_hash_lookup_data | ( | const struct rte_hash * | h, |
const void * | key, | ||
void ** | data | ||
) |
Find a key-value pair in the hash table. This operation is multi-thread safe with regarding to other lookup threads. Read-write concurrency can be enabled by setting flag during table creation.
h | Hash table to look in. |
key | Key to find. |
data | Output with pointer to data returned from the hash table. |
int rte_hash_lookup_with_hash_data | ( | const struct rte_hash * | h, |
const void * | key, | ||
hash_sig_t | sig, | ||
void ** | data | ||
) |
Find a key-value pair with a pre-computed hash value to an existing hash table. This operation is multi-thread safe with regarding to other lookup threads. Read-write concurrency can be enabled by setting flag during table creation.
h | Hash table to look in. |
key | Key to find. |
sig | Precomputed hash value for 'key' |
data | Output with pointer to data returned from the hash table. |
int32_t rte_hash_lookup | ( | const struct rte_hash * | h, |
const void * | key | ||
) |
Find a key in the hash table. This operation is multi-thread safe with regarding to other lookup threads. Read-write concurrency can be enabled by setting flag during table creation.
h | Hash table to look in. |
key | Key to find. |
int32_t rte_hash_lookup_with_hash | ( | const struct rte_hash * | h, |
const void * | key, | ||
hash_sig_t | sig | ||
) |
Find a key in the hash table. This operation is multi-thread safe with regarding to other lookup threads. Read-write concurrency can be enabled by setting flag during table creation.
h | Hash table to look in. |
key | Key to find. |
sig | Precomputed hash value for 'key'. |
hash_sig_t rte_hash_hash | ( | const struct rte_hash * | h, |
const void * | key | ||
) |
Calc a hash value by key. This operation is not multi-process safe.
h | Hash table to look in. |
key | Key to find. |
int rte_hash_lookup_bulk_data | ( | const struct rte_hash * | h, |
const void ** | keys, | ||
uint32_t | num_keys, | ||
uint64_t * | hit_mask, | ||
void * | data[] | ||
) |
Find multiple keys in the hash table. This operation is multi-thread safe with regarding to other lookup threads. Read-write concurrency can be enabled by setting flag during table creation.
h | Hash table to look in. |
keys | A pointer to a list of keys to look for. |
num_keys | How many keys are in the keys list (less than RTE_HASH_LOOKUP_BULK_MAX). |
hit_mask | Output containing a bitmask with all successful lookups. |
data | Output containing array of data returned from all the successful lookups. |
__rte_experimental int rte_hash_lookup_with_hash_bulk | ( | const struct rte_hash * | h, |
const void ** | keys, | ||
hash_sig_t * | sig, | ||
uint32_t | num_keys, | ||
int32_t * | positions | ||
) |
Find multiple keys in the hash table with precomputed hash value array. This operation is multi-thread safe with regarding to other lookup threads. Read-write concurrency can be enabled by setting flag during table creation.
h | Hash table to look in. |
keys | A pointer to a list of keys to look for. |
sig | A pointer to a list of precomputed hash values for keys. |
num_keys | How many keys are in the keys list (less than RTE_HASH_LOOKUP_BULK_MAX). |
positions | Output containing a list of values, corresponding to the list of keys that can be used by the caller as an offset into an array of user data. These values are unique for each key, and are the same values that were returned when each key was added. If a key in the list was not found, then -ENOENT will be the value. |
__rte_experimental int rte_hash_lookup_with_hash_bulk_data | ( | const struct rte_hash * | h, |
const void ** | keys, | ||
hash_sig_t * | sig, | ||
uint32_t | num_keys, | ||
uint64_t * | hit_mask, | ||
void * | data[] | ||
) |
Find multiple keys in the hash table with precomputed hash value array. This operation is multi-thread safe with regarding to other lookup threads. Read-write concurrency can be enabled by setting flag during table creation.
h | Hash table to look in. |
keys | A pointer to a list of keys to look for. |
sig | A pointer to a list of precomputed hash values for keys. |
num_keys | How many keys are in the keys list (less than RTE_HASH_LOOKUP_BULK_MAX). |
hit_mask | Output containing a bitmask with all successful lookups. |
data | Output containing array of data returned from all the successful lookups. |
int rte_hash_lookup_bulk | ( | const struct rte_hash * | h, |
const void ** | keys, | ||
uint32_t | num_keys, | ||
int32_t * | positions | ||
) |
Find multiple keys in the hash table. This operation is multi-thread safe with regarding to other lookup threads. Read-write concurrency can be enabled by setting flag during table creation.
h | Hash table to look in. |
keys | A pointer to a list of keys to look for. |
num_keys | How many keys are in the keys list (less than RTE_HASH_LOOKUP_BULK_MAX). |
positions | Output containing a list of values, corresponding to the list of keys that can be used by the caller as an offset into an array of user data. These values are unique for each key, and are the same values that were returned when each key was added. If a key in the list was not found, then -ENOENT will be the value. |
int32_t rte_hash_iterate | ( | const struct rte_hash * | h, |
const void ** | key, | ||
void ** | data, | ||
uint32_t * | next | ||
) |
Iterate through the hash table, returning key-value pairs.
h | Hash table to iterate |
key | Output containing the key where current iterator was pointing at |
data | Output containing the data associated with key. Returns NULL if data was not stored. |
next | Pointer to iterator. Should be 0 to start iterating the hash table. Iterator is incremented after each call of this function. |