#include <vnet/snap/snap.h>
#include <vnet/bonding/node.h>
+#ifndef CLIB_MARCH_VARIANT
bond_main_t bond_main;
+#endif /* CLIB_MARCH_VARIANT */
#define foreach_bond_input_error \
_(NONE, "no error") \
BOND_INPUT_N_ERROR,
} bond_input_error_t;
-#ifndef CLIB_MARCH_VARIANT
static char *bond_input_error_strings[] = {
#define _(n,s) s,
foreach_bond_input_error
return s;
}
-#endif
-
typedef enum
{
BOND_INPUT_NEXT_DROP,
BOND_INPUT_N_NEXT,
-} l2output_next_t;
+} bond_output_next_t;
static_always_inline u8
packet_is_cdp (ethernet_header_t * eth)
u32 * bond_sw_if_index, vlib_buffer_t * b,
u32 * next_index, vlib_error_t * error)
{
- u16 thread_index = vlib_get_thread_index ();
+ u16 thread_index = vm->thread_index;
slave_if_t *sif;
bond_if_t *bif;
*bond_sw_if_index = bif->sw_if_index;
*error = 0;
- vnet_feature_next ( /* not used */ 0, next_index, b);
+ vnet_feature_next (next_index, b);
}
VLIB_NODE_FN (bond_input_node) (vlib_main_t * vm,
vlib_node_runtime_t * node,
vlib_frame_t * frame)
{
- u16 thread_index = vlib_get_thread_index ();
+ u16 thread_index = vm->thread_index;
u32 *from, n_left;
vlib_buffer_t *bufs[VLIB_FRAME_SIZE], **b;
u32 sw_if_indices[VLIB_FRAME_SIZE], *sw_if_index;
/* Prefetch next iteration */
if (PREDICT_TRUE (n_left >= 16))
{
- CLIB_PREFETCH (vlib_buffer_get_current (b[8]),
- CLIB_CACHE_LINE_BYTES, LOAD);
- CLIB_PREFETCH (vlib_buffer_get_current (b[9]),
- CLIB_CACHE_LINE_BYTES, LOAD);
- CLIB_PREFETCH (vlib_buffer_get_current (b[10]),
- CLIB_CACHE_LINE_BYTES, LOAD);
- CLIB_PREFETCH (vlib_buffer_get_current (b[11]),
- CLIB_CACHE_LINE_BYTES, LOAD);
+ vlib_prefetch_buffer_data (b[8], LOAD);
+ vlib_prefetch_buffer_data (b[9], LOAD);
+ vlib_prefetch_buffer_data (b[10], LOAD);
+ vlib_prefetch_buffer_data (b[11], LOAD);
vlib_prefetch_buffer_header (b[12], LOAD);
vlib_prefetch_buffer_header (b[13], LOAD);
n_left = frame->n_vectors; /* number of packets to process */
b = bufs;
sw_if_index = sw_if_indices;
- next = nexts;
bond_packet_trace_t *t0;
while (n_left)
{
t0 = vlib_add_trace (vm, node, b[0], sizeof (*t0));
t0->sw_if_index = sw_if_index[0];
- clib_memcpy (&t0->ethernet, vlib_buffer_get_current (b[0]),
- sizeof (ethernet_header_t));
+ clib_memcpy_fast (&t0->ethernet, vlib_buffer_get_current (b[0]),
+ sizeof (ethernet_header_t));
t0->bond_sw_if_index = vnet_buffer (b[0])->sw_if_index[VLIB_RX];
}
/* next */
n_left--;
b++;
sw_if_index++;
- next++;
}
}
return frame->n_vectors;
}
-#ifndef CLIB_MARCH_VARIANT
static clib_error_t *
bond_input_init (vlib_main_t * vm)
{
if (sif)
{
sif->port_enabled = flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP;
+ if (sif->lacp_enabled)
+ return 0;
+
if (sif->port_enabled == 0)
{
- if (sif->lacp_enabled == 0)
- {
- bond_disable_collecting_distributing (vm, sif);
- }
+ bond_disable_collecting_distributing (vm, sif);
}
else
{
- if (sif->lacp_enabled == 0)
- {
- bond_enable_collecting_distributing (vm, sif);
- }
+ vnet_main_t *vnm = vnet_get_main ();
+ vnet_hw_interface_t *hw =
+ vnet_get_sup_hw_interface (vnm, sw_if_index);
+
+ if (hw->flags & VNET_HW_INTERFACE_FLAG_LINK_UP)
+ bond_enable_collecting_distributing (vm, sif);
}
}
sif = bond_get_slave_by_sw_if_index (sw->sw_if_index);
if (sif)
{
+ if (sif->lacp_enabled)
+ return 0;
+
if (!(flags & VNET_HW_INTERFACE_FLAG_LINK_UP))
{
- if (sif->lacp_enabled == 0)
- {
- bond_disable_collecting_distributing (vm, sif);
- }
+ bond_disable_collecting_distributing (vm, sif);
}
- else
+ else if (sif->port_enabled)
{
- if (sif->lacp_enabled == 0)
- {
- bond_enable_collecting_distributing (vm, sif);
- }
+ bond_enable_collecting_distributing (vm, sif);
}
}
}
VNET_HW_INTERFACE_LINK_UP_DOWN_FUNCTION (bond_hw_interface_up_down);
-#endif
/*
* fd.io coding-style-patch-verification: ON