Provided by: dpdk-doc_24.11.2-2_all bug

NAME

       rte_hash.h

SYNOPSIS

       #include <stdint.h>
       #include <stddef.h>
       #include <rte_rcu_qsbr.h>

   Data Structures
       struct rte_hash_parameters
       struct rte_hash_rcu_config

   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)
       typedef void(* rte_hash_free_key_data) (void *p, void *key_data)

   Enumerations
       enum rte_hash_qsbr_mode { RTE_HASH_QSBR_MODE_DQ = 0, RTE_HASH_QSBR_MODE_SYNC }

   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)
       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)
       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[])
       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)
       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)
       int rte_hash_rcu_qsbr_add (struct rte_hash *h, struct rte_hash_rcu_config *cfg)
       __rte_experimental int rte_hash_rcu_qsbr_dq_reclaim (struct rte_hash *h, unsigned int *freed, unsigned
           int *pending, unsigned int *available)

Detailed Description

       RTE Hash Table

       Definition in file rte_hash.h.

Macro Definition Documentation

   #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. However, if internal
       RCU is enabled, freeing of internal memory/index is done on delete

       Definition at line 51 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 56 of file rte_hash.h.

Typedef Documentation

   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 62 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 65 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 69 of file rte_hash.h.

   typedef void(* rte_hash_free_key_data) (void *p, void *key_data)
       Type of function used to free data stored in the key. Required when using internal RCU to allow
       application to free key-data once the key is returned to the ring of free key-slots.

       Definition at line 76 of file rte_hash.h.

Enumeration Type Documentation

   enum rte_hash_qsbr_mode
       RCU reclamation modes

       Enumerator

       RTE_HASH_QSBR_MODE_DQ
              Create defer queue for reclaim.

       RTE_HASH_QSBR_MODE_SYNC
              Use blocking mode reclaim. No defer queue created.

       Definition at line 93 of file rte_hash.h.

Function Documentation

   struct rte_hash * rte_hash_create (const struct rte_hash_parameters * params)
       Create a new hash table.

       Parameters
           params Parameters used to create and initialise the hash table.

       Returns
           Pointer  to hash table structure that is used in future hash table operations, or NULL on error, with
           error code set in rte_errno. Possible rte_errno errors include:

           • E_RTE_NO_CONFIG - function could not get pointer to rte_config structure

           • E_RTE_SECONDARY - function was called from a secondary process instance

           • ENOENT - missing entry

           • EINVAL - invalid parameter passed to function

           • ENOSPC - the maximum number of memzones has already been allocated

           • EEXIST - a memzone with the same name already exists

           • ENOMEM - no appropriate memory area found in which to create memzone

   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.

       Note
           Function pointer does not work with multi-process, so do not use it in multi-process mode.

       Parameters
           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.

       Parameters
           name Name of the hash table as passed to rte_hash_create()

       Returns
           Pointer to hash table or NULL  if  object  not  found  with  rte_errno  set  appropriately.  Possible
           rte_errno values include:

           • ENOENT - value not available for return

   void rte_hash_free (struct rte_hash * h)
       De-allocate all memory used by hash table.

       Parameters
           h Hash table to free, if NULL, the function does nothing.

   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.

       Parameters
           h Hash table to reset

   int32_t rte_hash_count (const struct rte_hash * h)
       Return the number of keys in the hash table

       Parameters
           h Hash table to query from

       Returns

           • -EINVAL if parameters are invalid

           • A value indicating how many keys were inserted in the table.

   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.

       Parameters
           h Hash table to query from

       Returns

           • -EINVAL if parameters are invalid

           • A value indicating the max key ID of key slots present in the table.

   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.

       Parameters
           h Hash table to add the key to.
           key Key to add to the hash table.
           data Data to add to the hash table.

       Returns

           • 0 if added successfully

           • -EINVAL if the parameters are invalid.

           • -ENOSPC if there is no space in the hash for this key.

   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.

       Parameters
           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.

       Returns

           • 0 if added successfully

           • -EINVAL if the parameters are invalid.

           • -ENOSPC if there is no space in the hash for this key.

   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.

       Parameters
           h Hash table to add the key to.
           key Key to add to the hash table.

       Returns

           • -EINVAL if the parameters are invalid.

           • -ENOSPC if there is no space in the hash for this key.

           • A non-negative value that can be used by the caller as an offset into an array of user  data.  This
             value  is unique for this key. This unique key id may be larger than the user specified entry count
             when RTE_HASH_EXTRA_FLAGS_MULTI_WRITER_ADD flag is set.

   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.

       Parameters
           h Hash table to add the key to.
           key Key to add to the hash table.
           sig Precomputed hash value for 'key'.

       Returns

           • -EINVAL if the parameters are invalid.

           • -ENOSPC if there is no space in the hash for this key.

           • A  non-negative  value that can be used by the caller as an offset into an array of user data. This
             value is unique for this key. This unique key ID may be larger than the user specified entry  count
             when RTE_HASH_EXTRA_FLAGS_MULTI_WRITER_ADD flag is set.

   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 and internal RCU
       is NOT 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.

       Parameters
           h Hash table to remove the key from.
           key Key to remove from the hash table.

       Returns

           • -EINVAL if the parameters are invalid.

           • -ENOENT if the key is not found.

           • A  non-negative  value that can be used by the caller as an offset into an array of user data. This
             value is unique for this key, and is the same value that was returned when the key was added.

   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 and internal RCU
       is  NOT  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.

       Parameters
           h Hash table to remove the key from.
           key Key to remove from the hash table.
           sig Precomputed hash value for 'key'.

       Returns

           • -EINVAL if the parameters are invalid.

           • -ENOENT if the key is not found.

           • A non-negative value that can be used by the caller as an offset into an array of user  data.  This
             value is unique for this key, and is the same value that was returned when the key was added.

   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.

       Parameters
           h Hash table to get the key from.
           position Position returned when the key was inserted.
           key Output containing a pointer to the key

       Returns

           • 0 if retrieved successfully

           • -EINVAL if the parameters are invalid.

           • -ENOENT if no valid key is found in the given position.

   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 and internal RCU is NOT 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.

       Parameters
           h Hash table to free the key from.
           position Position returned when the key was deleted.

       Returns

           • 0 if freed successfully

           • -EINVAL if the parameters are invalid.

   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.

       Parameters
           h Hash table to look in.
           key Key to find.
           data Output with pointer to data returned from the hash table.

       Returns

           • A non-negative value that can be used by the caller as an offset into an array of user  data.  This
             value is unique for this key, and is the same value that was returned when the key was added.

           • -EINVAL if the parameters are invalid.

           • -ENOENT if the key is not found.

   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.

       Parameters
           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.

       Returns

           • A  non-negative  value that can be used by the caller as an offset into an array of user data. This
             value is unique for this key, and is the same value that was returned when the key was added.

           • -EINVAL if the parameters are invalid.

           • -ENOENT if the key is not found.

   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.

       Parameters
           h Hash table to look in.
           key Key to find.

       Returns

           • -EINVAL if the parameters are invalid.

           • -ENOENT if the key is not found.

           • A non-negative value that can be used by the caller as an offset into an array of user  data.  This
             value is unique for this key, and is the same value that was returned when the key was added.

   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.

       Parameters
           h Hash table to look in.
           key Key to find.
           sig Precomputed hash value for 'key'.

       Returns

           • -EINVAL if the parameters are invalid.

           • -ENOENT if the key is not found.

           • A  non-negative  value that can be used by the caller as an offset into an array of user data. This
             value is unique for this key, and is the same value that was returned when the key was added.

   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.

       Parameters
           h Hash table to look in.
           key Key to find.

       Returns

           • hash value

   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.

       Parameters
           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.

       Returns
           -EINVAL if there's an error, otherwise number of successful lookups.

   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.

       Parameters
           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.

       Returns
           -EINVAL if there's an error, otherwise 0.

   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.

       Parameters
           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.

       Returns
           -EINVAL if there's an error, otherwise number of 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.

       Parameters
           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.

       Returns
           -EINVAL if there's an error, otherwise 0.

   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.

       Parameters
           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.

       Returns
           Position where key was stored, if successful.

           • -EINVAL if the parameters are invalid.

           • -ENOENT if end of the hash table.

   int rte_hash_rcu_qsbr_add (struct rte_hash * h, struct rte_hash_rcu_config * cfg)
       Associate RCU QSBR variable with a Hash object. This API should be called to enable  the  integrated  RCU
       QSBR support and should be called immediately after creating the Hash object.

       Parameters
           h the hash object to add RCU QSBR
           cfg RCU QSBR configuration

       Returns
           On success - 0 On error - 1 with error code set in rte_errno. Possible rte_errno codes are:

           • EINVAL - invalid pointer

           • EEXIST - already added QSBR

           • ENOMEM - memory allocation failure

   __rte_experimental  int rte_hash_rcu_qsbr_dq_reclaim (struct rte_hash * h, unsigned int * freed, unsigned int
       * pending, unsigned int * available)
       Reclaim resources from the defer queue. This API reclaim the resources from the defer  queue  if  rcu  is
       enabled.

       Parameters
           h The hash object to reclaim resources.
           freed Number of resources that were freed.
           pending  Number  of resources pending on the defer queue. This number might not be accurate if multi-
           thread safety is configured.
           available Number of resources that can be added to the defer queue. This number might not be accurate
           if multi-thread safety is configured.

       Returns
           On success - 0 On error - 1 with error code set in rte_errno. Possible rte_errno codes are:

           • EINVAL - invalid pointer

Author

       Generated automatically by Doxygen for DPDK from the source code.

DPDK                                             Version 24.11.2                                   rte_hash.h(3)