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>
This commit is contained in:
Damjan Marion
2021-03-10 14:35:28 +01:00
committed by Dave Wallace
parent aa479bb91d
commit a31698bb74
10 changed files with 256 additions and 235 deletions

View File

@ -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;
@ -655,6 +654,14 @@ vlib_timing_wheel_data_get_index (u32 d)
return d / 2;
}
typedef struct
{
clib_march_variant_type_t index;
int priority;
char *suffix;
char *desc;
} vlib_node_fn_variant_t;
typedef struct
{
/* Public 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;