X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Ffeature%2Ffeature.c;h=89a1951663e75d9d2ae286575a3d729a4bc7f0bd;hb=3ecc221162d644884048014dbd399a1f78b89700;hp=032fe784acec7e28bdb01d87e8cda25c78b927a1;hpb=7cd468a3d7dee7d6c92f69a0bb7061ae208ec727;p=vpp.git diff --git a/src/vnet/feature/feature.c b/src/vnet/feature/feature.c index 032fe784ace..89a1951663e 100644 --- a/src/vnet/feature/feature.c +++ b/src/vnet/feature/feature.c @@ -14,6 +14,7 @@ */ #include +#include vnet_feature_main_t feature_main; @@ -64,8 +65,11 @@ vnet_feature_init (vlib_main_t * vm) vnet_feature_registration_t *next; uword *p = hash_get_mem (fm->arc_index_by_name, freg->arc_name); if (p == 0) - return clib_error_return (0, "Unknown feature arc '%s'", - freg->arc_name); + { + /* Don't start vpp with broken features arcs */ + clib_warning ("Unknown feature arc '%s'", freg->arc_name); + os_exit (1); + } areg = uword_to_pointer (p[0], vnet_feature_arc_registration_t *); arc_index = areg->feature_arc_index; @@ -94,7 +98,8 @@ vnet_feature_init (vlib_main_t * vm) fm->next_feature_by_arc[arc_index], &fm->feature_nodes[arc_index]))) { - return error; + clib_error_report (error); + os_exit (1); } fm->next_feature_by_name[arc_index] = @@ -108,9 +113,6 @@ vnet_feature_init (vlib_main_t * vm) freg = freg->next; } - cm->end_feature_index = - vnet_get_feature_index (arc_index, areg->end_node); - /* next */ areg = areg->next; arc_index++; @@ -184,8 +186,7 @@ vnet_feature_enable_disable_with_index (u8 arc_index, u32 feature_index, vnet_feature_main_t *fm = &feature_main; vnet_feature_config_main_t *cm; i16 feature_count; - int is_first_or_last; - u32 ci; + u32 old_ci, ci; if (arc_index == (u8) ~ 0) return VNET_API_ERROR_INVALID_VALUE; @@ -195,7 +196,7 @@ vnet_feature_enable_disable_with_index (u8 arc_index, u32 feature_index, 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]; + old_ci = ci = cm->config_index_by_sw_if_index[sw_if_index]; vec_validate (fm->feature_count_by_sw_if_index[arc_index], sw_if_index); feature_count = fm->feature_count_by_sw_if_index[arc_index][sw_if_index]; @@ -208,27 +209,21 @@ vnet_feature_enable_disable_with_index (u8 arc_index, u32 feature_index, : vnet_config_del_feature) (vlib_get_main (), &cm->config_main, ci, feature_index, feature_config, n_feature_config_bytes); + if (old_ci == ci) + { + return 0; + } cm->config_index_by_sw_if_index[sw_if_index] = ci; /* update feature count */ enable_disable = (enable_disable > 0); feature_count += enable_disable ? 1 : -1; - is_first_or_last = (feature_count == enable_disable); ASSERT (feature_count >= 0); - if (is_first_or_last && cm->end_feature_index != ~0) - { - /*register end node */ - ci = (enable_disable - ? vnet_config_add_feature - : vnet_config_del_feature) - (vlib_get_main (), &cm->config_main, ci, cm->end_feature_index, 0, 0); - cm->config_index_by_sw_if_index[sw_if_index] = ci; - } - 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)); + adj_feature_update (sw_if_index, arc_index, (feature_count > 0)); fm->feature_count_by_sw_if_index[arc_index][sw_if_index] = feature_count; return 0; @@ -434,6 +429,7 @@ set_interface_features_command_fn (vlib_main_t * vm, done: vec_free (feature_name); vec_free (arc_name); + unformat_free (line_input); return error; } @@ -449,7 +445,8 @@ done: /* *INDENT-OFF* */ VLIB_CLI_COMMAND (set_interface_feature_command, static) = { .path = "set interface feature", - .short_help = "set interface feature arc ", + .short_help = "set interface feature arc " + "[disable]", .function = set_interface_features_command_fn, }; /* *INDENT-ON* */