---
name: "RTE_HASH_QSBR_MODE_DQ"
section: "3"
platform: "linux"
package: "dpdk-doc"
version: "24.11.4-0+deb13u1"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/rte_hash.h"
---

# RTE\_HASH\_QSBR\_MODE\_DQ(3)

Part of [rte\_hash.h(3)](/rte_hash.h/3.md).

## 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.*
