97 while (*s && *s !=
',')
130 int num_feature_start_nodes,
132 char ***in_feature_nodes)
134 uword *index_by_name;
138 char **these_constraints;
139 char *this_constraint_c;
140 u8 **constraints = 0;
141 u8 *constraint_tuple;
143 u8 **orig, **closure;
147 int a_index, b_index;
151 char **feature_nodes = 0;
153 u8 **keys_to_delete = 0;
158 this_reg = first_reg;
163 node_name =
format (0,
"%s%c", this_reg->node_name, 0);
170 these_constraints = this_reg->runs_before;
171 while (these_constraints && these_constraints[0])
173 this_constraint_c = these_constraints[0];
175 constraint_tuple =
format (0,
"%s,%s%c", node_name,
176 this_constraint_c, 0);
177 vec_add1 (constraints, constraint_tuple);
181 these_constraints = this_reg->runs_after;
182 while (these_constraints && these_constraints[0])
184 this_constraint_c = these_constraints[0];
186 constraint_tuple =
format (0,
"%s,%s%c",
187 this_constraint_c, node_name, 0);
188 vec_add1 (constraints, constraint_tuple);
192 this_reg = this_reg->next;
195 n_features =
vec_len (node_names);
198 for (i = 0; i <
vec_len (constraints); i++)
200 this_constraint = constraints[
i];
202 if (
comma_split (this_constraint, &a_name, &b_name))
222 orig[a_index][b_index] = 1;
231 for (i = 0; i < n_features; i++)
233 for (j = 0; j < n_features; j++)
236 goto item_constrained;
241 for (k = 0; k < n_features; k++)
255 if (vec_len (result) != n_features)
266 for (i = n_features - 1; i >= 0; i--)
268 p =
hash_get (reg_by_index, result[i]);
271 if (this_reg->feature_index)
272 *this_reg->feature_index = n_features - (i + 1);
273 this_reg->feature_index_u32 = n_features - (i + 1);
274 vec_add1 (feature_nodes, this_reg->node_name);
280 num_feature_start_nodes,
281 feature_nodes, vec_len (feature_nodes));
284 *in_feature_nodes = feature_nodes;
294 for (i = 0; i <
vec_len (keys_to_delete); i++)
304 #define foreach_af_cast \ 305 _(4, VNET_IP_RX_UNICAST_FEAT, "ip4 unicast") \ 306 _(4, VNET_IP_RX_MULTICAST_FEAT, "ip4 multicast") \ 307 _(4, VNET_IP_TX_FEAT, "ip4 output") \ 308 _(6, VNET_IP_RX_UNICAST_FEAT, "ip6 unicast") \ 309 _(6, VNET_IP_RX_MULTICAST_FEAT, "ip6 multicast") \ 310 _(6, VNET_IP_TX_FEAT, "ip6 output") 330 features = im##a->feature_nodes[c]; \ 331 vlib_cli_output (vm, "%s:", s); \ 332 for (i = 0; i < vec_len(features); i++) \ 333 vlib_cli_output (vm, " %s\n", features[i]); \ 383 .path =
"show ip features",
384 .short_help =
"show ip features",
397 u32 node_index, current_config_index;
416 if (
NULL == cm[cast].config_index_by_sw_if_index ||
417 vec_len (cm[cast].config_index_by_sw_if_index) < sw_if_index)
423 current_config_index =
vec_elt (cm[cast].config_index_by_sw_if_index,
426 ASSERT (current_config_index
462 for (af = 0; af < 2; af++)
500 .path =
"show ip interface features",
501 .short_help =
"show ip interface features <interface>",
vnet_config_main_t config_main
#define hash_set(h, key, value)
sll srl srl sll sra u16x4 i
vnet_config_feature_t * features
static char * feature_start_nodes[]
void vnet_config_init(vlib_main_t *vm, vnet_config_main_t *cm, char *start_node_names[], int n_start_node_names, char *feature_node_names[], int n_feature_node_names)
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
static clib_error_t * show_ip_features_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Display the set of available ip features.
#define hash_set_mem(h, key, value)
ip_lookup_main_t lookup_main
unformat_function_t unformat_vnet_sw_interface
format_function_t format_vnet_sw_if_index_name
clib_error_t * vnet_feature_arc_init(vlib_main_t *vm, vnet_config_main_t *vcm, char **feature_start_nodes, int num_feature_start_nodes, vnet_feature_registration_t *first_reg, char ***in_feature_nodes)
Initialize a feature graph arc.
vnet_main_t * vnet_get_main(void)
#define hash_create_string(elts, value_bytes)
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
u8 ** clib_ptclosure_alloc(int n)
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
static clib_error_t * show_ip_interface_features_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
vnet_feature_config_main_t feature_config_mains[VNET_N_IP_FEAT]
rx unicast, multicast, tx interface/feature configuration.
void clib_ptclosure_free(u8 **ptc)
u32 * config_pool_index_by_user_index
#define vec_free(V)
Free vector's memory (no header).
#define VLIB_CLI_COMMAND(x,...)
#define hash_create(elts, value_bytes)
ip_lookup_main_t lookup_main
static int comma_split(u8 *s, u8 **a, u8 **b)
void ip_interface_features_show(vlib_main_t *vm, const char *pname, vnet_feature_config_main_t *cm, u32 sw_if_index)
Display the set of IP features configured on a specific interface.
static const char * vnet_cast_names[]
#define vec_elt(v, i)
Get vector value at index i.
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
#define hash_foreach_pair(p, v, body)
Iterate over hash pairs.
u8 ** clib_ptclosure(u8 **orig)
#define hash_get_mem(h, key)
ip4_main_t ip4_main
Global ip4 main structure.
vnet_config_t * config_pool
static vlib_node_t * vlib_get_node(vlib_main_t *vm, u32 i)
Get vlib node by index.
#define clib_error_return(e, args...)
struct _vnet_feature_registration vnet_feature_registration_t
feature registration object