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 IPv6] (@ref rte_table_lpm_ipv6.h),
|
||||
[ACL] (@ref rte_table_acl.h),
|
||||
[hash] (@ref rte_table_hash.h),
|
||||
|
||||
- **basic**:
|
||||
[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)
|
||||
SRCS-$(CONFIG_RTE_LIBRTE_TABLE) += rte_table_acl.c
|
||||
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
|
||||
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)
|
||||
SYMLINK-$(CONFIG_RTE_LIBRTE_TABLE)-include += rte_table_acl.h
|
||||
endif
|
||||
SYMLINK-$(CONFIG_RTE_LIBRTE_TABLE)-include += rte_table_hash.h
|
||||
SYMLINK-$(CONFIG_RTE_LIBRTE_TABLE)-include += rte_lru.h
|
||||
|
||||
# this lib depends upon:
|
||||
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)
|
||||
DEPDIRS-$(CONFIG_RTE_LIBRTE_TABLE) += lib/librte_acl
|
||||
endif
|
||||
DEPDIRS-$(CONFIG_RTE_LIBRTE_TABLE) += lib/librte_hash
|
||||
|
||||
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