diff options
Diffstat (limited to 'src/dpdk22/lib/librte_hash')
-rw-r--r-- | src/dpdk22/lib/librte_hash/rte_cmp_arm64.h | 114 | ||||
-rw-r--r-- | src/dpdk22/lib/librte_hash/rte_cmp_x86.h | 109 | ||||
-rw-r--r-- | src/dpdk22/lib/librte_hash/rte_crc_arm64.h | 151 | ||||
-rw-r--r-- | src/dpdk22/lib/librte_hash/rte_cuckoo_hash.c | 1243 | ||||
-rw-r--r-- | src/dpdk22/lib/librte_hash/rte_fbk_hash.h | 396 | ||||
-rw-r--r-- | src/dpdk22/lib/librte_hash/rte_hash.h | 436 | ||||
-rw-r--r-- | src/dpdk22/lib/librte_hash/rte_hash_crc.h | 568 | ||||
-rw-r--r-- | src/dpdk22/lib/librte_hash/rte_jhash.h | 410 | ||||
-rw-r--r-- | src/dpdk22/lib/librte_hash/rte_thash.h | 250 |
9 files changed, 0 insertions, 3677 deletions
diff --git a/src/dpdk22/lib/librte_hash/rte_cmp_arm64.h b/src/dpdk22/lib/librte_hash/rte_cmp_arm64.h deleted file mode 100644 index 6fd937b1..00000000 --- a/src/dpdk22/lib/librte_hash/rte_cmp_arm64.h +++ /dev/null @@ -1,114 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright(c) 2015 Cavium networks. 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 Cavium networks 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. - */ - -/* Functions to compare multiple of 16 byte keys (up to 128 bytes) */ -static int -rte_hash_k16_cmp_eq(const void *key1, const void *key2, - size_t key_len __rte_unused) -{ - uint64_t x0, x1, y0, y1; - - asm volatile( - "ldp %x[x1], %x[x0], [%x[p1]]" - : [x1]"=r"(x1), [x0]"=r"(x0) - : [p1]"r"(key1) - ); - asm volatile( - "ldp %x[y1], %x[y0], [%x[p2]]" - : [y1]"=r"(y1), [y0]"=r"(y0) - : [p2]"r"(key2) - ); - x0 ^= y0; - x1 ^= y1; - return !(x0 == 0 && x1 == 0); -} - -static int -rte_hash_k32_cmp_eq(const void *key1, const void *key2, size_t key_len) -{ - return rte_hash_k16_cmp_eq(key1, key2, key_len) || - rte_hash_k16_cmp_eq((const char *) key1 + 16, - (const char *) key2 + 16, key_len); -} - -static int -rte_hash_k48_cmp_eq(const void *key1, const void *key2, size_t key_len) -{ - return rte_hash_k16_cmp_eq(key1, key2, key_len) || - rte_hash_k16_cmp_eq((const char *) key1 + 16, - (const char *) key2 + 16, key_len) || - rte_hash_k16_cmp_eq((const char *) key1 + 32, - (const char *) key2 + 32, key_len); -} - -static int -rte_hash_k64_cmp_eq(const void *key1, const void *key2, size_t key_len) -{ - return rte_hash_k32_cmp_eq(key1, key2, key_len) || - rte_hash_k32_cmp_eq((const char *) key1 + 32, - (const char *) key2 + 32, key_len); -} - -static int -rte_hash_k80_cmp_eq(const void *key1, const void *key2, size_t key_len) -{ - return rte_hash_k64_cmp_eq(key1, key2, key_len) || - rte_hash_k16_cmp_eq((const char *) key1 + 64, - (const char *) key2 + 64, key_len); -} - -static int -rte_hash_k96_cmp_eq(const void *key1, const void *key2, size_t key_len) -{ - return rte_hash_k64_cmp_eq(key1, key2, key_len) || - rte_hash_k32_cmp_eq((const char *) key1 + 64, - (const char *) key2 + 64, key_len); -} - -static int -rte_hash_k112_cmp_eq(const void *key1, const void *key2, size_t key_len) -{ - return rte_hash_k64_cmp_eq(key1, key2, key_len) || - rte_hash_k32_cmp_eq((const char *) key1 + 64, - (const char *) key2 + 64, key_len) || - rte_hash_k16_cmp_eq((const char *) key1 + 96, - (const char *) key2 + 96, key_len); -} - -static int -rte_hash_k128_cmp_eq(const void *key1, const void *key2, size_t key_len) -{ - return rte_hash_k64_cmp_eq(key1, key2, key_len) || - rte_hash_k64_cmp_eq((const char *) key1 + 64, - (const char *) key2 + 64, key_len); -} diff --git a/src/dpdk22/lib/librte_hash/rte_cmp_x86.h b/src/dpdk22/lib/librte_hash/rte_cmp_x86.h deleted file mode 100644 index 7f79bace..00000000 --- a/src/dpdk22/lib/librte_hash/rte_cmp_x86.h +++ /dev/null @@ -1,109 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright(c) 2015 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. - */ - -/* Functions to compare multiple of 16 byte keys (up to 128 bytes) */ -static int -rte_hash_k16_cmp_eq(const void *key1, const void *key2, size_t key_len __rte_unused) -{ - const __m128i k1 = _mm_loadu_si128((const __m128i *) key1); - const __m128i k2 = _mm_loadu_si128((const __m128i *) key2); -#ifdef RTE_MACHINE_CPUFLAG_SSE4_1 - const __m128i x = _mm_xor_si128(k1, k2); - - return !_mm_test_all_zeros(x, x); -#else - const __m128i x = _mm_cmpeq_epi32(k1, k2); - - return (_mm_movemask_epi8(x) != 0xffff); -#endif -} - -static int -rte_hash_k32_cmp_eq(const void *key1, const void *key2, size_t key_len) -{ - return rte_hash_k16_cmp_eq(key1, key2, key_len) || - rte_hash_k16_cmp_eq((const char *) key1 + 16, - (const char *) key2 + 16, key_len); -} - -static int -rte_hash_k48_cmp_eq(const void *key1, const void *key2, size_t key_len) -{ - return rte_hash_k16_cmp_eq(key1, key2, key_len) || - rte_hash_k16_cmp_eq((const char *) key1 + 16, - (const char *) key2 + 16, key_len) || - rte_hash_k16_cmp_eq((const char *) key1 + 32, - (const char *) key2 + 32, key_len); -} - -static int -rte_hash_k64_cmp_eq(const void *key1, const void *key2, size_t key_len) -{ - return rte_hash_k32_cmp_eq(key1, key2, key_len) || - rte_hash_k32_cmp_eq((const char *) key1 + 32, - (const char *) key2 + 32, key_len); -} - -static int -rte_hash_k80_cmp_eq(const void *key1, const void *key2, size_t key_len) -{ - return rte_hash_k64_cmp_eq(key1, key2, key_len) || - rte_hash_k16_cmp_eq((const char *) key1 + 64, - (const char *) key2 + 64, key_len); -} - -static int -rte_hash_k96_cmp_eq(const void *key1, const void *key2, size_t key_len) -{ - return rte_hash_k64_cmp_eq(key1, key2, key_len) || - rte_hash_k32_cmp_eq((const char *) key1 + 64, - (const char *) key2 + 64, key_len); -} - -static int -rte_hash_k112_cmp_eq(const void *key1, const void *key2, size_t key_len) -{ - return rte_hash_k64_cmp_eq(key1, key2, key_len) || - rte_hash_k32_cmp_eq((const char *) key1 + 64, - (const char *) key2 + 64, key_len) || - rte_hash_k16_cmp_eq((const char *) key1 + 96, - (const char *) key2 + 96, key_len); -} - -static int -rte_hash_k128_cmp_eq(const void *key1, const void *key2, size_t key_len) -{ - return rte_hash_k64_cmp_eq(key1, key2, key_len) || - rte_hash_k64_cmp_eq((const char *) key1 + 64, - (const char *) key2 + 64, key_len); -} diff --git a/src/dpdk22/lib/librte_hash/rte_crc_arm64.h b/src/dpdk22/lib/librte_hash/rte_crc_arm64.h deleted file mode 100644 index 02e26bca..00000000 --- a/src/dpdk22/lib/librte_hash/rte_crc_arm64.h +++ /dev/null @@ -1,151 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright(c) 2015 Cavium networks. 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 Cavium networks 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 _RTE_CRC_ARM64_H_ -#define _RTE_CRC_ARM64_H_ - -/** - * @file - * - * RTE CRC arm64 Hash - */ - -#ifdef __cplusplus -extern "C" { -#endif - -#include <stdint.h> -#include <rte_cpuflags.h> -#include <rte_branch_prediction.h> -#include <rte_common.h> - -static inline uint32_t -crc32c_arm64_u32(uint32_t data, uint32_t init_val) -{ - asm(".arch armv8-a+crc"); - __asm__ volatile( - "crc32cw %w[crc], %w[crc], %w[value]" - : [crc] "+r" (init_val) - : [value] "r" (data)); - return init_val; -} - -static inline uint32_t -crc32c_arm64_u64(uint64_t data, uint32_t init_val) -{ - asm(".arch armv8-a+crc"); - __asm__ volatile( - "crc32cx %w[crc], %w[crc], %x[value]" - : [crc] "+r" (init_val) - : [value] "r" (data)); - return init_val; -} - -/** - * Allow or disallow use of arm64 SIMD instrinsics for CRC32 hash - * calculation. - * - * @param alg - * An OR of following flags: - * - (CRC32_SW) Don't use arm64 crc intrinsics - * - (CRC32_ARM64) Use ARMv8 CRC intrinsic if available - * - */ -static inline void -rte_hash_crc_set_alg(uint8_t alg) -{ - switch (alg) { - case CRC32_ARM64: - if (!rte_cpu_get_flag_enabled(RTE_CPUFLAG_CRC32)) - alg = CRC32_SW; - case CRC32_SW: - crc32_alg = alg; - default: - break; - } -} - -/* Setting the best available algorithm */ -static inline void __attribute__((constructor)) -rte_hash_crc_init_alg(void) -{ - rte_hash_crc_set_alg(CRC32_ARM64); -} - -/** - * Use single crc32 instruction to perform a hash on a 4 byte value. - * Fall back to software crc32 implementation in case arm64 crc intrinsics is - * not supported - * - * @param data - * Data to perform hash on. - * @param init_val - * Value to initialise hash generator. - * @return - * 32bit calculated hash value. - */ -static inline uint32_t -rte_hash_crc_4byte(uint32_t data, uint32_t init_val) -{ - if (likely(crc32_alg & CRC32_ARM64)) - return crc32c_arm64_u32(data, init_val); - - return crc32c_1word(data, init_val); -} - -/** - * Use single crc32 instruction to perform a hash on a 8 byte value. - * Fall back to software crc32 implementation in case arm64 crc intrinsics is - * not supported - * - * @param data - * Data to perform hash on. - * @param init_val - * Value to initialise hash generator. - * @return - * 32bit calculated hash value. - */ -static inline uint32_t -rte_hash_crc_8byte(uint64_t data, uint32_t init_val) -{ - if (likely(crc32_alg == CRC32_ARM64)) - return crc32c_arm64_u64(data, init_val); - - return crc32c_2words(data, init_val); -} - -#ifdef __cplusplus -} -#endif - -#endif /* _RTE_CRC_ARM64_H_ */ diff --git a/src/dpdk22/lib/librte_hash/rte_cuckoo_hash.c b/src/dpdk22/lib/librte_hash/rte_cuckoo_hash.c deleted file mode 100644 index 3e3167c5..00000000 --- a/src/dpdk22/lib/librte_hash/rte_cuckoo_hash.c +++ /dev/null @@ -1,1243 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright(c) 2010-2015 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. - */ - -#include <string.h> -#include <stdint.h> -#include <errno.h> -#include <stdio.h> -#include <stdarg.h> -#include <sys/queue.h> - -#include <rte_common.h> -#include <rte_memory.h> /* for definition of RTE_CACHE_LINE_SIZE */ -#include <rte_log.h> -#include <rte_memcpy.h> -#include <rte_prefetch.h> -#include <rte_branch_prediction.h> -#include <rte_memzone.h> -#include <rte_malloc.h> -#include <rte_eal.h> -#include <rte_eal_memconfig.h> -#include <rte_per_lcore.h> -#include <rte_errno.h> -#include <rte_string_fns.h> -#include <rte_cpuflags.h> -#include <rte_log.h> -#include <rte_rwlock.h> -#include <rte_spinlock.h> -#include <rte_ring.h> -#include <rte_compat.h> - -#include "rte_hash.h" -#if defined(RTE_ARCH_X86_64) || defined(RTE_ARCH_I686) || defined(RTE_ARCH_X86_X32) -#include "rte_cmp_x86.h" -#endif - -#if defined(RTE_ARCH_ARM64) -#include "rte_cmp_arm64.h" -#endif - -TAILQ_HEAD(rte_hash_list, rte_tailq_entry); - -static struct rte_tailq_elem rte_hash_tailq = { - .name = "RTE_HASH", -}; -EAL_REGISTER_TAILQ(rte_hash_tailq) - -/* Macro to enable/disable run-time checking of function parameters */ -#if defined(RTE_LIBRTE_HASH_DEBUG) -#define RETURN_IF_TRUE(cond, retval) do { \ - if (cond) \ - return retval; \ -} while (0) -#else -#define RETURN_IF_TRUE(cond, retval) -#endif - -/* Hash function used if none is specified */ -#if defined(RTE_MACHINE_CPUFLAG_SSE4_2) || defined(RTE_MACHINE_CPUFLAG_CRC32) -#include <rte_hash_crc.h> -#define DEFAULT_HASH_FUNC rte_hash_crc -#else -#include <rte_jhash.h> -#define DEFAULT_HASH_FUNC rte_jhash -#endif - -/** Number of items per bucket. */ -#define RTE_HASH_BUCKET_ENTRIES 4 - -#define NULL_SIGNATURE 0 - -#define KEY_ALIGNMENT 16 - -#define LCORE_CACHE_SIZE 8 - -struct lcore_cache { - unsigned len; /**< Cache len */ - void *objs[LCORE_CACHE_SIZE]; /**< Cache objects */ -} __rte_cache_aligned; - -/** A hash table structure. */ -struct rte_hash { - char name[RTE_HASH_NAMESIZE]; /**< Name of the hash. */ - uint32_t entries; /**< Total table entries. */ - uint32_t num_buckets; /**< Number of buckets in table. */ - uint32_t key_len; /**< Length of hash key. */ - rte_hash_function hash_func; /**< Function used to calculate hash. */ - uint32_t hash_func_init_val; /**< Init value used by hash_func. */ - rte_hash_cmp_eq_t rte_hash_cmp_eq; /**< Function used to compare keys. */ - uint32_t bucket_bitmask; /**< Bitmask for getting bucket index - from hash signature. */ - uint32_t key_entry_size; /**< Size of each key entry. */ - - struct rte_ring *free_slots; /**< Ring that stores all indexes - of the free slots in the key table */ - void *key_store; /**< Table storing all keys and data */ - struct rte_hash_bucket *buckets; /**< Table with buckets storing all the - hash values and key indexes - to the key table*/ - uint8_t hw_trans_mem_support; /**< Hardware transactional - memory support */ - struct lcore_cache *local_free_slots; - /**< Local cache per lcore, storing some indexes of the free slots */ -} __rte_cache_aligned; - -/* Structure storing both primary and secondary hashes */ -struct rte_hash_signatures { - union { - struct { - hash_sig_t current; - hash_sig_t alt; - }; - uint64_t sig; - }; -}; - -/* Structure that stores key-value pair */ -struct rte_hash_key { - union { - uintptr_t idata; - void *pdata; - }; - /* Variable key size */ - char key[0]; -} __attribute__((aligned(KEY_ALIGNMENT))); - -/** Bucket structure */ -struct rte_hash_bucket { - struct rte_hash_signatures signatures[RTE_HASH_BUCKET_ENTRIES]; - /* Includes dummy key index that always contains index 0 */ - uint32_t key_idx[RTE_HASH_BUCKET_ENTRIES + 1]; - uint8_t flag[RTE_HASH_BUCKET_ENTRIES]; -} __rte_cache_aligned; - -struct rte_hash * -rte_hash_find_existing(const char *name) -{ - struct rte_hash *h = NULL; - struct rte_tailq_entry *te; - struct rte_hash_list *hash_list; - - hash_list = RTE_TAILQ_CAST(rte_hash_tailq.head, rte_hash_list); - - rte_rwlock_read_lock(RTE_EAL_TAILQ_RWLOCK); - TAILQ_FOREACH(te, hash_list, next) { - h = (struct rte_hash *) te->data; - if (strncmp(name, h->name, RTE_HASH_NAMESIZE) == 0) - break; - } - rte_rwlock_read_unlock(RTE_EAL_TAILQ_RWLOCK); - - if (te == NULL) { - rte_errno = ENOENT; - return NULL; - } - return h; -} - -void rte_hash_set_cmp_func(struct rte_hash *h, rte_hash_cmp_eq_t func) -{ - h->rte_hash_cmp_eq = func; -} - -struct rte_hash * -rte_hash_create(const struct rte_hash_parameters *params) -{ - struct rte_hash *h = NULL; - struct rte_tailq_entry *te = NULL; - struct rte_hash_list *hash_list; - struct rte_ring *r = NULL; - char hash_name[RTE_HASH_NAMESIZE]; - void *k = NULL; - void *buckets = NULL; - char ring_name[RTE_RING_NAMESIZE]; - unsigned num_key_slots; - unsigned hw_trans_mem_support = 0; - unsigned i; - - hash_list = RTE_TAILQ_CAST(rte_hash_tailq.head, rte_hash_list); - - if (params == NULL) { - RTE_LOG(ERR, HASH, "rte_hash_create has no parameters\n"); - return NULL; - } - - /* Check for valid parameters */ - if ((params->entries > RTE_HASH_ENTRIES_MAX) || - (params->entries < RTE_HASH_BUCKET_ENTRIES) || - !rte_is_power_of_2(RTE_HASH_BUCKET_ENTRIES) || - (params->key_len == 0)) { - rte_errno = EINVAL; - RTE_LOG(ERR, HASH, "rte_hash_create has invalid parameters\n"); - return NULL; - } - - /* Check extra flags field to check extra options. */ - if (params->extra_flag & RTE_HASH_EXTRA_FLAGS_TRANS_MEM_SUPPORT) - hw_trans_mem_support = 1; - - snprintf(hash_name, sizeof(hash_name), "HT_%s", params->name); - - /* Guarantee there's no existing */ - h = rte_hash_find_existing(params->name); - if (h != NULL) - return h; - - te = rte_zmalloc("HASH_TAILQ_ENTRY", sizeof(*te), 0); - if (te == NULL) { - RTE_LOG(ERR, HASH, "tailq entry allocation failed\n"); - goto err; - } - - h = (struct rte_hash *)rte_zmalloc_socket(hash_name, sizeof(struct rte_hash), - RTE_CACHE_LINE_SIZE, params->socket_id); - - if (h == NULL) { - RTE_LOG(ERR, HASH, "memory allocation failed\n"); - goto err; - } - - const uint32_t num_buckets = rte_align32pow2(params->entries) - / RTE_HASH_BUCKET_ENTRIES; - - buckets = rte_zmalloc_socket(NULL, - num_buckets * sizeof(struct rte_hash_bucket), - RTE_CACHE_LINE_SIZE, params->socket_id); - - if (buckets == NULL) { - RTE_LOG(ERR, HASH, "memory allocation failed\n"); - goto err; - } - - const uint32_t key_entry_size = sizeof(struct rte_hash_key) + params->key_len; - - /* Store all keys and leave the first entry as a dummy entry for lookup_bulk */ - if (hw_trans_mem_support) - /* - * Increase number of slots by total number of indices - * that can be stored in the lcore caches - * except for the first cache - */ - num_key_slots = params->entries + (RTE_MAX_LCORE - 1) * - LCORE_CACHE_SIZE + 1; - else - num_key_slots = params->entries + 1; - - const uint64_t key_tbl_size = (uint64_t) key_entry_size * num_key_slots; - - k = rte_zmalloc_socket(NULL, key_tbl_size, - RTE_CACHE_LINE_SIZE, params->socket_id); - - if (k == NULL) { - RTE_LOG(ERR, HASH, "memory allocation failed\n"); - goto err; - } - -/* - * If x86 architecture is used, select appropriate compare function, - * which may use x86 instrinsics, otherwise use memcmp - */ -#if defined(RTE_ARCH_X86_64) || defined(RTE_ARCH_I686) ||\ - defined(RTE_ARCH_X86_X32) || defined(RTE_ARCH_ARM64) - /* Select function to compare keys */ - switch (params->key_len) { - case 16: - h->rte_hash_cmp_eq = rte_hash_k16_cmp_eq; - break; - case 32: - h->rte_hash_cmp_eq = rte_hash_k32_cmp_eq; - break; - case 48: - h->rte_hash_cmp_eq = rte_hash_k48_cmp_eq; - break; - case 64: - h->rte_hash_cmp_eq = rte_hash_k64_cmp_eq; - break; - case 80: - h->rte_hash_cmp_eq = rte_hash_k80_cmp_eq; - break; - case 96: - h->rte_hash_cmp_eq = rte_hash_k96_cmp_eq; - break; - case 112: - h->rte_hash_cmp_eq = rte_hash_k112_cmp_eq; - break; - case 128: - h->rte_hash_cmp_eq = rte_hash_k128_cmp_eq; - break; - default: - /* If key is not multiple of 16, use generic memcmp */ - h->rte_hash_cmp_eq = memcmp; - } -#else - h->rte_hash_cmp_eq = memcmp; -#endif - - snprintf(ring_name, sizeof(ring_name), "HT_%s", params->name); - r = rte_ring_create(ring_name, rte_align32pow2(num_key_slots), - params->socket_id, 0); - if (r == NULL) { - RTE_LOG(ERR, HASH, "memory allocation failed\n"); - goto err; - } - - if (hw_trans_mem_support) { - h->local_free_slots = rte_zmalloc_socket(NULL, - sizeof(struct lcore_cache) * RTE_MAX_LCORE, - RTE_CACHE_LINE_SIZE, params->socket_id); - } - - /* Setup hash context */ - snprintf(h->name, sizeof(h->name), "%s", params->name); - h->entries = params->entries; - h->key_len = params->key_len; - h->key_entry_size = key_entry_size; - h->hash_func_init_val = params->hash_func_init_val; - - h->num_buckets = num_buckets; - h->bucket_bitmask = h->num_buckets - 1; - h->buckets = buckets; - h->hash_func = (params->hash_func == NULL) ? - DEFAULT_HASH_FUNC : params->hash_func; - h->key_store = k; - h->free_slots = r; - h->hw_trans_mem_support = hw_trans_mem_support; - - /* populate the free slots ring. Entry zero is reserved for key misses */ - for (i = 1; i < params->entries + 1; i++) - rte_ring_sp_enqueue(r, (void *)((uintptr_t) i)); - - rte_rwlock_write_lock(RTE_EAL_TAILQ_RWLOCK); - te->data = (void *) h; - TAILQ_INSERT_TAIL(hash_list, te, next); - rte_rwlock_write_unlock(RTE_EAL_TAILQ_RWLOCK); - - return h; -err: - rte_free(te); - rte_free(h); - rte_free(buckets); - rte_free(k); - return NULL; -} - -void -rte_hash_free(struct rte_hash *h) -{ - struct rte_tailq_entry *te; - struct rte_hash_list *hash_list; - - if (h == NULL) - return; - - hash_list = RTE_TAILQ_CAST(rte_hash_tailq.head, rte_hash_list); - - rte_rwlock_write_lock(RTE_EAL_TAILQ_RWLOCK); - - /* find out tailq entry */ - TAILQ_FOREACH(te, hash_list, next) { - if (te->data == (void *) h) - break; - } - - if (te == NULL) { - rte_rwlock_write_unlock(RTE_EAL_TAILQ_RWLOCK); - return; - } - - TAILQ_REMOVE(hash_list, te, next); - - rte_rwlock_write_unlock(RTE_EAL_TAILQ_RWLOCK); - - if (h->hw_trans_mem_support) - rte_free(h->local_free_slots); - - rte_ring_free(h->free_slots); - rte_free(h->key_store); - rte_free(h->buckets); - rte_free(h); - rte_free(te); -} - -hash_sig_t -rte_hash_hash(const struct rte_hash *h, const void *key) -{ - /* calc hash result by key */ - return h->hash_func(key, h->key_len, h->hash_func_init_val); -} - -/* Calc the secondary hash value from the primary hash value of a given key */ -static inline hash_sig_t -rte_hash_secondary_hash(const hash_sig_t primary_hash) -{ - static const unsigned all_bits_shift = 12; - static const unsigned alt_bits_xor = 0x5bd1e995; - - uint32_t tag = primary_hash >> all_bits_shift; - - return (primary_hash ^ ((tag + 1) * alt_bits_xor)); -} - -void -rte_hash_reset(struct rte_hash *h) -{ - void *ptr; - unsigned i; - - if (h == NULL) - return; - - memset(h->buckets, 0, h->num_buckets * sizeof(struct rte_hash_bucket)); - memset(h->key_store, 0, h->key_entry_size * (h->entries + 1)); - - /* clear the free ring */ - while (rte_ring_dequeue(h->free_slots, &ptr) == 0) - rte_pause(); - - /* Repopulate the free slots ring. Entry zero is reserved for key misses */ - for (i = 1; i < h->entries + 1; i++) - rte_ring_sp_enqueue(h->free_slots, (void *)((uintptr_t) i)); - - if (h->hw_trans_mem_support) { - /* Reset local caches per lcore */ - for (i = 0; i < RTE_MAX_LCORE; i++) - h->local_free_slots[i].len = 0; - } -} - -/* Search for an entry that can be pushed to its alternative location */ -static inline int -make_space_bucket(const struct rte_hash *h, struct rte_hash_bucket *bkt) -{ - unsigned i, j; - int ret; - uint32_t next_bucket_idx; - struct rte_hash_bucket *next_bkt[RTE_HASH_BUCKET_ENTRIES]; - - /* - * Push existing item (search for bucket with space in - * alternative locations) to its alternative location - */ - for (i = 0; i < RTE_HASH_BUCKET_ENTRIES; i++) { - /* Search for space in alternative locations */ - next_bucket_idx = bkt->signatures[i].alt & h->bucket_bitmask; - next_bkt[i] = &h->buckets[next_bucket_idx]; - for (j = 0; j < RTE_HASH_BUCKET_ENTRIES; j++) { - if (next_bkt[i]->signatures[j].sig == NULL_SIGNATURE) - break; - } - - if (j != RTE_HASH_BUCKET_ENTRIES) - break; - } - - /* Alternative location has spare room (end of recursive function) */ - if (i != RTE_HASH_BUCKET_ENTRIES) { - next_bkt[i]->signatures[j].alt = bkt->signatures[i].current; - next_bkt[i]->signatures[j].current = bkt->signatures[i].alt; - next_bkt[i]->key_idx[j] = bkt->key_idx[i]; - return i; - } - - /* Pick entry that has not been pushed yet */ - for (i = 0; i < RTE_HASH_BUCKET_ENTRIES; i++) - if (bkt->flag[i] == 0) - break; - - /* All entries have been pushed, so entry cannot be added */ - if (i == RTE_HASH_BUCKET_ENTRIES) - return -ENOSPC; - - /* Set flag to indicate that this entry is going to be pushed */ - bkt->flag[i] = 1; - /* Need room in alternative bucket to insert the pushed entry */ - ret = make_space_bucket(h, next_bkt[i]); - /* - * After recursive function. - * Clear flags and insert the pushed entry - * in its alternative location if successful, - * or return error - */ - bkt->flag[i] = 0; - if (ret >= 0) { - next_bkt[i]->signatures[ret].alt = bkt->signatures[i].current; - next_bkt[i]->signatures[ret].current = bkt->signatures[i].alt; - next_bkt[i]->key_idx[ret] = bkt->key_idx[i]; - return i; - } else - return ret; - -} - -/* - * Function called to enqueue back an index in the cache/ring, - * as slot has not being used and it can be used in the - * next addition attempt. - */ -static inline void -enqueue_slot_back(const struct rte_hash *h, - struct lcore_cache *cached_free_slots, - void *slot_id) -{ - if (h->hw_trans_mem_support) { - cached_free_slots->objs[cached_free_slots->len] = slot_id; - cached_free_slots->len++; - } else - rte_ring_sp_enqueue(h->free_slots, slot_id); -} - -static inline int32_t -__rte_hash_add_key_with_hash(const struct rte_hash *h, const void *key, - hash_sig_t sig, void *data) -{ - hash_sig_t alt_hash; - uint32_t prim_bucket_idx, sec_bucket_idx; - unsigned i; - struct rte_hash_bucket *prim_bkt, *sec_bkt; - struct rte_hash_key *new_k, *k, *keys = h->key_store; - void *slot_id = NULL; - uint32_t new_idx; - int ret; - unsigned n_slots; - unsigned lcore_id; - struct lcore_cache *cached_free_slots = NULL; - - prim_bucket_idx = sig & h->bucket_bitmask; - prim_bkt = &h->buckets[prim_bucket_idx]; - rte_prefetch0(prim_bkt); - - alt_hash = rte_hash_secondary_hash(sig); - sec_bucket_idx = alt_hash & h->bucket_bitmask; - sec_bkt = &h->buckets[sec_bucket_idx]; - rte_prefetch0(sec_bkt); - - /* Get a new slot for storing the new key */ - if (h->hw_trans_mem_support) { - lcore_id = rte_lcore_id(); - cached_free_slots = &h->local_free_slots[lcore_id]; - /* Try to get a free slot from the local cache */ - if (cached_free_slots->len == 0) { - /* Need to get another burst of free slots from global ring */ - n_slots = rte_ring_mc_dequeue_burst(h->free_slots, - cached_free_slots->objs, LCORE_CACHE_SIZE); - if (n_slots == 0) - return -ENOSPC; - - cached_free_slots->len += n_slots; - } - - /* Get a free slot from the local cache */ - cached_free_slots->len--; - slot_id = cached_free_slots->objs[cached_free_slots->len]; - } else { - if (rte_ring_sc_dequeue(h->free_slots, &slot_id) != 0) - return -ENOSPC; - } - - new_k = RTE_PTR_ADD(keys, (uintptr_t)slot_id * h->key_entry_size); - rte_prefetch0(new_k); - new_idx = (uint32_t)((uintptr_t) slot_id); - - /* Check if key is already inserted in primary location */ - for (i = 0; i < RTE_HASH_BUCKET_ENTRIES; i++) { - if (prim_bkt->signatures[i].current == sig && - prim_bkt->signatures[i].alt == alt_hash) { - k = (struct rte_hash_key *) ((char *)keys + - prim_bkt->key_idx[i] * h->key_entry_size); - if (h->rte_hash_cmp_eq(key, k->key, h->key_len) == 0) { - /* Enqueue index of free slot back in the ring. */ - enqueue_slot_back(h, cached_free_slots, slot_id); - /* Update data */ - k->pdata = data; - /* - * Return index where key is stored, - * substracting the first dummy index - */ - return (prim_bkt->key_idx[i] - 1); - } - } - } - - /* Check if key is already inserted in secondary location */ - for (i = 0; i < RTE_HASH_BUCKET_ENTRIES; i++) { - if (sec_bkt->signatures[i].alt == sig && - sec_bkt->signatures[i].current == alt_hash) { - k = (struct rte_hash_key *) ((char *)keys + - sec_bkt->key_idx[i] * h->key_entry_size); - if (h->rte_hash_cmp_eq(key, k->key, h->key_len) == 0) { - /* Enqueue index of free slot back in the ring. */ - enqueue_slot_back(h, cached_free_slots, slot_id); - /* Update data */ - k->pdata = data; - /* - * Return index where key is stored, - * substracting the first dummy index - */ - return (sec_bkt->key_idx[i] - 1); - } - } - } - - /* Copy key */ - rte_memcpy(new_k->key, key, h->key_len); - new_k->pdata = data; - - /* Insert new entry is there is room in the primary bucket */ - for (i = 0; i < RTE_HASH_BUCKET_ENTRIES; i++) { - /* Check if slot is available */ - if (likely(prim_bkt->signatures[i].sig == NULL_SIGNATURE)) { - prim_bkt->signatures[i].current = sig; - prim_bkt->signatures[i].alt = alt_hash; - prim_bkt->key_idx[i] = new_idx; - return new_idx - 1; - } - } - - /* Primary bucket is full, so we need to make space for new entry */ - ret = make_space_bucket(h, prim_bkt); - /* - * After recursive function. - * Insert the new entry in the position of the pushed entry - * if successful or return error and - * store the new slot back in the ring - */ - if (ret >= 0) { - prim_bkt->signatures[ret].current = sig; - prim_bkt->signatures[ret].alt = alt_hash; - prim_bkt->key_idx[ret] = new_idx; - return (new_idx - 1); - } - - /* Error in addition, store new slot back in the ring and return error */ - enqueue_slot_back(h, cached_free_slots, (void *)((uintptr_t) new_idx)); - - return ret; -} - -int32_t -rte_hash_add_key_with_hash(const struct rte_hash *h, - const void *key, hash_sig_t sig) -{ - RETURN_IF_TRUE(((h == NULL) || (key == NULL)), -EINVAL); - return __rte_hash_add_key_with_hash(h, key, sig, 0); -} - -int32_t -rte_hash_add_key(const struct rte_hash *h, const void *key) -{ - RETURN_IF_TRUE(((h == NULL) || (key == NULL)), -EINVAL); - return __rte_hash_add_key_with_hash(h, key, rte_hash_hash(h, key), 0); -} - -int -rte_hash_add_key_with_hash_data(const struct rte_hash *h, - const void *key, hash_sig_t sig, void *data) -{ - int ret; - - RETURN_IF_TRUE(((h == NULL) || (key == NULL)), -EINVAL); - ret = __rte_hash_add_key_with_hash(h, key, sig, data); - if (ret >= 0) - return 0; - else - return ret; -} - -int -rte_hash_add_key_data(const struct rte_hash *h, const void *key, void *data) -{ - int ret; - - RETURN_IF_TRUE(((h == NULL) || (key == NULL)), -EINVAL); - - ret = __rte_hash_add_key_with_hash(h, key, rte_hash_hash(h, key), data); - if (ret >= 0) - return 0; - else - return ret; -} -static inline int32_t -__rte_hash_lookup_with_hash(const struct rte_hash *h, const void *key, - hash_sig_t sig, void **data) -{ - uint32_t bucket_idx; - hash_sig_t alt_hash; - unsigned i; - struct rte_hash_bucket *bkt; - struct rte_hash_key *k, *keys = h->key_store; - - bucket_idx = sig & h->bucket_bitmask; - bkt = &h->buckets[bucket_idx]; - - /* Check if key is in primary location */ - for (i = 0; i < RTE_HASH_BUCKET_ENTRIES; i++) { - if (bkt->signatures[i].current == sig && - bkt->signatures[i].sig != NULL_SIGNATURE) { - k = (struct rte_hash_key *) ((char *)keys + - bkt->key_idx[i] * h->key_entry_size); - if (h->rte_hash_cmp_eq(key, k->key, h->key_len) == 0) { - if (data != NULL) - *data = k->pdata; - /* - * Return index where key is stored, - * substracting the first dummy index - */ - return (bkt->key_idx[i] - 1); - } - } - } - - /* Calculate secondary hash */ - alt_hash = rte_hash_secondary_hash(sig); - bucket_idx = alt_hash & h->bucket_bitmask; - bkt = &h->buckets[bucket_idx]; - - /* Check if key is in secondary location */ - for (i = 0; i < RTE_HASH_BUCKET_ENTRIES; i++) { - if (bkt->signatures[i].current == alt_hash && - bkt->signatures[i].alt == sig) { - k = (struct rte_hash_key *) ((char *)keys + - bkt->key_idx[i] * h->key_entry_size); - if (h->rte_hash_cmp_eq(key, k->key, h->key_len) == 0) { - if (data != NULL) - *data = k->pdata; - /* - * Return index where key is stored, - * substracting the first dummy index - */ - return (bkt->key_idx[i] - 1); - } - } - } - - return -ENOENT; -} - -int32_t -rte_hash_lookup_with_hash(const struct rte_hash *h, - const void *key, hash_sig_t sig) -{ - RETURN_IF_TRUE(((h == NULL) || (key == NULL)), -EINVAL); - return __rte_hash_lookup_with_hash(h, key, sig, NULL); -} - -int32_t -rte_hash_lookup(const struct rte_hash *h, const void *key) -{ - RETURN_IF_TRUE(((h == NULL) || (key == NULL)), -EINVAL); - return __rte_hash_lookup_with_hash(h, key, rte_hash_hash(h, key), NULL); -} - -int -rte_hash_lookup_with_hash_data(const struct rte_hash *h, - const void *key, hash_sig_t sig, void **data) -{ - RETURN_IF_TRUE(((h == NULL) || (key == NULL)), -EINVAL); - return __rte_hash_lookup_with_hash(h, key, sig, data); -} - -int -rte_hash_lookup_data(const struct rte_hash *h, const void *key, void **data) -{ - RETURN_IF_TRUE(((h == NULL) || (key == NULL)), -EINVAL); - return __rte_hash_lookup_with_hash(h, key, rte_hash_hash(h, key), data); -} - -static inline void -remove_entry(const struct rte_hash *h, struct rte_hash_bucket *bkt, unsigned i) -{ - unsigned lcore_id, n_slots; - struct lcore_cache *cached_free_slots; - - bkt->signatures[i].sig = NULL_SIGNATURE; - if (h->hw_trans_mem_support) { - lcore_id = rte_lcore_id(); - cached_free_slots = &h->local_free_slots[lcore_id]; - /* Cache full, need to free it. */ - if (cached_free_slots->len == LCORE_CACHE_SIZE) { - /* Need to enqueue the free slots in global ring. */ - n_slots = rte_ring_mp_enqueue_burst(h->free_slots, - cached_free_slots->objs, - LCORE_CACHE_SIZE); - cached_free_slots->len -= n_slots; - } - /* Put index of new free slot in cache. */ - cached_free_slots->objs[cached_free_slots->len] = - (void *)((uintptr_t)bkt->key_idx[i]); - cached_free_slots->len++; - } else { - rte_ring_sp_enqueue(h->free_slots, - (void *)((uintptr_t)bkt->key_idx[i])); - } -} - -static inline int32_t -__rte_hash_del_key_with_hash(const struct rte_hash *h, const void *key, - hash_sig_t sig) -{ - uint32_t bucket_idx; - hash_sig_t alt_hash; - unsigned i; - struct rte_hash_bucket *bkt; - struct rte_hash_key *k, *keys = h->key_store; - - bucket_idx = sig & h->bucket_bitmask; - bkt = &h->buckets[bucket_idx]; - - /* Check if key is in primary location */ - for (i = 0; i < RTE_HASH_BUCKET_ENTRIES; i++) { - if (bkt->signatures[i].current == sig && - bkt->signatures[i].sig != NULL_SIGNATURE) { - k = (struct rte_hash_key *) ((char *)keys + - bkt->key_idx[i] * h->key_entry_size); - if (h->rte_hash_cmp_eq(key, k->key, h->key_len) == 0) { - remove_entry(h, bkt, i); - - /* - * Return index where key is stored, - * substracting the first dummy index - */ - return (bkt->key_idx[i] - 1); - } - } - } - - /* Calculate secondary hash */ - alt_hash = rte_hash_secondary_hash(sig); - bucket_idx = alt_hash & h->bucket_bitmask; - bkt = &h->buckets[bucket_idx]; - - /* Check if key is in secondary location */ - for (i = 0; i < RTE_HASH_BUCKET_ENTRIES; i++) { - if (bkt->signatures[i].current == alt_hash && - bkt->signatures[i].sig != NULL_SIGNATURE) { - k = (struct rte_hash_key *) ((char *)keys + - bkt->key_idx[i] * h->key_entry_size); - if (h->rte_hash_cmp_eq(key, k->key, h->key_len) == 0) { - remove_entry(h, bkt, i); - - /* - * Return index where key is stored, - * substracting the first dummy index - */ - return (bkt->key_idx[i] - 1); - } - } - } - - return -ENOENT; -} - -int32_t -rte_hash_del_key_with_hash(const struct rte_hash *h, - const void *key, hash_sig_t sig) -{ - RETURN_IF_TRUE(((h == NULL) || (key == NULL)), -EINVAL); - return __rte_hash_del_key_with_hash(h, key, sig); -} - -int32_t -rte_hash_del_key(const struct rte_hash *h, const void *key) -{ - RETURN_IF_TRUE(((h == NULL) || (key == NULL)), -EINVAL); - return __rte_hash_del_key_with_hash(h, key, rte_hash_hash(h, key)); -} - -/* Lookup bulk stage 0: Prefetch input key */ -static inline void -lookup_stage0(unsigned *idx, uint64_t *lookup_mask, - const void * const *keys) -{ - *idx = __builtin_ctzl(*lookup_mask); - if (*lookup_mask == 0) - *idx = 0; - - rte_prefetch0(keys[*idx]); - *lookup_mask &= ~(1llu << *idx); -} - -/* - * Lookup bulk stage 1: Calculate primary/secondary hashes - * and prefetch primary/secondary buckets - */ -static inline void -lookup_stage1(unsigned idx, hash_sig_t *prim_hash, hash_sig_t *sec_hash, - const struct rte_hash_bucket **primary_bkt, - const struct rte_hash_bucket **secondary_bkt, - hash_sig_t *hash_vals, const void * const *keys, - const struct rte_hash *h) -{ - *prim_hash = rte_hash_hash(h, keys[idx]); - hash_vals[idx] = *prim_hash; - *sec_hash = rte_hash_secondary_hash(*prim_hash); - - *primary_bkt = &h->buckets[*prim_hash & h->bucket_bitmask]; - *secondary_bkt = &h->buckets[*sec_hash & h->bucket_bitmask]; - - rte_prefetch0(*primary_bkt); - rte_prefetch0(*secondary_bkt); -} - -/* - * Lookup bulk stage 2: Search for match hashes in primary/secondary locations - * and prefetch first key slot - */ -static inline void -lookup_stage2(unsigned idx, hash_sig_t prim_hash, hash_sig_t sec_hash, - const struct rte_hash_bucket *prim_bkt, - const struct rte_hash_bucket *sec_bkt, - const struct rte_hash_key **key_slot, int32_t *positions, - uint64_t *extra_hits_mask, const void *keys, - const struct rte_hash *h) -{ - unsigned prim_hash_matches, sec_hash_matches, key_idx, i; - unsigned total_hash_matches; - - prim_hash_matches = 1 << RTE_HASH_BUCKET_ENTRIES; - sec_hash_matches = 1 << RTE_HASH_BUCKET_ENTRIES; - for (i = 0; i < RTE_HASH_BUCKET_ENTRIES; i++) { - prim_hash_matches |= ((prim_hash == prim_bkt->signatures[i].current) << i); - sec_hash_matches |= ((sec_hash == sec_bkt->signatures[i].current) << i); - } - - key_idx = prim_bkt->key_idx[__builtin_ctzl(prim_hash_matches)]; - if (key_idx == 0) - key_idx = sec_bkt->key_idx[__builtin_ctzl(sec_hash_matches)]; - - total_hash_matches = (prim_hash_matches | - (sec_hash_matches << (RTE_HASH_BUCKET_ENTRIES + 1))); - *key_slot = (const struct rte_hash_key *) ((const char *)keys + - key_idx * h->key_entry_size); - - rte_prefetch0(*key_slot); - /* - * Return index where key is stored, - * substracting the first dummy index - */ - positions[idx] = (key_idx - 1); - - *extra_hits_mask |= (uint64_t)(__builtin_popcount(total_hash_matches) > 3) << idx; - -} - - -/* Lookup bulk stage 3: Check if key matches, update hit mask and return data */ -static inline void -lookup_stage3(unsigned idx, const struct rte_hash_key *key_slot, const void * const *keys, - const int32_t *positions, void *data[], uint64_t *hits, - const struct rte_hash *h) -{ - unsigned hit; - unsigned key_idx; - - hit = !h->rte_hash_cmp_eq(key_slot->key, keys[idx], h->key_len); - if (data != NULL) - data[idx] = key_slot->pdata; - - key_idx = positions[idx] + 1; - /* - * If key index is 0, force hit to be 0, in case key to be looked up - * is all zero (as in the dummy slot), which would result in a wrong hit - */ - *hits |= (uint64_t)(hit && !!key_idx) << idx; -} - -static inline void -__rte_hash_lookup_bulk(const struct rte_hash *h, const void **keys, - uint32_t num_keys, int32_t *positions, - uint64_t *hit_mask, void *data[]) -{ - uint64_t hits = 0; - uint64_t extra_hits_mask = 0; - uint64_t lookup_mask, miss_mask; - unsigned idx; - const void *key_store = h->key_store; - int ret; - hash_sig_t hash_vals[RTE_HASH_LOOKUP_BULK_MAX]; - - unsigned idx00, idx01, idx10, idx11, idx20, idx21, idx30, idx31; - const struct rte_hash_bucket *primary_bkt10, *primary_bkt11; - const struct rte_hash_bucket *secondary_bkt10, *secondary_bkt11; - const struct rte_hash_bucket *primary_bkt20, *primary_bkt21; - const struct rte_hash_bucket *secondary_bkt20, *secondary_bkt21; - const struct rte_hash_key *k_slot20, *k_slot21, *k_slot30, *k_slot31; - hash_sig_t primary_hash10, primary_hash11; - hash_sig_t secondary_hash10, secondary_hash11; - hash_sig_t primary_hash20, primary_hash21; - hash_sig_t secondary_hash20, secondary_hash21; - - lookup_mask = (uint64_t) -1 >> (64 - num_keys); - miss_mask = lookup_mask; - - lookup_stage0(&idx00, &lookup_mask, keys); - lookup_stage0(&idx01, &lookup_mask, keys); - - idx10 = idx00, idx11 = idx01; - - lookup_stage0(&idx00, &lookup_mask, keys); - lookup_stage0(&idx01, &lookup_mask, keys); - lookup_stage1(idx10, &primary_hash10, &secondary_hash10, - &primary_bkt10, &secondary_bkt10, hash_vals, keys, h); - lookup_stage1(idx11, &primary_hash11, &secondary_hash11, - &primary_bkt11, &secondary_bkt11, hash_vals, keys, h); - - primary_bkt20 = primary_bkt10; - primary_bkt21 = primary_bkt11; - secondary_bkt20 = secondary_bkt10; - secondary_bkt21 = secondary_bkt11; - primary_hash20 = primary_hash10; - primary_hash21 = primary_hash11; - secondary_hash20 = secondary_hash10; - secondary_hash21 = secondary_hash11; - idx20 = idx10, idx21 = idx11; - idx10 = idx00, idx11 = idx01; - - lookup_stage0(&idx00, &lookup_mask, keys); - lookup_stage0(&idx01, &lookup_mask, keys); - lookup_stage1(idx10, &primary_hash10, &secondary_hash10, - &primary_bkt10, &secondary_bkt10, hash_vals, keys, h); - lookup_stage1(idx11, &primary_hash11, &secondary_hash11, - &primary_bkt11, &secondary_bkt11, hash_vals, keys, h); - lookup_stage2(idx20, primary_hash20, secondary_hash20, primary_bkt20, - secondary_bkt20, &k_slot20, positions, &extra_hits_mask, - key_store, h); - lookup_stage2(idx21, primary_hash21, secondary_hash21, primary_bkt21, - secondary_bkt21, &k_slot21, positions, &extra_hits_mask, - key_store, h); - - while (lookup_mask) { - k_slot30 = k_slot20, k_slot31 = k_slot21; - idx30 = idx20, idx31 = idx21; - primary_bkt20 = primary_bkt10; - primary_bkt21 = primary_bkt11; - secondary_bkt20 = secondary_bkt10; - secondary_bkt21 = secondary_bkt11; - primary_hash20 = primary_hash10; - primary_hash21 = primary_hash11; - secondary_hash20 = secondary_hash10; - secondary_hash21 = secondary_hash11; - idx20 = idx10, idx21 = idx11; - idx10 = idx00, idx11 = idx01; - - lookup_stage0(&idx00, &lookup_mask, keys); - lookup_stage0(&idx01, &lookup_mask, keys); - lookup_stage1(idx10, &primary_hash10, &secondary_hash10, - &primary_bkt10, &secondary_bkt10, hash_vals, keys, h); - lookup_stage1(idx11, &primary_hash11, &secondary_hash11, - &primary_bkt11, &secondary_bkt11, hash_vals, keys, h); - lookup_stage2(idx20, primary_hash20, secondary_hash20, - primary_bkt20, secondary_bkt20, &k_slot20, positions, - &extra_hits_mask, key_store, h); - lookup_stage2(idx21, primary_hash21, secondary_hash21, - primary_bkt21, secondary_bkt21, &k_slot21, positions, - &extra_hits_mask, key_store, h); - lookup_stage3(idx30, k_slot30, keys, positions, data, &hits, h); - lookup_stage3(idx31, k_slot31, keys, positions, data, &hits, h); - } - - k_slot30 = k_slot20, k_slot31 = k_slot21; - idx30 = idx20, idx31 = idx21; - primary_bkt20 = primary_bkt10; - primary_bkt21 = primary_bkt11; - secondary_bkt20 = secondary_bkt10; - secondary_bkt21 = secondary_bkt11; - primary_hash20 = primary_hash10; - primary_hash21 = primary_hash11; - secondary_hash20 = secondary_hash10; - secondary_hash21 = secondary_hash11; - idx20 = idx10, idx21 = idx11; - idx10 = idx00, idx11 = idx01; - - lookup_stage1(idx10, &primary_hash10, &secondary_hash10, - &primary_bkt10, &secondary_bkt10, hash_vals, keys, h); - lookup_stage1(idx11, &primary_hash11, &secondary_hash11, - &primary_bkt11, &secondary_bkt11, hash_vals, keys, h); - lookup_stage2(idx20, primary_hash20, secondary_hash20, primary_bkt20, - secondary_bkt20, &k_slot20, positions, &extra_hits_mask, - key_store, h); - lookup_stage2(idx21, primary_hash21, secondary_hash21, primary_bkt21, - secondary_bkt21, &k_slot21, positions, &extra_hits_mask, - key_store, h); - lookup_stage3(idx30, k_slot30, keys, positions, data, &hits, h); - lookup_stage3(idx31, k_slot31, keys, positions, data, &hits, h); - - k_slot30 = k_slot20, k_slot31 = k_slot21; - idx30 = idx20, idx31 = idx21; - primary_bkt20 = primary_bkt10; - primary_bkt21 = primary_bkt11; - secondary_bkt20 = secondary_bkt10; - secondary_bkt21 = secondary_bkt11; - primary_hash20 = primary_hash10; - primary_hash21 = primary_hash11; - secondary_hash20 = secondary_hash10; - secondary_hash21 = secondary_hash11; - idx20 = idx10, idx21 = idx11; - - lookup_stage2(idx20, primary_hash20, secondary_hash20, primary_bkt20, - secondary_bkt20, &k_slot20, positions, &extra_hits_mask, - key_store, h); - lookup_stage2(idx21, primary_hash21, secondary_hash21, primary_bkt21, - secondary_bkt21, &k_slot21, positions, &extra_hits_mask, - key_store, h); - lookup_stage3(idx30, k_slot30, keys, positions, data, &hits, h); - lookup_stage3(idx31, k_slot31, keys, positions, data, &hits, h); - - k_slot30 = k_slot20, k_slot31 = k_slot21; - idx30 = idx20, idx31 = idx21; - - lookup_stage3(idx30, k_slot30, keys, positions, data, &hits, h); - lookup_stage3(idx31, k_slot31, keys, positions, data, &hits, h); - - /* ignore any items we have already found */ - extra_hits_mask &= ~hits; - - if (unlikely(extra_hits_mask)) { - /* run a single search for each remaining item */ - do { - idx = __builtin_ctzl(extra_hits_mask); - if (data != NULL) { - ret = rte_hash_lookup_with_hash_data(h, - keys[idx], hash_vals[idx], &data[idx]); - if (ret >= 0) - hits |= 1ULL << idx; - } else { - positions[idx] = rte_hash_lookup_with_hash(h, - keys[idx], hash_vals[idx]); - if (positions[idx] >= 0) - hits |= 1llu << idx; - } - extra_hits_mask &= ~(1llu << idx); - } while (extra_hits_mask); - } - - miss_mask &= ~hits; - if (unlikely(miss_mask)) { - do { - idx = __builtin_ctzl(miss_mask); - positions[idx] = -ENOENT; - miss_mask &= ~(1llu << idx); - } while (miss_mask); - } - - if (hit_mask != NULL) - *hit_mask = hits; -} - -int -rte_hash_lookup_bulk(const struct rte_hash *h, const void **keys, - uint32_t num_keys, int32_t *positions) -{ - RETURN_IF_TRUE(((h == NULL) || (keys == NULL) || (num_keys == 0) || - (num_keys > RTE_HASH_LOOKUP_BULK_MAX) || - (positions == NULL)), -EINVAL); - - __rte_hash_lookup_bulk(h, keys, num_keys, positions, NULL, NULL); - return 0; -} - -int -rte_hash_lookup_bulk_data(const struct rte_hash *h, const void **keys, - uint32_t num_keys, uint64_t *hit_mask, void *data[]) -{ - RETURN_IF_TRUE(((h == NULL) || (keys == NULL) || (num_keys == 0) || - (num_keys > RTE_HASH_LOOKUP_BULK_MAX) || - (hit_mask == NULL)), -EINVAL); - - int32_t positions[num_keys]; - - __rte_hash_lookup_bulk(h, keys, num_keys, positions, hit_mask, data); - - /* Return number of hits */ - return __builtin_popcountl(*hit_mask); -} - -int32_t -rte_hash_iterate(const struct rte_hash *h, const void **key, void **data, uint32_t *next) -{ - uint32_t bucket_idx, idx, position; - struct rte_hash_key *next_key; - - RETURN_IF_TRUE(((h == NULL) || (next == NULL)), -EINVAL); - - const uint32_t total_entries = h->num_buckets * RTE_HASH_BUCKET_ENTRIES; - /* Out of bounds */ - if (*next >= total_entries) - return -ENOENT; - - /* Calculate bucket and index of current iterator */ - bucket_idx = *next / RTE_HASH_BUCKET_ENTRIES; - idx = *next % RTE_HASH_BUCKET_ENTRIES; - - /* If current position is empty, go to the next one */ - while (h->buckets[bucket_idx].signatures[idx].sig == NULL_SIGNATURE) { - (*next)++; - /* End of table */ - if (*next == total_entries) - return -ENOENT; - bucket_idx = *next / RTE_HASH_BUCKET_ENTRIES; - idx = *next % RTE_HASH_BUCKET_ENTRIES; - } - - /* Get position of entry in key table */ - position = h->buckets[bucket_idx].key_idx[idx]; - next_key = (struct rte_hash_key *) ((char *)h->key_store + - position * h->key_entry_size); - /* Return key and data */ - *key = next_key->key; - *data = next_key->pdata; - - /* Increment iterator */ - (*next)++; - - return (position - 1); -} diff --git a/src/dpdk22/lib/librte_hash/rte_fbk_hash.h b/src/dpdk22/lib/librte_hash/rte_fbk_hash.h deleted file mode 100644 index a430961d..00000000 --- a/src/dpdk22/lib/librte_hash/rte_fbk_hash.h +++ /dev/null @@ -1,396 +0,0 @@ -/*- - * 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 _RTE_FBK_HASH_H_ -#define _RTE_FBK_HASH_H_ - -/** - * @file - * - * This is a hash table implementation for four byte keys (fbk). - * - * Note that the return value of the add function should always be checked as, - * if a bucket is full, the key is not added even if there is space in other - * buckets. This keeps the lookup function very simple and therefore fast. - */ - -#include <stdint.h> -#include <errno.h> -#include <sys/queue.h> - -#ifdef __cplusplus -extern "C" { -#endif - -#include <string.h> - -#ifndef RTE_FBK_HASH_FUNC_DEFAULT -#if defined(RTE_MACHINE_CPUFLAG_SSE4_2) || defined(RTE_MACHINE_CPUFLAG_CRC32) -#include <rte_hash_crc.h> -/** Default four-byte key hash function if none is specified. */ -#define RTE_FBK_HASH_FUNC_DEFAULT rte_hash_crc_4byte -#else -#include <rte_jhash.h> -#define RTE_FBK_HASH_FUNC_DEFAULT rte_jhash_1word -#endif -#endif - -#ifndef RTE_FBK_HASH_INIT_VAL_DEFAULT -/** Initialising value used when calculating hash. */ -#define RTE_FBK_HASH_INIT_VAL_DEFAULT 0xFFFFFFFF -#endif - -/** The maximum number of entries in the hash table that is supported. */ -#define RTE_FBK_HASH_ENTRIES_MAX (1 << 20) - -/** The maximum number of entries in each bucket that is supported. */ -#define RTE_FBK_HASH_ENTRIES_PER_BUCKET_MAX 256 - -/** Maximum size of string for naming the hash. */ -#define RTE_FBK_HASH_NAMESIZE 32 - -/** Type of function that can be used for calculating the hash value. */ -typedef uint32_t (*rte_fbk_hash_fn)(uint32_t key, uint32_t init_val); - -/** Parameters used when creating four-byte key hash table. */ -struct rte_fbk_hash_params { - const char *name; /**< Name of the hash table. */ - uint32_t entries; /**< Total number of entries. */ - uint32_t entries_per_bucket; /**< Number of entries in a bucket. */ - int socket_id; /**< Socket to allocate memory on. */ - rte_fbk_hash_fn hash_func; /**< The hash function. */ - uint32_t init_val; /**< For initialising hash function. */ -}; - -/** Individual entry in the four-byte key hash table. */ -union rte_fbk_hash_entry { - uint64_t whole_entry; /**< For accessing entire entry. */ - struct { - uint16_t is_entry; /**< Non-zero if entry is active. */ - uint16_t value; /**< Value returned by lookup. */ - uint32_t key; /**< Key used to find value. */ - } entry; /**< For accessing each entry part. */ -}; - - -/** The four-byte key hash table structure. */ -struct rte_fbk_hash_table { - char name[RTE_FBK_HASH_NAMESIZE]; /**< Name of the hash. */ - uint32_t entries; /**< Total number of entries. */ - uint32_t entries_per_bucket; /**< Number of entries in a bucket. */ - uint32_t used_entries; /**< How many entries are used. */ - uint32_t bucket_mask; /**< To find which bucket the key is in. */ - uint32_t bucket_shift; /**< Convert bucket to table offset. */ - rte_fbk_hash_fn hash_func; /**< The hash function. */ - uint32_t init_val; /**< For initialising hash function. */ - - /** A flat table of all buckets. */ - union rte_fbk_hash_entry t[0]; -}; - -/** - * Find the offset into hash table of the bucket containing a particular key. - * - * @param ht - * Pointer to hash table. - * @param key - * Key to calculate bucket for. - * @return - * Offset into hash table. - */ -static inline uint32_t -rte_fbk_hash_get_bucket(const struct rte_fbk_hash_table *ht, uint32_t key) -{ - return (ht->hash_func(key, ht->init_val) & ht->bucket_mask) << - ht->bucket_shift; -} - -/** - * Add a key to an existing hash table with bucket id. - * This operation is not multi-thread safe - * and should only be called from one thread. - * - * @param ht - * Hash table to add the key to. - * @param key - * Key to add to the hash table. - * @param value - * Value to associate with key. - * @param bucket - * Bucket to associate with key. - * @return - * 0 if ok, or negative value on error. - */ -static inline int -rte_fbk_hash_add_key_with_bucket(struct rte_fbk_hash_table *ht, - uint32_t key, uint16_t value, uint32_t bucket) -{ - /* - * The writing of a new value to the hash table is done as a single - * 64bit operation. This should help prevent individual entries being - * corrupted due to race conditions, but it's still possible to - * overwrite entries that have just been made valid. - */ - const uint64_t new_entry = ((uint64_t)(key) << 32) | - ((uint64_t)(value) << 16) | - 1; /* 1 = is_entry bit. */ - uint32_t i; - - for (i = 0; i < ht->entries_per_bucket; i++) { - /* Set entry if unused. */ - if (! ht->t[bucket + i].entry.is_entry) { - ht->t[bucket + i].whole_entry = new_entry; - ht->used_entries++; - return 0; - } - /* Change value if key already exists. */ - if (ht->t[bucket + i].entry.key == key) { - ht->t[bucket + i].entry.value = value; - return 0; - } - } - - return -ENOSPC; /* No space in bucket. */ -} - -/** - * Add a key to an existing hash table. This operation is not multi-thread safe - * and should only be called from one thread. - * - * @param ht - * Hash table to add the key to. - * @param key - * Key to add to the hash table. - * @param value - * Value to associate with key. - * @return - * 0 if ok, or negative value on error. - */ -static inline int -rte_fbk_hash_add_key(struct rte_fbk_hash_table *ht, - uint32_t key, uint16_t value) -{ - return rte_fbk_hash_add_key_with_bucket(ht, - key, value, rte_fbk_hash_get_bucket(ht, key)); -} - -/** - * Remove a key with a given bucket id from an existing hash table. - * This operation is not multi-thread - * safe and should only be called from one thread. - * - * @param ht - * Hash table to remove the key from. - * @param key - * Key to remove from the hash table. - * @param bucket - * Bucket id associate with key. - * @return - * 0 if ok, or negative value on error. - */ -static inline int -rte_fbk_hash_delete_key_with_bucket(struct rte_fbk_hash_table *ht, - uint32_t key, uint32_t bucket) -{ - uint32_t last_entry = ht->entries_per_bucket - 1; - uint32_t i, j; - - for (i = 0; i < ht->entries_per_bucket; i++) { - if (ht->t[bucket + i].entry.key == key) { - /* Find last key in bucket. */ - for (j = ht->entries_per_bucket - 1; j > i; j-- ) { - if (! ht->t[bucket + j].entry.is_entry) { - last_entry = j - 1; - } - } - /* - * Move the last key to the deleted key's position, and - * delete the last key. lastEntry and i may be same but - * it doesn't matter. - */ - ht->t[bucket + i].whole_entry = - ht->t[bucket + last_entry].whole_entry; - ht->t[bucket + last_entry].whole_entry = 0; - - ht->used_entries--; - return 0; - } - } - - return -ENOENT; /* Key didn't exist. */ -} - -/** - * Remove a key from an existing hash table. This operation is not multi-thread - * safe and should only be called from one thread. - * - * @param ht - * Hash table to remove the key from. - * @param key - * Key to remove from the hash table. - * @return - * 0 if ok, or negative value on error. - */ -static inline int -rte_fbk_hash_delete_key(struct rte_fbk_hash_table *ht, uint32_t key) -{ - return rte_fbk_hash_delete_key_with_bucket(ht, - key, rte_fbk_hash_get_bucket(ht, key)); -} - -/** - * Find a key in the hash table with a given bucketid. - * This operation is multi-thread safe. - * - * @param ht - * Hash table to look in. - * @param key - * Key to find. - * @param bucket - * Bucket associate to the key. - * @return - * The value that was associated with the key, or negative value on error. - */ -static inline int -rte_fbk_hash_lookup_with_bucket(const struct rte_fbk_hash_table *ht, - uint32_t key, uint32_t bucket) -{ - union rte_fbk_hash_entry current_entry; - uint32_t i; - - for (i = 0; i < ht->entries_per_bucket; i++) { - /* Single read of entry, which should be atomic. */ - current_entry.whole_entry = ht->t[bucket + i].whole_entry; - if (! current_entry.entry.is_entry) { - return -ENOENT; /* Error once we hit an empty field. */ - } - if (current_entry.entry.key == key) { - return current_entry.entry.value; - } - } - return -ENOENT; /* Key didn't exist. */ -} - -/** - * Find a key in the hash table. This operation is multi-thread safe. - * - * @param ht - * Hash table to look in. - * @param key - * Key to find. - * @return - * The value that was associated with the key, or negative value on error. - */ -static inline int -rte_fbk_hash_lookup(const struct rte_fbk_hash_table *ht, uint32_t key) -{ - return rte_fbk_hash_lookup_with_bucket(ht, - key, rte_fbk_hash_get_bucket(ht, key)); -} - -/** - * Delete all entries in a hash table. This operation is not multi-thread - * safe and should only be called from one thread. - * - * @param ht - * Hash table to delete entries in. - */ -static inline void -rte_fbk_hash_clear_all(struct rte_fbk_hash_table *ht) -{ - memset(ht->t, 0, sizeof(ht->t[0]) * ht->entries); - ht->used_entries = 0; -} - -/** - * Find what fraction of entries are being used. - * - * @param ht - * Hash table to find how many entries are being used in. - * @return - * Load factor of the hash table, or negative value on error. - */ -static inline double -rte_fbk_hash_get_load_factor(struct rte_fbk_hash_table *ht) -{ - return (double)ht->used_entries / (double)ht->entries; -} - -/** - * Performs a lookup for an existing hash table, and returns a pointer to - * the table if found. - * - * @param name - * Name of the hash table to find - * - * @return - * pointer to hash table structure or NULL on error with rte_errno - * set appropriately. Possible rte_errno values include: - * - ENOENT - required entry not available to return. - */ -struct rte_fbk_hash_table *rte_fbk_hash_find_existing(const char *name); - -/** - * Create a new hash table for use with four byte keys. - * - * @param params - * Parameters used in creation of hash table. - * - * @return - * Pointer to hash table structure that is used in future hash table - * operations, or NULL on error with rte_errno set appropriately. - * Possible rte_errno error values 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 - * - EINVAL - invalid parameter value 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 - */ -struct rte_fbk_hash_table * \ -rte_fbk_hash_create(const struct rte_fbk_hash_params *params); - -/** - * Free all memory used by a hash table. - * Has no effect on hash tables allocated in memory zones - * - * @param ht - * Hash table to deallocate. - */ -void rte_fbk_hash_free(struct rte_fbk_hash_table *ht); - -#ifdef __cplusplus -} -#endif - -#endif /* _RTE_FBK_HASH_H_ */ diff --git a/src/dpdk22/lib/librte_hash/rte_hash.h b/src/dpdk22/lib/librte_hash/rte_hash.h deleted file mode 100644 index 85fc4162..00000000 --- a/src/dpdk22/lib/librte_hash/rte_hash.h +++ /dev/null @@ -1,436 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright(c) 2010-2015 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 _RTE_HASH_H_ -#define _RTE_HASH_H_ - -/** - * @file - * - * RTE Hash Table - */ - -#include <stdint.h> -#include <stddef.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/** Maximum size of hash table that can be created. */ -#define RTE_HASH_ENTRIES_MAX (1 << 30) - -/** Maximum number of characters in hash name.*/ -#define RTE_HASH_NAMESIZE 32 - -/** Maximum number of keys that can be searched for using rte_hash_lookup_bulk. */ -#define RTE_HASH_LOOKUP_BULK_MAX 64 -#define RTE_HASH_LOOKUP_MULTI_MAX RTE_HASH_LOOKUP_BULK_MAX - -/** Enable Hardware transactional memory support. */ -#define RTE_HASH_EXTRA_FLAGS_TRANS_MEM_SUPPORT 0x01 - -/** Signature of key that is stored internally. */ -typedef uint32_t hash_sig_t; - -/** Type of function that can be used for calculating the hash value. */ -typedef uint32_t (*rte_hash_function)(const void *key, uint32_t key_len, - uint32_t init_val); - -/** Type of function used to compare the hash key. */ -typedef int (*rte_hash_cmp_eq_t)(const void *key1, const void *key2, size_t key_len); - -/** - * Parameters used when creating the hash table. - */ -struct rte_hash_parameters { - const char *name; /**< Name of the hash. */ - uint32_t entries; /**< Total hash table entries. */ - uint32_t reserved; /**< Unused field. Should be set to 0 */ - uint32_t key_len; /**< Length of hash key. */ - rte_hash_function hash_func; /**< Primary Hash function used to calculate hash. */ - uint32_t hash_func_init_val; /**< Init value used by hash_func. */ - int socket_id; /**< NUMA Socket ID for memory. */ - uint8_t extra_flag; /**< Indicate if additional parameters are present. */ -}; - -/** @internal A hash table structure. */ -struct rte_hash; - -/** - * Create a new hash table. - * - * @param params - * Parameters used to create and initialise the hash table. - * @return - * 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 - */ -struct rte_hash * -rte_hash_create(const struct rte_hash_parameters *params); - -/** - * 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. - * - * @param h - * Hash table to reset - * @param func - * New compare function - */ -void rte_hash_set_cmp_func(struct rte_hash *h, rte_hash_cmp_eq_t func); - -/** - * Find an existing hash table object and return a pointer to it. - * - * @param name - * Name of the hash table as passed to rte_hash_create() - * @return - * 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 - */ -struct rte_hash * -rte_hash_find_existing(const char *name); - -/** - * De-allocate all memory used by hash table. - * @param h - * Hash table to free - */ -void -rte_hash_free(struct rte_hash *h); - -/** - * Reset all hash structure, by zeroing all entries - * @param h - * Hash table to reset - */ -void -rte_hash_reset(struct rte_hash *h); - -/** - * 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. - * - * @param h - * Hash table to add the key to. - * @param key - * Key to add to the hash table. - * @param data - * Data to add to the hash table. - * @return - * - 0 if added successfully - * - -EINVAL if the parameters are invalid. - * - -ENOSPC if there is no space in the hash for this key. - */ -int -rte_hash_add_key_data(const struct rte_hash *h, const void *key, 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. - * - * @param h - * Hash table to add the key to. - * @param key - * Key to add to the hash table. - * @param sig - * Precomputed hash value for 'key' - * @param data - * Data to add to the hash table. - * @return - * - 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 to an existing hash table. This operation is not multi-thread safe - * and should only be called from one thread. - * - * @param h - * Hash table to add the key to. - * @param key - * Key to add to the hash table. - * @return - * - -EINVAL if the parameters are invalid. - * - -ENOSPC if there is no space in the hash for this key. - * - A positive value that can be used by the caller as an offset into an - * array of user data. This value is unique 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. - * - * @param h - * Hash table to add the key to. - * @param key - * Key to add to the hash table. - * @param sig - * Precomputed hash value for 'key'. - * @return - * - -EINVAL if the parameters are invalid. - * - -ENOSPC if there is no space in the hash for this key. - * - A positive value that can be used by the caller as an offset into an - * array of user data. This value is unique for this key. - */ -int32_t -rte_hash_add_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. - * - * @param h - * Hash table to remove the key from. - * @param key - * Key to remove from the hash table. - * @return - * - -EINVAL if the parameters are invalid. - * - -ENOENT if the key is not found. - * - A positive 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(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. - * - * @param h - * Hash table to remove the key from. - * @param key - * Key to remove from the hash table. - * @param sig - * Precomputed hash value for 'key'. - * @return - * - -EINVAL if the parameters are invalid. - * - -ENOENT if the key is not found. - * - A positive 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); - - -/** - * Find a key-value pair in the hash table. - * This operation is multi-thread safe. - * - * @param h - * Hash table to look in. - * @param key - * Key to find. - * @param data - * Output with pointer to data returned from the hash table. - * @return - * 0 if successful lookup - * - EINVAL if the parameters are invalid. - * - ENOENT if the key is not found. - */ -int -rte_hash_lookup_data(const struct rte_hash *h, const void *key, void **data); - -/** - * Find a key-value pair with a pre-computed hash value - * to an existing hash table. - * This operation is multi-thread safe. - * - * @param h - * Hash table to look in. - * @param key - * Key to find. - * @param sig - * Precomputed hash value for 'key' - * @param data - * Output with pointer to data returned from the hash table. - * @return - * 0 if successful lookup - * - 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 in the hash table. - * This operation is multi-thread safe. - * - * @param h - * Hash table to look in. - * @param key - * Key to find. - * @return - * - -EINVAL if the parameters are invalid. - * - -ENOENT if the key is not found. - * - A positive 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(const struct rte_hash *h, const void *key); - -/** - * Find a key in the hash table. - * This operation is multi-thread safe. - * - * @param h - * Hash table to look in. - * @param key - * Key to find. - * @param sig - * Hash value to remove from the hash table. - * @return - * - -EINVAL if the parameters are invalid. - * - -ENOENT if the key is not found. - * - A positive 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); - -/** - * Calc a hash value by key. - * This operation is not multi-thread safe. - * - * @param h - * Hash table to look in. - * @param key - * Key to find. - * @return - * - hash value - */ -hash_sig_t -rte_hash_hash(const struct rte_hash *h, const void *key); - -#define rte_hash_lookup_multi rte_hash_lookup_bulk -#define rte_hash_lookup_multi_data rte_hash_lookup_bulk_data -/** - * Find multiple keys in the hash table. - * This operation is multi-thread safe. - * - * @param h - * Hash table to look in. - * @param keys - * A pointer to a list of keys to look for. - * @param num_keys - * How many keys are in the keys list (less than RTE_HASH_LOOKUP_BULK_MAX). - * @param hit_mask - * Output containing a bitmask with all successful lookups. - * @param data - * Output containing array of data returned from all the successful lookups. - * @return - * -EINVAL if there's an error, otherwise number of successful lookups. - */ -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. - * - * @param h - * Hash table to look in. - * @param keys - * A pointer to a list of keys to look for. - * @param num_keys - * How many keys are in the keys list (less than RTE_HASH_LOOKUP_BULK_MAX). - * @param 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. - * @return - * -EINVAL if there's an error, otherwise 0. - */ -int -rte_hash_lookup_bulk(const struct rte_hash *h, const void **keys, - uint32_t num_keys, int32_t *positions); - -/** - * Iterate through the hash table, returning key-value pairs. - * - * @param h - * Hash table to iterate - * @param key - * Output containing the key where current iterator - * was pointing at - * @param data - * Output containing the data associated with key. - * Returns NULL if data was not stored. - * @param next - * Pointer to iterator. Should be 0 to start iterating the hash table. - * Iterator is incremented after each call of this function. - * @return - * Position where key was stored, if successful. - * - -EINVAL if the parameters are invalid. - * - -ENOENT if end of the hash table. - */ -int32_t -rte_hash_iterate(const struct rte_hash *h, const void **key, void **data, uint32_t *next); -#ifdef __cplusplus -} -#endif - -#endif /* _RTE_HASH_H_ */ diff --git a/src/dpdk22/lib/librte_hash/rte_hash_crc.h b/src/dpdk22/lib/librte_hash/rte_hash_crc.h deleted file mode 100644 index 78a34b76..00000000 --- a/src/dpdk22/lib/librte_hash/rte_hash_crc.h +++ /dev/null @@ -1,568 +0,0 @@ -/*- - * 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 _RTE_HASH_CRC_H_ -#define _RTE_HASH_CRC_H_ - -/** - * @file - * - * RTE CRC Hash - */ - -#ifdef __cplusplus -extern "C" { -#endif - -#include <stdint.h> -#include <rte_cpuflags.h> -#include <rte_branch_prediction.h> -#include <rte_common.h> - -/* Lookup tables for software implementation of CRC32C */ -static const uint32_t crc32c_tables[8][256] = {{ - 0x00000000, 0xF26B8303, 0xE13B70F7, 0x1350F3F4, 0xC79A971F, 0x35F1141C, 0x26A1E7E8, 0xD4CA64EB, - 0x8AD958CF, 0x78B2DBCC, 0x6BE22838, 0x9989AB3B, 0x4D43CFD0, 0xBF284CD3, 0xAC78BF27, 0x5E133C24, - 0x105EC76F, 0xE235446C, 0xF165B798, 0x030E349B, 0xD7C45070, 0x25AFD373, 0x36FF2087, 0xC494A384, - 0x9A879FA0, 0x68EC1CA3, 0x7BBCEF57, 0x89D76C54, 0x5D1D08BF, 0xAF768BBC, 0xBC267848, 0x4E4DFB4B, - 0x20BD8EDE, 0xD2D60DDD, 0xC186FE29, 0x33ED7D2A, 0xE72719C1, 0x154C9AC2, 0x061C6936, 0xF477EA35, - 0xAA64D611, 0x580F5512, 0x4B5FA6E6, 0xB93425E5, 0x6DFE410E, 0x9F95C20D, 0x8CC531F9, 0x7EAEB2FA, - 0x30E349B1, 0xC288CAB2, 0xD1D83946, 0x23B3BA45, 0xF779DEAE, 0x05125DAD, 0x1642AE59, 0xE4292D5A, - 0xBA3A117E, 0x4851927D, 0x5B016189, 0xA96AE28A, 0x7DA08661, 0x8FCB0562, 0x9C9BF696, 0x6EF07595, - 0x417B1DBC, 0xB3109EBF, 0xA0406D4B, 0x522BEE48, 0x86E18AA3, 0x748A09A0, 0x67DAFA54, 0x95B17957, - 0xCBA24573, 0x39C9C670, 0x2A993584, 0xD8F2B687, 0x0C38D26C, 0xFE53516F, 0xED03A29B, 0x1F682198, - 0x5125DAD3, 0xA34E59D0, 0xB01EAA24, 0x42752927, 0x96BF4DCC, 0x64D4CECF, 0x77843D3B, 0x85EFBE38, - 0xDBFC821C, 0x2997011F, 0x3AC7F2EB, 0xC8AC71E8, 0x1C661503, 0xEE0D9600, 0xFD5D65F4, 0x0F36E6F7, - 0x61C69362, 0x93AD1061, 0x80FDE395, 0x72966096, 0xA65C047D, 0x5437877E, 0x4767748A, 0xB50CF789, - 0xEB1FCBAD, 0x197448AE, 0x0A24BB5A, 0xF84F3859, 0x2C855CB2, 0xDEEEDFB1, 0xCDBE2C45, 0x3FD5AF46, - 0x7198540D, 0x83F3D70E, 0x90A324FA, 0x62C8A7F9, 0xB602C312, 0x44694011, 0x5739B3E5, 0xA55230E6, - 0xFB410CC2, 0x092A8FC1, 0x1A7A7C35, 0xE811FF36, 0x3CDB9BDD, 0xCEB018DE, 0xDDE0EB2A, 0x2F8B6829, - 0x82F63B78, 0x709DB87B, 0x63CD4B8F, 0x91A6C88C, 0x456CAC67, 0xB7072F64, 0xA457DC90, 0x563C5F93, - 0x082F63B7, 0xFA44E0B4, 0xE9141340, 0x1B7F9043, 0xCFB5F4A8, 0x3DDE77AB, 0x2E8E845F, 0xDCE5075C, - 0x92A8FC17, 0x60C37F14, 0x73938CE0, 0x81F80FE3, 0x55326B08, 0xA759E80B, 0xB4091BFF, 0x466298FC, - 0x1871A4D8, 0xEA1A27DB, 0xF94AD42F, 0x0B21572C, 0xDFEB33C7, 0x2D80B0C4, 0x3ED04330, 0xCCBBC033, - 0xA24BB5A6, 0x502036A5, 0x4370C551, 0xB11B4652, 0x65D122B9, 0x97BAA1BA, 0x84EA524E, 0x7681D14D, - 0x2892ED69, 0xDAF96E6A, 0xC9A99D9E, 0x3BC21E9D, 0xEF087A76, 0x1D63F975, 0x0E330A81, 0xFC588982, - 0xB21572C9, 0x407EF1CA, 0x532E023E, 0xA145813D, 0x758FE5D6, 0x87E466D5, 0x94B49521, 0x66DF1622, - 0x38CC2A06, 0xCAA7A905, 0xD9F75AF1, 0x2B9CD9F2, 0xFF56BD19, 0x0D3D3E1A, 0x1E6DCDEE, 0xEC064EED, - 0xC38D26C4, 0x31E6A5C7, 0x22B65633, 0xD0DDD530, 0x0417B1DB, 0xF67C32D8, 0xE52CC12C, 0x1747422F, - 0x49547E0B, 0xBB3FFD08, 0xA86F0EFC, 0x5A048DFF, 0x8ECEE914, 0x7CA56A17, 0x6FF599E3, 0x9D9E1AE0, - 0xD3D3E1AB, 0x21B862A8, 0x32E8915C, 0xC083125F, 0x144976B4, 0xE622F5B7, 0xF5720643, 0x07198540, - 0x590AB964, 0xAB613A67, 0xB831C993, 0x4A5A4A90, 0x9E902E7B, 0x6CFBAD78, 0x7FAB5E8C, 0x8DC0DD8F, - 0xE330A81A, 0x115B2B19, 0x020BD8ED, 0xF0605BEE, 0x24AA3F05, 0xD6C1BC06, 0xC5914FF2, 0x37FACCF1, - 0x69E9F0D5, 0x9B8273D6, 0x88D28022, 0x7AB90321, 0xAE7367CA, 0x5C18E4C9, 0x4F48173D, 0xBD23943E, - 0xF36E6F75, 0x0105EC76, 0x12551F82, 0xE03E9C81, 0x34F4F86A, 0xC69F7B69, 0xD5CF889D, 0x27A40B9E, - 0x79B737BA, 0x8BDCB4B9, 0x988C474D, 0x6AE7C44E, 0xBE2DA0A5, 0x4C4623A6, 0x5F16D052, 0xAD7D5351 -}, -{ - 0x00000000, 0x13A29877, 0x274530EE, 0x34E7A899, 0x4E8A61DC, 0x5D28F9AB, 0x69CF5132, 0x7A6DC945, - 0x9D14C3B8, 0x8EB65BCF, 0xBA51F356, 0xA9F36B21, 0xD39EA264, 0xC03C3A13, 0xF4DB928A, 0xE7790AFD, - 0x3FC5F181, 0x2C6769F6, 0x1880C16F, 0x0B225918, 0x714F905D, 0x62ED082A, 0x560AA0B3, 0x45A838C4, - 0xA2D13239, 0xB173AA4E, 0x859402D7, 0x96369AA0, 0xEC5B53E5, 0xFFF9CB92, 0xCB1E630B, 0xD8BCFB7C, - 0x7F8BE302, 0x6C297B75, 0x58CED3EC, 0x4B6C4B9B, 0x310182DE, 0x22A31AA9, 0x1644B230, 0x05E62A47, - 0xE29F20BA, 0xF13DB8CD, 0xC5DA1054, 0xD6788823, 0xAC154166, 0xBFB7D911, 0x8B507188, 0x98F2E9FF, - 0x404E1283, 0x53EC8AF4, 0x670B226D, 0x74A9BA1A, 0x0EC4735F, 0x1D66EB28, 0x298143B1, 0x3A23DBC6, - 0xDD5AD13B, 0xCEF8494C, 0xFA1FE1D5, 0xE9BD79A2, 0x93D0B0E7, 0x80722890, 0xB4958009, 0xA737187E, - 0xFF17C604, 0xECB55E73, 0xD852F6EA, 0xCBF06E9D, 0xB19DA7D8, 0xA23F3FAF, 0x96D89736, 0x857A0F41, - 0x620305BC, 0x71A19DCB, 0x45463552, 0x56E4AD25, 0x2C896460, 0x3F2BFC17, 0x0BCC548E, 0x186ECCF9, - 0xC0D23785, 0xD370AFF2, 0xE797076B, 0xF4359F1C, 0x8E585659, 0x9DFACE2E, 0xA91D66B7, 0xBABFFEC0, - 0x5DC6F43D, 0x4E646C4A, 0x7A83C4D3, 0x69215CA4, 0x134C95E1, 0x00EE0D96, 0x3409A50F, 0x27AB3D78, - 0x809C2506, 0x933EBD71, 0xA7D915E8, 0xB47B8D9F, 0xCE1644DA, 0xDDB4DCAD, 0xE9537434, 0xFAF1EC43, - 0x1D88E6BE, 0x0E2A7EC9, 0x3ACDD650, 0x296F4E27, 0x53028762, 0x40A01F15, 0x7447B78C, 0x67E52FFB, - 0xBF59D487, 0xACFB4CF0, 0x981CE469, 0x8BBE7C1E, 0xF1D3B55B, 0xE2712D2C, 0xD69685B5, 0xC5341DC2, - 0x224D173F, 0x31EF8F48, 0x050827D1, 0x16AABFA6, 0x6CC776E3, 0x7F65EE94, 0x4B82460D, 0x5820DE7A, - 0xFBC3FAF9, 0xE861628E, 0xDC86CA17, 0xCF245260, 0xB5499B25, 0xA6EB0352, 0x920CABCB, 0x81AE33BC, - 0x66D73941, 0x7575A136, 0x419209AF, 0x523091D8, 0x285D589D, 0x3BFFC0EA, 0x0F186873, 0x1CBAF004, - 0xC4060B78, 0xD7A4930F, 0xE3433B96, 0xF0E1A3E1, 0x8A8C6AA4, 0x992EF2D3, 0xADC95A4A, 0xBE6BC23D, - 0x5912C8C0, 0x4AB050B7, 0x7E57F82E, 0x6DF56059, 0x1798A91C, 0x043A316B, 0x30DD99F2, 0x237F0185, - 0x844819FB, 0x97EA818C, 0xA30D2915, 0xB0AFB162, 0xCAC27827, 0xD960E050, 0xED8748C9, 0xFE25D0BE, - 0x195CDA43, 0x0AFE4234, 0x3E19EAAD, 0x2DBB72DA, 0x57D6BB9F, 0x447423E8, 0x70938B71, 0x63311306, - 0xBB8DE87A, 0xA82F700D, 0x9CC8D894, 0x8F6A40E3, 0xF50789A6, 0xE6A511D1, 0xD242B948, 0xC1E0213F, - 0x26992BC2, 0x353BB3B5, 0x01DC1B2C, 0x127E835B, 0x68134A1E, 0x7BB1D269, 0x4F567AF0, 0x5CF4E287, - 0x04D43CFD, 0x1776A48A, 0x23910C13, 0x30339464, 0x4A5E5D21, 0x59FCC556, 0x6D1B6DCF, 0x7EB9F5B8, - 0x99C0FF45, 0x8A626732, 0xBE85CFAB, 0xAD2757DC, 0xD74A9E99, 0xC4E806EE, 0xF00FAE77, 0xE3AD3600, - 0x3B11CD7C, 0x28B3550B, 0x1C54FD92, 0x0FF665E5, 0x759BACA0, 0x663934D7, 0x52DE9C4E, 0x417C0439, - 0xA6050EC4, 0xB5A796B3, 0x81403E2A, 0x92E2A65D, 0xE88F6F18, 0xFB2DF76F, 0xCFCA5FF6, 0xDC68C781, - 0x7B5FDFFF, 0x68FD4788, 0x5C1AEF11, 0x4FB87766, 0x35D5BE23, 0x26772654, 0x12908ECD, 0x013216BA, - 0xE64B1C47, 0xF5E98430, 0xC10E2CA9, 0xD2ACB4DE, 0xA8C17D9B, 0xBB63E5EC, 0x8F844D75, 0x9C26D502, - 0x449A2E7E, 0x5738B609, 0x63DF1E90, 0x707D86E7, 0x0A104FA2, 0x19B2D7D5, 0x2D557F4C, 0x3EF7E73B, - 0xD98EEDC6, 0xCA2C75B1, 0xFECBDD28, 0xED69455F, 0x97048C1A, 0x84A6146D, 0xB041BCF4, 0xA3E32483 -}, -{ - 0x00000000, 0xA541927E, 0x4F6F520D, 0xEA2EC073, 0x9EDEA41A, 0x3B9F3664, 0xD1B1F617, 0x74F06469, - 0x38513EC5, 0x9D10ACBB, 0x773E6CC8, 0xD27FFEB6, 0xA68F9ADF, 0x03CE08A1, 0xE9E0C8D2, 0x4CA15AAC, - 0x70A27D8A, 0xD5E3EFF4, 0x3FCD2F87, 0x9A8CBDF9, 0xEE7CD990, 0x4B3D4BEE, 0xA1138B9D, 0x045219E3, - 0x48F3434F, 0xEDB2D131, 0x079C1142, 0xA2DD833C, 0xD62DE755, 0x736C752B, 0x9942B558, 0x3C032726, - 0xE144FB14, 0x4405696A, 0xAE2BA919, 0x0B6A3B67, 0x7F9A5F0E, 0xDADBCD70, 0x30F50D03, 0x95B49F7D, - 0xD915C5D1, 0x7C5457AF, 0x967A97DC, 0x333B05A2, 0x47CB61CB, 0xE28AF3B5, 0x08A433C6, 0xADE5A1B8, - 0x91E6869E, 0x34A714E0, 0xDE89D493, 0x7BC846ED, 0x0F382284, 0xAA79B0FA, 0x40577089, 0xE516E2F7, - 0xA9B7B85B, 0x0CF62A25, 0xE6D8EA56, 0x43997828, 0x37691C41, 0x92288E3F, 0x78064E4C, 0xDD47DC32, - 0xC76580D9, 0x622412A7, 0x880AD2D4, 0x2D4B40AA, 0x59BB24C3, 0xFCFAB6BD, 0x16D476CE, 0xB395E4B0, - 0xFF34BE1C, 0x5A752C62, 0xB05BEC11, 0x151A7E6F, 0x61EA1A06, 0xC4AB8878, 0x2E85480B, 0x8BC4DA75, - 0xB7C7FD53, 0x12866F2D, 0xF8A8AF5E, 0x5DE93D20, 0x29195949, 0x8C58CB37, 0x66760B44, 0xC337993A, - 0x8F96C396, 0x2AD751E8, 0xC0F9919B, 0x65B803E5, 0x1148678C, 0xB409F5F2, 0x5E273581, 0xFB66A7FF, - 0x26217BCD, 0x8360E9B3, 0x694E29C0, 0xCC0FBBBE, 0xB8FFDFD7, 0x1DBE4DA9, 0xF7908DDA, 0x52D11FA4, - 0x1E704508, 0xBB31D776, 0x511F1705, 0xF45E857B, 0x80AEE112, 0x25EF736C, 0xCFC1B31F, 0x6A802161, - 0x56830647, 0xF3C29439, 0x19EC544A, 0xBCADC634, 0xC85DA25D, 0x6D1C3023, 0x8732F050, 0x2273622E, - 0x6ED23882, 0xCB93AAFC, 0x21BD6A8F, 0x84FCF8F1, 0xF00C9C98, 0x554D0EE6, 0xBF63CE95, 0x1A225CEB, - 0x8B277743, 0x2E66E53D, 0xC448254E, 0x6109B730, 0x15F9D359, 0xB0B84127, 0x5A968154, 0xFFD7132A, - 0xB3764986, 0x1637DBF8, 0xFC191B8B, 0x595889F5, 0x2DA8ED9C, 0x88E97FE2, 0x62C7BF91, 0xC7862DEF, - 0xFB850AC9, 0x5EC498B7, 0xB4EA58C4, 0x11ABCABA, 0x655BAED3, 0xC01A3CAD, 0x2A34FCDE, 0x8F756EA0, - 0xC3D4340C, 0x6695A672, 0x8CBB6601, 0x29FAF47F, 0x5D0A9016, 0xF84B0268, 0x1265C21B, 0xB7245065, - 0x6A638C57, 0xCF221E29, 0x250CDE5A, 0x804D4C24, 0xF4BD284D, 0x51FCBA33, 0xBBD27A40, 0x1E93E83E, - 0x5232B292, 0xF77320EC, 0x1D5DE09F, 0xB81C72E1, 0xCCEC1688, 0x69AD84F6, 0x83834485, 0x26C2D6FB, - 0x1AC1F1DD, 0xBF8063A3, 0x55AEA3D0, 0xF0EF31AE, 0x841F55C7, 0x215EC7B9, 0xCB7007CA, 0x6E3195B4, - 0x2290CF18, 0x87D15D66, 0x6DFF9D15, 0xC8BE0F6B, 0xBC4E6B02, 0x190FF97C, 0xF321390F, 0x5660AB71, - 0x4C42F79A, 0xE90365E4, 0x032DA597, 0xA66C37E9, 0xD29C5380, 0x77DDC1FE, 0x9DF3018D, 0x38B293F3, - 0x7413C95F, 0xD1525B21, 0x3B7C9B52, 0x9E3D092C, 0xEACD6D45, 0x4F8CFF3B, 0xA5A23F48, 0x00E3AD36, - 0x3CE08A10, 0x99A1186E, 0x738FD81D, 0xD6CE4A63, 0xA23E2E0A, 0x077FBC74, 0xED517C07, 0x4810EE79, - 0x04B1B4D5, 0xA1F026AB, 0x4BDEE6D8, 0xEE9F74A6, 0x9A6F10CF, 0x3F2E82B1, 0xD50042C2, 0x7041D0BC, - 0xAD060C8E, 0x08479EF0, 0xE2695E83, 0x4728CCFD, 0x33D8A894, 0x96993AEA, 0x7CB7FA99, 0xD9F668E7, - 0x9557324B, 0x3016A035, 0xDA386046, 0x7F79F238, 0x0B899651, 0xAEC8042F, 0x44E6C45C, 0xE1A75622, - 0xDDA47104, 0x78E5E37A, 0x92CB2309, 0x378AB177, 0x437AD51E, 0xE63B4760, 0x0C158713, 0xA954156D, - 0xE5F54FC1, 0x40B4DDBF, 0xAA9A1DCC, 0x0FDB8FB2, 0x7B2BEBDB, 0xDE6A79A5, 0x3444B9D6, 0x91052BA8 -}, -{ - 0x00000000, 0xDD45AAB8, 0xBF672381, 0x62228939, 0x7B2231F3, 0xA6679B4B, 0xC4451272, 0x1900B8CA, - 0xF64463E6, 0x2B01C95E, 0x49234067, 0x9466EADF, 0x8D665215, 0x5023F8AD, 0x32017194, 0xEF44DB2C, - 0xE964B13D, 0x34211B85, 0x560392BC, 0x8B463804, 0x924680CE, 0x4F032A76, 0x2D21A34F, 0xF06409F7, - 0x1F20D2DB, 0xC2657863, 0xA047F15A, 0x7D025BE2, 0x6402E328, 0xB9474990, 0xDB65C0A9, 0x06206A11, - 0xD725148B, 0x0A60BE33, 0x6842370A, 0xB5079DB2, 0xAC072578, 0x71428FC0, 0x136006F9, 0xCE25AC41, - 0x2161776D, 0xFC24DDD5, 0x9E0654EC, 0x4343FE54, 0x5A43469E, 0x8706EC26, 0xE524651F, 0x3861CFA7, - 0x3E41A5B6, 0xE3040F0E, 0x81268637, 0x5C632C8F, 0x45639445, 0x98263EFD, 0xFA04B7C4, 0x27411D7C, - 0xC805C650, 0x15406CE8, 0x7762E5D1, 0xAA274F69, 0xB327F7A3, 0x6E625D1B, 0x0C40D422, 0xD1057E9A, - 0xABA65FE7, 0x76E3F55F, 0x14C17C66, 0xC984D6DE, 0xD0846E14, 0x0DC1C4AC, 0x6FE34D95, 0xB2A6E72D, - 0x5DE23C01, 0x80A796B9, 0xE2851F80, 0x3FC0B538, 0x26C00DF2, 0xFB85A74A, 0x99A72E73, 0x44E284CB, - 0x42C2EEDA, 0x9F874462, 0xFDA5CD5B, 0x20E067E3, 0x39E0DF29, 0xE4A57591, 0x8687FCA8, 0x5BC25610, - 0xB4868D3C, 0x69C32784, 0x0BE1AEBD, 0xD6A40405, 0xCFA4BCCF, 0x12E11677, 0x70C39F4E, 0xAD8635F6, - 0x7C834B6C, 0xA1C6E1D4, 0xC3E468ED, 0x1EA1C255, 0x07A17A9F, 0xDAE4D027, 0xB8C6591E, 0x6583F3A6, - 0x8AC7288A, 0x57828232, 0x35A00B0B, 0xE8E5A1B3, 0xF1E51979, 0x2CA0B3C1, 0x4E823AF8, 0x93C79040, - 0x95E7FA51, 0x48A250E9, 0x2A80D9D0, 0xF7C57368, 0xEEC5CBA2, 0x3380611A, 0x51A2E823, 0x8CE7429B, - 0x63A399B7, 0xBEE6330F, 0xDCC4BA36, 0x0181108E, 0x1881A844, 0xC5C402FC, 0xA7E68BC5, 0x7AA3217D, - 0x52A0C93F, 0x8FE56387, 0xEDC7EABE, 0x30824006, 0x2982F8CC, 0xF4C75274, 0x96E5DB4D, 0x4BA071F5, - 0xA4E4AAD9, 0x79A10061, 0x1B838958, 0xC6C623E0, 0xDFC69B2A, 0x02833192, 0x60A1B8AB, 0xBDE41213, - 0xBBC47802, 0x6681D2BA, 0x04A35B83, 0xD9E6F13B, 0xC0E649F1, 0x1DA3E349, 0x7F816A70, 0xA2C4C0C8, - 0x4D801BE4, 0x90C5B15C, 0xF2E73865, 0x2FA292DD, 0x36A22A17, 0xEBE780AF, 0x89C50996, 0x5480A32E, - 0x8585DDB4, 0x58C0770C, 0x3AE2FE35, 0xE7A7548D, 0xFEA7EC47, 0x23E246FF, 0x41C0CFC6, 0x9C85657E, - 0x73C1BE52, 0xAE8414EA, 0xCCA69DD3, 0x11E3376B, 0x08E38FA1, 0xD5A62519, 0xB784AC20, 0x6AC10698, - 0x6CE16C89, 0xB1A4C631, 0xD3864F08, 0x0EC3E5B0, 0x17C35D7A, 0xCA86F7C2, 0xA8A47EFB, 0x75E1D443, - 0x9AA50F6F, 0x47E0A5D7, 0x25C22CEE, 0xF8878656, 0xE1873E9C, 0x3CC29424, 0x5EE01D1D, 0x83A5B7A5, - 0xF90696D8, 0x24433C60, 0x4661B559, 0x9B241FE1, 0x8224A72B, 0x5F610D93, 0x3D4384AA, 0xE0062E12, - 0x0F42F53E, 0xD2075F86, 0xB025D6BF, 0x6D607C07, 0x7460C4CD, 0xA9256E75, 0xCB07E74C, 0x16424DF4, - 0x106227E5, 0xCD278D5D, 0xAF050464, 0x7240AEDC, 0x6B401616, 0xB605BCAE, 0xD4273597, 0x09629F2F, - 0xE6264403, 0x3B63EEBB, 0x59416782, 0x8404CD3A, 0x9D0475F0, 0x4041DF48, 0x22635671, 0xFF26FCC9, - 0x2E238253, 0xF36628EB, 0x9144A1D2, 0x4C010B6A, 0x5501B3A0, 0x88441918, 0xEA669021, 0x37233A99, - 0xD867E1B5, 0x05224B0D, 0x6700C234, 0xBA45688C, 0xA345D046, 0x7E007AFE, 0x1C22F3C7, 0xC167597F, - 0xC747336E, 0x1A0299D6, 0x782010EF, 0xA565BA57, 0xBC65029D, 0x6120A825, 0x0302211C, 0xDE478BA4, - 0x31035088, 0xEC46FA30, 0x8E647309, 0x5321D9B1, 0x4A21617B, 0x9764CBC3, 0xF54642FA, 0x2803E842 -}, -{ - 0x00000000, 0x38116FAC, 0x7022DF58, 0x4833B0F4, 0xE045BEB0, 0xD854D11C, 0x906761E8, 0xA8760E44, - 0xC5670B91, 0xFD76643D, 0xB545D4C9, 0x8D54BB65, 0x2522B521, 0x1D33DA8D, 0x55006A79, 0x6D1105D5, - 0x8F2261D3, 0xB7330E7F, 0xFF00BE8B, 0xC711D127, 0x6F67DF63, 0x5776B0CF, 0x1F45003B, 0x27546F97, - 0x4A456A42, 0x725405EE, 0x3A67B51A, 0x0276DAB6, 0xAA00D4F2, 0x9211BB5E, 0xDA220BAA, 0xE2336406, - 0x1BA8B557, 0x23B9DAFB, 0x6B8A6A0F, 0x539B05A3, 0xFBED0BE7, 0xC3FC644B, 0x8BCFD4BF, 0xB3DEBB13, - 0xDECFBEC6, 0xE6DED16A, 0xAEED619E, 0x96FC0E32, 0x3E8A0076, 0x069B6FDA, 0x4EA8DF2E, 0x76B9B082, - 0x948AD484, 0xAC9BBB28, 0xE4A80BDC, 0xDCB96470, 0x74CF6A34, 0x4CDE0598, 0x04EDB56C, 0x3CFCDAC0, - 0x51EDDF15, 0x69FCB0B9, 0x21CF004D, 0x19DE6FE1, 0xB1A861A5, 0x89B90E09, 0xC18ABEFD, 0xF99BD151, - 0x37516AAE, 0x0F400502, 0x4773B5F6, 0x7F62DA5A, 0xD714D41E, 0xEF05BBB2, 0xA7360B46, 0x9F2764EA, - 0xF236613F, 0xCA270E93, 0x8214BE67, 0xBA05D1CB, 0x1273DF8F, 0x2A62B023, 0x625100D7, 0x5A406F7B, - 0xB8730B7D, 0x806264D1, 0xC851D425, 0xF040BB89, 0x5836B5CD, 0x6027DA61, 0x28146A95, 0x10050539, - 0x7D1400EC, 0x45056F40, 0x0D36DFB4, 0x3527B018, 0x9D51BE5C, 0xA540D1F0, 0xED736104, 0xD5620EA8, - 0x2CF9DFF9, 0x14E8B055, 0x5CDB00A1, 0x64CA6F0D, 0xCCBC6149, 0xF4AD0EE5, 0xBC9EBE11, 0x848FD1BD, - 0xE99ED468, 0xD18FBBC4, 0x99BC0B30, 0xA1AD649C, 0x09DB6AD8, 0x31CA0574, 0x79F9B580, 0x41E8DA2C, - 0xA3DBBE2A, 0x9BCAD186, 0xD3F96172, 0xEBE80EDE, 0x439E009A, 0x7B8F6F36, 0x33BCDFC2, 0x0BADB06E, - 0x66BCB5BB, 0x5EADDA17, 0x169E6AE3, 0x2E8F054F, 0x86F90B0B, 0xBEE864A7, 0xF6DBD453, 0xCECABBFF, - 0x6EA2D55C, 0x56B3BAF0, 0x1E800A04, 0x269165A8, 0x8EE76BEC, 0xB6F60440, 0xFEC5B4B4, 0xC6D4DB18, - 0xABC5DECD, 0x93D4B161, 0xDBE70195, 0xE3F66E39, 0x4B80607D, 0x73910FD1, 0x3BA2BF25, 0x03B3D089, - 0xE180B48F, 0xD991DB23, 0x91A26BD7, 0xA9B3047B, 0x01C50A3F, 0x39D46593, 0x71E7D567, 0x49F6BACB, - 0x24E7BF1E, 0x1CF6D0B2, 0x54C56046, 0x6CD40FEA, 0xC4A201AE, 0xFCB36E02, 0xB480DEF6, 0x8C91B15A, - 0x750A600B, 0x4D1B0FA7, 0x0528BF53, 0x3D39D0FF, 0x954FDEBB, 0xAD5EB117, 0xE56D01E3, 0xDD7C6E4F, - 0xB06D6B9A, 0x887C0436, 0xC04FB4C2, 0xF85EDB6E, 0x5028D52A, 0x6839BA86, 0x200A0A72, 0x181B65DE, - 0xFA2801D8, 0xC2396E74, 0x8A0ADE80, 0xB21BB12C, 0x1A6DBF68, 0x227CD0C4, 0x6A4F6030, 0x525E0F9C, - 0x3F4F0A49, 0x075E65E5, 0x4F6DD511, 0x777CBABD, 0xDF0AB4F9, 0xE71BDB55, 0xAF286BA1, 0x9739040D, - 0x59F3BFF2, 0x61E2D05E, 0x29D160AA, 0x11C00F06, 0xB9B60142, 0x81A76EEE, 0xC994DE1A, 0xF185B1B6, - 0x9C94B463, 0xA485DBCF, 0xECB66B3B, 0xD4A70497, 0x7CD10AD3, 0x44C0657F, 0x0CF3D58B, 0x34E2BA27, - 0xD6D1DE21, 0xEEC0B18D, 0xA6F30179, 0x9EE26ED5, 0x36946091, 0x0E850F3D, 0x46B6BFC9, 0x7EA7D065, - 0x13B6D5B0, 0x2BA7BA1C, 0x63940AE8, 0x5B856544, 0xF3F36B00, 0xCBE204AC, 0x83D1B458, 0xBBC0DBF4, - 0x425B0AA5, 0x7A4A6509, 0x3279D5FD, 0x0A68BA51, 0xA21EB415, 0x9A0FDBB9, 0xD23C6B4D, 0xEA2D04E1, - 0x873C0134, 0xBF2D6E98, 0xF71EDE6C, 0xCF0FB1C0, 0x6779BF84, 0x5F68D028, 0x175B60DC, 0x2F4A0F70, - 0xCD796B76, 0xF56804DA, 0xBD5BB42E, 0x854ADB82, 0x2D3CD5C6, 0x152DBA6A, 0x5D1E0A9E, 0x650F6532, - 0x081E60E7, 0x300F0F4B, 0x783CBFBF, 0x402DD013, 0xE85BDE57, 0xD04AB1FB, 0x9879010F, 0xA0686EA3 -}, -{ - 0x00000000, 0xEF306B19, 0xDB8CA0C3, 0x34BCCBDA, 0xB2F53777, 0x5DC55C6E, 0x697997B4, 0x8649FCAD, - 0x6006181F, 0x8F367306, 0xBB8AB8DC, 0x54BAD3C5, 0xD2F32F68, 0x3DC34471, 0x097F8FAB, 0xE64FE4B2, - 0xC00C303E, 0x2F3C5B27, 0x1B8090FD, 0xF4B0FBE4, 0x72F90749, 0x9DC96C50, 0xA975A78A, 0x4645CC93, - 0xA00A2821, 0x4F3A4338, 0x7B8688E2, 0x94B6E3FB, 0x12FF1F56, 0xFDCF744F, 0xC973BF95, 0x2643D48C, - 0x85F4168D, 0x6AC47D94, 0x5E78B64E, 0xB148DD57, 0x370121FA, 0xD8314AE3, 0xEC8D8139, 0x03BDEA20, - 0xE5F20E92, 0x0AC2658B, 0x3E7EAE51, 0xD14EC548, 0x570739E5, 0xB83752FC, 0x8C8B9926, 0x63BBF23F, - 0x45F826B3, 0xAAC84DAA, 0x9E748670, 0x7144ED69, 0xF70D11C4, 0x183D7ADD, 0x2C81B107, 0xC3B1DA1E, - 0x25FE3EAC, 0xCACE55B5, 0xFE729E6F, 0x1142F576, 0x970B09DB, 0x783B62C2, 0x4C87A918, 0xA3B7C201, - 0x0E045BEB, 0xE13430F2, 0xD588FB28, 0x3AB89031, 0xBCF16C9C, 0x53C10785, 0x677DCC5F, 0x884DA746, - 0x6E0243F4, 0x813228ED, 0xB58EE337, 0x5ABE882E, 0xDCF77483, 0x33C71F9A, 0x077BD440, 0xE84BBF59, - 0xCE086BD5, 0x213800CC, 0x1584CB16, 0xFAB4A00F, 0x7CFD5CA2, 0x93CD37BB, 0xA771FC61, 0x48419778, - 0xAE0E73CA, 0x413E18D3, 0x7582D309, 0x9AB2B810, 0x1CFB44BD, 0xF3CB2FA4, 0xC777E47E, 0x28478F67, - 0x8BF04D66, 0x64C0267F, 0x507CEDA5, 0xBF4C86BC, 0x39057A11, 0xD6351108, 0xE289DAD2, 0x0DB9B1CB, - 0xEBF65579, 0x04C63E60, 0x307AF5BA, 0xDF4A9EA3, 0x5903620E, 0xB6330917, 0x828FC2CD, 0x6DBFA9D4, - 0x4BFC7D58, 0xA4CC1641, 0x9070DD9B, 0x7F40B682, 0xF9094A2F, 0x16392136, 0x2285EAEC, 0xCDB581F5, - 0x2BFA6547, 0xC4CA0E5E, 0xF076C584, 0x1F46AE9D, 0x990F5230, 0x763F3929, 0x4283F2F3, 0xADB399EA, - 0x1C08B7D6, 0xF338DCCF, 0xC7841715, 0x28B47C0C, 0xAEFD80A1, 0x41CDEBB8, 0x75712062, 0x9A414B7B, - 0x7C0EAFC9, 0x933EC4D0, 0xA7820F0A, 0x48B26413, 0xCEFB98BE, 0x21CBF3A7, 0x1577387D, 0xFA475364, - 0xDC0487E8, 0x3334ECF1, 0x0788272B, 0xE8B84C32, 0x6EF1B09F, 0x81C1DB86, 0xB57D105C, 0x5A4D7B45, - 0xBC029FF7, 0x5332F4EE, 0x678E3F34, 0x88BE542D, 0x0EF7A880, 0xE1C7C399, 0xD57B0843, 0x3A4B635A, - 0x99FCA15B, 0x76CCCA42, 0x42700198, 0xAD406A81, 0x2B09962C, 0xC439FD35, 0xF08536EF, 0x1FB55DF6, - 0xF9FAB944, 0x16CAD25D, 0x22761987, 0xCD46729E, 0x4B0F8E33, 0xA43FE52A, 0x90832EF0, 0x7FB345E9, - 0x59F09165, 0xB6C0FA7C, 0x827C31A6, 0x6D4C5ABF, 0xEB05A612, 0x0435CD0B, 0x308906D1, 0xDFB96DC8, - 0x39F6897A, 0xD6C6E263, 0xE27A29B9, 0x0D4A42A0, 0x8B03BE0D, 0x6433D514, 0x508F1ECE, 0xBFBF75D7, - 0x120CEC3D, 0xFD3C8724, 0xC9804CFE, 0x26B027E7, 0xA0F9DB4A, 0x4FC9B053, 0x7B757B89, 0x94451090, - 0x720AF422, 0x9D3A9F3B, 0xA98654E1, 0x46B63FF8, 0xC0FFC355, 0x2FCFA84C, 0x1B736396, 0xF443088F, - 0xD200DC03, 0x3D30B71A, 0x098C7CC0, 0xE6BC17D9, 0x60F5EB74, 0x8FC5806D, 0xBB794BB7, 0x544920AE, - 0xB206C41C, 0x5D36AF05, 0x698A64DF, 0x86BA0FC6, 0x00F3F36B, 0xEFC39872, 0xDB7F53A8, 0x344F38B1, - 0x97F8FAB0, 0x78C891A9, 0x4C745A73, 0xA344316A, 0x250DCDC7, 0xCA3DA6DE, 0xFE816D04, 0x11B1061D, - 0xF7FEE2AF, 0x18CE89B6, 0x2C72426C, 0xC3422975, 0x450BD5D8, 0xAA3BBEC1, 0x9E87751B, 0x71B71E02, - 0x57F4CA8E, 0xB8C4A197, 0x8C786A4D, 0x63480154, 0xE501FDF9, 0x0A3196E0, 0x3E8D5D3A, 0xD1BD3623, - 0x37F2D291, 0xD8C2B988, 0xEC7E7252, 0x034E194B, 0x8507E5E6, 0x6A378EFF, 0x5E8B4525, 0xB1BB2E3C -}, -{ - 0x00000000, 0x68032CC8, 0xD0065990, 0xB8057558, 0xA5E0C5D1, 0xCDE3E919, 0x75E69C41, 0x1DE5B089, - 0x4E2DFD53, 0x262ED19B, 0x9E2BA4C3, 0xF628880B, 0xEBCD3882, 0x83CE144A, 0x3BCB6112, 0x53C84DDA, - 0x9C5BFAA6, 0xF458D66E, 0x4C5DA336, 0x245E8FFE, 0x39BB3F77, 0x51B813BF, 0xE9BD66E7, 0x81BE4A2F, - 0xD27607F5, 0xBA752B3D, 0x02705E65, 0x6A7372AD, 0x7796C224, 0x1F95EEEC, 0xA7909BB4, 0xCF93B77C, - 0x3D5B83BD, 0x5558AF75, 0xED5DDA2D, 0x855EF6E5, 0x98BB466C, 0xF0B86AA4, 0x48BD1FFC, 0x20BE3334, - 0x73767EEE, 0x1B755226, 0xA370277E, 0xCB730BB6, 0xD696BB3F, 0xBE9597F7, 0x0690E2AF, 0x6E93CE67, - 0xA100791B, 0xC90355D3, 0x7106208B, 0x19050C43, 0x04E0BCCA, 0x6CE39002, 0xD4E6E55A, 0xBCE5C992, - 0xEF2D8448, 0x872EA880, 0x3F2BDDD8, 0x5728F110, 0x4ACD4199, 0x22CE6D51, 0x9ACB1809, 0xF2C834C1, - 0x7AB7077A, 0x12B42BB2, 0xAAB15EEA, 0xC2B27222, 0xDF57C2AB, 0xB754EE63, 0x0F519B3B, 0x6752B7F3, - 0x349AFA29, 0x5C99D6E1, 0xE49CA3B9, 0x8C9F8F71, 0x917A3FF8, 0xF9791330, 0x417C6668, 0x297F4AA0, - 0xE6ECFDDC, 0x8EEFD114, 0x36EAA44C, 0x5EE98884, 0x430C380D, 0x2B0F14C5, 0x930A619D, 0xFB094D55, - 0xA8C1008F, 0xC0C22C47, 0x78C7591F, 0x10C475D7, 0x0D21C55E, 0x6522E996, 0xDD279CCE, 0xB524B006, - 0x47EC84C7, 0x2FEFA80F, 0x97EADD57, 0xFFE9F19F, 0xE20C4116, 0x8A0F6DDE, 0x320A1886, 0x5A09344E, - 0x09C17994, 0x61C2555C, 0xD9C72004, 0xB1C40CCC, 0xAC21BC45, 0xC422908D, 0x7C27E5D5, 0x1424C91D, - 0xDBB77E61, 0xB3B452A9, 0x0BB127F1, 0x63B20B39, 0x7E57BBB0, 0x16549778, 0xAE51E220, 0xC652CEE8, - 0x959A8332, 0xFD99AFFA, 0x459CDAA2, 0x2D9FF66A, 0x307A46E3, 0x58796A2B, 0xE07C1F73, 0x887F33BB, - 0xF56E0EF4, 0x9D6D223C, 0x25685764, 0x4D6B7BAC, 0x508ECB25, 0x388DE7ED, 0x808892B5, 0xE88BBE7D, - 0xBB43F3A7, 0xD340DF6F, 0x6B45AA37, 0x034686FF, 0x1EA33676, 0x76A01ABE, 0xCEA56FE6, 0xA6A6432E, - 0x6935F452, 0x0136D89A, 0xB933ADC2, 0xD130810A, 0xCCD53183, 0xA4D61D4B, 0x1CD36813, 0x74D044DB, - 0x27180901, 0x4F1B25C9, 0xF71E5091, 0x9F1D7C59, 0x82F8CCD0, 0xEAFBE018, 0x52FE9540, 0x3AFDB988, - 0xC8358D49, 0xA036A181, 0x1833D4D9, 0x7030F811, 0x6DD54898, 0x05D66450, 0xBDD31108, 0xD5D03DC0, - 0x8618701A, 0xEE1B5CD2, 0x561E298A, 0x3E1D0542, 0x23F8B5CB, 0x4BFB9903, 0xF3FEEC5B, 0x9BFDC093, - 0x546E77EF, 0x3C6D5B27, 0x84682E7F, 0xEC6B02B7, 0xF18EB23E, 0x998D9EF6, 0x2188EBAE, 0x498BC766, - 0x1A438ABC, 0x7240A674, 0xCA45D32C, 0xA246FFE4, 0xBFA34F6D, 0xD7A063A5, 0x6FA516FD, 0x07A63A35, - 0x8FD9098E, 0xE7DA2546, 0x5FDF501E, 0x37DC7CD6, 0x2A39CC5F, 0x423AE097, 0xFA3F95CF, 0x923CB907, - 0xC1F4F4DD, 0xA9F7D815, 0x11F2AD4D, 0x79F18185, 0x6414310C, 0x0C171DC4, 0xB412689C, 0xDC114454, - 0x1382F328, 0x7B81DFE0, 0xC384AAB8, 0xAB878670, 0xB66236F9, 0xDE611A31, 0x66646F69, 0x0E6743A1, - 0x5DAF0E7B, 0x35AC22B3, 0x8DA957EB, 0xE5AA7B23, 0xF84FCBAA, 0x904CE762, 0x2849923A, 0x404ABEF2, - 0xB2828A33, 0xDA81A6FB, 0x6284D3A3, 0x0A87FF6B, 0x17624FE2, 0x7F61632A, 0xC7641672, 0xAF673ABA, - 0xFCAF7760, 0x94AC5BA8, 0x2CA92EF0, 0x44AA0238, 0x594FB2B1, 0x314C9E79, 0x8949EB21, 0xE14AC7E9, - 0x2ED97095, 0x46DA5C5D, 0xFEDF2905, 0x96DC05CD, 0x8B39B544, 0xE33A998C, 0x5B3FECD4, 0x333CC01C, - 0x60F48DC6, 0x08F7A10E, 0xB0F2D456, 0xD8F1F89E, 0xC5144817, 0xAD1764DF, 0x15121187, 0x7D113D4F -}, -{ - 0x00000000, 0x493C7D27, 0x9278FA4E, 0xDB448769, 0x211D826D, 0x6821FF4A, 0xB3657823, 0xFA590504, - 0x423B04DA, 0x0B0779FD, 0xD043FE94, 0x997F83B3, 0x632686B7, 0x2A1AFB90, 0xF15E7CF9, 0xB86201DE, - 0x847609B4, 0xCD4A7493, 0x160EF3FA, 0x5F328EDD, 0xA56B8BD9, 0xEC57F6FE, 0x37137197, 0x7E2F0CB0, - 0xC64D0D6E, 0x8F717049, 0x5435F720, 0x1D098A07, 0xE7508F03, 0xAE6CF224, 0x7528754D, 0x3C14086A, - 0x0D006599, 0x443C18BE, 0x9F789FD7, 0xD644E2F0, 0x2C1DE7F4, 0x65219AD3, 0xBE651DBA, 0xF759609D, - 0x4F3B6143, 0x06071C64, 0xDD439B0D, 0x947FE62A, 0x6E26E32E, 0x271A9E09, 0xFC5E1960, 0xB5626447, - 0x89766C2D, 0xC04A110A, 0x1B0E9663, 0x5232EB44, 0xA86BEE40, 0xE1579367, 0x3A13140E, 0x732F6929, - 0xCB4D68F7, 0x827115D0, 0x593592B9, 0x1009EF9E, 0xEA50EA9A, 0xA36C97BD, 0x782810D4, 0x31146DF3, - 0x1A00CB32, 0x533CB615, 0x8878317C, 0xC1444C5B, 0x3B1D495F, 0x72213478, 0xA965B311, 0xE059CE36, - 0x583BCFE8, 0x1107B2CF, 0xCA4335A6, 0x837F4881, 0x79264D85, 0x301A30A2, 0xEB5EB7CB, 0xA262CAEC, - 0x9E76C286, 0xD74ABFA1, 0x0C0E38C8, 0x453245EF, 0xBF6B40EB, 0xF6573DCC, 0x2D13BAA5, 0x642FC782, - 0xDC4DC65C, 0x9571BB7B, 0x4E353C12, 0x07094135, 0xFD504431, 0xB46C3916, 0x6F28BE7F, 0x2614C358, - 0x1700AEAB, 0x5E3CD38C, 0x857854E5, 0xCC4429C2, 0x361D2CC6, 0x7F2151E1, 0xA465D688, 0xED59ABAF, - 0x553BAA71, 0x1C07D756, 0xC743503F, 0x8E7F2D18, 0x7426281C, 0x3D1A553B, 0xE65ED252, 0xAF62AF75, - 0x9376A71F, 0xDA4ADA38, 0x010E5D51, 0x48322076, 0xB26B2572, 0xFB575855, 0x2013DF3C, 0x692FA21B, - 0xD14DA3C5, 0x9871DEE2, 0x4335598B, 0x0A0924AC, 0xF05021A8, 0xB96C5C8F, 0x6228DBE6, 0x2B14A6C1, - 0x34019664, 0x7D3DEB43, 0xA6796C2A, 0xEF45110D, 0x151C1409, 0x5C20692E, 0x8764EE47, 0xCE589360, - 0x763A92BE, 0x3F06EF99, 0xE44268F0, 0xAD7E15D7, 0x572710D3, 0x1E1B6DF4, 0xC55FEA9D, 0x8C6397BA, - 0xB0779FD0, 0xF94BE2F7, 0x220F659E, 0x6B3318B9, 0x916A1DBD, 0xD856609A, 0x0312E7F3, 0x4A2E9AD4, - 0xF24C9B0A, 0xBB70E62D, 0x60346144, 0x29081C63, 0xD3511967, 0x9A6D6440, 0x4129E329, 0x08159E0E, - 0x3901F3FD, 0x703D8EDA, 0xAB7909B3, 0xE2457494, 0x181C7190, 0x51200CB7, 0x8A648BDE, 0xC358F6F9, - 0x7B3AF727, 0x32068A00, 0xE9420D69, 0xA07E704E, 0x5A27754A, 0x131B086D, 0xC85F8F04, 0x8163F223, - 0xBD77FA49, 0xF44B876E, 0x2F0F0007, 0x66337D20, 0x9C6A7824, 0xD5560503, 0x0E12826A, 0x472EFF4D, - 0xFF4CFE93, 0xB67083B4, 0x6D3404DD, 0x240879FA, 0xDE517CFE, 0x976D01D9, 0x4C2986B0, 0x0515FB97, - 0x2E015D56, 0x673D2071, 0xBC79A718, 0xF545DA3F, 0x0F1CDF3B, 0x4620A21C, 0x9D642575, 0xD4585852, - 0x6C3A598C, 0x250624AB, 0xFE42A3C2, 0xB77EDEE5, 0x4D27DBE1, 0x041BA6C6, 0xDF5F21AF, 0x96635C88, - 0xAA7754E2, 0xE34B29C5, 0x380FAEAC, 0x7133D38B, 0x8B6AD68F, 0xC256ABA8, 0x19122CC1, 0x502E51E6, - 0xE84C5038, 0xA1702D1F, 0x7A34AA76, 0x3308D751, 0xC951D255, 0x806DAF72, 0x5B29281B, 0x1215553C, - 0x230138CF, 0x6A3D45E8, 0xB179C281, 0xF845BFA6, 0x021CBAA2, 0x4B20C785, 0x906440EC, 0xD9583DCB, - 0x613A3C15, 0x28064132, 0xF342C65B, 0xBA7EBB7C, 0x4027BE78, 0x091BC35F, 0xD25F4436, 0x9B633911, - 0xA777317B, 0xEE4B4C5C, 0x350FCB35, 0x7C33B612, 0x866AB316, 0xCF56CE31, 0x14124958, 0x5D2E347F, - 0xE54C35A1, 0xAC704886, 0x7734CFEF, 0x3E08B2C8, 0xC451B7CC, 0x8D6DCAEB, 0x56294D82, 0x1F1530A5 -}}; - -#define CRC32_UPD(crc, n) \ - (crc32c_tables[(n)][(crc) & 0xFF] ^ \ - crc32c_tables[(n)-1][((crc) >> 8) & 0xFF]) - -static inline uint32_t -crc32c_1word(uint32_t data, uint32_t init_val) -{ - uint32_t crc, term1, term2; - crc = init_val; - crc ^= data; - - term1 = CRC32_UPD(crc, 3); - term2 = crc >> 16; - crc = term1 ^ CRC32_UPD(term2, 1); - - return crc; -} - -static inline uint32_t -crc32c_2words(uint64_t data, uint32_t init_val) -{ - union { - uint64_t u64; - uint32_t u32[2]; - } d; - d.u64 = data; - - uint32_t crc, term1, term2; - - crc = init_val; - crc ^= d.u32[0]; - - term1 = CRC32_UPD(crc, 7); - term2 = crc >> 16; - crc = term1 ^ CRC32_UPD(term2, 5); - term1 = CRC32_UPD(d.u32[1], 3); - term2 = d.u32[1] >> 16; - crc ^= term1 ^ CRC32_UPD(term2, 1); - - return crc; -} - -#if defined(RTE_ARCH_I686) || defined(RTE_ARCH_X86_64) -static inline uint32_t -crc32c_sse42_u32(uint32_t data, uint32_t init_val) -{ - __asm__ volatile( - "crc32l %[data], %[init_val];" - : [init_val] "+r" (init_val) - : [data] "rm" (data)); - return init_val; -} - -static inline uint32_t -crc32c_sse42_u64_mimic(uint64_t data, uint64_t init_val) -{ - union { - uint32_t u32[2]; - uint64_t u64; - } d; - - d.u64 = data; - init_val = crc32c_sse42_u32(d.u32[0], init_val); - init_val = crc32c_sse42_u32(d.u32[1], init_val); - return init_val; -} -#endif - -#ifdef RTE_ARCH_X86_64 -static inline uint32_t -crc32c_sse42_u64(uint64_t data, uint64_t init_val) -{ - __asm__ volatile( - "crc32q %[data], %[init_val];" - : [init_val] "+r" (init_val) - : [data] "rm" (data)); - return init_val; -} -#endif - -#define CRC32_SW (1U << 0) -#define CRC32_SSE42 (1U << 1) -#define CRC32_x64 (1U << 2) -#define CRC32_SSE42_x64 (CRC32_x64|CRC32_SSE42) -#define CRC32_ARM64 (1U << 3) - -static uint8_t crc32_alg = CRC32_SW; - -#if defined(RTE_ARCH_ARM64) -#include "rte_crc_arm64.h" -#else - -/** - * Allow or disallow use of SSE4.2 instrinsics for CRC32 hash - * calculation. - * - * @param alg - * An OR of following flags: - * - (CRC32_SW) Don't use SSE4.2 intrinsics - * - (CRC32_SSE42) Use SSE4.2 intrinsics if available - * - (CRC32_SSE42_x64) Use 64-bit SSE4.2 intrinsic if available (default) - * - */ -static inline void -rte_hash_crc_set_alg(uint8_t alg) -{ - switch (alg) { -#if defined(RTE_ARCH_I686) || defined(RTE_ARCH_X86_64) - case CRC32_SSE42_x64: - if (! rte_cpu_get_flag_enabled(RTE_CPUFLAG_EM64T)) - alg = CRC32_SSE42; - case CRC32_SSE42: - if (! rte_cpu_get_flag_enabled(RTE_CPUFLAG_SSE4_2)) - alg = CRC32_SW; -#endif - case CRC32_SW: - crc32_alg = alg; - default: - break; - } -} - -/* Setting the best available algorithm */ -static inline void __attribute__((constructor)) -rte_hash_crc_init_alg(void) -{ - rte_hash_crc_set_alg(CRC32_SSE42_x64); -} - -/** - * Use single crc32 instruction to perform a hash on a 4 byte value. - * Fall back to software crc32 implementation in case SSE4.2 is - * not supported - * - * @param data - * Data to perform hash on. - * @param init_val - * Value to initialise hash generator. - * @return - * 32bit calculated hash value. - */ -static inline uint32_t -rte_hash_crc_4byte(uint32_t data, uint32_t init_val) -{ -#if defined RTE_ARCH_I686 || defined RTE_ARCH_X86_64 - if (likely(crc32_alg & CRC32_SSE42)) - return crc32c_sse42_u32(data, init_val); -#endif - - return crc32c_1word(data, init_val); -} - -/** - * Use single crc32 instruction to perform a hash on a 8 byte value. - * Fall back to software crc32 implementation in case SSE4.2 is - * not supported - * - * @param data - * Data to perform hash on. - * @param init_val - * Value to initialise hash generator. - * @return - * 32bit calculated hash value. - */ -static inline uint32_t -rte_hash_crc_8byte(uint64_t data, uint32_t init_val) -{ -#ifdef RTE_ARCH_X86_64 - if (likely(crc32_alg == CRC32_SSE42_x64)) - return crc32c_sse42_u64(data, init_val); -#endif - -#if defined RTE_ARCH_I686 || defined RTE_ARCH_X86_64 - if (likely(crc32_alg & CRC32_SSE42)) - return crc32c_sse42_u64_mimic(data, init_val); -#endif - - return crc32c_2words(data, init_val); -} - -#endif - -/** - * Calculate CRC32 hash on user-supplied byte array. - * - * @param data - * Data to perform hash on. - * @param data_len - * How many bytes to use to calculate hash value. - * @param init_val - * Value to initialise hash generator. - * @return - * 32bit calculated hash value. - */ -static inline uint32_t -rte_hash_crc(const void *data, uint32_t data_len, uint32_t init_val) -{ - unsigned i; - uint64_t temp = 0; - uintptr_t pd = (uintptr_t) data; - - for (i = 0; i < data_len / 8; i++) { - init_val = rte_hash_crc_8byte(*(const uint64_t *)pd, init_val); - pd += 8; - } - - switch (7 - (data_len & 0x07)) { - case 0: - temp |= (uint64_t) *((const uint8_t *)pd + 6) << 48; - /* Fallthrough */ - case 1: - temp |= (uint64_t) *((const uint8_t *)pd + 5) << 40; - /* Fallthrough */ - case 2: - temp |= (uint64_t) *((const uint8_t *)pd + 4) << 32; - temp |= *(const uint32_t *)pd; - init_val = rte_hash_crc_8byte(temp, init_val); - break; - case 3: - init_val = rte_hash_crc_4byte(*(const uint32_t *)pd, init_val); - break; - case 4: - temp |= *((const uint8_t *)pd + 2) << 16; - /* Fallthrough */ - case 5: - temp |= *((const uint8_t *)pd + 1) << 8; - /* Fallthrough */ - case 6: - temp |= *(const uint8_t *)pd; - init_val = rte_hash_crc_4byte(temp, init_val); - /* Fallthrough */ - default: - break; - } - - return init_val; -} - -#ifdef __cplusplus -} -#endif - -#endif /* _RTE_HASH_CRC_H_ */ diff --git a/src/dpdk22/lib/librte_hash/rte_jhash.h b/src/dpdk22/lib/librte_hash/rte_jhash.h deleted file mode 100644 index 457f225c..00000000 --- a/src/dpdk22/lib/librte_hash/rte_jhash.h +++ /dev/null @@ -1,410 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright(c) 2010-2015 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 _RTE_JHASH_H -#define _RTE_JHASH_H - -/** - * @file - * - * jhash functions. - */ - -#ifdef __cplusplus -extern "C" { -#endif - -#include <stdint.h> -#include <string.h> -#include <limits.h> - -#include <rte_log.h> -#include <rte_byteorder.h> - -/* jhash.h: Jenkins hash support. - * - * Copyright (C) 2006 Bob Jenkins (bob_jenkins@burtleburtle.net) - * - * http://burtleburtle.net/bob/hash/ - * - * These are the credits from Bob's sources: - * - * lookup3.c, by Bob Jenkins, May 2006, Public Domain. - * - * These are functions for producing 32-bit hashes for hash table lookup. - * hashword(), hashlittle(), hashlittle2(), hashbig(), mix(), and final() - * are externally useful functions. Routines to test the hash are included - * if SELF_TEST is defined. You can use this free for any purpose. It's in - * the public domain. It has no warranty. - * - * $FreeBSD$ - */ - -#define rot(x, k) (((x) << (k)) | ((x) >> (32-(k)))) - -/** @internal Internal function. NOTE: Arguments are modified. */ -#define __rte_jhash_mix(a, b, c) do { \ - a -= c; a ^= rot(c, 4); c += b; \ - b -= a; b ^= rot(a, 6); a += c; \ - c -= b; c ^= rot(b, 8); b += a; \ - a -= c; a ^= rot(c, 16); c += b; \ - b -= a; b ^= rot(a, 19); a += c; \ - c -= b; c ^= rot(b, 4); b += a; \ -} while (0) - -#define __rte_jhash_final(a, b, c) do { \ - c ^= b; c -= rot(b, 14); \ - a ^= c; a -= rot(c, 11); \ - b ^= a; b -= rot(a, 25); \ - c ^= b; c -= rot(b, 16); \ - a ^= c; a -= rot(c, 4); \ - b ^= a; b -= rot(a, 14); \ - c ^= b; c -= rot(b, 24); \ -} while (0) - -/** The golden ratio: an arbitrary value. */ -#define RTE_JHASH_GOLDEN_RATIO 0xdeadbeef - -#if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN -#define BIT_SHIFT(x, y, k) (((x) >> (k)) | ((uint64_t)(y) << (32-(k)))) -#else -#define BIT_SHIFT(x, y, k) (((uint64_t)(x) << (k)) | ((y) >> (32-(k)))) -#endif - -#define LOWER8b_MASK rte_le_to_cpu_32(0xff) -#define LOWER16b_MASK rte_le_to_cpu_32(0xffff) -#define LOWER24b_MASK rte_le_to_cpu_32(0xffffff) - -static inline void -__rte_jhash_2hashes(const void *key, uint32_t length, uint32_t *pc, - uint32_t *pb, unsigned check_align) -{ - uint32_t a, b, c; - - /* Set up the internal state */ - a = b = c = RTE_JHASH_GOLDEN_RATIO + ((uint32_t)length) + *pc; - c += *pb; - - /* - * Check key alignment. For x86 architecture, first case is always optimal - * If check_align is not set, first case will be used - */ -#if defined(RTE_ARCH_X86_64) || defined(RTE_ARCH_I686) || defined(RTE_ARCH_X86_X32) - const uint32_t *k = key; - const uint32_t s = 0; -#else - const uint32_t *k = (uint32_t *)((uintptr_t)key & (uintptr_t)~3); - const uint32_t s = ((uintptr_t)key & 3) * CHAR_BIT; -#endif - if (!check_align || s == 0) { - while (length > 12) { - a += k[0]; - b += k[1]; - c += k[2]; - - __rte_jhash_mix(a, b, c); - - k += 3; - length -= 12; - } - - switch (length) { - case 12: - c += k[2]; b += k[1]; a += k[0]; break; - case 11: - c += k[2] & LOWER24b_MASK; b += k[1]; a += k[0]; break; - case 10: - c += k[2] & LOWER16b_MASK; b += k[1]; a += k[0]; break; - case 9: - c += k[2] & LOWER8b_MASK; b += k[1]; a += k[0]; break; - case 8: - b += k[1]; a += k[0]; break; - case 7: - b += k[1] & LOWER24b_MASK; a += k[0]; break; - case 6: - b += k[1] & LOWER16b_MASK; a += k[0]; break; - case 5: - b += k[1] & LOWER8b_MASK; a += k[0]; break; - case 4: - a += k[0]; break; - case 3: - a += k[0] & LOWER24b_MASK; break; - case 2: - a += k[0] & LOWER16b_MASK; break; - case 1: - a += k[0] & LOWER8b_MASK; break; - /* zero length strings require no mixing */ - case 0: - *pc = c; - *pb = b; - return; - }; - } else { - /* all but the last block: affect some 32 bits of (a, b, c) */ - while (length > 12) { - a += BIT_SHIFT(k[0], k[1], s); - b += BIT_SHIFT(k[1], k[2], s); - c += BIT_SHIFT(k[2], k[3], s); - __rte_jhash_mix(a, b, c); - - k += 3; - length -= 12; - } - - /* last block: affect all 32 bits of (c) */ - switch (length) { - case 12: - a += BIT_SHIFT(k[0], k[1], s); - b += BIT_SHIFT(k[1], k[2], s); - c += BIT_SHIFT(k[2], k[3], s); - break; - case 11: - a += BIT_SHIFT(k[0], k[1], s); - b += BIT_SHIFT(k[1], k[2], s); - c += BIT_SHIFT(k[2], k[3], s) & LOWER24b_MASK; - break; - case 10: - a += BIT_SHIFT(k[0], k[1], s); - b += BIT_SHIFT(k[1], k[2], s); - c += BIT_SHIFT(k[2], k[3], s) & LOWER16b_MASK; - break; - case 9: - a += BIT_SHIFT(k[0], k[1], s); - b += BIT_SHIFT(k[1], k[2], s); - c += BIT_SHIFT(k[2], k[3], s) & LOWER8b_MASK; - break; - case 8: - a += BIT_SHIFT(k[0], k[1], s); - b += BIT_SHIFT(k[1], k[2], s); - break; - case 7: - a += BIT_SHIFT(k[0], k[1], s); - b += BIT_SHIFT(k[1], k[2], s) & LOWER24b_MASK; - break; - case 6: - a += BIT_SHIFT(k[0], k[1], s); - b += BIT_SHIFT(k[1], k[2], s) & LOWER16b_MASK; - break; - case 5: - a += BIT_SHIFT(k[0], k[1], s); - b += BIT_SHIFT(k[1], k[2], s) & LOWER8b_MASK; - break; - case 4: - a += BIT_SHIFT(k[0], k[1], s); - break; - case 3: - a += BIT_SHIFT(k[0], k[1], s) & LOWER24b_MASK; - break; - case 2: - a += BIT_SHIFT(k[0], k[1], s) & LOWER16b_MASK; - break; - case 1: - a += BIT_SHIFT(k[0], k[1], s) & LOWER8b_MASK; - break; - /* zero length strings require no mixing */ - case 0: - *pc = c; - *pb = b; - return; - } - } - - __rte_jhash_final(a, b, c); - - *pc = c; - *pb = b; -} - -/** - * Same as rte_jhash, but takes two seeds and return two uint32_ts. - * pc and pb must be non-null, and *pc and *pb must both be initialized - * with seeds. If you pass in (*pb)=0, the output (*pc) will be - * the same as the return value from rte_jhash. - * - * @param key - * Key to calculate hash of. - * @param length - * Length of key in bytes. - * @param pc - * IN: seed OUT: primary hash value. - * @param pb - * IN: second seed OUT: secondary hash value. - */ -static inline void -rte_jhash_2hashes(const void *key, uint32_t length, uint32_t *pc, uint32_t *pb) -{ - __rte_jhash_2hashes(key, length, pc, pb, 1); -} - -/** - * Same as rte_jhash_32b, but takes two seeds and return two uint32_ts. - * pc and pb must be non-null, and *pc and *pb must both be initialized - * with seeds. If you pass in (*pb)=0, the output (*pc) will be - * the same as the return value from rte_jhash_32b. - * - * @param k - * Key to calculate hash of. - * @param length - * Length of key in units of 4 bytes. - * @param pc - * IN: seed OUT: primary hash value. - * @param pb - * IN: second seed OUT: secondary hash value. - */ -static inline void -rte_jhash_32b_2hashes(const uint32_t *k, uint32_t length, uint32_t *pc, uint32_t *pb) -{ - __rte_jhash_2hashes((const void *) k, (length << 2), pc, pb, 0); -} - -/** - * The most generic version, hashes an arbitrary sequence - * of bytes. No alignment or length assumptions are made about - * the input key. - * - * @param key - * Key to calculate hash of. - * @param length - * Length of key in bytes. - * @param initval - * Initialising value of hash. - * @return - * Calculated hash value. - */ -static inline uint32_t -rte_jhash(const void *key, uint32_t length, uint32_t initval) -{ - uint32_t initval2 = 0; - - rte_jhash_2hashes(key, length, &initval, &initval2); - - return initval; -} - -/** - * A special optimized version that handles 1 or more of uint32_ts. - * The length parameter here is the number of uint32_ts in the key. - * - * @param k - * Key to calculate hash of. - * @param length - * Length of key in units of 4 bytes. - * @param initval - * Initialising value of hash. - * @return - * Calculated hash value. - */ -static inline uint32_t -rte_jhash_32b(const uint32_t *k, uint32_t length, uint32_t initval) -{ - uint32_t initval2 = 0; - - rte_jhash_32b_2hashes(k, length, &initval, &initval2); - - return initval; -} - -static inline uint32_t -__rte_jhash_3words(uint32_t a, uint32_t b, uint32_t c, uint32_t initval) -{ - a += RTE_JHASH_GOLDEN_RATIO + initval; - b += RTE_JHASH_GOLDEN_RATIO + initval; - c += RTE_JHASH_GOLDEN_RATIO + initval; - - __rte_jhash_final(a, b, c); - - return c; -} - -/** - * A special ultra-optimized versions that knows it is hashing exactly - * 3 words. - * - * @param a - * First word to calculate hash of. - * @param b - * Second word to calculate hash of. - * @param c - * Third word to calculate hash of. - * @param initval - * Initialising value of hash. - * @return - * Calculated hash value. - */ -static inline uint32_t -rte_jhash_3words(uint32_t a, uint32_t b, uint32_t c, uint32_t initval) -{ - return __rte_jhash_3words(a + 12, b + 12, c + 12, initval); -} - -/** - * A special ultra-optimized versions that knows it is hashing exactly - * 2 words. - * - * @param a - * First word to calculate hash of. - * @param b - * Second word to calculate hash of. - * @param initval - * Initialising value of hash. - * @return - * Calculated hash value. - */ -static inline uint32_t -rte_jhash_2words(uint32_t a, uint32_t b, uint32_t initval) -{ - return __rte_jhash_3words(a + 8, b + 8, 8, initval); -} - -/** - * A special ultra-optimized versions that knows it is hashing exactly - * 1 word. - * - * @param a - * Word to calculate hash of. - * @param initval - * Initialising value of hash. - * @return - * Calculated hash value. - */ -static inline uint32_t -rte_jhash_1word(uint32_t a, uint32_t initval) -{ - return __rte_jhash_3words(a + 4, 4, 4, initval); -} - -#ifdef __cplusplus -} -#endif - -#endif /* _RTE_JHASH_H */ diff --git a/src/dpdk22/lib/librte_hash/rte_thash.h b/src/dpdk22/lib/librte_hash/rte_thash.h deleted file mode 100644 index d98e98e7..00000000 --- a/src/dpdk22/lib/librte_hash/rte_thash.h +++ /dev/null @@ -1,250 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright(c) 2015 Vladimir Medvedkin <medvedkinv@gmail.com> - * 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 _RTE_THASH_H -#define _RTE_THASH_H - -/** - * @file - * - * toeplitz hash functions. - */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Software implementation of the Toeplitz hash function used by RSS. - * Can be used either for packet distribution on single queue NIC - * or for simulating of RSS computation on specific NIC (for example - * after GRE header decapsulating) - */ - -#include <stdint.h> -#include <rte_byteorder.h> -#include <rte_ip.h> - -#ifdef __SSE3__ -#include <rte_vect.h> -#endif - -#ifdef __SSE3__ -/* Byte swap mask used for converting IPv6 address - * 4-byte chunks to CPU byte order - */ -static const __m128i rte_thash_ipv6_bswap_mask = { - 0x0405060700010203ULL, 0x0C0D0E0F08090A0BULL}; -#endif - -/** - * length in dwords of input tuple to - * calculate hash of ipv4 header only - */ -#define RTE_THASH_V4_L3_LEN ((sizeof(struct rte_ipv4_tuple) - \ - sizeof(((struct rte_ipv4_tuple *)0)->sctp_tag)) / 4) - -/** - * length in dwords of input tuple to - * calculate hash of ipv4 header + - * transport header - */ -#define RTE_THASH_V4_L4_LEN ((sizeof(struct rte_ipv4_tuple)) / 4) - -/** - * length in dwords of input tuple to - * calculate hash of ipv6 header only - */ -#define RTE_THASH_V6_L3_LEN ((sizeof(struct rte_ipv6_tuple) - \ - sizeof(((struct rte_ipv6_tuple *)0)->sctp_tag)) / 4) - -/** - * length in dwords of input tuple to - * calculate hash of ipv6 header + - * transport header - */ -#define RTE_THASH_V6_L4_LEN ((sizeof(struct rte_ipv6_tuple)) / 4) - -/** - * IPv4 tuple - * addresses and ports/sctp_tag have to be CPU byte order - */ -struct rte_ipv4_tuple { - uint32_t src_addr; - uint32_t dst_addr; - union { - struct { - uint16_t dport; - uint16_t sport; - }; - uint32_t sctp_tag; - }; -}; - -/** - * IPv6 tuple - * Addresses have to be filled by rte_thash_load_v6_addr() - * ports/sctp_tag have to be CPU byte order - */ -struct rte_ipv6_tuple { - uint8_t src_addr[16]; - uint8_t dst_addr[16]; - union { - struct { - uint16_t dport; - uint16_t sport; - }; - uint32_t sctp_tag; - }; -}; - -union rte_thash_tuple { - struct rte_ipv4_tuple v4; - struct rte_ipv6_tuple v6; -#ifdef __SSE3__ -} __attribute__((aligned(XMM_SIZE))); -#else -}; -#endif - -/** - * Prepare special converted key to use with rte_softrss_be() - * @param orig - * pointer to original RSS key - * @param targ - * pointer to target RSS key - * @param len - * RSS key length - */ -static inline void -rte_convert_rss_key(const uint32_t *orig, uint32_t *targ, int len) -{ - int i; - - for (i = 0; i < (len >> 2); i++) - targ[i] = rte_be_to_cpu_32(orig[i]); -} - -/** - * Prepare and load IPv6 addresses (src and dst) - * into target tuple - * @param orig - * Pointer to ipv6 header of the original packet - * @param targ - * Pointer to rte_ipv6_tuple structure - */ -static inline void -rte_thash_load_v6_addrs(const struct ipv6_hdr *orig, union rte_thash_tuple *targ) -{ -#ifdef __SSE3__ - __m128i ipv6 = _mm_loadu_si128((const __m128i *)orig->src_addr); - *(__m128i *)targ->v6.src_addr = - _mm_shuffle_epi8(ipv6, rte_thash_ipv6_bswap_mask); - ipv6 = _mm_loadu_si128((const __m128i *)orig->dst_addr); - *(__m128i *)targ->v6.dst_addr = - _mm_shuffle_epi8(ipv6, rte_thash_ipv6_bswap_mask); -#else - int i; - for (i = 0; i < 4; i++) { - *((uint32_t *)targ->v6.src_addr + i) = - rte_be_to_cpu_32(*((const uint32_t *)orig->src_addr + i)); - *((uint32_t *)targ->v6.dst_addr + i) = - rte_be_to_cpu_32(*((const uint32_t *)orig->dst_addr + i)); - } -#endif -} - -/** - * Generic implementation. Can be used with original rss_key - * @param input_tuple - * Pointer to input tuple - * @param input_len - * Length of input_tuple in 4-bytes chunks - * @param rss_key - * Pointer to RSS hash key. - * @return - * Calculated hash value. - */ -static inline uint32_t -rte_softrss(uint32_t *input_tuple, uint32_t input_len, - const uint8_t *rss_key) -{ - uint32_t i, j, ret = 0; - - for (j = 0; j < input_len; j++) { - for (i = 0; i < 32; i++) { - if (input_tuple[j] & (1 << (31 - i))) { - ret ^= rte_cpu_to_be_32(((const uint32_t *)rss_key)[j]) << i | - (uint32_t)((uint64_t)(rte_cpu_to_be_32(((const uint32_t *)rss_key)[j + 1])) >> - (32 - i)); - } - } - } - return ret; -} - -/** - * Optimized implementation. - * If you want the calculated hash value matches NIC RSS value - * you have to use special converted key with rte_convert_rss_key() fn. - * @param input_tuple - * Pointer to input tuple - * @param input_len - * Length of input_tuple in 4-bytes chunks - * @param *rss_key - * Pointer to RSS hash key. - * @return - * Calculated hash value. - */ -static inline uint32_t -rte_softrss_be(uint32_t *input_tuple, uint32_t input_len, - const uint8_t *rss_key) -{ - uint32_t i, j, ret = 0; - - for (j = 0; j < input_len; j++) { - for (i = 0; i < 32; i++) { - if (input_tuple[j] & (1 << (31 - i))) { - ret ^= ((const uint32_t *)rss_key)[j] << i | - (uint32_t)((uint64_t)(((const uint32_t *)rss_key)[j + 1]) >> (32 - i)); - } - } - } - return ret; -} - -#ifdef __cplusplus -} -#endif - -#endif /* _RTE_THASH_H */ |