X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Ffeature%2Ffeature.h;h=a8235d3d9eef2356878cba1501af34fd8cf0cc6b;hb=1457828c596c56f271d71f9a56c39728ee9e4c67;hp=5c202dda274201aa51edfd1fbd1c9adf77e0d461;hpb=2dd192b76774beb9c7960527fb3f397a2848f679;p=vpp.git diff --git a/src/vnet/feature/feature.h b/src/vnet/feature/feature.h index 5c202dda274..a8235d3d9ee 100644 --- a/src/vnet/feature/feature.h +++ b/src/vnet/feature/feature.h @@ -30,6 +30,8 @@ typedef struct _vnet_feature_arc_registration /** Start nodes */ char **start_nodes; int n_start_nodes; + /** End of the arc (optional, for consistency-checking) */ + char *last_in_arc; /* Feature arc index, assigned by init function */ u8 feature_arc_index; u8 *arc_index_ptr; @@ -217,6 +219,20 @@ vnet_feature_enable_disable (const char *arc_name, const char *node_name, void *feature_config, u32 n_feature_config_bytes); +u32 +vnet_feature_modify_end_node (u8 arc_index, u32 sw_if_index, u32 node_index); + +u32 vnet_feature_get_end_node (u8 arc_index, u32 sw_if_index); + +u32 vnet_feature_reset_end_node (u8 arc_index, u32 sw_if_index); + +static_always_inline u32 +vnet_get_feature_count (u8 arc, u32 sw_if_index) +{ + vnet_feature_main_t *fm = &feature_main; + return (fm->feature_count_by_sw_if_index[arc][sw_if_index]); +} + static inline vnet_feature_config_main_t * vnet_get_feature_arc_config_main (u8 arc_index) { @@ -269,6 +285,23 @@ vnet_feature_arc_start_with_data (u8 arc, u32 sw_if_index, u32 * next, return 0; } +static_always_inline void * +vnet_feature_arc_start_w_cfg_index (u8 arc, + u32 sw_if_index, + u32 * next, + vlib_buffer_t * b, u32 cfg_index) +{ + vnet_feature_main_t *fm = &feature_main; + vnet_feature_config_main_t *cm; + cm = &fm->feature_config_mains[arc]; + + vnet_buffer (b)->feature_arc_index = arc; + b->current_config_index = cfg_index; + + return vnet_get_config_data (&cm->config_main, &b->current_config_index, + next, 0); +} + static_always_inline void vnet_feature_arc_start (u8 arc, u32 sw_if_index, u32 * next0, vlib_buffer_t * b0) @@ -295,6 +328,14 @@ vnet_feature_next (u32 * next0, vlib_buffer_t * b0) vnet_feature_next_with_data (next0, b0, 0); } +static_always_inline void +vnet_feature_next_u16 (u16 * next0, vlib_buffer_t * b0) +{ + u32 next32; + vnet_feature_next_with_data (&next32, b0, 0); + *next0 = next32; +} + static_always_inline int vnet_device_input_have_features (u32 sw_if_index) { @@ -437,6 +478,7 @@ clib_error_t *vnet_feature_arc_init vnet_config_main_t * vcm, char **feature_start_nodes, int num_feature_start_nodes, + char *last_in_arc, vnet_feature_registration_t * first_reg, vnet_feature_constraint_registration_t * first_const_set, char ***in_feature_nodes); @@ -444,6 +486,16 @@ clib_error_t *vnet_feature_arc_init void vnet_interface_features_show (vlib_main_t * vm, u32 sw_if_index, int verbose); +typedef void (*vnet_feature_update_cb_t) (u32 sw_if_index, + u8 arc_index, + u8 is_enable, void *cb); + +extern void vnet_feature_register (vnet_feature_update_cb_t cb, void *data); + +int +vnet_feature_is_enabled (const char *arc_name, const char *feature_node_name, + u32 sw_if_index); + #endif /* included_feature_h */ /*