X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=vnet%2Fvnet%2Ffeature%2Ffeature.c;fp=vnet%2Fvnet%2Ffeature%2Ffeature.c;h=25f098d33ad5895782bf17a5e7c16ef5ba1bf5c0;hb=96b41f76097de4516251a43cef365641dd8760a4;hp=bfdea3db41f5bbaeb39d4a4a965abff48244817b;hpb=d6338ab75200fad9825f53640f7c2b2a650c5ce9;p=vpp.git diff --git a/vnet/vnet/feature/feature.c b/vnet/vnet/feature/feature.c index bfdea3db41f..25f098d33ad 100644 --- a/vnet/vnet/feature/feature.c +++ b/vnet/vnet/feature/feature.c @@ -59,6 +59,7 @@ vnet_feature_init (vlib_main_t * vm) freg = fm->next_feature; while (freg) { + 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'", @@ -67,12 +68,15 @@ vnet_feature_init (vlib_main_t * vm) areg = uword_to_pointer (p[0], vnet_feature_arc_registration_t *); arc_index = areg->feature_arc_index; - vec_add1 (fm->next_feature_by_arc[arc_index], *freg); + next = freg->next; + freg->next = fm->next_feature_by_arc[arc_index]; + fm->next_feature_by_arc[arc_index] = freg; /* next */ - freg = freg->next; + freg = next; } + areg = fm->next_arc; while (areg) { clib_error_t *error; @@ -163,7 +167,7 @@ vnet_get_feature_index (u8 arc, const char *s) return reg->feature_index_u32; } -void +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) @@ -176,13 +180,13 @@ vnet_feature_enable_disable (const char *arc_name, const char *node_name, arc_index = vnet_get_feature_arc_index (arc_name); if (arc_index == (u8) ~ 0) - return; + 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); feature_index = vnet_get_feature_index (arc_index, node_name); if (feature_index == ~0) - return; + return VNET_API_ERROR_INVALID_VALUE_2; ci = cm->config_index_by_sw_if_index[sw_if_index]; ci = (enable_disable @@ -195,6 +199,7 @@ vnet_feature_enable_disable (const char *arc_name, const char *node_name, vnet_config_update_feature_count (fm, arc_index, sw_if_index, enable_disable); + return 0; } @@ -216,10 +221,12 @@ show_features_command_fn (vlib_main_t * vm, while (areg) { vlib_cli_output (vm, "%s:", areg->arc_name); - vec_foreach (freg, fm->next_feature_by_arc[areg->feature_arc_index]) - { - vlib_cli_output (vm, " %s\n", freg->node_name); - } + freg = fm->next_feature_by_arc[areg->feature_arc_index]; + while (freg) + { + vlib_cli_output (vm, " %s\n", freg->node_name); + freg = freg->next; + } /* next */