summaryrefslogtreecommitdiffstats
path: root/src/vnet/hash/hash.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/vnet/hash/hash.h')
-rw-r--r--src/vnet/hash/hash.h59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/vnet/hash/hash.h b/src/vnet/hash/hash.h
new file mode 100644
index 00000000000..c1eb9475e28
--- /dev/null
+++ b/src/vnet/hash/hash.h
@@ -0,0 +1,59 @@
+/*
+ * SPDX-License-Identifier: Apache-2.0
+ * Copyright(c) 2021 Cisco Systems, Inc.
+ */
+
+#ifndef __VNET_HASH_H__
+#define __VNET_HASH_H__
+
+#include <vlib/vlib.h>
+
+#define foreach_vnet_hash_fn_types \
+ _ (ETHERNET, 0, "hash-fn-ethernet") \
+ _ (IP, 1, "hash-fn-ip")
+
+typedef enum
+{
+#define _(f, n, s) VNET_HASH_FN_TYPE_##f,
+ foreach_vnet_hash_fn_types
+#undef _
+ VNET_HASH_FN_TYPE_N,
+} vnet_hash_fn_type_t;
+
+typedef void (*vnet_hash_fn_t) (void **p, u32 *h, u32 n_packets);
+
+typedef struct vnet_hash_function_registration
+{
+ const char *name;
+ const char *description;
+ int priority;
+ vnet_hash_fn_t function[VNET_HASH_FN_TYPE_N];
+
+ struct vnet_hash_function_registration *next;
+} vnet_hash_function_registration_t;
+
+typedef struct
+{
+ vnet_hash_function_registration_t *hash_registrations;
+} vnet_hash_main_t;
+
+extern vnet_hash_main_t vnet_hash_main;
+
+#define VNET_REGISTER_HASH_FUNCTION(x, ...) \
+ __VA_ARGS__ vnet_hash_function_registration_t __vnet_hash_function_##x; \
+ static void __clib_constructor __vnet_hash_function_registration_##x (void) \
+ { \
+ vnet_hash_main_t *hm = &vnet_hash_main; \
+ __vnet_hash_function_##x.next = hm->hash_registrations; \
+ hm->hash_registrations = &__vnet_hash_function_##x; \
+ } \
+ __VA_ARGS__ vnet_hash_function_registration_t __vnet_hash_function_##x
+
+vnet_hash_fn_t vnet_hash_default_function (vnet_hash_fn_type_t ftype);
+vnet_hash_fn_t vnet_hash_function_from_name (const char *name,
+ vnet_hash_fn_type_t ftype);
+vnet_hash_function_registration_t *
+vnet_hash_function_from_func (vnet_hash_fn_t fn, vnet_hash_fn_type_t ftype);
+format_function_t format_vnet_hash;
+
+#endif