#include <vnet/adj/adj_mcast.h>
#include <vnet/l2/l2_input.h>
-#define VNET_INTERFACE_SET_FLAGS_HELPER_IS_CREATE (1 << 0)
-#define VNET_INTERFACE_SET_FLAGS_HELPER_WANT_REDISTRIBUTE (1 << 1)
+typedef enum vnet_interface_helper_flags_t_
+{
+ VNET_INTERFACE_SET_FLAGS_HELPER_IS_CREATE = (1 << 0),
+ VNET_INTERFACE_SET_FLAGS_HELPER_WANT_REDISTRIBUTE = (1 << 1),
+} vnet_interface_helper_flags_t;
static clib_error_t *vnet_hw_interface_set_flags_helper (vnet_main_t * vnm,
u32 hw_if_index,
- u32 flags,
- u32 helper_flags);
+ vnet_hw_interface_flags_t
+ flags,
+ vnet_interface_helper_flags_t
+ helper_flags);
static clib_error_t *vnet_sw_interface_set_flags_helper (vnet_main_t * vnm,
u32 sw_if_index,
- u32 flags,
- u32 helper_flags);
+ vnet_sw_interface_flags_t
+ flags,
+ vnet_interface_helper_flags_t
+ helper_flags);
static clib_error_t *vnet_hw_interface_set_class_helper (vnet_main_t * vnm,
u32 hw_if_index,
}
}
+static vnet_sw_interface_flags_t
+vnet_hw_interface_flags_to_sw (vnet_hw_interface_flags_t hwf)
+{
+ vnet_sw_interface_flags_t swf = VNET_SW_INTERFACE_FLAG_NONE;
+
+ if (hwf & VNET_HW_INTERFACE_FLAG_LINK_UP)
+ swf |= VNET_SW_INTERFACE_FLAG_ADMIN_UP;
+
+ return (swf);
+}
+
void
serialize_vnet_interface_state (serialize_main_t * m, va_list * va)
{
{
vec_add2 (sts, st, 1);
st->sw_hw_if_index = hif->hw_if_index;
- st->flags = hif->flags;
+ st->flags = vnet_hw_interface_flags_to_sw(hif->flags);
}
}));
/* *INDENT-ON* */
vec_free (sts);
}
+static vnet_hw_interface_flags_t
+vnet_sw_interface_flags_to_hw (vnet_sw_interface_flags_t swf)
+{
+ vnet_hw_interface_flags_t hwf = VNET_HW_INTERFACE_FLAG_NONE;
+
+ if (swf & VNET_SW_INTERFACE_FLAG_ADMIN_UP)
+ hwf |= VNET_HW_INTERFACE_FLAG_LINK_UP;
+
+ return (hwf);
+}
+
void
unserialize_vnet_interface_state (serialize_main_t * m, va_list * va)
{
vec_unserialize (m, &sts, unserialize_vec_vnet_sw_hw_interface_state);
vec_foreach (st, sts)
- vnet_hw_interface_set_flags_helper (vnm, st->sw_hw_if_index, st->flags,
- /* no distribute */ 0);
+ {
+ vnet_hw_interface_set_flags_helper
+ (vnm, st->sw_hw_if_index, vnet_sw_interface_flags_to_hw (st->flags),
+ /* no distribute */ 0);
+ }
vec_free (sts);
}
static clib_error_t *
vnet_hw_interface_set_flags_helper (vnet_main_t * vnm, u32 hw_if_index,
- u32 flags, u32 helper_flags)
+ vnet_hw_interface_flags_t flags,
+ vnet_interface_helper_flags_t
+ helper_flags)
{
vnet_hw_interface_t *hi = vnet_get_hw_interface (vnm, hw_if_index);
vnet_hw_interface_class_t *hw_class =
(helper_flags & VNET_INTERFACE_SET_FLAGS_HELPER_IS_CREATE) != 0;
mask =
- (VNET_HW_INTERFACE_FLAG_LINK_UP | VNET_HW_INTERFACE_FLAG_DUPLEX_MASK |
- VNET_HW_INTERFACE_FLAG_SPEED_MASK);
+ (VNET_HW_INTERFACE_FLAG_LINK_UP | VNET_HW_INTERFACE_FLAG_DUPLEX_MASK);
flags &= mask;
/* Call hardware interface add/del callbacks. */
static clib_error_t *
vnet_sw_interface_set_flags_helper (vnet_main_t * vnm, u32 sw_if_index,
- u32 flags, u32 helper_flags)
+ vnet_sw_interface_flags_t flags,
+ vnet_interface_helper_flags_t
+ helper_flags)
{
vnet_sw_interface_t *si = vnet_get_sw_interface (vnm, sw_if_index);
u32 mask;
}
clib_error_t *
-vnet_hw_interface_set_flags (vnet_main_t * vnm, u32 hw_if_index, u32 flags)
+vnet_hw_interface_set_flags (vnet_main_t * vnm, u32 hw_if_index,
+ vnet_hw_interface_flags_t flags)
{
return vnet_hw_interface_set_flags_helper
(vnm, hw_if_index, flags,
}
clib_error_t *
-vnet_sw_interface_set_flags (vnet_main_t * vnm, u32 sw_if_index, u32 flags)
+vnet_sw_interface_set_flags (vnet_main_t * vnm, u32 sw_if_index,
+ vnet_sw_interface_flags_t flags)
{
return vnet_sw_interface_set_flags_helper
(vnm, sw_if_index, flags,
char *tx_node_name = NULL, *output_node_name = NULL;
pool_get (im->hw_interfaces, hw);
- memset (hw, 0, sizeof (*hw));
+ clib_memset (hw, 0, sizeof (*hw));
hw_index = hw - im->hw_interfaces;
hw->hw_if_index = hw_index;
/* The new class may differ from the old one.
* Functions have to be updated. */
node = vlib_get_node (vm, hw->output_node_index);
- node->function = vnet_interface_output_node_multiarch_select ();
+ node->function = vnet_interface_output_node;
node->format_trace = format_vnet_interface_output_trace;
/* *INDENT-OFF* */
foreach_vlib_main ({
.is_deleted = 0,
};
- memset (&r, 0, sizeof (r));
+ clib_memset (&r, 0, sizeof (r));
r.type = VLIB_NODE_TYPE_INTERNAL;
r.runtime_data = &rt;
r.runtime_data_bytes = sizeof (rt);
r.flags = 0;
r.name = output_node_name;
- r.function = vnet_interface_output_node_multiarch_select ();
+ r.function = vnet_interface_output_node;
r.format_trace = format_vnet_interface_output_trace;
{
static char *e[] = {
"interface is down",
"interface is deleted",
+ "no buffers to segment GSO",
};
r.n_errors = ARRAY_LEN (e);
}
}
+ im->gso_interface_count = 0;
+ /* init per-thread data */
+ vec_validate_aligned (im->per_thread_data, vlib_num_workers (),
+ CLIB_CACHE_LINE_BYTES);
+
if ((error = vlib_call_init_function (vm, vnet_interface_cli_init)))
return error;
static clib_error_t *
vnet_hw_interface_change_mac_address_helper (vnet_main_t * vnm,
u32 hw_if_index,
- u8 * mac_address)
+ const u8 * mac_address)
{
clib_error_t *error = 0;
vnet_hw_interface_t *hi = vnet_get_hw_interface (vnm, hw_if_index);
clib_error_t *
vnet_hw_interface_change_mac_address (vnet_main_t * vnm, u32 hw_if_index,
- u8 * mac_address)
+ const u8 * mac_address)
{
return vnet_hw_interface_change_mac_address_helper
(vnm, hw_if_index, mac_address);