diff options
Diffstat (limited to 'src/vnet/feature')
-rw-r--r-- | src/vnet/feature/feature.c | 60 | ||||
-rw-r--r-- | src/vnet/feature/feature.h | 4 |
2 files changed, 63 insertions, 1 deletions
diff --git a/src/vnet/feature/feature.c b/src/vnet/feature/feature.c index c93f586c349..1750612783b 100644 --- a/src/vnet/feature/feature.c +++ b/src/vnet/feature/feature.c @@ -293,9 +293,10 @@ vnet_feature_enable_disable_with_index (u8 arc_index, u32 feature_index, fm->sw_if_index_has_features[arc_index] = clib_bitmap_set (fm->sw_if_index_has_features[arc_index], sw_if_index, (feature_count > 0)); + fm->feature_count_by_sw_if_index[arc_index][sw_if_index] = feature_count; + vnet_feature_reg_invoke (sw_if_index, arc_index, (feature_count > 0)); - fm->feature_count_by_sw_if_index[arc_index][sw_if_index] = feature_count; return 0; } @@ -375,6 +376,52 @@ vnet_feature_is_enabled (const char *arc_name, const char *feature_node_name, return 0; } +u32 +vnet_feature_get_end_node (u8 arc_index, u32 sw_if_index) +{ + vnet_feature_main_t *fm = &feature_main; + vnet_feature_config_main_t *cm; + u32 ci; + + if (arc_index == (u8) ~0) + return VNET_API_ERROR_INVALID_VALUE; + + cm = &fm->feature_config_mains[arc_index]; + vec_validate_init_empty (cm->config_index_by_sw_if_index, sw_if_index, ~0); + ci = cm->config_index_by_sw_if_index[sw_if_index]; + + return (vnet_config_get_end_node (vlib_get_main (), &cm->config_main, ci)); +} + +u32 +vnet_feature_reset_end_node (u8 arc_index, u32 sw_if_index) +{ + vnet_feature_main_t *fm = &feature_main; + vnet_feature_config_main_t *cm; + u32 ci; + + cm = &fm->feature_config_mains[arc_index]; + vec_validate_init_empty (cm->config_index_by_sw_if_index, sw_if_index, ~0); + ci = cm->config_index_by_sw_if_index[sw_if_index]; + + ci = vnet_config_reset_end_node (vlib_get_main (), &cm->config_main, ci); + + if (ci != ~0) + cm->config_index_by_sw_if_index[sw_if_index] = ci; + + i16 feature_count; + + if (NULL == fm->feature_count_by_sw_if_index || + vec_len (fm->feature_count_by_sw_if_index) <= arc_index || + vec_len (fm->feature_count_by_sw_if_index[arc_index]) <= sw_if_index) + feature_count = 0; + else + feature_count = fm->feature_count_by_sw_if_index[arc_index][sw_if_index]; + + vnet_feature_reg_invoke (sw_if_index, arc_index, (feature_count > 0)); + + return ci; +} u32 vnet_feature_modify_end_node (u8 arc_index, @@ -400,6 +447,17 @@ vnet_feature_modify_end_node (u8 arc_index, if (ci != ~0) cm->config_index_by_sw_if_index[sw_if_index] = ci; + i16 feature_count; + + if (NULL == fm->feature_count_by_sw_if_index || + vec_len (fm->feature_count_by_sw_if_index) <= arc_index || + vec_len (fm->feature_count_by_sw_if_index[arc_index]) <= sw_if_index) + feature_count = 0; + else + feature_count = fm->feature_count_by_sw_if_index[arc_index][sw_if_index]; + + vnet_feature_reg_invoke (sw_if_index, arc_index, (feature_count > 0)); + return ci; } diff --git a/src/vnet/feature/feature.h b/src/vnet/feature/feature.h index 9aa32182ef6..a8235d3d9ee 100644 --- a/src/vnet/feature/feature.h +++ b/src/vnet/feature/feature.h @@ -222,6 +222,10 @@ vnet_feature_enable_disable (const char *arc_name, const char *node_name, 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) { |