Propagate the multi-arch variant selection to interfaces.
Type: fix
Signed-off-by: Radu Nicolau <radu.nicolau@intel.com>
Change-Id: I99c4a7896f172f0d14d2ded22a27383825529a7d
#include <sys/types.h>
#include <fcntl.h>
#include <vlib/vlib.h>
+#include <vnet/vnet.h>
typedef struct _vlib_node_march_variant
{
}
static_always_inline void
-vlib_update_nr_variant_default (vlib_node_registration_t * nr, u8 * variant)
+vlib_update_nr_variant_default (vlib_node_fn_registration_t * fnr,
+ u8 * variant)
{
- vlib_node_fn_registration_t *fnr = nr->node_fn_registrations;
vlib_node_fn_registration_t *p_reg = 0;
vlib_node_fn_registration_t *v_reg = 0;
u32 tmp;
{
clib_error_t *error = 0;
vlib_node_registration_t *nr, **all;
+ vnet_device_class_t *c;
+ vnet_main_t *vnm = vnet_get_main ();
unformat_input_t sub_input;
uword *hash = 0, *p;
u8 *variant = 0;
nr = vm->node_main.node_registrations;
while (nr)
{
- vlib_update_nr_variant_default (nr, variant);
+ vlib_update_nr_variant_default (nr->node_fn_registrations,
+ variant);
nr = nr->next_registration;
}
+ /* also apply it to interfaces */
+ c = vnm->device_class_registrations;
+ while (c)
+ {
+ vlib_update_nr_variant_default (c->tx_fn_registrations,
+ variant);
+ c = c->next_class_registration;
+ }
+
vec_free (variant);
}
}
"please specify a valid node variant");
vec_add1 (variant, 0);
- vlib_update_nr_variant_default (nr, variant);
+ vlib_update_nr_variant_default (nr->node_fn_registrations,
+ variant);
vec_free (variant);
}
vnet_config_main_t *cm;
u32 hw_index, i;
char *tx_node_name = NULL, *output_node_name = NULL;
- vlib_node_function_t *output_node = vnet_interface_output_node_get ();
+ vlib_node_function_t *output_node = vnet_interface_output_node_get (vm);
pool_get (im->hw_interfaces, hw);
clib_memset (hw, 0, sizeof (*hw));
vlib_node_fn_registration_t *r; \
r = &CLIB_MARCH_SFX (devclass##_tx_fn_registration); \
r->priority = CLIB_MARCH_FN_PRIORITY(); \
+ r->name = CLIB_MARCH_VARIANT_STR; \
r->next_registration = devclass.tx_fn_registrations; \
devclass.tx_fn_registrations = r; \
} \
int vnet_interface_name_renumber (u32 sw_if_index, u32 new_show_dev_instance);
-vlib_node_function_t *vnet_interface_output_node_get (void);
+vlib_node_function_t *vnet_interface_output_node_get (vlib_main_t * vm);
void vnet_register_format_buffer_opaque_helper
(vnet_buffer_opquae_formatter_t fn);
#ifndef CLIB_MARCH_VARIANT
vlib_node_function_t *
-vnet_interface_output_node_get (void)
+vnet_interface_output_node_get (vlib_main_t * vm)
{
- return CLIB_MARCH_FN_POINTER (vnet_interface_output_node);
+ vlib_node_function_t *fn = 0;
+ vlib_node_fn_registration_t *fnr;
+ char *name = 0;
+ vlib_node_t *node = vlib_get_node_by_name (vm, (u8 *) "interface-output");
+ ASSERT (node);
+
+ /* search for the same name */
+ fnr = node->node_fn_registrations;
+ while (fnr)
+ {
+ if (fnr->function == node->function)
+ {
+ name = fnr->name;
+ break;
+ }
+ fnr = fnr->next_registration;
+ }
+
+ if (name)
+ {
+ fn = CLIB_MARCH_FN_POINTER_BY_NAME (vnet_interface_output_node, name);
+ }
+ if (!fn) /* revert to march type selection if search failed */
+ {
+ fn = CLIB_MARCH_FN_POINTER (vnet_interface_output_node);
+ }
+ return fn;
}
#endif /* CLIB_MARCH_VARIANT */
return rv;
}
+static_always_inline void *
+clib_march_select_fn_ptr_by_name (clib_march_fn_registration * r, char *name)
+{
+ void *rv = 0;
+
+ while (r)
+ {
+ if (strncmp (name, r->name, vec_len (r->name) - 1) == 0)
+ {
+ rv = r->function;
+ break;
+ }
+ r = r->next;
+ }
+ return rv;
+}
+
#define CLIB_MARCH_FN_POINTER(fn) \
clib_march_select_fn_ptr (fn##_march_fn_registrations);
+#define CLIB_MARCH_FN_POINTER_BY_NAME(fn, name) \
+ clib_march_select_fn_ptr_by_name (fn##_march_fn_registrations, name);
+
#define _CLIB_MARCH_FN_REGISTRATION(fn) \
static clib_march_fn_registration \
CLIB_MARCH_SFX(fn##_march_fn_registration) = \