@@ -159,6 +159,7 @@ Bernard Iremonger <bernard.iremonger@intel.com>
Bert van Leeuwen <bert.vanleeuwen@netronome.com>
Bhagyada Modali <bhagyada.modali@amd.com>
Bharat Mota <bmota@vmware.com>
+Bili Dong <qobilidop@gmail.com>
Bill Hong <bhong@brocade.com>
Billy McFall <bmcfall@redhat.com>
Billy O'Mahony <billy.o.mahony@intel.com>
@@ -15,6 +15,7 @@
#include <rte_hash.h>
#include <rte_jhash.h>
#include <rte_hash_crc.h>
+#include <rte_hash_xor.h>
#include "test.h"
@@ -22,8 +23,8 @@
* Hash values calculated for key sizes from array "hashtest_key_lens"
* and for initial values from array "hashtest_initvals.
* Each key will be formed by increasing each byte by 1:
- * e.g.: key size = 4, key = 0x03020100
- * key size = 8, key = 0x0706050403020100
+ * e.g.: key size = 4, key = 0x00010203
+ * key size = 8, key = 0x0001020304050607
*/
static uint32_t hash_values_jhash[2][12] = {{
0x8ba9414b, 0xdf0d39c9,
@@ -51,6 +52,19 @@ static uint32_t hash_values_crc[2][12] = {{
0x789c104f, 0x53028d3e
}
};
+static uint32_t hash_values_xor[2][12] = {{
+ 0x00000000, 0x00010000,
+ 0x00010203, 0x04040404, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0c040404, 0x000d0e0f,
+ 0x04212223, 0x04040404
+},
+{
+ 0xdeadbeef, 0xdeacbeef,
+ 0xdeacbcec, 0xdaa9baeb, 0xdeadbeef, 0xdeadbeef,
+ 0xdeadbeef, 0xdeadbeef, 0xd2a9baeb, 0xdea0b0e0,
+ 0xda8c9ccc, 0xdaa9baeb
+}
+};
/*******************************************************************************
* Hash function performance test configuration section. Each performance test
@@ -61,7 +75,7 @@ static uint32_t hash_values_crc[2][12] = {{
*/
#define HASHTEST_ITERATIONS 1000000
#define MAX_KEYSIZE 64
-static rte_hash_function hashtest_funcs[] = {rte_jhash, rte_hash_crc};
+static rte_hash_function hashtest_funcs[] = {rte_jhash, rte_hash_crc, rte_hash_xor};
static uint32_t hashtest_initvals[] = {0, 0xdeadbeef};
static uint32_t hashtest_key_lens[] = {
1, 2, /* Unusual key sizes */
@@ -85,6 +99,9 @@ get_hash_name(rte_hash_function f)
if (f == rte_hash_crc)
return "rte_hash_crc";
+ if (f == rte_hash_xor)
+ return "rte_hash_xor";
+
return "UnknownHash";
}
@@ -173,6 +190,16 @@ verify_precalculated_hash_func_tests(void)
hash_values_crc[j][i], hash);
return -1;
}
+
+ hash = rte_hash_xor(key, hashtest_key_lens[i],
+ hashtest_initvals[j]);
+ if (hash != hash_values_xor[j][i]) {
+ printf("XOR for %u bytes with initial value 0x%x."
+ "Expected 0x%x, but got 0x%x\n",
+ hashtest_key_lens[i], hashtest_initvals[j],
+ hash_values_xor[j][i], hash);
+ return -1;
+ }
}
}
new file mode 100644
@@ -0,0 +1,64 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2023 Intel Corporation
+ */
+
+#ifndef _RTE_HASH_XOR_H_
+#define _RTE_HASH_XOR_H_
+
+/**
+ * @file
+ *
+ * RTE XOR Hash
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+
+#include <rte_byteorder.h>
+
+#define LEFT8b_MASK rte_cpu_to_be_32(0xff000000)
+#define LEFT16b_MASK rte_cpu_to_be_32(0xffff0000)
+
+/**
+ * Calculate XOR32 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_xor(const void *data, uint32_t data_len, uint32_t init_val)
+{
+ uintptr_t pd = (uintptr_t) data;
+ init_val = rte_cpu_to_be_32(init_val);
+
+ for (uint32_t i = 0; i < data_len / 4; i++) {
+ init_val ^= *(const uint32_t *)pd;
+ pd += 4;
+ }
+
+ if (data_len & 0x2) {
+ init_val ^= *(const uint32_t *)pd & LEFT16b_MASK;
+ pd += 2;
+ }
+
+ if (data_len & 0x1)
+ init_val ^= *(const uint32_t *)pd & LEFT8b_MASK;
+
+ init_val = rte_be_to_cpu_32(init_val);
+ return init_val;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RTE_HASH_XOR_H_ */