table: hash
Various types of hash tables presented under the Packet Framework toolbox. Hash table types: 1. Extendible bucket (ext): when bucket is full, bucket is extended with more keys 2. Least Recently Used (LRU): when bucket is full, the LRU entry is discarded 3. Pre-computed key signature: RX core extracts the key n-tuple from the packet, computes the key signature and saves the key and key signature within the packet meta-data; flow classification core performs the actual lookup (the bucket search stage) after reading the key and key signature from packet meta-data 4. Signature computed on-the-fly (do-sig version): the same CPU core extracts the key n-tuple from pkt, computes key signature and performs the table lookup 5. Configurable key size or optimized for single key size (8-byte, 16-byte and 32-byte key sizes) Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com> Acked-by: Pablo de Lara Guarch <pablo.de.lara.guarch@intel.com> Acked by: Ivan Boule <ivan.boule@6wind.com>
This commit is contained in:
parent
166923eb2f
commit
8aa327214c
@ -112,6 +112,7 @@ There are many libraries, so their headers may be grouped by topics:
|
|||||||
[lpm IPv4] (@ref rte_table_lpm.h),
|
[lpm IPv4] (@ref rte_table_lpm.h),
|
||||||
[lpm IPv6] (@ref rte_table_lpm_ipv6.h),
|
[lpm IPv6] (@ref rte_table_lpm_ipv6.h),
|
||||||
[ACL] (@ref rte_table_acl.h),
|
[ACL] (@ref rte_table_acl.h),
|
||||||
|
[hash] (@ref rte_table_hash.h),
|
||||||
|
|
||||||
- **basic**:
|
- **basic**:
|
||||||
[approx fraction] (@ref rte_approx.h),
|
[approx fraction] (@ref rte_approx.h),
|
||||||
|
@ -47,6 +47,11 @@ SRCS-$(CONFIG_RTE_LIBRTE_TABLE) += rte_table_lpm_ipv6.c
|
|||||||
ifeq ($(CONFIG_RTE_LIBRTE_ACL),y)
|
ifeq ($(CONFIG_RTE_LIBRTE_ACL),y)
|
||||||
SRCS-$(CONFIG_RTE_LIBRTE_TABLE) += rte_table_acl.c
|
SRCS-$(CONFIG_RTE_LIBRTE_TABLE) += rte_table_acl.c
|
||||||
endif
|
endif
|
||||||
|
SRCS-$(CONFIG_RTE_LIBRTE_TABLE) += rte_table_hash_key8.c
|
||||||
|
SRCS-$(CONFIG_RTE_LIBRTE_TABLE) += rte_table_hash_key16.c
|
||||||
|
SRCS-$(CONFIG_RTE_LIBRTE_TABLE) += rte_table_hash_key32.c
|
||||||
|
SRCS-$(CONFIG_RTE_LIBRTE_TABLE) += rte_table_hash_ext.c
|
||||||
|
SRCS-$(CONFIG_RTE_LIBRTE_TABLE) += rte_table_hash_lru.c
|
||||||
|
|
||||||
# install includes
|
# install includes
|
||||||
SYMLINK-$(CONFIG_RTE_LIBRTE_TABLE)-include += rte_table.h
|
SYMLINK-$(CONFIG_RTE_LIBRTE_TABLE)-include += rte_table.h
|
||||||
@ -55,6 +60,8 @@ SYMLINK-$(CONFIG_RTE_LIBRTE_TABLE)-include += rte_table_lpm_ipv6.h
|
|||||||
ifeq ($(CONFIG_RTE_LIBRTE_ACL),y)
|
ifeq ($(CONFIG_RTE_LIBRTE_ACL),y)
|
||||||
SYMLINK-$(CONFIG_RTE_LIBRTE_TABLE)-include += rte_table_acl.h
|
SYMLINK-$(CONFIG_RTE_LIBRTE_TABLE)-include += rte_table_acl.h
|
||||||
endif
|
endif
|
||||||
|
SYMLINK-$(CONFIG_RTE_LIBRTE_TABLE)-include += rte_table_hash.h
|
||||||
|
SYMLINK-$(CONFIG_RTE_LIBRTE_TABLE)-include += rte_lru.h
|
||||||
|
|
||||||
# this lib depends upon:
|
# this lib depends upon:
|
||||||
DEPDIRS-$(CONFIG_RTE_LIBRTE_TABLE) := lib/librte_eal
|
DEPDIRS-$(CONFIG_RTE_LIBRTE_TABLE) := lib/librte_eal
|
||||||
@ -66,5 +73,6 @@ DEPDIRS-$(CONFIG_RTE_LIBRTE_TABLE) += lib/librte_lpm
|
|||||||
ifeq ($(CONFIG_RTE_LIBRTE_ACL),y)
|
ifeq ($(CONFIG_RTE_LIBRTE_ACL),y)
|
||||||
DEPDIRS-$(CONFIG_RTE_LIBRTE_TABLE) += lib/librte_acl
|
DEPDIRS-$(CONFIG_RTE_LIBRTE_TABLE) += lib/librte_acl
|
||||||
endif
|
endif
|
||||||
|
DEPDIRS-$(CONFIG_RTE_LIBRTE_TABLE) += lib/librte_hash
|
||||||
|
|
||||||
include $(RTE_SDK)/mk/rte.lib.mk
|
include $(RTE_SDK)/mk/rte.lib.mk
|
||||||
|
213
lib/librte_table/rte_lru.h
Normal file
213
lib/librte_table/rte_lru.h
Normal file
@ -0,0 +1,213 @@
|
|||||||
|
/*-
|
||||||
|
* BSD LICENSE
|
||||||
|
*
|
||||||
|
* Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in
|
||||||
|
* the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
* * Neither the name of Intel Corporation nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __INCLUDE_RTE_LRU_H__
|
||||||
|
#define __INCLUDE_RTE_LRU_H__
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifdef __INTEL_COMPILER
|
||||||
|
#define GCC_VERSION (0)
|
||||||
|
#else
|
||||||
|
#define GCC_VERSION (__GNUC__ * 10000+__GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef RTE_TABLE_HASH_LRU_STRATEGY
|
||||||
|
#ifdef __SSE4_2__
|
||||||
|
#define RTE_TABLE_HASH_LRU_STRATEGY 2
|
||||||
|
#else /* if no SSE, use simple scalar version */
|
||||||
|
#define RTE_TABLE_HASH_LRU_STRATEGY 1
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef RTE_ARCH_X86_64
|
||||||
|
#undef RTE_TABLE_HASH_LRU_STRATEGY
|
||||||
|
#define RTE_TABLE_HASH_LRU_STRATEGY 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (RTE_TABLE_HASH_LRU_STRATEGY < 0) || (RTE_TABLE_HASH_LRU_STRATEGY > 3)
|
||||||
|
#error Invalid value for RTE_TABLE_HASH_LRU_STRATEGY
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if RTE_TABLE_HASH_LRU_STRATEGY == 0
|
||||||
|
|
||||||
|
#define lru_init(bucket) \
|
||||||
|
do \
|
||||||
|
bucket = bucket; \
|
||||||
|
while (0)
|
||||||
|
|
||||||
|
#define lru_pos(bucket) (bucket->lru_list & 0xFFFFLLU)
|
||||||
|
|
||||||
|
#define lru_update(bucket, mru_val) \
|
||||||
|
do { \
|
||||||
|
bucket = bucket; \
|
||||||
|
mru_val = mru_val; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#elif RTE_TABLE_HASH_LRU_STRATEGY == 1
|
||||||
|
|
||||||
|
#define lru_init(bucket) \
|
||||||
|
do \
|
||||||
|
bucket->lru_list = 0x0000000100020003LLU; \
|
||||||
|
while (0)
|
||||||
|
|
||||||
|
#define lru_pos(bucket) (bucket->lru_list & 0xFFFFLLU)
|
||||||
|
|
||||||
|
#define lru_update(bucket, mru_val) \
|
||||||
|
do { \
|
||||||
|
uint64_t x, pos, x0, x1, x2, mask; \
|
||||||
|
\
|
||||||
|
x = bucket->lru_list; \
|
||||||
|
\
|
||||||
|
pos = 4; \
|
||||||
|
if ((x >> 48) == ((uint64_t) mru_val)) \
|
||||||
|
pos = 3; \
|
||||||
|
\
|
||||||
|
if (((x >> 32) & 0xFFFFLLU) == ((uint64_t) mru_val)) \
|
||||||
|
pos = 2; \
|
||||||
|
\
|
||||||
|
if (((x >> 16) & 0xFFFFLLU) == ((uint64_t) mru_val)) \
|
||||||
|
pos = 1; \
|
||||||
|
\
|
||||||
|
if ((x & 0xFFFFLLU) == ((uint64_t) mru_val)) \
|
||||||
|
pos = 0; \
|
||||||
|
\
|
||||||
|
\
|
||||||
|
pos <<= 4; \
|
||||||
|
mask = (~0LLU) << pos; \
|
||||||
|
x0 = x & (~mask); \
|
||||||
|
x1 = (x >> 16) & mask; \
|
||||||
|
x2 = (x << (48 - pos)) & (0xFFFFLLU << 48); \
|
||||||
|
x = x0 | x1 | x2; \
|
||||||
|
\
|
||||||
|
if (pos != 64) \
|
||||||
|
bucket->lru_list = x; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#elif RTE_TABLE_HASH_LRU_STRATEGY == 2
|
||||||
|
|
||||||
|
#if GCC_VERSION > 40306
|
||||||
|
#include <x86intrin.h>
|
||||||
|
#else
|
||||||
|
#include <emmintrin.h>
|
||||||
|
#include <smmintrin.h>
|
||||||
|
#include <xmmintrin.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define lru_init(bucket) \
|
||||||
|
do \
|
||||||
|
bucket->lru_list = 0x0000000100020003LLU; \
|
||||||
|
while (0)
|
||||||
|
|
||||||
|
#define lru_pos(bucket) (bucket->lru_list & 0xFFFFLLU)
|
||||||
|
|
||||||
|
#define lru_update(bucket, mru_val) \
|
||||||
|
do { \
|
||||||
|
/* set up the masks for all possible shuffles, depends on pos */\
|
||||||
|
static uint64_t masks[10] = { \
|
||||||
|
/* Shuffle order; Make Zero (see _mm_shuffle_epi8 manual) */\
|
||||||
|
0x0100070605040302, 0x8080808080808080, \
|
||||||
|
0x0302070605040100, 0x8080808080808080, \
|
||||||
|
0x0504070603020100, 0x8080808080808080, \
|
||||||
|
0x0706050403020100, 0x8080808080808080, \
|
||||||
|
0x0706050403020100, 0x8080808080808080}; \
|
||||||
|
/* load up one register with repeats of mru-val */ \
|
||||||
|
uint64_t mru2 = mru_val; \
|
||||||
|
uint64_t mru3 = mru2 | (mru2 << 16); \
|
||||||
|
uint64_t lru = bucket->lru_list; \
|
||||||
|
/* XOR to cause the word we're looking for to go to zero */ \
|
||||||
|
uint64_t mru = lru ^ ((mru3 << 32) | mru3); \
|
||||||
|
__m128i c = _mm_cvtsi64_si128(mru); \
|
||||||
|
__m128i b = _mm_cvtsi64_si128(lru); \
|
||||||
|
/* Find the minimum value (first zero word, if it's in there) */\
|
||||||
|
__m128i d = _mm_minpos_epu16(c); \
|
||||||
|
/* Second word is the index to found word (first word is the value) */\
|
||||||
|
unsigned pos = _mm_extract_epi16(d, 1); \
|
||||||
|
/* move the recently used location to top of list */ \
|
||||||
|
__m128i k = _mm_shuffle_epi8(b, *((__m128i *) &masks[2 * pos]));\
|
||||||
|
/* Finally, update the original list with the reordered data */ \
|
||||||
|
bucket->lru_list = _mm_extract_epi64(k, 0); \
|
||||||
|
/* Phwew! */ \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#elif RTE_TABLE_HASH_LRU_STRATEGY == 3
|
||||||
|
|
||||||
|
#if GCC_VERSION > 40306
|
||||||
|
#include <x86intrin.h>
|
||||||
|
#else
|
||||||
|
#include <emmintrin.h>
|
||||||
|
#include <smmintrin.h>
|
||||||
|
#include <xmmintrin.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define lru_init(bucket) \
|
||||||
|
do \
|
||||||
|
bucket->lru_list = ~0LLU; \
|
||||||
|
while (0)
|
||||||
|
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
f_lru_pos(uint64_t lru_list)
|
||||||
|
{
|
||||||
|
__m128i lst = _mm_set_epi64x((uint64_t)-1, lru_list);
|
||||||
|
__m128i min = _mm_minpos_epu16(lst);
|
||||||
|
return _mm_extract_epi16(min, 1);
|
||||||
|
}
|
||||||
|
#define lru_pos(bucket) f_lru_pos(bucket->lru_list)
|
||||||
|
|
||||||
|
#define lru_update(bucket, mru_val) \
|
||||||
|
do { \
|
||||||
|
const uint64_t orvals[] = {0xFFFFLLU, 0xFFFFLLU << 16, \
|
||||||
|
0xFFFFLLU << 32, 0xFFFFLLU << 48, 0LLU}; \
|
||||||
|
const uint64_t decs[] = {0x1000100010001LLU, 0}; \
|
||||||
|
__m128i lru = _mm_cvtsi64_si128(bucket->lru_list); \
|
||||||
|
__m128i vdec = _mm_cvtsi64_si128(decs[mru_val>>2]); \
|
||||||
|
lru = _mm_subs_epu16(lru, vdec); \
|
||||||
|
bucket->lru_list = _mm_extract_epi64(lru, 0) | orvals[mru_val]; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#error "Incorrect value for RTE_TABLE_HASH_LRU_STRATEGY"
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
350
lib/librte_table/rte_table_hash.h
Normal file
350
lib/librte_table/rte_table_hash.h
Normal file
@ -0,0 +1,350 @@
|
|||||||
|
/*-
|
||||||
|
* BSD LICENSE
|
||||||
|
*
|
||||||
|
* Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in
|
||||||
|
* the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
* * Neither the name of Intel Corporation nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __INCLUDE_RTE_TABLE_HASH_H__
|
||||||
|
#define __INCLUDE_RTE_TABLE_HASH_H__
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* RTE Table Hash
|
||||||
|
*
|
||||||
|
* These tables use the exact match criterion to uniquely associate data to
|
||||||
|
* lookup keys.
|
||||||
|
*
|
||||||
|
* Use-cases: Flow classification table, Address Resolution Protocol (ARP) table
|
||||||
|
*
|
||||||
|
* Hash table types:
|
||||||
|
* 1. Entry add strategy on bucket full:
|
||||||
|
* a. Least Recently Used (LRU): One of the existing keys in the bucket is
|
||||||
|
* deleted and the new key is added in its place. The number of keys in
|
||||||
|
* each bucket never grows bigger than 4. The logic to pick the key to
|
||||||
|
* be dropped from the bucket is LRU. The hash table lookup operation
|
||||||
|
* maintains the order in which the keys in the same bucket are hit, so
|
||||||
|
* every time a key is hit, it becomes the new Most Recently Used (MRU)
|
||||||
|
* key, i.e. the most unlikely candidate for drop. When a key is added
|
||||||
|
* to the bucket, it also becomes the new MRU key. When a key needs to
|
||||||
|
* be picked and dropped, the most likely candidate for drop, i.e. the
|
||||||
|
* current LRU key, is always picked. The LRU logic requires maintaining
|
||||||
|
* specific data structures per each bucket.
|
||||||
|
* b. Extendible bucket (ext): The bucket is extended with space for 4 more
|
||||||
|
* keys. This is done by allocating additional memory at table init time,
|
||||||
|
* which is used to create a pool of free keys (the size of this pool is
|
||||||
|
* configurable and always a multiple of 4). On key add operation, the
|
||||||
|
* allocation of a group of 4 keys only happens successfully within the
|
||||||
|
* limit of free keys, otherwise the key add operation fails. On key
|
||||||
|
* delete operation, a group of 4 keys is freed back to the pool of free
|
||||||
|
* keys when the key to be deleted is the only key that was used within
|
||||||
|
* its group of 4 keys at that time. On key lookup operation, if the
|
||||||
|
* current bucket is in extended state and a match is not found in the
|
||||||
|
* first group of 4 keys, the search continues beyond the first group of
|
||||||
|
* 4 keys, potentially until all keys in this bucket are examined. The
|
||||||
|
* extendible bucket logic requires maintaining specific data structures
|
||||||
|
* per table and per each bucket.
|
||||||
|
* 2. Key signature computation:
|
||||||
|
* a. Pre-computed key signature: The key lookup operation is split between
|
||||||
|
* two CPU cores. The first CPU core (typically the CPU core performing
|
||||||
|
* packet RX) extracts the key from the input packet, computes the key
|
||||||
|
* signature and saves both the key and the key signature in the packet
|
||||||
|
* buffer as packet meta-data. The second CPU core reads both the key and
|
||||||
|
* the key signature from the packet meta-data and performs the bucket
|
||||||
|
* search step of the key lookup operation.
|
||||||
|
* b. Key signature computed on lookup (do-sig): The same CPU core reads
|
||||||
|
* the key from the packet meta-data, uses it to compute the key
|
||||||
|
* signature and also performs the bucket search step of the key lookup
|
||||||
|
* operation.
|
||||||
|
* 3. Key size:
|
||||||
|
* a. Configurable key size
|
||||||
|
* b. Single key size (8-byte, 16-byte or 32-byte key size)
|
||||||
|
*
|
||||||
|
***/
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "rte_table.h"
|
||||||
|
|
||||||
|
/** Hash function */
|
||||||
|
typedef uint64_t (*rte_table_hash_op_hash)(
|
||||||
|
void *key,
|
||||||
|
uint32_t key_size,
|
||||||
|
uint64_t seed);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hash tables with configurable key size
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
/** Extendible bucket hash table parameters */
|
||||||
|
struct rte_table_hash_ext_params {
|
||||||
|
/** Key size (number of bytes) */
|
||||||
|
uint32_t key_size;
|
||||||
|
|
||||||
|
/** Maximum number of keys */
|
||||||
|
uint32_t n_keys;
|
||||||
|
|
||||||
|
/** Number of hash table buckets. Each bucket stores up to 4 keys. */
|
||||||
|
uint32_t n_buckets;
|
||||||
|
|
||||||
|
/** Number of hash table bucket extensions. Each bucket extension has
|
||||||
|
space for 4 keys and each bucket can have 0, 1 or more extensions. */
|
||||||
|
uint32_t n_buckets_ext;
|
||||||
|
|
||||||
|
/** Hash function */
|
||||||
|
rte_table_hash_op_hash f_hash;
|
||||||
|
|
||||||
|
/** Seed value for the hash function */
|
||||||
|
uint64_t seed;
|
||||||
|
|
||||||
|
/** Byte offset within packet meta-data where the 4-byte key signature
|
||||||
|
is located. Valid for pre-computed key signature tables, ignored for
|
||||||
|
do-sig tables. */
|
||||||
|
uint32_t signature_offset;
|
||||||
|
|
||||||
|
/** Byte offset within packet meta-data where the key is located */
|
||||||
|
uint32_t key_offset;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Extendible bucket hash table operations for pre-computed key signature */
|
||||||
|
extern struct rte_table_ops rte_table_hash_ext_ops;
|
||||||
|
|
||||||
|
/** Extendible bucket hash table operations for key signature computed on
|
||||||
|
lookup ("do-sig") */
|
||||||
|
extern struct rte_table_ops rte_table_hash_ext_dosig_ops;
|
||||||
|
|
||||||
|
/** LRU hash table parameters */
|
||||||
|
struct rte_table_hash_lru_params {
|
||||||
|
/** Key size (number of bytes) */
|
||||||
|
uint32_t key_size;
|
||||||
|
|
||||||
|
/** Maximum number of keys */
|
||||||
|
uint32_t n_keys;
|
||||||
|
|
||||||
|
/** Number of hash table buckets. Each bucket stores up to 4 keys. */
|
||||||
|
uint32_t n_buckets;
|
||||||
|
|
||||||
|
/** Hash function */
|
||||||
|
rte_table_hash_op_hash f_hash;
|
||||||
|
|
||||||
|
/** Seed value for the hash function */
|
||||||
|
uint64_t seed;
|
||||||
|
|
||||||
|
/** Byte offset within packet meta-data where the 4-byte key signature
|
||||||
|
is located. Valid for pre-computed key signature tables, ignored for
|
||||||
|
do-sig tables. */
|
||||||
|
uint32_t signature_offset;
|
||||||
|
|
||||||
|
/** Byte offset within packet meta-data where the key is located */
|
||||||
|
uint32_t key_offset;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** LRU hash table operations for pre-computed key signature */
|
||||||
|
extern struct rte_table_ops rte_table_hash_lru_ops;
|
||||||
|
|
||||||
|
/** LRU hash table operations for key signature computed on lookup ("do-sig") */
|
||||||
|
extern struct rte_table_ops rte_table_hash_lru_dosig_ops;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 8-byte key hash tables
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
/** LRU hash table parameters */
|
||||||
|
struct rte_table_hash_key8_lru_params {
|
||||||
|
/** Maximum number of entries (and keys) in the table */
|
||||||
|
uint32_t n_entries;
|
||||||
|
|
||||||
|
/** Hash function */
|
||||||
|
rte_table_hash_op_hash f_hash;
|
||||||
|
|
||||||
|
/** Seed for the hash function */
|
||||||
|
uint64_t seed;
|
||||||
|
|
||||||
|
/** Byte offset within packet meta-data where the 4-byte key signature
|
||||||
|
is located. Valid for pre-computed key signature tables, ignored for
|
||||||
|
do-sig tables. */
|
||||||
|
uint32_t signature_offset;
|
||||||
|
|
||||||
|
/** Byte offset within packet meta-data where the key is located */
|
||||||
|
uint32_t key_offset;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** LRU hash table operations for pre-computed key signature */
|
||||||
|
extern struct rte_table_ops rte_table_hash_key8_lru_ops;
|
||||||
|
|
||||||
|
/** LRU hash table operations for key signature computed on lookup ("do-sig") */
|
||||||
|
extern struct rte_table_ops rte_table_hash_key8_lru_dosig_ops;
|
||||||
|
|
||||||
|
/** Extendible bucket hash table parameters */
|
||||||
|
struct rte_table_hash_key8_ext_params {
|
||||||
|
/** Maximum number of entries (and keys) in the table */
|
||||||
|
uint32_t n_entries;
|
||||||
|
|
||||||
|
/** Number of entries (and keys) for hash table bucket extensions. Each
|
||||||
|
bucket is extended in increments of 4 keys. */
|
||||||
|
uint32_t n_entries_ext;
|
||||||
|
|
||||||
|
/** Hash function */
|
||||||
|
rte_table_hash_op_hash f_hash;
|
||||||
|
|
||||||
|
/** Seed for the hash function */
|
||||||
|
uint64_t seed;
|
||||||
|
|
||||||
|
/** Byte offset within packet meta-data where the 4-byte key signature
|
||||||
|
is located. Valid for pre-computed key signature tables, ignored for
|
||||||
|
do-sig tables. */
|
||||||
|
uint32_t signature_offset;
|
||||||
|
|
||||||
|
/** Byte offset within packet meta-data where the key is located */
|
||||||
|
uint32_t key_offset;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Extendible bucket hash table operations for pre-computed key signature */
|
||||||
|
extern struct rte_table_ops rte_table_hash_key8_ext_ops;
|
||||||
|
|
||||||
|
/** Extendible bucket hash table operations for key signature computed on
|
||||||
|
lookup ("do-sig") */
|
||||||
|
extern struct rte_table_ops rte_table_hash_key8_ext_dosig_ops;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 16-byte key hash tables
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
/** LRU hash table parameters */
|
||||||
|
struct rte_table_hash_key16_lru_params {
|
||||||
|
/** Maximum number of entries (and keys) in the table */
|
||||||
|
uint32_t n_entries;
|
||||||
|
|
||||||
|
/** Hash function */
|
||||||
|
rte_table_hash_op_hash f_hash;
|
||||||
|
|
||||||
|
/** Seed for the hash function */
|
||||||
|
uint64_t seed;
|
||||||
|
|
||||||
|
/** Byte offset within packet meta-data where the 4-byte key signature
|
||||||
|
is located. Valid for pre-computed key signature tables, ignored for
|
||||||
|
do-sig tables. */
|
||||||
|
uint32_t signature_offset;
|
||||||
|
|
||||||
|
/** Byte offset within packet meta-data where the key is located */
|
||||||
|
uint32_t key_offset;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** LRU hash table operations for pre-computed key signature */
|
||||||
|
extern struct rte_table_ops rte_table_hash_key16_lru_ops;
|
||||||
|
|
||||||
|
/** Extendible bucket hash table parameters */
|
||||||
|
struct rte_table_hash_key16_ext_params {
|
||||||
|
/** Maximum number of entries (and keys) in the table */
|
||||||
|
uint32_t n_entries;
|
||||||
|
|
||||||
|
/** Number of entries (and keys) for hash table bucket extensions. Each
|
||||||
|
bucket is extended in increments of 4 keys. */
|
||||||
|
uint32_t n_entries_ext;
|
||||||
|
|
||||||
|
/** Hash function */
|
||||||
|
rte_table_hash_op_hash f_hash;
|
||||||
|
|
||||||
|
/** Seed for the hash function */
|
||||||
|
uint64_t seed;
|
||||||
|
|
||||||
|
/** Byte offset within packet meta-data where the 4-byte key signature
|
||||||
|
is located. Valid for pre-computed key signature tables, ignored for
|
||||||
|
do-sig tables. */
|
||||||
|
uint32_t signature_offset;
|
||||||
|
|
||||||
|
/** Byte offset within packet meta-data where the key is located */
|
||||||
|
uint32_t key_offset;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Extendible bucket operations for pre-computed key signature */
|
||||||
|
extern struct rte_table_ops rte_table_hash_key16_ext_ops;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 32-byte key hash tables
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
/** LRU hash table parameters */
|
||||||
|
struct rte_table_hash_key32_lru_params {
|
||||||
|
/** Maximum number of entries (and keys) in the table */
|
||||||
|
uint32_t n_entries;
|
||||||
|
|
||||||
|
/** Hash function */
|
||||||
|
rte_table_hash_op_hash f_hash;
|
||||||
|
|
||||||
|
/** Seed for the hash function */
|
||||||
|
uint64_t seed;
|
||||||
|
|
||||||
|
/** Byte offset within packet meta-data where the 4-byte key signature
|
||||||
|
is located. Valid for pre-computed key signature tables, ignored for
|
||||||
|
do-sig tables. */
|
||||||
|
uint32_t signature_offset;
|
||||||
|
|
||||||
|
/** Byte offset within packet meta-data where the key is located */
|
||||||
|
uint32_t key_offset;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** LRU hash table operations for pre-computed key signature */
|
||||||
|
extern struct rte_table_ops rte_table_hash_key32_lru_ops;
|
||||||
|
|
||||||
|
/** Extendible bucket hash table parameters */
|
||||||
|
struct rte_table_hash_key32_ext_params {
|
||||||
|
/** Maximum number of entries (and keys) in the table */
|
||||||
|
uint32_t n_entries;
|
||||||
|
|
||||||
|
/** Number of entries (and keys) for hash table bucket extensions. Each
|
||||||
|
bucket is extended in increments of 4 keys. */
|
||||||
|
uint32_t n_entries_ext;
|
||||||
|
|
||||||
|
/** Hash function */
|
||||||
|
rte_table_hash_op_hash f_hash;
|
||||||
|
|
||||||
|
/** Seed for the hash function */
|
||||||
|
uint64_t seed;
|
||||||
|
|
||||||
|
/** Byte offset within packet meta-data where the 4-byte key signature
|
||||||
|
is located. Valid for pre-computed key signature tables, ignored for
|
||||||
|
do-sig tables. */
|
||||||
|
uint32_t signature_offset;
|
||||||
|
|
||||||
|
/** Byte offset within packet meta-data where the key is located */
|
||||||
|
uint32_t key_offset;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Extendible bucket hash table operations */
|
||||||
|
extern struct rte_table_ops rte_table_hash_key32_ext_ops;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
1122
lib/librte_table/rte_table_hash_ext.c
Normal file
1122
lib/librte_table/rte_table_hash_ext.c
Normal file
File diff suppressed because it is too large
Load Diff
1100
lib/librte_table/rte_table_hash_key16.c
Normal file
1100
lib/librte_table/rte_table_hash_key16.c
Normal file
File diff suppressed because it is too large
Load Diff
1120
lib/librte_table/rte_table_hash_key32.c
Normal file
1120
lib/librte_table/rte_table_hash_key32.c
Normal file
File diff suppressed because it is too large
Load Diff
1398
lib/librte_table/rte_table_hash_key8.c
Normal file
1398
lib/librte_table/rte_table_hash_key8.c
Normal file
File diff suppressed because it is too large
Load Diff
1065
lib/librte_table/rte_table_hash_lru.c
Normal file
1065
lib/librte_table/rte_table_hash_lru.c
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user