diff options
Diffstat (limited to 'src/vnet/feature')
-rw-r--r-- | src/vnet/feature/feature.c | 64 | ||||
-rw-r--r-- | src/vnet/feature/feature.h | 115 | ||||
-rw-r--r-- | src/vnet/feature/registration.c | 2 |
3 files changed, 65 insertions, 116 deletions
diff --git a/src/vnet/feature/feature.c b/src/vnet/feature/feature.c index c93f586c349..a7246fbb16a 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; } @@ -475,13 +533,11 @@ show_features_command_fn (vlib_main_t * vm, * @cliexend * @endparblock ?*/ -/* *INDENT-OFF* */ VLIB_CLI_COMMAND (show_features_command, static) = { .path = "show features", .short_help = "show features [verbose]", .function = show_features_command_fn, }; -/* *INDENT-ON* */ /** Display the set of driver features configured on a specific interface * Called by "show interface" handler @@ -642,14 +698,12 @@ done: * @cliexend * @endparblock ?*/ -/* *INDENT-OFF* */ VLIB_CLI_COMMAND (set_interface_feature_command, static) = { .path = "set interface feature", .short_help = "set interface feature <intfc> <feature_name> arc <arc_name> " "[disable]", .function = set_interface_features_command_fn, }; -/* *INDENT-ON* */ static clib_error_t * vnet_feature_add_del_sw_interface (vnet_main_t * vnm, u32 sw_if_index, diff --git a/src/vnet/feature/feature.h b/src/vnet/feature/feature.h index 9aa32182ef6..b1917e8df13 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) { @@ -340,83 +344,8 @@ vnet_device_input_have_features (u32 sw_if_index) } static_always_inline void -vnet_feature_start_device_input_x1 (u32 sw_if_index, u32 * next0, - vlib_buffer_t * b0) -{ - vnet_feature_main_t *fm = &feature_main; - vnet_feature_config_main_t *cm; - u8 feature_arc_index = fm->device_input_feature_arc_index; - cm = &fm->feature_config_mains[feature_arc_index]; - - if (PREDICT_FALSE - (clib_bitmap_get - (fm->sw_if_index_has_features[feature_arc_index], sw_if_index))) - { - /* - * Save next0 so that the last feature in the chain - * can skip ethernet-input if indicated... - */ - u16 adv; - - adv = device_input_next_node_advance[*next0]; - vlib_buffer_advance (b0, -adv); - - vnet_buffer (b0)->feature_arc_index = feature_arc_index; - b0->current_config_index = - vec_elt (cm->config_index_by_sw_if_index, sw_if_index); - vnet_get_config_data (&cm->config_main, &b0->current_config_index, - next0, /* # bytes of config data */ 0); - } -} - -static_always_inline void -vnet_feature_start_device_input_x2 (u32 sw_if_index, - u32 * next0, - u32 * next1, - vlib_buffer_t * b0, vlib_buffer_t * b1) -{ - vnet_feature_main_t *fm = &feature_main; - vnet_feature_config_main_t *cm; - u8 feature_arc_index = fm->device_input_feature_arc_index; - cm = &fm->feature_config_mains[feature_arc_index]; - - if (PREDICT_FALSE - (clib_bitmap_get - (fm->sw_if_index_has_features[feature_arc_index], sw_if_index))) - { - /* - * Save next0 so that the last feature in the chain - * can skip ethernet-input if indicated... - */ - u16 adv; - - adv = device_input_next_node_advance[*next0]; - vlib_buffer_advance (b0, -adv); - - adv = device_input_next_node_advance[*next1]; - vlib_buffer_advance (b1, -adv); - - vnet_buffer (b0)->feature_arc_index = feature_arc_index; - vnet_buffer (b1)->feature_arc_index = feature_arc_index; - b0->current_config_index = - vec_elt (cm->config_index_by_sw_if_index, sw_if_index); - b1->current_config_index = b0->current_config_index; - vnet_get_config_data (&cm->config_main, &b0->current_config_index, - next0, /* # bytes of config data */ 0); - vnet_get_config_data (&cm->config_main, &b1->current_config_index, - next1, /* # bytes of config data */ 0); - } -} - -static_always_inline void -vnet_feature_start_device_input_x4 (u32 sw_if_index, - u32 * next0, - u32 * next1, - u32 * next2, - u32 * next3, - vlib_buffer_t * b0, - vlib_buffer_t * b1, - vlib_buffer_t * b2, vlib_buffer_t * b3) +vnet_feature_start_device_input (u32 sw_if_index, u32 *next0, + vlib_buffer_t *b0) { vnet_feature_main_t *fm = &feature_main; vnet_feature_config_main_t *cm; @@ -427,43 +356,11 @@ vnet_feature_start_device_input_x4 (u32 sw_if_index, (clib_bitmap_get (fm->sw_if_index_has_features[feature_arc_index], sw_if_index))) { - /* - * Save next0 so that the last feature in the chain - * can skip ethernet-input if indicated... - */ - u16 adv; - - adv = device_input_next_node_advance[*next0]; - vlib_buffer_advance (b0, -adv); - - adv = device_input_next_node_advance[*next1]; - vlib_buffer_advance (b1, -adv); - - adv = device_input_next_node_advance[*next2]; - vlib_buffer_advance (b2, -adv); - - adv = device_input_next_node_advance[*next3]; - vlib_buffer_advance (b3, -adv); - vnet_buffer (b0)->feature_arc_index = feature_arc_index; - vnet_buffer (b1)->feature_arc_index = feature_arc_index; - vnet_buffer (b2)->feature_arc_index = feature_arc_index; - vnet_buffer (b3)->feature_arc_index = feature_arc_index; - b0->current_config_index = vec_elt (cm->config_index_by_sw_if_index, sw_if_index); - b1->current_config_index = b0->current_config_index; - b2->current_config_index = b0->current_config_index; - b3->current_config_index = b0->current_config_index; - vnet_get_config_data (&cm->config_main, &b0->current_config_index, next0, /* # bytes of config data */ 0); - vnet_get_config_data (&cm->config_main, &b1->current_config_index, - next1, /* # bytes of config data */ 0); - vnet_get_config_data (&cm->config_main, &b2->current_config_index, - next2, /* # bytes of config data */ 0); - vnet_get_config_data (&cm->config_main, &b3->current_config_index, - next3, /* # bytes of config data */ 0); } } diff --git a/src/vnet/feature/registration.c b/src/vnet/feature/registration.c index 537a4ada6e4..bc20412b9cf 100644 --- a/src/vnet/feature/registration.c +++ b/src/vnet/feature/registration.c @@ -351,12 +351,10 @@ again: *in_feature_nodes = feature_nodes; /* Finally, clean up all the shit we allocated */ - /* *INDENT-OFF* */ hash_foreach_pair (hp, index_by_name, ({ vec_add1 (keys_to_delete, (u8 *)hp->key); })); - /* *INDENT-ON* */ hash_free (index_by_name); for (i = 0; i < vec_len (keys_to_delete); i++) vec_free (keys_to_delete[i]); |