summaryrefslogtreecommitdiffstats
path: root/src/vlib/node.h
diff options
context:
space:
mode:
authorDamjan Marion <damarion@cisco.com>2021-03-10 14:35:28 +0100
committerDave Wallace <dwallacelf@gmail.com>2021-03-11 17:30:34 +0000
commita31698bb7401f6e2389c0e805bf280ae52278524 (patch)
tree05d7940ef2e137cf885941f682a0b39402adb424 /src/vlib/node.h
parentaa479bb91d0c75b603e6c8828e6fffa0c70c5a0c (diff)
vlib: refactor node function variants
It allows default variant selection from startup.conf Type: improvement Change-Id: Idff95e12dd0c105dab7c905089548b05a6e974e0 Signed-off-by: Damjan Marion <damarion@cisco.com>
Diffstat (limited to 'src/vlib/node.h')
-rw-r--r--src/vlib/node.h56
1 files changed, 36 insertions, 20 deletions
diff --git a/src/vlib/node.h b/src/vlib/node.h
index 0c815eaa4d2..9a3bb8370af 100644
--- a/src/vlib/node.h
+++ b/src/vlib/node.h
@@ -89,9 +89,8 @@ typedef enum
typedef struct _vlib_node_fn_registration
{
vlib_node_function_t *function;
- int priority;
+ clib_march_variant_type_t march_variant;
struct _vlib_node_fn_registration *next_registration;
- char *name;
} vlib_node_fn_registration_t;
typedef struct _vlib_node_registration
@@ -200,24 +199,24 @@ static __clib_unused vlib_node_registration_t __clib_unused_##x
#define CLIB_MARCH_VARIANT_STR _CLIB_MARCH_VARIANT_STR(CLIB_MARCH_VARIANT)
#endif
-#define VLIB_NODE_FN(node) \
-uword CLIB_MARCH_SFX (node##_fn)(); \
-static vlib_node_fn_registration_t \
- CLIB_MARCH_SFX(node##_fn_registration) = \
- { .function = &CLIB_MARCH_SFX (node##_fn), }; \
- \
-static void __clib_constructor \
-CLIB_MARCH_SFX (node##_multiarch_register) (void) \
-{ \
- extern vlib_node_registration_t node; \
- vlib_node_fn_registration_t *r; \
- r = & CLIB_MARCH_SFX (node##_fn_registration); \
- r->priority = CLIB_MARCH_FN_PRIORITY(); \
- r->name = CLIB_MARCH_VARIANT_STR; \
- r->next_registration = node.node_fn_registrations; \
- node.node_fn_registrations = r; \
-} \
-uword CLIB_CPU_OPTIMIZED CLIB_MARCH_SFX (node##_fn)
+#define VLIB_NODE_FN(node) \
+ uword CLIB_MARCH_SFX (node##_fn) (); \
+ static vlib_node_fn_registration_t CLIB_MARCH_SFX ( \
+ node##_fn_registration) = { \
+ .function = &CLIB_MARCH_SFX (node##_fn), \
+ }; \
+ \
+ static void __clib_constructor CLIB_MARCH_SFX (node##_multiarch_register) ( \
+ void) \
+ { \
+ extern vlib_node_registration_t node; \
+ vlib_node_fn_registration_t *r; \
+ r = &CLIB_MARCH_SFX (node##_fn_registration); \
+ r->march_variant = CLIB_MARCH_SFX (CLIB_MARCH_VARIANT_TYPE); \
+ r->next_registration = node.node_fn_registrations; \
+ node.node_fn_registrations = r; \
+ } \
+ uword CLIB_CPU_OPTIMIZED CLIB_MARCH_SFX (node##_fn)
unformat_function_t unformat_vlib_node_variant;
@@ -657,6 +656,14 @@ vlib_timing_wheel_data_get_index (u32 d)
typedef struct
{
+ clib_march_variant_type_t index;
+ int priority;
+ char *suffix;
+ char *desc;
+} vlib_node_fn_variant_t;
+
+typedef struct
+{
/* Public nodes. */
vlib_node_t **nodes;
@@ -727,6 +734,15 @@ typedef struct
/* Node index from error code */
u32 *node_by_error;
+
+ /* Node Function Variants */
+ vlib_node_fn_variant_t *variants;
+
+ /* Node Function Default Variant Index */
+ u32 node_fn_default_march_variant;
+
+ /* Node Function march Variant by Suffix Hash */
+ uword *node_fn_march_variant_by_suffix;
} vlib_node_main_t;
typedef u16 vlib_error_t;