X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=vnet%2Fvnet%2Ffeature%2Ffeature.h;h=96d573b69f63115de06e78d782bc907914f95adc;hb=7490a752814187ed03c0deca4d836b0dca09fb4b;hp=765af356d3f8cb5268aa392a5643bc59a4ce18e6;hpb=05bb1dd7a9b356df1acb73bc13b6a30dae67be55;p=vpp.git diff --git a/vnet/vnet/feature/feature.h b/vnet/vnet/feature/feature.h index 765af356d3f..96d573b69f6 100644 --- a/vnet/vnet/feature/feature.h +++ b/vnet/vnet/feature/feature.h @@ -17,6 +17,7 @@ #define included_features_h #include +#include /** feature registration object */ typedef struct _vnet_feature_arc_registration @@ -30,8 +31,13 @@ typedef struct _vnet_feature_arc_registration int n_start_nodes; /* Feature arc index, assigned by init function */ u8 feature_arc_index; + u8 *arc_index_ptr; } vnet_feature_arc_registration_t; +/* Enable feature callback. */ +typedef clib_error_t *(vnet_feature_enable_disable_function_t) + (u32 sw_if_index, int enable_disable); + /** feature registration object */ typedef struct _vnet_feature_registration { @@ -42,12 +48,15 @@ typedef struct _vnet_feature_registration /** Graph node name */ char *node_name; /** Pointer to this feature index, filled in by vnet_feature_arc_init */ - u32 *feature_index; - u32 feature_index_u32; + u32 *feature_index_ptr; + u32 feature_index; /** Constraints of the form "this feature runs before X" */ char **runs_before; /** Constraints of the form "this feature runs after Y" */ char **runs_after; + + /** Function to enable/disable feature **/ + vnet_feature_enable_disable_function_t *enable_disable_cb; } vnet_feature_registration_t; typedef struct vnet_feature_config_main_t_ @@ -119,13 +128,39 @@ vnet_config_update_feature_count (vnet_feature_main_t * fm, u8 arc, u32 vnet_get_feature_index (u8 arc, const char *s); u8 vnet_get_feature_arc_index (const char *s); +vnet_feature_registration_t *vnet_get_feature_reg (const char *arc_name, + const char *node_name); -void + +int +vnet_feature_enable_disable_with_index (u8 arc_index, u32 feature_index, + u32 sw_if_index, int enable_disable, + void *feature_config, + u32 n_feature_config_bytes); + +int vnet_feature_enable_disable (const char *arc_name, const char *node_name, u32 sw_if_index, int enable_disable, void *feature_config, u32 n_feature_config_bytes); +static inline vnet_feature_config_main_t * +vnet_get_feature_arc_config_main (u8 arc_index) +{ + vnet_feature_main_t *fm = &feature_main; + + if (arc_index == (u8) ~ 0) + return 0; + + return &fm->feature_config_mains[arc_index]; +} + +static_always_inline vnet_feature_config_main_t * +vnet_feature_get_config_main (u16 arc) +{ + vnet_feature_main_t *fm = &feature_main; + return &fm->feature_config_mains[arc]; +} static_always_inline int vnet_have_features (u8 arc, u32 sw_if_index) @@ -258,7 +293,6 @@ vnet_feature_start_device_input_x2 (u32 sw_if_index, } -#define ORDER_CONSTRAINTS (char*[]) #define VNET_FEATURES(...) (char*[]) { __VA_ARGS__, 0} clib_error_t *vnet_feature_arc_init (vlib_main_t * vm,