bonding lacp: replace slave string with member
- Replace textual string slave with member except APIs. - For APIs, mark the existing APIs as deprecated and introduce new APIs - While introducing sw_bond_interface_dump, add the optional filter by sw_if_index and enhance the testcases to make use of it. Type: improvement Signed-off-by: Steven Luong <sluong@cisco.com> Change-Id: Ib6626c514e45350308aeeda0decb70f3aba2f63e
This commit is contained in:
committed by
Dave Barach
parent
4d1423c5ac
commit
4c4223edfd
+120
-119
File diff suppressed because it is too large
Load Diff
+56
-56
@@ -19,9 +19,9 @@
|
||||
#include <vpp/stats/stat_segment.h>
|
||||
|
||||
static int
|
||||
lacp_packet_scan (vlib_main_t * vm, slave_if_t * sif)
|
||||
lacp_packet_scan (vlib_main_t * vm, member_if_t * mif)
|
||||
{
|
||||
lacp_pdu_t *lacpdu = (lacp_pdu_t *) sif->last_rx_pkt;
|
||||
lacp_pdu_t *lacpdu = (lacp_pdu_t *) mif->last_rx_pkt;
|
||||
|
||||
if (lacpdu->subtype != LACP_SUBTYPE)
|
||||
return LACP_ERROR_UNSUPPORTED;
|
||||
@@ -36,33 +36,33 @@ lacp_packet_scan (vlib_main_t * vm, slave_if_t * sif)
|
||||
(lacpdu->terminator.tlv_length != 0))
|
||||
return (LACP_ERROR_BAD_TLV);
|
||||
|
||||
lacp_machine_dispatch (&lacp_rx_machine, vm, sif,
|
||||
LACP_RX_EVENT_PDU_RECEIVED, &sif->rx_state);
|
||||
lacp_machine_dispatch (&lacp_rx_machine, vm, mif,
|
||||
LACP_RX_EVENT_PDU_RECEIVED, &mif->rx_state);
|
||||
|
||||
return LACP_ERROR_NONE;
|
||||
}
|
||||
|
||||
static void
|
||||
marker_fill_pdu (marker_pdu_t * marker, slave_if_t * sif)
|
||||
marker_fill_pdu (marker_pdu_t * marker, member_if_t * mif)
|
||||
{
|
||||
marker_pdu_t *pkt = (marker_pdu_t *) sif->last_marker_pkt;
|
||||
marker_pdu_t *pkt = (marker_pdu_t *) mif->last_marker_pkt;
|
||||
|
||||
marker->marker_info = pkt->marker_info;
|
||||
marker->marker_info.tlv_type = MARKER_RESPONSE_INFORMATION;
|
||||
}
|
||||
|
||||
void
|
||||
marker_fill_request_pdu (marker_pdu_t * marker, slave_if_t * sif)
|
||||
marker_fill_request_pdu (marker_pdu_t * marker, member_if_t * mif)
|
||||
{
|
||||
marker->marker_info.tlv_type = MARKER_INFORMATION;
|
||||
marker->marker_info.requester_port = sif->actor.port_number;
|
||||
clib_memcpy (marker->marker_info.requester_system, sif->actor.system, 6);
|
||||
marker->marker_info.requester_transaction_id = sif->marker_tx_id;
|
||||
sif->marker_tx_id++;
|
||||
marker->marker_info.requester_port = mif->actor.port_number;
|
||||
clib_memcpy (marker->marker_info.requester_system, mif->actor.system, 6);
|
||||
marker->marker_info.requester_transaction_id = mif->marker_tx_id;
|
||||
mif->marker_tx_id++;
|
||||
}
|
||||
|
||||
static void
|
||||
send_ethernet_marker_response_pdu (vlib_main_t * vm, slave_if_t * sif)
|
||||
send_ethernet_marker_response_pdu (vlib_main_t * vm, member_if_t * mif)
|
||||
{
|
||||
lacp_main_t *lm = &lacp_main;
|
||||
u32 *to_next;
|
||||
@@ -78,18 +78,18 @@ send_ethernet_marker_response_pdu (vlib_main_t * vm, slave_if_t * sif)
|
||||
* into the buffer by the packet template mechanism
|
||||
*/
|
||||
h0 = vlib_packet_template_get_packet
|
||||
(vm, &lm->marker_packet_templates[sif->packet_template_index], &bi0);
|
||||
(vm, &lm->marker_packet_templates[mif->packet_template_index], &bi0);
|
||||
|
||||
if (!h0)
|
||||
return;
|
||||
|
||||
/* Add the interface's ethernet source address */
|
||||
hw = vnet_get_sup_hw_interface (vnm, sif->sw_if_index);
|
||||
hw = vnet_get_sup_hw_interface (vnm, mif->sw_if_index);
|
||||
|
||||
clib_memcpy (h0->ethernet.src_address, hw->hw_address,
|
||||
vec_len (hw->hw_address));
|
||||
|
||||
marker_fill_pdu (&h0->marker, sif);
|
||||
marker_fill_pdu (&h0->marker, mif);
|
||||
|
||||
/* Set the outbound packet length */
|
||||
b0 = vlib_get_buffer (vm, bi0);
|
||||
@@ -108,14 +108,14 @@ send_ethernet_marker_response_pdu (vlib_main_t * vm, slave_if_t * sif)
|
||||
f->n_vectors = 1;
|
||||
|
||||
vlib_put_frame_to_node (vm, hw->output_node_index, f);
|
||||
sif->last_marker_pdu_sent_time = vlib_time_now (vm);
|
||||
sif->marker_pdu_sent++;
|
||||
mif->last_marker_pdu_sent_time = vlib_time_now (vm);
|
||||
mif->marker_pdu_sent++;
|
||||
}
|
||||
|
||||
static int
|
||||
handle_marker_protocol (vlib_main_t * vm, slave_if_t * sif)
|
||||
handle_marker_protocol (vlib_main_t * vm, member_if_t * mif)
|
||||
{
|
||||
marker_pdu_t *marker = (marker_pdu_t *) sif->last_marker_pkt;
|
||||
marker_pdu_t *marker = (marker_pdu_t *) mif->last_marker_pkt;
|
||||
|
||||
/*
|
||||
* According to the spec, no checking on the version number and tlv types.
|
||||
@@ -125,7 +125,7 @@ handle_marker_protocol (vlib_main_t * vm, slave_if_t * sif)
|
||||
(marker->terminator.tlv_length != 0))
|
||||
return (LACP_ERROR_BAD_TLV);
|
||||
|
||||
send_ethernet_marker_response_pdu (vm, sif);
|
||||
send_ethernet_marker_response_pdu (vm, mif);
|
||||
|
||||
return LACP_ERROR_NONE;
|
||||
}
|
||||
@@ -137,16 +137,16 @@ lacp_error_t
|
||||
lacp_input (vlib_main_t * vm, vlib_buffer_t * b0, u32 bi0)
|
||||
{
|
||||
bond_main_t *bm = &bond_main;
|
||||
slave_if_t *sif;
|
||||
member_if_t *mif;
|
||||
uword nbytes;
|
||||
lacp_error_t e;
|
||||
marker_pdu_t *marker;
|
||||
uword last_packet_signature;
|
||||
bond_if_t *bif;
|
||||
|
||||
sif =
|
||||
bond_get_slave_by_sw_if_index (vnet_buffer (b0)->sw_if_index[VLIB_RX]);
|
||||
if ((sif == 0) || (sif->mode != BOND_MODE_LACP))
|
||||
mif =
|
||||
bond_get_member_by_sw_if_index (vnet_buffer (b0)->sw_if_index[VLIB_RX]);
|
||||
if ((mif == 0) || (mif->mode != BOND_MODE_LACP))
|
||||
{
|
||||
return LACP_ERROR_DISABLED;
|
||||
}
|
||||
@@ -155,20 +155,20 @@ lacp_input (vlib_main_t * vm, vlib_buffer_t * b0, u32 bi0)
|
||||
marker = (marker_pdu_t *) (b0->data + b0->current_data);
|
||||
if (marker->subtype == MARKER_SUBTYPE)
|
||||
{
|
||||
sif->last_marker_pdu_recd_time = vlib_time_now (vm);
|
||||
if (sif->last_marker_pkt)
|
||||
_vec_len (sif->last_marker_pkt) = 0;
|
||||
vec_validate (sif->last_marker_pkt,
|
||||
mif->last_marker_pdu_recd_time = vlib_time_now (vm);
|
||||
if (mif->last_marker_pkt)
|
||||
_vec_len (mif->last_marker_pkt) = 0;
|
||||
vec_validate (mif->last_marker_pkt,
|
||||
vlib_buffer_length_in_chain (vm, b0) - 1);
|
||||
nbytes = vlib_buffer_contents (vm, bi0, sif->last_marker_pkt);
|
||||
ASSERT (nbytes <= vec_len (sif->last_marker_pkt));
|
||||
nbytes = vlib_buffer_contents (vm, bi0, mif->last_marker_pkt);
|
||||
ASSERT (nbytes <= vec_len (mif->last_marker_pkt));
|
||||
if (nbytes < sizeof (lacp_pdu_t))
|
||||
{
|
||||
sif->marker_bad_pdu_received++;
|
||||
mif->marker_bad_pdu_received++;
|
||||
return LACP_ERROR_TOO_SMALL;
|
||||
}
|
||||
e = handle_marker_protocol (vm, sif);
|
||||
sif->marker_pdu_received++;
|
||||
e = handle_marker_protocol (vm, mif);
|
||||
mif->marker_pdu_received++;
|
||||
return e;
|
||||
}
|
||||
|
||||
@@ -177,57 +177,57 @@ lacp_input (vlib_main_t * vm, vlib_buffer_t * b0, u32 bi0)
|
||||
* the per-neighbor rx buffer. Reset its apparent length to zero
|
||||
* and reuse it.
|
||||
*/
|
||||
if (sif->last_rx_pkt)
|
||||
_vec_len (sif->last_rx_pkt) = 0;
|
||||
if (mif->last_rx_pkt)
|
||||
_vec_len (mif->last_rx_pkt) = 0;
|
||||
|
||||
/*
|
||||
* Make sure the per-neighbor rx buffer is big enough to hold
|
||||
* the data we're about to copy
|
||||
*/
|
||||
vec_validate (sif->last_rx_pkt, vlib_buffer_length_in_chain (vm, b0) - 1);
|
||||
vec_validate (mif->last_rx_pkt, vlib_buffer_length_in_chain (vm, b0) - 1);
|
||||
|
||||
/*
|
||||
* Coalesce / copy the buffer chain into the per-neighbor
|
||||
* rx buffer
|
||||
*/
|
||||
nbytes = vlib_buffer_contents (vm, bi0, sif->last_rx_pkt);
|
||||
ASSERT (nbytes <= vec_len (sif->last_rx_pkt));
|
||||
nbytes = vlib_buffer_contents (vm, bi0, mif->last_rx_pkt);
|
||||
ASSERT (nbytes <= vec_len (mif->last_rx_pkt));
|
||||
|
||||
sif->last_lacpdu_recd_time = vlib_time_now (vm);
|
||||
mif->last_lacpdu_recd_time = vlib_time_now (vm);
|
||||
if (nbytes < sizeof (lacp_pdu_t))
|
||||
{
|
||||
sif->bad_pdu_received++;
|
||||
mif->bad_pdu_received++;
|
||||
return LACP_ERROR_TOO_SMALL;
|
||||
}
|
||||
|
||||
last_packet_signature =
|
||||
hash_memory (sif->last_rx_pkt, vec_len (sif->last_rx_pkt), 0xd00b);
|
||||
hash_memory (mif->last_rx_pkt, vec_len (mif->last_rx_pkt), 0xd00b);
|
||||
|
||||
if (sif->last_packet_signature_valid &&
|
||||
(sif->last_packet_signature == last_packet_signature) &&
|
||||
((sif->actor.state & LACP_STEADY_STATE) == LACP_STEADY_STATE))
|
||||
if (mif->last_packet_signature_valid &&
|
||||
(mif->last_packet_signature == last_packet_signature) &&
|
||||
((mif->actor.state & LACP_STEADY_STATE) == LACP_STEADY_STATE))
|
||||
{
|
||||
lacp_start_current_while_timer (vm, sif, sif->ttl_in_seconds);
|
||||
lacp_start_current_while_timer (vm, mif, mif->ttl_in_seconds);
|
||||
e = LACP_ERROR_CACHE_HIT;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Actually scan the packet */
|
||||
e = lacp_packet_scan (vm, sif);
|
||||
bif = bond_get_master_by_dev_instance (sif->bif_dev_instance);
|
||||
e = lacp_packet_scan (vm, mif);
|
||||
bif = bond_get_bond_if_by_dev_instance (mif->bif_dev_instance);
|
||||
stat_segment_set_state_counter (bm->stats[bif->sw_if_index]
|
||||
[sif->sw_if_index].actor_state,
|
||||
sif->actor.state);
|
||||
[mif->sw_if_index].actor_state,
|
||||
mif->actor.state);
|
||||
stat_segment_set_state_counter (bm->stats[bif->sw_if_index]
|
||||
[sif->sw_if_index].partner_state,
|
||||
sif->partner.state);
|
||||
sif->last_packet_signature_valid = 1;
|
||||
sif->last_packet_signature = last_packet_signature;
|
||||
[mif->sw_if_index].partner_state,
|
||||
mif->partner.state);
|
||||
mif->last_packet_signature_valid = 1;
|
||||
mif->last_packet_signature = last_packet_signature;
|
||||
}
|
||||
sif->pdu_received++;
|
||||
mif->pdu_received++;
|
||||
|
||||
if (sif->last_rx_pkt)
|
||||
_vec_len (sif->last_rx_pkt) = 0;
|
||||
if (mif->last_rx_pkt)
|
||||
_vec_len (mif->last_rx_pkt) = 0;
|
||||
|
||||
return e;
|
||||
}
|
||||
|
||||
@@ -31,8 +31,8 @@ define sw_interface_lacp_dump
|
||||
};
|
||||
|
||||
/** \brief Reply for lacp dump request
|
||||
@param sw_if_index - software index of slave interface
|
||||
@param interface_name - name of slave interface
|
||||
@param sw_if_index - software index of member interface
|
||||
@param interface_name - name of member interface
|
||||
@param rx_state - rx machine state
|
||||
@param tx_state - tx machine state
|
||||
@param mux_state - mux machine state
|
||||
|
||||
+115
-115
File diff suppressed because it is too large
Load Diff
@@ -29,7 +29,7 @@ typedef struct
|
||||
int next_state;
|
||||
} lacp_fsm_state_t;
|
||||
|
||||
typedef void (*debug_func) (slave_if_t * sif, int event, int state,
|
||||
typedef void (*debug_func) (member_if_t * mif, int event, int state,
|
||||
lacp_fsm_state_t * transition);
|
||||
|
||||
typedef struct
|
||||
@@ -44,7 +44,7 @@ typedef struct
|
||||
} lacp_machine_t;
|
||||
|
||||
extern int lacp_machine_dispatch (lacp_machine_t * machine, vlib_main_t * vm,
|
||||
slave_if_t * sif, int event, int *state);
|
||||
member_if_t * mif, int event, int *state);
|
||||
|
||||
#endif /* __LACP_MACHINE_H__ */
|
||||
|
||||
|
||||
@@ -80,39 +80,39 @@ lacp_machine_t lacp_mux_machine = {
|
||||
};
|
||||
|
||||
static void
|
||||
lacp_detach_mux_from_aggregator (vlib_main_t * vm, slave_if_t * sif)
|
||||
lacp_detach_mux_from_aggregator (vlib_main_t * vm, member_if_t * mif)
|
||||
{
|
||||
sif->actor.state &= ~LACP_STATE_SYNCHRONIZATION;
|
||||
sif->ready = 0;
|
||||
sif->ready_n = 0;
|
||||
mif->actor.state &= ~LACP_STATE_SYNCHRONIZATION;
|
||||
mif->ready = 0;
|
||||
mif->ready_n = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
lacp_attach_mux_to_aggregator (vlib_main_t * vm, slave_if_t * sif)
|
||||
lacp_attach_mux_to_aggregator (vlib_main_t * vm, member_if_t * mif)
|
||||
{
|
||||
sif->actor.state |= LACP_STATE_SYNCHRONIZATION;
|
||||
mif->actor.state |= LACP_STATE_SYNCHRONIZATION;
|
||||
}
|
||||
|
||||
int
|
||||
lacp_mux_action_detached (void *p1, void *p2)
|
||||
{
|
||||
vlib_main_t *vm = p1;
|
||||
slave_if_t *sif = p2;
|
||||
member_if_t *mif = p2;
|
||||
|
||||
lacp_detach_mux_from_aggregator (vm, sif);
|
||||
sif->actor.state &= ~LACP_STATE_COLLECTING;
|
||||
bond_disable_collecting_distributing (vm, sif);
|
||||
sif->actor.state &= ~LACP_STATE_DISTRIBUTING;
|
||||
sif->ntt = 1;
|
||||
lacp_start_periodic_timer (vm, sif, 0);
|
||||
lacp_detach_mux_from_aggregator (vm, mif);
|
||||
mif->actor.state &= ~LACP_STATE_COLLECTING;
|
||||
bond_disable_collecting_distributing (vm, mif);
|
||||
mif->actor.state &= ~LACP_STATE_DISTRIBUTING;
|
||||
mif->ntt = 1;
|
||||
lacp_start_periodic_timer (vm, mif, 0);
|
||||
|
||||
if (sif->selected == LACP_PORT_SELECTED)
|
||||
lacp_machine_dispatch (&lacp_mux_machine, vm, sif,
|
||||
LACP_MUX_EVENT_SELECTED, &sif->mux_state);
|
||||
if (mif->selected == LACP_PORT_SELECTED)
|
||||
lacp_machine_dispatch (&lacp_mux_machine, vm, mif,
|
||||
LACP_MUX_EVENT_SELECTED, &mif->mux_state);
|
||||
|
||||
if (sif->selected == LACP_PORT_STANDBY)
|
||||
lacp_machine_dispatch (&lacp_mux_machine, vm, sif, LACP_MUX_EVENT_STANDBY,
|
||||
&sif->mux_state);
|
||||
if (mif->selected == LACP_PORT_STANDBY)
|
||||
lacp_machine_dispatch (&lacp_mux_machine, vm, mif, LACP_MUX_EVENT_STANDBY,
|
||||
&mif->mux_state);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -121,24 +121,24 @@ int
|
||||
lacp_mux_action_attached (void *p1, void *p2)
|
||||
{
|
||||
vlib_main_t *vm = p1;
|
||||
slave_if_t *sif = p2;
|
||||
member_if_t *mif = p2;
|
||||
|
||||
lacp_attach_mux_to_aggregator (vm, sif);
|
||||
sif->actor.state &= ~LACP_STATE_COLLECTING;
|
||||
bond_disable_collecting_distributing (vm, sif);
|
||||
sif->actor.state &= ~LACP_STATE_DISTRIBUTING;
|
||||
sif->ntt = 1;
|
||||
lacp_start_periodic_timer (vm, sif, 0);
|
||||
lacp_attach_mux_to_aggregator (vm, mif);
|
||||
mif->actor.state &= ~LACP_STATE_COLLECTING;
|
||||
bond_disable_collecting_distributing (vm, mif);
|
||||
mif->actor.state &= ~LACP_STATE_DISTRIBUTING;
|
||||
mif->ntt = 1;
|
||||
lacp_start_periodic_timer (vm, mif, 0);
|
||||
|
||||
if ((sif->selected == LACP_PORT_UNSELECTED) ||
|
||||
(sif->selected == LACP_PORT_STANDBY))
|
||||
lacp_machine_dispatch (&lacp_mux_machine, vm, sif,
|
||||
LACP_MUX_EVENT_UNSELECTED, &sif->mux_state);
|
||||
if ((mif->selected == LACP_PORT_UNSELECTED) ||
|
||||
(mif->selected == LACP_PORT_STANDBY))
|
||||
lacp_machine_dispatch (&lacp_mux_machine, vm, mif,
|
||||
LACP_MUX_EVENT_UNSELECTED, &mif->mux_state);
|
||||
|
||||
if ((sif->selected == LACP_PORT_SELECTED) &&
|
||||
(sif->partner.state & LACP_STATE_SYNCHRONIZATION))
|
||||
lacp_machine_dispatch (&lacp_mux_machine, vm, sif, LACP_MUX_EVENT_SYNC,
|
||||
&sif->mux_state);
|
||||
if ((mif->selected == LACP_PORT_SELECTED) &&
|
||||
(mif->partner.state & LACP_STATE_SYNCHRONIZATION))
|
||||
lacp_machine_dispatch (&lacp_mux_machine, vm, mif, LACP_MUX_EVENT_SYNC,
|
||||
&mif->mux_state);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -146,18 +146,18 @@ int
|
||||
lacp_mux_action_waiting (void *p1, void *p2)
|
||||
{
|
||||
vlib_main_t *vm = p1;
|
||||
slave_if_t *sif = p2;
|
||||
member_if_t *mif = p2;
|
||||
|
||||
if (!lacp_timer_is_running (sif->wait_while_timer))
|
||||
lacp_start_wait_while_timer (vm, sif, LACP_AGGREGATE_WAIT_TIME);
|
||||
if (!lacp_timer_is_running (mif->wait_while_timer))
|
||||
lacp_start_wait_while_timer (vm, mif, LACP_AGGREGATE_WAIT_TIME);
|
||||
|
||||
if ((sif->selected == LACP_PORT_SELECTED) && sif->ready)
|
||||
lacp_machine_dispatch (&lacp_mux_machine, vm, sif,
|
||||
LACP_MUX_EVENT_READY, &sif->mux_state);
|
||||
if ((mif->selected == LACP_PORT_SELECTED) && mif->ready)
|
||||
lacp_machine_dispatch (&lacp_mux_machine, vm, mif,
|
||||
LACP_MUX_EVENT_READY, &mif->mux_state);
|
||||
|
||||
if (sif->selected == LACP_PORT_UNSELECTED)
|
||||
lacp_machine_dispatch (&lacp_mux_machine, vm, sif,
|
||||
LACP_MUX_EVENT_UNSELECTED, &sif->mux_state);
|
||||
if (mif->selected == LACP_PORT_UNSELECTED)
|
||||
lacp_machine_dispatch (&lacp_mux_machine, vm, mif,
|
||||
LACP_MUX_EVENT_UNSELECTED, &mif->mux_state);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -166,18 +166,18 @@ int
|
||||
lacp_mux_action_collecting_distributing (void *p1, void *p2)
|
||||
{
|
||||
vlib_main_t *vm = p1;
|
||||
slave_if_t *sif = p2;
|
||||
member_if_t *mif = p2;
|
||||
|
||||
sif->actor.state |= LACP_STATE_SYNCHRONIZATION | LACP_STATE_COLLECTING |
|
||||
mif->actor.state |= LACP_STATE_SYNCHRONIZATION | LACP_STATE_COLLECTING |
|
||||
LACP_STATE_DISTRIBUTING;
|
||||
bond_enable_collecting_distributing (vm, sif);
|
||||
sif->ntt = 1;
|
||||
lacp_start_periodic_timer (vm, sif, 0);
|
||||
if ((sif->selected == LACP_PORT_UNSELECTED) ||
|
||||
(sif->selected == LACP_PORT_STANDBY) ||
|
||||
!(sif->partner.state & LACP_STATE_SYNCHRONIZATION))
|
||||
lacp_machine_dispatch (&lacp_mux_machine, vm, sif,
|
||||
LACP_MUX_EVENT_UNSELECTED, &sif->mux_state);
|
||||
bond_enable_collecting_distributing (vm, mif);
|
||||
mif->ntt = 1;
|
||||
lacp_start_periodic_timer (vm, mif, 0);
|
||||
if ((mif->selected == LACP_PORT_UNSELECTED) ||
|
||||
(mif->selected == LACP_PORT_STANDBY) ||
|
||||
!(mif->partner.state & LACP_STATE_SYNCHRONIZATION))
|
||||
lacp_machine_dispatch (&lacp_mux_machine, vm, mif,
|
||||
LACP_MUX_EVENT_UNSELECTED, &mif->mux_state);
|
||||
|
||||
|
||||
return 0;
|
||||
@@ -204,7 +204,7 @@ format_mux_event (u8 * s, va_list * args)
|
||||
}
|
||||
|
||||
void
|
||||
lacp_mux_debug_func (slave_if_t * sif, int event, int state,
|
||||
lacp_mux_debug_func (member_if_t * mif, int event, int state,
|
||||
lacp_fsm_state_t * transition)
|
||||
{
|
||||
vlib_worker_thread_t *w = vlib_worker_threads + os_get_thread_index ();
|
||||
@@ -224,16 +224,16 @@ lacp_mux_debug_func (slave_if_t * sif, int event, int state,
|
||||
ed->event =
|
||||
elog_string (&vlib_global_main.elog_main, "%U-MUX: %U, %U->%U%c",
|
||||
format_vnet_sw_if_index_name, vnet_get_main (),
|
||||
sif->sw_if_index, format_mux_event, event,
|
||||
mif->sw_if_index, format_mux_event, event,
|
||||
format_mux_sm_state, state, format_mux_sm_state,
|
||||
transition->next_state, 0);
|
||||
}
|
||||
|
||||
void
|
||||
lacp_init_mux_machine (vlib_main_t * vm, slave_if_t * sif)
|
||||
lacp_init_mux_machine (vlib_main_t * vm, member_if_t * mif)
|
||||
{
|
||||
lacp_machine_dispatch (&lacp_mux_machine, vm, sif, LACP_MUX_EVENT_BEGIN,
|
||||
&sif->mux_state);
|
||||
lacp_machine_dispatch (&lacp_mux_machine, vm, mif, LACP_MUX_EVENT_BEGIN,
|
||||
&mif->mux_state);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -53,7 +53,7 @@ int lacp_mux_action_detached (void *p1, void *p2);
|
||||
int lacp_mux_action_attached (void *p1, void *p2);
|
||||
int lacp_mux_action_waiting (void *p1, void *p2);
|
||||
int lacp_mux_action_collecting_distributing (void *p1, void *p2);
|
||||
void lacp_mux_debug_func (slave_if_t * sif, int event, int state,
|
||||
void lacp_mux_debug_func (member_if_t * mif, int event, int state,
|
||||
lacp_fsm_state_t * transition);
|
||||
|
||||
#define LACP_ACTION_DETACHED LACP_ACTION_ROUTINE(lacp_mux_action_detached)
|
||||
@@ -63,10 +63,10 @@ void lacp_mux_debug_func (slave_if_t * sif, int event, int state,
|
||||
LACP_ACTION_ROUTINE(lacp_mux_action_collecting_distributing)
|
||||
|
||||
static inline void
|
||||
lacp_start_wait_while_timer (vlib_main_t * vm, slave_if_t * sif,
|
||||
lacp_start_wait_while_timer (vlib_main_t * vm, member_if_t * mif,
|
||||
u8 expiration)
|
||||
{
|
||||
sif->wait_while_timer = vlib_time_now (vm) + expiration;
|
||||
mif->wait_while_timer = vlib_time_now (vm) + expiration;
|
||||
}
|
||||
|
||||
#endif /* __LACP_MUX_MACHINE_H__ */
|
||||
|
||||
@@ -146,15 +146,15 @@ int lacp_dump_ifs (lacp_interface_details_t ** out_bondids);
|
||||
lacp_error_t lacp_input (vlib_main_t * vm, vlib_buffer_t * b0, u32 bi0);
|
||||
void lacp_periodic (vlib_main_t * vm);
|
||||
u8 *lacp_input_format_trace (u8 * s, va_list * args);
|
||||
void lacp_init_neighbor (slave_if_t * sif, u8 * hw_address,
|
||||
void lacp_init_neighbor (member_if_t * mif, u8 * hw_address,
|
||||
u16 port_number, u32 group);
|
||||
void lacp_init_state_machines (vlib_main_t * vm, slave_if_t * sif);
|
||||
void lacp_init_rx_machine (vlib_main_t * vm, slave_if_t * sif);
|
||||
void lacp_init_tx_machine (vlib_main_t * vm, slave_if_t * sif);
|
||||
void lacp_init_ptx_machine (vlib_main_t * vm, slave_if_t * sif);
|
||||
void lacp_init_mux_machine (vlib_main_t * vm, slave_if_t * sif);
|
||||
void lacp_selection_logic (vlib_main_t * vm, slave_if_t * sif);
|
||||
void lacp_send_lacp_pdu (vlib_main_t * vm, slave_if_t * sif);
|
||||
void lacp_init_state_machines (vlib_main_t * vm, member_if_t * mif);
|
||||
void lacp_init_rx_machine (vlib_main_t * vm, member_if_t * mif);
|
||||
void lacp_init_tx_machine (vlib_main_t * vm, member_if_t * mif);
|
||||
void lacp_init_ptx_machine (vlib_main_t * vm, member_if_t * mif);
|
||||
void lacp_init_mux_machine (vlib_main_t * vm, member_if_t * mif);
|
||||
void lacp_selection_logic (vlib_main_t * vm, member_if_t * mif);
|
||||
void lacp_send_lacp_pdu (vlib_main_t * vm, member_if_t * mif);
|
||||
|
||||
static inline void
|
||||
lacp_stop_timer (f64 * timer)
|
||||
|
||||
@@ -75,10 +75,10 @@ int
|
||||
lacp_ptx_action_no_periodic (void *p1, void *p2)
|
||||
{
|
||||
vlib_main_t *vm = p1;
|
||||
slave_if_t *sif = p2;
|
||||
member_if_t *mif = p2;
|
||||
|
||||
lacp_stop_timer (&sif->periodic_timer);
|
||||
lacp_ptx_post_short_timeout_event (vm, sif);
|
||||
lacp_stop_timer (&mif->periodic_timer);
|
||||
lacp_ptx_post_short_timeout_event (vm, mif);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -86,26 +86,26 @@ int
|
||||
lacp_ptx_action_slow_periodic (void *p1, void *p2)
|
||||
{
|
||||
vlib_main_t *vm = p1;
|
||||
slave_if_t *sif = p2;
|
||||
member_if_t *mif = p2;
|
||||
u8 timer_expired;
|
||||
|
||||
if (!(sif->partner.state & LACP_STATE_LACP_ACTIVITY) &&
|
||||
!(sif->actor.state & LACP_STATE_LACP_ACTIVITY))
|
||||
lacp_machine_dispatch (&lacp_ptx_machine, vm, sif,
|
||||
LACP_PTX_EVENT_NO_PERIODIC, &sif->ptx_state);
|
||||
if (!(mif->partner.state & LACP_STATE_LACP_ACTIVITY) &&
|
||||
!(mif->actor.state & LACP_STATE_LACP_ACTIVITY))
|
||||
lacp_machine_dispatch (&lacp_ptx_machine, vm, mif,
|
||||
LACP_PTX_EVENT_NO_PERIODIC, &mif->ptx_state);
|
||||
else
|
||||
{
|
||||
if (lacp_timer_is_running (sif->periodic_timer) &&
|
||||
lacp_timer_is_expired (vm, sif->periodic_timer))
|
||||
if (lacp_timer_is_running (mif->periodic_timer) &&
|
||||
lacp_timer_is_expired (vm, mif->periodic_timer))
|
||||
timer_expired = 1;
|
||||
else
|
||||
timer_expired = 0;
|
||||
|
||||
lacp_schedule_periodic_timer (vm, sif);
|
||||
lacp_schedule_periodic_timer (vm, mif);
|
||||
|
||||
if (timer_expired || (sif->partner.state & LACP_STATE_LACP_TIMEOUT))
|
||||
lacp_machine_dispatch (&lacp_ptx_machine, vm, sif,
|
||||
LACP_PTX_EVENT_TIMER_EXPIRED, &sif->ptx_state);
|
||||
if (timer_expired || (mif->partner.state & LACP_STATE_LACP_TIMEOUT))
|
||||
lacp_machine_dispatch (&lacp_ptx_machine, vm, mif,
|
||||
LACP_PTX_EVENT_TIMER_EXPIRED, &mif->ptx_state);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -115,30 +115,30 @@ int
|
||||
lacp_ptx_action_fast_periodic (void *p1, void *p2)
|
||||
{
|
||||
vlib_main_t *vm = p1;
|
||||
slave_if_t *sif = p2;
|
||||
member_if_t *mif = p2;
|
||||
u8 timer_expired;
|
||||
|
||||
if (!(sif->partner.state & LACP_STATE_LACP_ACTIVITY) &&
|
||||
!(sif->actor.state & LACP_STATE_LACP_ACTIVITY))
|
||||
lacp_machine_dispatch (&lacp_ptx_machine, vm, sif,
|
||||
LACP_PTX_EVENT_NO_PERIODIC, &sif->ptx_state);
|
||||
if (!(mif->partner.state & LACP_STATE_LACP_ACTIVITY) &&
|
||||
!(mif->actor.state & LACP_STATE_LACP_ACTIVITY))
|
||||
lacp_machine_dispatch (&lacp_ptx_machine, vm, mif,
|
||||
LACP_PTX_EVENT_NO_PERIODIC, &mif->ptx_state);
|
||||
else
|
||||
{
|
||||
if (lacp_timer_is_running (sif->periodic_timer) &&
|
||||
lacp_timer_is_expired (vm, sif->periodic_timer))
|
||||
if (lacp_timer_is_running (mif->periodic_timer) &&
|
||||
lacp_timer_is_expired (vm, mif->periodic_timer))
|
||||
timer_expired = 1;
|
||||
else
|
||||
timer_expired = 0;
|
||||
|
||||
lacp_start_periodic_timer (vm, sif, LACP_FAST_PERIODIC_TIMER);
|
||||
lacp_start_periodic_timer (vm, mif, LACP_FAST_PERIODIC_TIMER);
|
||||
|
||||
if (timer_expired)
|
||||
lacp_machine_dispatch (&lacp_ptx_machine, vm, sif,
|
||||
LACP_PTX_EVENT_TIMER_EXPIRED, &sif->ptx_state);
|
||||
lacp_machine_dispatch (&lacp_ptx_machine, vm, mif,
|
||||
LACP_PTX_EVENT_TIMER_EXPIRED, &mif->ptx_state);
|
||||
|
||||
if (!(sif->partner.state & LACP_STATE_LACP_TIMEOUT))
|
||||
lacp_machine_dispatch (&lacp_ptx_machine, vm, sif,
|
||||
LACP_PTX_EVENT_LONG_TIMEOUT, &sif->ptx_state);
|
||||
if (!(mif->partner.state & LACP_STATE_LACP_TIMEOUT))
|
||||
lacp_machine_dispatch (&lacp_ptx_machine, vm, mif,
|
||||
LACP_PTX_EVENT_LONG_TIMEOUT, &mif->ptx_state);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -148,23 +148,23 @@ int
|
||||
lacp_ptx_action_timer_expired (void *p1, void *p2)
|
||||
{
|
||||
vlib_main_t *vm = p1;
|
||||
slave_if_t *sif = p2;
|
||||
member_if_t *mif = p2;
|
||||
|
||||
if (!(sif->partner.state & LACP_STATE_LACP_ACTIVITY) &&
|
||||
!(sif->actor.state & LACP_STATE_LACP_ACTIVITY))
|
||||
lacp_machine_dispatch (&lacp_ptx_machine, vm, sif,
|
||||
LACP_PTX_EVENT_NO_PERIODIC, &sif->ptx_state);
|
||||
if (!(mif->partner.state & LACP_STATE_LACP_ACTIVITY) &&
|
||||
!(mif->actor.state & LACP_STATE_LACP_ACTIVITY))
|
||||
lacp_machine_dispatch (&lacp_ptx_machine, vm, mif,
|
||||
LACP_PTX_EVENT_NO_PERIODIC, &mif->ptx_state);
|
||||
else
|
||||
{
|
||||
sif->ntt = 1;
|
||||
lacp_machine_dispatch (&lacp_tx_machine, vm, sif, LACP_TX_EVENT_NTT,
|
||||
&sif->tx_state);
|
||||
if (sif->partner.state & LACP_STATE_LACP_TIMEOUT)
|
||||
lacp_machine_dispatch (&lacp_ptx_machine, vm, sif,
|
||||
LACP_PTX_EVENT_SHORT_TIMEOUT, &sif->ptx_state);
|
||||
mif->ntt = 1;
|
||||
lacp_machine_dispatch (&lacp_tx_machine, vm, mif, LACP_TX_EVENT_NTT,
|
||||
&mif->tx_state);
|
||||
if (mif->partner.state & LACP_STATE_LACP_TIMEOUT)
|
||||
lacp_machine_dispatch (&lacp_ptx_machine, vm, mif,
|
||||
LACP_PTX_EVENT_SHORT_TIMEOUT, &mif->ptx_state);
|
||||
else
|
||||
lacp_machine_dispatch (&lacp_ptx_machine, vm, sif,
|
||||
LACP_PTX_EVENT_LONG_TIMEOUT, &sif->ptx_state);
|
||||
lacp_machine_dispatch (&lacp_ptx_machine, vm, mif,
|
||||
LACP_PTX_EVENT_LONG_TIMEOUT, &mif->ptx_state);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -191,7 +191,7 @@ format_ptx_event (u8 * s, va_list * args)
|
||||
}
|
||||
|
||||
void
|
||||
lacp_ptx_debug_func (slave_if_t * sif, int event, int state,
|
||||
lacp_ptx_debug_func (member_if_t * mif, int event, int state,
|
||||
lacp_fsm_state_t * transition)
|
||||
{
|
||||
vlib_worker_thread_t *w = vlib_worker_threads + os_get_thread_index ();
|
||||
@@ -211,16 +211,16 @@ lacp_ptx_debug_func (slave_if_t * sif, int event, int state,
|
||||
ed->event =
|
||||
elog_string (&vlib_global_main.elog_main, "%U-PTX: %U, %U->%U%c",
|
||||
format_vnet_sw_if_index_name, vnet_get_main (),
|
||||
sif->sw_if_index, format_ptx_event, event,
|
||||
mif->sw_if_index, format_ptx_event, event,
|
||||
format_ptx_sm_state, state, format_ptx_sm_state,
|
||||
transition->next_state, 0);
|
||||
}
|
||||
|
||||
void
|
||||
lacp_init_ptx_machine (vlib_main_t * vm, slave_if_t * sif)
|
||||
lacp_init_ptx_machine (vlib_main_t * vm, member_if_t * mif)
|
||||
{
|
||||
lacp_machine_dispatch (&lacp_ptx_machine, vm, sif,
|
||||
LACP_PTX_EVENT_NO_PERIODIC, &sif->ptx_state);
|
||||
lacp_machine_dispatch (&lacp_ptx_machine, vm, mif,
|
||||
LACP_PTX_EVENT_NO_PERIODIC, &mif->ptx_state);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -51,7 +51,7 @@ int lacp_ptx_action_no_periodic (void *p1, void *p2);
|
||||
int lacp_ptx_action_slow_periodic (void *p1, void *p2);
|
||||
int lacp_ptx_action_fast_periodic (void *p1, void *p2);
|
||||
int lacp_ptx_action_timer_expired (void *p1, void *p2);
|
||||
void lacp_ptx_debug_func (slave_if_t * sif, int event, int state,
|
||||
void lacp_ptx_debug_func (member_if_t * mif, int event, int state,
|
||||
lacp_fsm_state_t * transition);
|
||||
|
||||
#define LACP_ACTION_NO_PERIODIC \
|
||||
@@ -64,36 +64,36 @@ void lacp_ptx_debug_func (slave_if_t * sif, int event, int state,
|
||||
LACP_ACTION_ROUTINE(lacp_ptx_action_timer_expired)
|
||||
|
||||
static inline void
|
||||
lacp_start_periodic_timer (vlib_main_t * vm, slave_if_t * sif, u8 expiration)
|
||||
lacp_start_periodic_timer (vlib_main_t * vm, member_if_t * mif, u8 expiration)
|
||||
{
|
||||
sif->periodic_timer = vlib_time_now (vm) + expiration;
|
||||
mif->periodic_timer = vlib_time_now (vm) + expiration;
|
||||
}
|
||||
|
||||
static inline void
|
||||
lacp_schedule_periodic_timer (vlib_main_t * vm, slave_if_t * sif)
|
||||
lacp_schedule_periodic_timer (vlib_main_t * vm, member_if_t * mif)
|
||||
{
|
||||
// do fast rate if partner is in short timeout or
|
||||
// we are not yet synchronized
|
||||
if ((sif->partner.state & LACP_STATE_LACP_TIMEOUT) ||
|
||||
(((sif->actor.state & (LACP_STATE_SYNCHRONIZATION |
|
||||
if ((mif->partner.state & LACP_STATE_LACP_TIMEOUT) ||
|
||||
(((mif->actor.state & (LACP_STATE_SYNCHRONIZATION |
|
||||
LACP_STATE_COLLECTING |
|
||||
LACP_STATE_DISTRIBUTING)) !=
|
||||
(LACP_STATE_SYNCHRONIZATION | LACP_STATE_COLLECTING |
|
||||
LACP_STATE_DISTRIBUTING))
|
||||
&& (sif->partner.state & LACP_STATE_AGGREGATION)))
|
||||
lacp_start_periodic_timer (vm, sif, LACP_FAST_PERIODIC_TIMER);
|
||||
&& (mif->partner.state & LACP_STATE_AGGREGATION)))
|
||||
lacp_start_periodic_timer (vm, mif, LACP_FAST_PERIODIC_TIMER);
|
||||
else
|
||||
lacp_start_periodic_timer (vm, sif, LACP_SLOW_PERIODIC_TIMER);
|
||||
lacp_start_periodic_timer (vm, mif, LACP_SLOW_PERIODIC_TIMER);
|
||||
}
|
||||
|
||||
static inline void
|
||||
lacp_ptx_post_short_timeout_event (vlib_main_t * vm, slave_if_t * sif)
|
||||
lacp_ptx_post_short_timeout_event (vlib_main_t * vm, member_if_t * mif)
|
||||
{
|
||||
if (sif->lacp_enabled && sif->port_enabled &&
|
||||
((sif->partner.state & LACP_STATE_LACP_ACTIVITY) ||
|
||||
(sif->actor.state & LACP_STATE_LACP_ACTIVITY)))
|
||||
lacp_machine_dispatch (&lacp_ptx_machine, vm, sif,
|
||||
LACP_PTX_EVENT_SHORT_TIMEOUT, &sif->ptx_state);
|
||||
if (mif->lacp_enabled && mif->port_enabled &&
|
||||
((mif->partner.state & LACP_STATE_LACP_ACTIVITY) ||
|
||||
(mif->actor.state & LACP_STATE_LACP_ACTIVITY)))
|
||||
lacp_machine_dispatch (&lacp_ptx_machine, vm, mif,
|
||||
LACP_PTX_EVENT_SHORT_TIMEOUT, &mif->ptx_state);
|
||||
}
|
||||
|
||||
#endif /* __LACP_PTX_MACHINE_H__ */
|
||||
|
||||
+118
-118
File diff suppressed because it is too large
Load Diff
@@ -59,7 +59,7 @@ int lacp_rx_action_expired (void *, void *);
|
||||
int lacp_rx_action_lacp_disabled (void *, void *);
|
||||
int lacp_rx_action_defaulted (void *, void *);
|
||||
int lacp_rx_action_current (void *, void *);
|
||||
void lacp_rx_debug_func (slave_if_t * sif, int event, int state,
|
||||
void lacp_rx_debug_func (member_if_t * mif, int event, int state,
|
||||
lacp_fsm_state_t * transition);
|
||||
|
||||
#define LACP_ACTION_INITIALIZE \
|
||||
@@ -74,10 +74,10 @@ void lacp_rx_debug_func (slave_if_t * sif, int event, int state,
|
||||
#define LACP_ACTION_CURRENT LACP_ACTION_ROUTINE(lacp_rx_action_current)
|
||||
|
||||
static inline void
|
||||
lacp_start_current_while_timer (vlib_main_t * vm, slave_if_t * sif,
|
||||
lacp_start_current_while_timer (vlib_main_t * vm, member_if_t * mif,
|
||||
u8 expiration)
|
||||
{
|
||||
sif->current_while_timer = vlib_time_now (vm) + expiration;
|
||||
mif->current_while_timer = vlib_time_now (vm) + expiration;
|
||||
}
|
||||
|
||||
#endif /* __LACP_RX_MACHINE_H__ */
|
||||
|
||||
@@ -20,27 +20,27 @@
|
||||
#include <lacp/node.h>
|
||||
|
||||
static void
|
||||
lacp_set_port_selected (vlib_main_t * vm, slave_if_t * sif)
|
||||
lacp_set_port_selected (vlib_main_t * vm, member_if_t * mif)
|
||||
{
|
||||
/* Handle loopback port */
|
||||
if (!memcmp (sif->partner.system, sif->actor.system, 6) &&
|
||||
(sif->partner.key == sif->actor.key))
|
||||
if (!memcmp (mif->partner.system, mif->actor.system, 6) &&
|
||||
(mif->partner.key == mif->actor.key))
|
||||
{
|
||||
sif->loopback_port = 1;
|
||||
sif->actor.state &= ~LACP_STATE_AGGREGATION;
|
||||
mif->loopback_port = 1;
|
||||
mif->actor.state &= ~LACP_STATE_AGGREGATION;
|
||||
}
|
||||
sif->selected = LACP_PORT_SELECTED;
|
||||
mif->selected = LACP_PORT_SELECTED;
|
||||
|
||||
switch (sif->mux_state)
|
||||
switch (mif->mux_state)
|
||||
{
|
||||
case LACP_MUX_STATE_DETACHED:
|
||||
break;
|
||||
case LACP_MUX_STATE_WAITING:
|
||||
if (!sif->ready)
|
||||
if (!mif->ready)
|
||||
return;
|
||||
break;
|
||||
case LACP_MUX_STATE_ATTACHED:
|
||||
if (!(sif->partner.state & LACP_STATE_SYNCHRONIZATION))
|
||||
if (!(mif->partner.state & LACP_STATE_SYNCHRONIZATION))
|
||||
return;
|
||||
break;
|
||||
case LACP_MUX_STATE_COLLECTING_DISTRIBUTING:
|
||||
@@ -48,39 +48,39 @@ lacp_set_port_selected (vlib_main_t * vm, slave_if_t * sif)
|
||||
default:
|
||||
break;
|
||||
}
|
||||
lacp_machine_dispatch (&lacp_mux_machine, vm, sif, LACP_MUX_EVENT_SELECTED,
|
||||
&sif->mux_state);
|
||||
lacp_machine_dispatch (&lacp_mux_machine, vm, mif, LACP_MUX_EVENT_SELECTED,
|
||||
&mif->mux_state);
|
||||
}
|
||||
|
||||
void
|
||||
lacp_selection_logic (vlib_main_t * vm, slave_if_t * sif)
|
||||
lacp_selection_logic (vlib_main_t * vm, member_if_t * mif)
|
||||
{
|
||||
slave_if_t *sif2;
|
||||
member_if_t *mif2;
|
||||
bond_if_t *bif;
|
||||
u32 *sw_if_index;
|
||||
|
||||
bif = bond_get_master_by_dev_instance (sif->bif_dev_instance);
|
||||
vec_foreach (sw_if_index, bif->slaves)
|
||||
bif = bond_get_bond_if_by_dev_instance (mif->bif_dev_instance);
|
||||
vec_foreach (sw_if_index, bif->members)
|
||||
{
|
||||
sif2 = bond_get_slave_by_sw_if_index (*sw_if_index);
|
||||
if (sif2 && (sif2->actor.state & LACP_STATE_SYNCHRONIZATION) &&
|
||||
(sif2->ready_n == 0))
|
||||
mif2 = bond_get_member_by_sw_if_index (*sw_if_index);
|
||||
if (mif2 && (mif2->actor.state & LACP_STATE_SYNCHRONIZATION) &&
|
||||
(mif2->ready_n == 0))
|
||||
goto out;
|
||||
}
|
||||
|
||||
vec_foreach (sw_if_index, bif->slaves)
|
||||
vec_foreach (sw_if_index, bif->members)
|
||||
{
|
||||
sif2 = bond_get_slave_by_sw_if_index (*sw_if_index);
|
||||
if (sif2)
|
||||
mif2 = bond_get_member_by_sw_if_index (*sw_if_index);
|
||||
if (mif2)
|
||||
{
|
||||
sif2->ready = 1;
|
||||
if (sif2->selected == LACP_PORT_SELECTED)
|
||||
lacp_machine_dispatch (&lacp_mux_machine, vm, sif2,
|
||||
LACP_MUX_EVENT_READY, &sif2->mux_state);
|
||||
mif2->ready = 1;
|
||||
if (mif2->selected == LACP_PORT_SELECTED)
|
||||
lacp_machine_dispatch (&lacp_mux_machine, vm, mif2,
|
||||
LACP_MUX_EVENT_READY, &mif2->mux_state);
|
||||
}
|
||||
}
|
||||
out:
|
||||
lacp_set_port_selected (vm, sif);
|
||||
lacp_set_port_selected (vm, mif);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -105,21 +105,21 @@ class TestMarker(VppTestCase):
|
||||
bond1.add_vpp_config()
|
||||
bond1.admin_up()
|
||||
|
||||
bond0.enslave_vpp_bond_interface(sw_if_index=memif1.sw_if_index)
|
||||
bond1.enslave_vpp_bond_interface(sw_if_index=memif11.sw_if_index)
|
||||
bond0.add_member_vpp_bond_interface(sw_if_index=memif1.sw_if_index)
|
||||
bond1.add_member_vpp_bond_interface(sw_if_index=memif11.sw_if_index)
|
||||
|
||||
# wait for memif protocol exchange and hardware carrier to come up
|
||||
self.assertEqual(memif1.wait_for_link_up(10), True)
|
||||
self.assertEqual(memif11.wait_for_link_up(10), True)
|
||||
|
||||
# verify memif1 in bond0
|
||||
intfs = self.vapi.sw_interface_slave_dump(
|
||||
intfs = self.vapi.sw_member_interface_dump(
|
||||
sw_if_index=bond0.sw_if_index)
|
||||
for intf in intfs:
|
||||
self.assertEqual(intf.sw_if_index, memif1.sw_if_index)
|
||||
|
||||
# verify memif11 in bond1
|
||||
intfs = self.vapi.sw_interface_slave_dump(
|
||||
intfs = self.vapi.sw_member_interface_dump(
|
||||
sw_if_index=bond1.sw_if_index)
|
||||
for intf in intfs:
|
||||
self.assertEqual(intf.sw_if_index, memif11.sw_if_index)
|
||||
@@ -134,7 +134,7 @@ class TestMarker(VppTestCase):
|
||||
requester_system=bond_mac,
|
||||
requester_transaction_id=1))
|
||||
|
||||
bond1.enslave_vpp_bond_interface(sw_if_index=self.pg0.sw_if_index)
|
||||
bond1.add_member_vpp_bond_interface(sw_if_index=self.pg0.sw_if_index)
|
||||
self.pg0.add_stream(marker)
|
||||
self.pg_enable_capture(self.pg_interfaces)
|
||||
self.pg_start()
|
||||
@@ -185,19 +185,19 @@ class TestLACP(VppTestCase):
|
||||
if timeout <= 0:
|
||||
return 0
|
||||
|
||||
def wait_for_slave_detach(self, bond, timeout, count, step=1):
|
||||
def wait_for_member_detach(self, bond, timeout, count, step=1):
|
||||
while 1:
|
||||
intfs = self.vapi.sw_interface_bond_dump()
|
||||
intfs = self.vapi.sw_bond_interface_dump(
|
||||
sw_if_index=bond.sw_if_index)
|
||||
for intf in intfs:
|
||||
if (bond.sw_if_index == intf.sw_if_index):
|
||||
if ((intf.slaves == count) and
|
||||
(intf.active_slaves == count)):
|
||||
return 1
|
||||
else:
|
||||
self.sleep(1)
|
||||
timeout -= step
|
||||
if (timeouut <= 0):
|
||||
return 0
|
||||
if ((intf.members == count) and
|
||||
(intf.active_members == count)):
|
||||
return 1
|
||||
else:
|
||||
self.sleep(1)
|
||||
timeout -= step
|
||||
if (timeouut <= 0):
|
||||
return 0
|
||||
|
||||
def test_lacp_connect(self):
|
||||
""" LACP protocol connect test """
|
||||
@@ -284,13 +284,13 @@ class TestLACP(VppTestCase):
|
||||
bond1.add_vpp_config()
|
||||
bond1.admin_up()
|
||||
|
||||
# enslave memif1 and memif2 to bond0
|
||||
bond0.enslave_vpp_bond_interface(sw_if_index=memif1.sw_if_index)
|
||||
bond0.enslave_vpp_bond_interface(sw_if_index=memif2.sw_if_index)
|
||||
# add member memif1 and memif2 to bond0
|
||||
bond0.add_member_vpp_bond_interface(sw_if_index=memif1.sw_if_index)
|
||||
bond0.add_member_vpp_bond_interface(sw_if_index=memif2.sw_if_index)
|
||||
|
||||
# enslave memif11 and memif12 to bond1
|
||||
bond1.enslave_vpp_bond_interface(sw_if_index=memif11.sw_if_index)
|
||||
bond1.enslave_vpp_bond_interface(sw_if_index=memif12.sw_if_index)
|
||||
# add member memif11 and memif12 to bond1
|
||||
bond1.add_member_vpp_bond_interface(sw_if_index=memif11.sw_if_index)
|
||||
bond1.add_member_vpp_bond_interface(sw_if_index=memif12.sw_if_index)
|
||||
|
||||
# wait for memif protocol exchange and hardware carrier to come up
|
||||
self.assertEqual(memif1.wait_for_link_up(10), True)
|
||||
@@ -299,14 +299,14 @@ class TestLACP(VppTestCase):
|
||||
self.assertEqual(memif12.wait_for_link_up(10), True)
|
||||
|
||||
# verify memif1 and memif2 in bond0
|
||||
intfs = self.vapi.sw_interface_slave_dump(
|
||||
intfs = self.vapi.sw_member_interface_dump(
|
||||
sw_if_index=bond0.sw_if_index)
|
||||
for intf in intfs:
|
||||
self.assertIn(
|
||||
intf.sw_if_index, (memif1.sw_if_index, memif2.sw_if_index))
|
||||
|
||||
# verify memif11 and memif12 in bond1
|
||||
intfs = self.vapi.sw_interface_slave_dump(
|
||||
intfs = self.vapi.sw_member_interface_dump(
|
||||
sw_if_index=bond1.sw_if_index)
|
||||
for intf in intfs:
|
||||
self.assertIn(
|
||||
@@ -324,37 +324,37 @@ class TestLACP(VppTestCase):
|
||||
self.assertEqual(
|
||||
intf.partner_state, LACP_COLLECTION_AND_DISTRIBUTION_STATE)
|
||||
|
||||
intfs = self.vapi.sw_interface_bond_dump()
|
||||
intfs = self.vapi.sw_bond_interface_dump(sw_if_index=0xFFFFFFFF)
|
||||
for intf in intfs:
|
||||
self.assertEqual(intf.slaves, 2)
|
||||
self.assertEqual(intf.active_slaves, 2)
|
||||
self.assertEqual(intf.members, 2)
|
||||
self.assertEqual(intf.active_members, 2)
|
||||
self.assertEqual(
|
||||
intf.mode, VppEnum.vl_api_bond_mode_t.BOND_API_MODE_LACP)
|
||||
|
||||
self.logger.info(self.vapi.ppcli("show lacp"))
|
||||
self.logger.info(self.vapi.ppcli("show lacp details"))
|
||||
|
||||
# detach slave memif1
|
||||
# detach member memif1
|
||||
bond0.detach_vpp_bond_interface(sw_if_index=memif1.sw_if_index)
|
||||
|
||||
self.wait_for_slave_detach(bond0, timeout=10, count=1)
|
||||
intfs = self.vapi.sw_interface_bond_dump()
|
||||
self.wait_for_member_detach(bond0, timeout=10, count=1)
|
||||
intfs = self.vapi.sw_bond_interface_dump(
|
||||
sw_if_index=bond0.sw_if_index)
|
||||
for intf in intfs:
|
||||
if (bond0.sw_if_index == intf.sw_if_index):
|
||||
self.assertEqual(intf.slaves, 1)
|
||||
self.assertEqual(intf.active_slaves, 1)
|
||||
self.assertEqual(
|
||||
intf.mode, VppEnum.vl_api_bond_mode_t.BOND_API_MODE_LACP)
|
||||
self.assertEqual(intf.members, 1)
|
||||
self.assertEqual(intf.active_members, 1)
|
||||
self.assertEqual(
|
||||
intf.mode, VppEnum.vl_api_bond_mode_t.BOND_API_MODE_LACP)
|
||||
|
||||
# detach slave memif2
|
||||
# detach member memif2
|
||||
bond0.detach_vpp_bond_interface(sw_if_index=memif2.sw_if_index)
|
||||
self.wait_for_slave_detach(bond0, timeout=10, count=0)
|
||||
self.wait_for_member_detach(bond0, timeout=10, count=0)
|
||||
|
||||
intfs = self.vapi.sw_interface_bond_dump()
|
||||
intfs = self.vapi.sw_bond_interface_dump(
|
||||
sw_if_index=bond0.sw_if_index)
|
||||
for intf in intfs:
|
||||
if (bond0.sw_if_index == intf.sw_if_index):
|
||||
self.assertEqual(intf.slaves, 0)
|
||||
self.assertEqual(intf.active_slaves, 0)
|
||||
self.assertEqual(intf.members, 0)
|
||||
self.assertEqual(intf.active_members, 0)
|
||||
|
||||
bond0.remove_vpp_config()
|
||||
bond1.remove_vpp_config()
|
||||
|
||||
@@ -39,22 +39,22 @@ int
|
||||
lacp_tx_action_transmit (void *p1, void *p2)
|
||||
{
|
||||
vlib_main_t *vm = p1;
|
||||
slave_if_t *sif = p2;
|
||||
member_if_t *mif = p2;
|
||||
f64 now = vlib_time_now (vm);
|
||||
|
||||
if (!lacp_timer_is_running (sif->periodic_timer))
|
||||
if (!lacp_timer_is_running (mif->periodic_timer))
|
||||
return 0;
|
||||
|
||||
// No more than 3 LACPDUs per fast interval
|
||||
if (now <= (sif->last_lacpdu_sent_time + 0.333))
|
||||
if (now <= (mif->last_lacpdu_sent_time + 0.333))
|
||||
return 0;
|
||||
|
||||
if (sif->ntt)
|
||||
if (mif->ntt)
|
||||
{
|
||||
lacp_send_lacp_pdu (vm, sif);
|
||||
lacp_schedule_periodic_timer (vm, sif);
|
||||
lacp_send_lacp_pdu (vm, mif);
|
||||
lacp_schedule_periodic_timer (vm, mif);
|
||||
}
|
||||
sif->ntt = 0;
|
||||
mif->ntt = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -80,7 +80,7 @@ format_tx_event (u8 * s, va_list * args)
|
||||
}
|
||||
|
||||
void
|
||||
lacp_tx_debug_func (slave_if_t * sif, int event, int state,
|
||||
lacp_tx_debug_func (member_if_t * mif, int event, int state,
|
||||
lacp_fsm_state_t * transition)
|
||||
{
|
||||
vlib_worker_thread_t *w = vlib_worker_threads + os_get_thread_index ();
|
||||
@@ -99,16 +99,16 @@ lacp_tx_debug_func (slave_if_t * sif, int event, int state,
|
||||
ed = ELOG_TRACK_DATA (&vlib_global_main.elog_main, e, w->elog_track);
|
||||
ed->event = elog_string (&vlib_global_main.elog_main, "%U-TX: %U, %U->%U%c",
|
||||
format_vnet_sw_if_index_name, vnet_get_main (),
|
||||
sif->sw_if_index, format_tx_event, event,
|
||||
mif->sw_if_index, format_tx_event, event,
|
||||
format_tx_sm_state, state, format_tx_sm_state,
|
||||
transition->next_state, 0);
|
||||
}
|
||||
|
||||
void
|
||||
lacp_init_tx_machine (vlib_main_t * vm, slave_if_t * sif)
|
||||
lacp_init_tx_machine (vlib_main_t * vm, member_if_t * mif)
|
||||
{
|
||||
lacp_machine_dispatch (&lacp_tx_machine, vm, sif, LACP_TX_EVENT_BEGIN,
|
||||
&sif->tx_state);
|
||||
lacp_machine_dispatch (&lacp_tx_machine, vm, mif, LACP_TX_EVENT_BEGIN,
|
||||
&mif->tx_state);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -43,7 +43,7 @@ typedef enum
|
||||
extern lacp_machine_t lacp_tx_machine;
|
||||
|
||||
int lacp_tx_action_transmit (void *p1, void *p2);
|
||||
void lacp_tx_debug_func (slave_if_t * sif, int event, int state,
|
||||
void lacp_tx_debug_func (member_if_t * mif, int event, int state,
|
||||
lacp_fsm_state_t * transition);
|
||||
|
||||
#define LACP_ACTION_TRANSMIT LACP_ACTION_ROUTINE(lacp_tx_action_transmit)
|
||||
|
||||
+55
-41
@@ -1930,7 +1930,7 @@ static void vl_api_bond_delete_reply_t_handler_json
|
||||
}
|
||||
|
||||
static void
|
||||
vl_api_bond_enslave_reply_t_handler (vl_api_bond_enslave_reply_t * mp)
|
||||
vl_api_bond_add_member_reply_t_handler (vl_api_bond_add_member_reply_t * mp)
|
||||
{
|
||||
vat_main_t *vam = &vat_main;
|
||||
i32 retval = ntohl (mp->retval);
|
||||
@@ -1946,8 +1946,8 @@ vl_api_bond_enslave_reply_t_handler (vl_api_bond_enslave_reply_t * mp)
|
||||
}
|
||||
}
|
||||
|
||||
static void vl_api_bond_enslave_reply_t_handler_json
|
||||
(vl_api_bond_enslave_reply_t * mp)
|
||||
static void vl_api_bond_add_member_reply_t_handler_json
|
||||
(vl_api_bond_add_member_reply_t * mp)
|
||||
{
|
||||
vat_main_t *vam = &vat_main;
|
||||
vat_json_node_t node;
|
||||
@@ -1963,8 +1963,8 @@ static void vl_api_bond_enslave_reply_t_handler_json
|
||||
}
|
||||
|
||||
static void
|
||||
vl_api_bond_detach_slave_reply_t_handler (vl_api_bond_detach_slave_reply_t *
|
||||
mp)
|
||||
vl_api_bond_detach_member_reply_t_handler (vl_api_bond_detach_member_reply_t *
|
||||
mp)
|
||||
{
|
||||
vat_main_t *vam = &vat_main;
|
||||
i32 retval = ntohl (mp->retval);
|
||||
@@ -1980,8 +1980,8 @@ vl_api_bond_detach_slave_reply_t_handler (vl_api_bond_detach_slave_reply_t *
|
||||
}
|
||||
}
|
||||
|
||||
static void vl_api_bond_detach_slave_reply_t_handler_json
|
||||
(vl_api_bond_detach_slave_reply_t * mp)
|
||||
static void vl_api_bond_detach_member_reply_t_handler_json
|
||||
(vl_api_bond_detach_member_reply_t * mp)
|
||||
{
|
||||
vat_main_t *vam = &vat_main;
|
||||
vat_json_node_t node;
|
||||
@@ -2039,8 +2039,8 @@ api_sw_interface_set_bond_weight (vat_main_t * vam)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void vl_api_sw_interface_bond_details_t_handler
|
||||
(vl_api_sw_interface_bond_details_t * mp)
|
||||
static void vl_api_sw_bond_interface_details_t_handler
|
||||
(vl_api_sw_bond_interface_details_t * mp)
|
||||
{
|
||||
vat_main_t *vam = &vat_main;
|
||||
|
||||
@@ -2048,11 +2048,11 @@ static void vl_api_sw_interface_bond_details_t_handler
|
||||
"%-16s %-12d %-12U %-13U %-14u %-14u",
|
||||
mp->interface_name, ntohl (mp->sw_if_index),
|
||||
format_bond_mode, ntohl (mp->mode), format_bond_load_balance,
|
||||
ntohl (mp->lb), ntohl (mp->active_slaves), ntohl (mp->slaves));
|
||||
ntohl (mp->lb), ntohl (mp->active_members), ntohl (mp->members));
|
||||
}
|
||||
|
||||
static void vl_api_sw_interface_bond_details_t_handler_json
|
||||
(vl_api_sw_interface_bond_details_t * mp)
|
||||
static void vl_api_sw_bond_interface_details_t_handler_json
|
||||
(vl_api_sw_bond_interface_details_t * mp)
|
||||
{
|
||||
vat_main_t *vam = &vat_main;
|
||||
vat_json_node_t *node = NULL;
|
||||
@@ -2070,24 +2070,38 @@ static void vl_api_sw_interface_bond_details_t_handler_json
|
||||
mp->interface_name);
|
||||
vat_json_object_add_uint (node, "mode", ntohl (mp->mode));
|
||||
vat_json_object_add_uint (node, "load_balance", ntohl (mp->lb));
|
||||
vat_json_object_add_uint (node, "active_slaves", ntohl (mp->active_slaves));
|
||||
vat_json_object_add_uint (node, "slaves", ntohl (mp->slaves));
|
||||
vat_json_object_add_uint (node, "active_members",
|
||||
ntohl (mp->active_members));
|
||||
vat_json_object_add_uint (node, "members", ntohl (mp->members));
|
||||
}
|
||||
|
||||
static int
|
||||
api_sw_interface_bond_dump (vat_main_t * vam)
|
||||
api_sw_bond_interface_dump (vat_main_t * vam)
|
||||
{
|
||||
vl_api_sw_interface_bond_dump_t *mp;
|
||||
unformat_input_t *i = vam->input;
|
||||
vl_api_sw_bond_interface_dump_t *mp;
|
||||
vl_api_control_ping_t *mp_ping;
|
||||
int ret;
|
||||
u32 sw_if_index = ~0;
|
||||
|
||||
while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
|
||||
{
|
||||
if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
|
||||
;
|
||||
else if (unformat (i, "sw_if_index %d", &sw_if_index))
|
||||
;
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
print (vam->ofp,
|
||||
"\n%-16s %-12s %-12s %-13s %-14s %-14s",
|
||||
"interface name", "sw_if_index", "mode", "load balance",
|
||||
"active slaves", "slaves");
|
||||
"active members", "members");
|
||||
|
||||
/* Get list of bond interfaces */
|
||||
M (SW_INTERFACE_BOND_DUMP, mp);
|
||||
M (SW_BOND_INTERFACE_DUMP, mp);
|
||||
mp->sw_if_index = ntohl (sw_if_index);
|
||||
S (mp);
|
||||
|
||||
/* Use a control ping for synchronization */
|
||||
@@ -2098,8 +2112,8 @@ api_sw_interface_bond_dump (vat_main_t * vam)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void vl_api_sw_interface_slave_details_t_handler
|
||||
(vl_api_sw_interface_slave_details_t * mp)
|
||||
static void vl_api_sw_member_interface_details_t_handler
|
||||
(vl_api_sw_member_interface_details_t * mp)
|
||||
{
|
||||
vat_main_t *vam = &vat_main;
|
||||
|
||||
@@ -2109,8 +2123,8 @@ static void vl_api_sw_interface_slave_details_t_handler
|
||||
ntohl (mp->weight), mp->is_local_numa);
|
||||
}
|
||||
|
||||
static void vl_api_sw_interface_slave_details_t_handler_json
|
||||
(vl_api_sw_interface_slave_details_t * mp)
|
||||
static void vl_api_sw_member_interface_details_t_handler_json
|
||||
(vl_api_sw_member_interface_details_t * mp)
|
||||
{
|
||||
vat_main_t *vam = &vat_main;
|
||||
vat_json_node_t *node = NULL;
|
||||
@@ -2133,10 +2147,10 @@ static void vl_api_sw_interface_slave_details_t_handler_json
|
||||
}
|
||||
|
||||
static int
|
||||
api_sw_interface_slave_dump (vat_main_t * vam)
|
||||
api_sw_member_interface_dump (vat_main_t * vam)
|
||||
{
|
||||
unformat_input_t *i = vam->input;
|
||||
vl_api_sw_interface_slave_dump_t *mp;
|
||||
vl_api_sw_member_interface_dump_t *mp;
|
||||
vl_api_control_ping_t *mp_ping;
|
||||
u32 sw_if_index = ~0;
|
||||
u8 sw_if_index_set = 0;
|
||||
@@ -2161,11 +2175,11 @@ api_sw_interface_slave_dump (vat_main_t * vam)
|
||||
|
||||
print (vam->ofp,
|
||||
"\n%-25s %-12s %-7s %-12s %-10s %-10s",
|
||||
"slave interface name", "sw_if_index", "passive", "long_timeout",
|
||||
"member interface name", "sw_if_index", "passive", "long_timeout",
|
||||
"weight", "local numa");
|
||||
|
||||
/* Get list of bond interfaces */
|
||||
M (SW_INTERFACE_SLAVE_DUMP, mp);
|
||||
M (SW_MEMBER_INTERFACE_DUMP, mp);
|
||||
mp->sw_if_index = ntohl (sw_if_index);
|
||||
S (mp);
|
||||
|
||||
@@ -5230,11 +5244,11 @@ _(VIRTIO_PCI_DELETE_REPLY, virtio_pci_delete_reply) \
|
||||
_(SW_INTERFACE_VIRTIO_PCI_DETAILS, sw_interface_virtio_pci_details) \
|
||||
_(BOND_CREATE_REPLY, bond_create_reply) \
|
||||
_(BOND_DELETE_REPLY, bond_delete_reply) \
|
||||
_(BOND_ENSLAVE_REPLY, bond_enslave_reply) \
|
||||
_(BOND_DETACH_SLAVE_REPLY, bond_detach_slave_reply) \
|
||||
_(BOND_ADD_MEMBER_REPLY, bond_add_member_reply) \
|
||||
_(BOND_DETACH_MEMBER_REPLY, bond_detach_member_reply) \
|
||||
_(SW_INTERFACE_SET_BOND_WEIGHT_REPLY, sw_interface_set_bond_weight_reply) \
|
||||
_(SW_INTERFACE_BOND_DETAILS, sw_interface_bond_details) \
|
||||
_(SW_INTERFACE_SLAVE_DETAILS, sw_interface_slave_details) \
|
||||
_(SW_BOND_INTERFACE_DETAILS, sw_bond_interface_details) \
|
||||
_(SW_MEMBER_INTERFACE_DETAILS, sw_member_interface_details) \
|
||||
_(IP_ROUTE_ADD_DEL_REPLY, ip_route_add_del_reply) \
|
||||
_(IP_TABLE_ADD_DEL_REPLY, ip_table_add_del_reply) \
|
||||
_(IP_TABLE_REPLACE_BEGIN_REPLY, ip_table_replace_begin_reply) \
|
||||
@@ -7747,10 +7761,10 @@ api_bond_delete (vat_main_t * vam)
|
||||
}
|
||||
|
||||
static int
|
||||
api_bond_enslave (vat_main_t * vam)
|
||||
api_bond_add_member (vat_main_t * vam)
|
||||
{
|
||||
unformat_input_t *i = vam->input;
|
||||
vl_api_bond_enslave_t *mp;
|
||||
vl_api_bond_add_member_t *mp;
|
||||
u32 bond_sw_if_index;
|
||||
int ret;
|
||||
u8 is_passive;
|
||||
@@ -7781,12 +7795,12 @@ api_bond_enslave (vat_main_t * vam)
|
||||
}
|
||||
if (sw_if_index_is_set == 0)
|
||||
{
|
||||
errmsg ("Missing slave sw_if_index. ");
|
||||
errmsg ("Missing member sw_if_index. ");
|
||||
return -99;
|
||||
}
|
||||
|
||||
/* Construct the API message */
|
||||
M (BOND_ENSLAVE, mp);
|
||||
M (BOND_ADD_MEMBER, mp);
|
||||
|
||||
mp->bond_sw_if_index = ntohl (bond_sw_if_index);
|
||||
mp->sw_if_index = ntohl (sw_if_index);
|
||||
@@ -7802,10 +7816,10 @@ api_bond_enslave (vat_main_t * vam)
|
||||
}
|
||||
|
||||
static int
|
||||
api_bond_detach_slave (vat_main_t * vam)
|
||||
api_bond_detach_member (vat_main_t * vam)
|
||||
{
|
||||
unformat_input_t *i = vam->input;
|
||||
vl_api_bond_detach_slave_t *mp;
|
||||
vl_api_bond_detach_member_t *mp;
|
||||
u32 sw_if_index = ~0;
|
||||
u8 sw_if_index_set = 0;
|
||||
int ret;
|
||||
@@ -7828,7 +7842,7 @@ api_bond_detach_slave (vat_main_t * vam)
|
||||
}
|
||||
|
||||
/* Construct the API message */
|
||||
M (BOND_DETACH_SLAVE, mp);
|
||||
M (BOND_DETACH_MEMBER, mp);
|
||||
|
||||
mp->sw_if_index = ntohl (sw_if_index);
|
||||
|
||||
@@ -20618,13 +20632,13 @@ _(bond_create, \
|
||||
"[id <if-id>]") \
|
||||
_(bond_delete, \
|
||||
"<vpp-if-name> | sw_if_index <id>") \
|
||||
_(bond_enslave, \
|
||||
_(bond_add_member, \
|
||||
"sw_if_index <n> bond <sw_if_index> [is_passive] [is_long_timeout]") \
|
||||
_(bond_detach_slave, \
|
||||
_(bond_detach_member, \
|
||||
"sw_if_index <n>") \
|
||||
_(sw_interface_set_bond_weight, "<intfc> | sw_if_index <nn> weight <value>") \
|
||||
_(sw_interface_bond_dump, "") \
|
||||
_(sw_interface_slave_dump, \
|
||||
_(sw_bond_interface_dump, "<intfc> | sw_if_index <nn>") \
|
||||
_(sw_member_interface_dump, \
|
||||
"<vpp-if-name> | sw_if_index <id>") \
|
||||
_(ip_table_add_del, \
|
||||
"table <n> [ipv6] [add | del]\n") \
|
||||
|
||||
+114
-8
@@ -19,7 +19,7 @@
|
||||
the bonding device driver
|
||||
*/
|
||||
|
||||
option version = "2.0.0";
|
||||
option version = "2.1.0";
|
||||
|
||||
import "vnet/interface_types.api";
|
||||
import "vnet/ethernet/ethernet_types.api";
|
||||
@@ -80,7 +80,7 @@ define bond_create_reply
|
||||
/** \brief Delete bond interface
|
||||
@param client_index - opaque cookie to identify the sender
|
||||
@param context - sender context, to match reply w/ request
|
||||
@param sw_if_index - interface index of slave interface
|
||||
@param sw_if_index - interface index of member interface
|
||||
*/
|
||||
autoreply define bond_delete
|
||||
{
|
||||
@@ -99,6 +99,7 @@ autoreply define bond_delete
|
||||
*/
|
||||
define bond_enslave
|
||||
{
|
||||
option deprecated="20.06";
|
||||
u32 client_index;
|
||||
u32 context;
|
||||
vl_api_interface_index_t sw_if_index;
|
||||
@@ -117,12 +118,53 @@ define bond_enslave_reply
|
||||
i32 retval;
|
||||
};
|
||||
|
||||
/** \brief Initialize a new bond interface with the given paramters
|
||||
@param client_index - opaque cookie to identify the sender
|
||||
@param context - sender context, to match reply w/ request
|
||||
@param sw_if_index - member sw_if_index
|
||||
@param bond_sw_if_index - bond sw_if_index
|
||||
@param is_passive - interface does not initiate the lacp protocol, remote must be active speaker
|
||||
@param is_long_timeout - 90 seconds vs default 3 seconds neighbor timeout
|
||||
*/
|
||||
define bond_add_member
|
||||
{
|
||||
u32 client_index;
|
||||
u32 context;
|
||||
vl_api_interface_index_t sw_if_index;
|
||||
vl_api_interface_index_t bond_sw_if_index;
|
||||
bool is_passive;
|
||||
bool is_long_timeout;
|
||||
};
|
||||
|
||||
/** \brief Reply for bond add_member reply
|
||||
@param context - returned sender context, to match reply w/ request
|
||||
@param retval - return code
|
||||
*/
|
||||
define bond_add_member_reply
|
||||
{
|
||||
u32 context;
|
||||
i32 retval;
|
||||
};
|
||||
|
||||
/** \brief bond detach slave
|
||||
@param client_index - opaque cookie to identify the sender
|
||||
@param context - sender context, to match reply w/ request
|
||||
@param sw_if_index - interface index of slave interface
|
||||
@param sw_if_index - interface index of member interface
|
||||
*/
|
||||
autoreply define bond_detach_slave
|
||||
{
|
||||
option deprecated="20.06";
|
||||
u32 client_index;
|
||||
u32 context;
|
||||
vl_api_interface_index_t sw_if_index;
|
||||
};
|
||||
|
||||
/** \brief bond detach member
|
||||
@param client_index - opaque cookie to identify the sender
|
||||
@param context - sender context, to match reply w/ request
|
||||
@param sw_if_index - interface index of member interface
|
||||
*/
|
||||
autoreply define bond_detach_member
|
||||
{
|
||||
u32 client_index;
|
||||
u32 context;
|
||||
@@ -132,6 +174,7 @@ autoreply define bond_detach_slave
|
||||
/** \brief Dump bond interfaces request */
|
||||
define sw_interface_bond_dump
|
||||
{
|
||||
option deprecated="20.06";
|
||||
u32 client_index;
|
||||
u32 context;
|
||||
};
|
||||
@@ -139,12 +182,12 @@ define sw_interface_bond_dump
|
||||
/** \brief Reply for bond dump request
|
||||
@param sw_if_index - software index of bond interface
|
||||
@param id - ID of interface
|
||||
@param interface_name - name of interface
|
||||
@param mode - bonding mode
|
||||
@param lb - load balance algo
|
||||
@param numa_only - enable local numa TX for lacp mode
|
||||
@param active_slaves - active slaves count
|
||||
@param slaves - config slave count
|
||||
@param interface_name - name of interface
|
||||
@param active_slaves - active member count
|
||||
@param slaves - config member count
|
||||
*/
|
||||
define sw_interface_bond_details
|
||||
{
|
||||
@@ -159,6 +202,37 @@ define sw_interface_bond_details
|
||||
string interface_name[64];
|
||||
};
|
||||
|
||||
/** \brief Dump bond interfaces request */
|
||||
define sw_bond_interface_dump
|
||||
{
|
||||
u32 client_index;
|
||||
u32 context;
|
||||
vl_api_interface_index_t sw_if_index [default=0xffffffff];
|
||||
};
|
||||
|
||||
/** \brief Reply for bond dump request
|
||||
@param sw_if_index - software index of bond interface
|
||||
@param id - ID of interface
|
||||
@param mode - bonding mode
|
||||
@param lb - load balance algo
|
||||
@param numa_only - enable local numa TX for lacp mode
|
||||
@param active_members - active members count
|
||||
@param members - config member count
|
||||
@param interface_name - name of interface
|
||||
*/
|
||||
define sw_bond_interface_details
|
||||
{
|
||||
u32 context;
|
||||
vl_api_interface_index_t sw_if_index;
|
||||
u32 id;
|
||||
vl_api_bond_mode_t mode;
|
||||
vl_api_bond_lb_algo_t lb;
|
||||
bool numa_only;
|
||||
u32 active_members;
|
||||
u32 members;
|
||||
string interface_name[64];
|
||||
};
|
||||
|
||||
/** \brief bond slave dump
|
||||
@param client_index - opaque cookie to identify the sender
|
||||
@param context - sender context, to match reply w/ request
|
||||
@@ -166,6 +240,7 @@ define sw_interface_bond_details
|
||||
*/
|
||||
define sw_interface_slave_dump
|
||||
{
|
||||
option deprecated="20.06";
|
||||
u32 client_index;
|
||||
u32 context;
|
||||
vl_api_interface_index_t sw_if_index;
|
||||
@@ -190,11 +265,42 @@ define sw_interface_slave_details
|
||||
u32 weight;
|
||||
};
|
||||
|
||||
/** \brief bond member dump
|
||||
@param client_index - opaque cookie to identify the sender
|
||||
@param context - sender context, to match reply w/ request
|
||||
@param sw_if_index - interface index of bond interface
|
||||
*/
|
||||
define sw_member_interface_dump
|
||||
{
|
||||
u32 client_index;
|
||||
u32 context;
|
||||
vl_api_interface_index_t sw_if_index;
|
||||
};
|
||||
|
||||
/** \brief Reply for member dump request
|
||||
@param sw_if_index - software index of member interface
|
||||
@param interface_name - name of interface
|
||||
@param is_passve - interface does not initiate the lacp protocol, remote must be active speaker
|
||||
@param is_long_timeout - 90 seconds vs default 3 seconds neighbor timeout
|
||||
@param is_local_numa - the member interface is local numa
|
||||
@param weight - the weight for the member interface (active-backup mode only)
|
||||
*/
|
||||
define sw_member_interface_details
|
||||
{
|
||||
u32 context;
|
||||
vl_api_interface_index_t sw_if_index;
|
||||
string interface_name[64];
|
||||
bool is_passive;
|
||||
bool is_long_timeout;
|
||||
bool is_local_numa;
|
||||
u32 weight;
|
||||
};
|
||||
|
||||
/** \brief Interface set bond weight
|
||||
@param client_index - opaque cookie to identify the sender
|
||||
@param context - sender context, to match reply w/ request
|
||||
@param sw_if_index - slave interface for which to set the weight
|
||||
@param weight - weight value to be set for the slave interface
|
||||
@param sw_if_index - member interface for which to set the weight
|
||||
@param weight - weight value to be set for the member interface
|
||||
*/
|
||||
autoreply define sw_interface_set_bond_weight
|
||||
{
|
||||
|
||||
+178
-29
@@ -48,10 +48,14 @@
|
||||
_(BOND_CREATE, bond_create) \
|
||||
_(BOND_DELETE, bond_delete) \
|
||||
_(BOND_ENSLAVE, bond_enslave) \
|
||||
_(BOND_ADD_MEMBER, bond_add_member) \
|
||||
_(SW_INTERFACE_SET_BOND_WEIGHT, sw_interface_set_bond_weight) \
|
||||
_(BOND_DETACH_SLAVE, bond_detach_slave) \
|
||||
_(SW_INTERFACE_BOND_DUMP, sw_interface_bond_dump)\
|
||||
_(SW_INTERFACE_SLAVE_DUMP, sw_interface_slave_dump)
|
||||
_(BOND_DETACH_MEMBER, bond_detach_member) \
|
||||
_(SW_INTERFACE_BOND_DUMP, sw_interface_bond_dump) \
|
||||
_(SW_BOND_INTERFACE_DUMP, sw_bond_interface_dump) \
|
||||
_(SW_INTERFACE_SLAVE_DUMP, sw_interface_slave_dump) \
|
||||
_(SW_MEMBER_INTERFACE_DUMP, sw_member_interface_dump)
|
||||
|
||||
static void
|
||||
vl_api_bond_delete_t_handler (vl_api_bond_delete_t * mp)
|
||||
@@ -99,21 +103,41 @@ vl_api_bond_create_t_handler (vl_api_bond_create_t * mp)
|
||||
}
|
||||
|
||||
static void
|
||||
vl_api_bond_enslave_t_handler (vl_api_bond_enslave_t * mp)
|
||||
vl_api_bond_add_member_t_handler (vl_api_bond_add_member_t * mp)
|
||||
{
|
||||
vlib_main_t *vm = vlib_get_main ();
|
||||
vl_api_bond_enslave_reply_t *rmp;
|
||||
bond_enslave_args_t _a, *ap = &_a;
|
||||
vl_api_bond_add_member_reply_t *rmp;
|
||||
bond_add_member_args_t _a, *ap = &_a;
|
||||
int rv = 0;
|
||||
|
||||
clib_memset (ap, 0, sizeof (*ap));
|
||||
|
||||
ap->group = ntohl (mp->bond_sw_if_index);
|
||||
ap->slave = ntohl (mp->sw_if_index);
|
||||
ap->member = ntohl (mp->sw_if_index);
|
||||
ap->is_passive = mp->is_passive;
|
||||
ap->is_long_timeout = mp->is_long_timeout;
|
||||
|
||||
bond_enslave (vm, ap);
|
||||
bond_add_member (vm, ap);
|
||||
|
||||
REPLY_MACRO (VL_API_BOND_ADD_MEMBER_REPLY);
|
||||
}
|
||||
|
||||
static void
|
||||
vl_api_bond_enslave_t_handler (vl_api_bond_enslave_t * mp)
|
||||
{
|
||||
vlib_main_t *vm = vlib_get_main ();
|
||||
vl_api_bond_enslave_reply_t *rmp;
|
||||
bond_add_member_args_t _a, *ap = &_a;
|
||||
int rv = 0;
|
||||
|
||||
clib_memset (ap, 0, sizeof (*ap));
|
||||
|
||||
ap->group = ntohl (mp->bond_sw_if_index);
|
||||
ap->member = ntohl (mp->sw_if_index);
|
||||
ap->is_passive = mp->is_passive;
|
||||
ap->is_long_timeout = mp->is_long_timeout;
|
||||
|
||||
bond_add_member (vm, ap);
|
||||
|
||||
REPLY_MACRO (VL_API_BOND_ENSLAVE_REPLY);
|
||||
}
|
||||
@@ -142,17 +166,33 @@ vl_api_bond_detach_slave_t_handler (vl_api_bond_detach_slave_t * mp)
|
||||
{
|
||||
vlib_main_t *vm = vlib_get_main ();
|
||||
vl_api_bond_detach_slave_reply_t *rmp;
|
||||
bond_detach_slave_args_t _a, *ap = &_a;
|
||||
bond_detach_member_args_t _a, *ap = &_a;
|
||||
int rv = 0;
|
||||
|
||||
clib_memset (ap, 0, sizeof (*ap));
|
||||
|
||||
ap->slave = ntohl (mp->sw_if_index);
|
||||
bond_detach_slave (vm, ap);
|
||||
ap->member = ntohl (mp->sw_if_index);
|
||||
bond_detach_member (vm, ap);
|
||||
|
||||
REPLY_MACRO (VL_API_BOND_DETACH_SLAVE_REPLY);
|
||||
}
|
||||
|
||||
static void
|
||||
vl_api_bond_detach_member_t_handler (vl_api_bond_detach_member_t * mp)
|
||||
{
|
||||
vlib_main_t *vm = vlib_get_main ();
|
||||
vl_api_bond_detach_member_reply_t *rmp;
|
||||
bond_detach_member_args_t _a, *ap = &_a;
|
||||
int rv = 0;
|
||||
|
||||
clib_memset (ap, 0, sizeof (*ap));
|
||||
|
||||
ap->member = ntohl (mp->sw_if_index);
|
||||
bond_detach_member (vm, ap);
|
||||
|
||||
REPLY_MACRO (VL_API_BOND_DETACH_MEMBER_REPLY);
|
||||
}
|
||||
|
||||
static void
|
||||
bond_send_sw_interface_details (vpe_api_main_t * am,
|
||||
vl_api_registration_t * reg,
|
||||
@@ -172,8 +212,8 @@ bond_send_sw_interface_details (vpe_api_main_t * am,
|
||||
mp->mode = htonl (bond_if->mode);
|
||||
mp->lb = htonl (bond_if->lb);
|
||||
mp->numa_only = bond_if->numa_only;
|
||||
mp->active_slaves = htonl (bond_if->active_slaves);
|
||||
mp->slaves = htonl (bond_if->slaves);
|
||||
mp->active_slaves = htonl (bond_if->active_members);
|
||||
mp->slaves = htonl (bond_if->members);
|
||||
|
||||
mp->context = context;
|
||||
vl_api_send_msg (reg, (u8 *) mp);
|
||||
@@ -205,24 +245,83 @@ vl_api_sw_interface_bond_dump_t_handler (vl_api_sw_interface_bond_dump_t * mp)
|
||||
}
|
||||
|
||||
static void
|
||||
bond_send_sw_interface_slave_details (vpe_api_main_t * am,
|
||||
vl_api_registration_t * reg,
|
||||
slave_interface_details_t * slave_if,
|
||||
u32 context)
|
||||
bond_send_sw_bond_interface_details (vpe_api_main_t * am,
|
||||
vl_api_registration_t * reg,
|
||||
bond_interface_details_t * bond_if,
|
||||
u32 context)
|
||||
{
|
||||
vl_api_sw_bond_interface_details_t *mp;
|
||||
|
||||
mp = vl_msg_api_alloc (sizeof (*mp));
|
||||
clib_memset (mp, 0, sizeof (*mp));
|
||||
mp->_vl_msg_id = htons (VL_API_SW_BOND_INTERFACE_DETAILS);
|
||||
mp->sw_if_index = htonl (bond_if->sw_if_index);
|
||||
mp->id = htonl (bond_if->id);
|
||||
clib_memcpy (mp->interface_name, bond_if->interface_name,
|
||||
MIN (ARRAY_LEN (mp->interface_name) - 1,
|
||||
strlen ((const char *) bond_if->interface_name)));
|
||||
mp->mode = htonl (bond_if->mode);
|
||||
mp->lb = htonl (bond_if->lb);
|
||||
mp->numa_only = bond_if->numa_only;
|
||||
mp->active_members = htonl (bond_if->active_members);
|
||||
mp->members = htonl (bond_if->members);
|
||||
|
||||
mp->context = context;
|
||||
vl_api_send_msg (reg, (u8 *) mp);
|
||||
}
|
||||
|
||||
static void
|
||||
vl_api_sw_bond_interface_dump_t_handler (vl_api_sw_bond_interface_dump_t * mp)
|
||||
{
|
||||
int rv;
|
||||
vpe_api_main_t *am = &vpe_api_main;
|
||||
vl_api_registration_t *reg;
|
||||
bond_interface_details_t *bondifs = NULL;
|
||||
bond_interface_details_t *bond_if = NULL;
|
||||
u32 filter_sw_if_index;
|
||||
|
||||
reg = vl_api_client_index_to_registration (mp->client_index);
|
||||
if (!reg)
|
||||
return;
|
||||
|
||||
filter_sw_if_index = htonl (mp->sw_if_index);
|
||||
if (filter_sw_if_index != ~0)
|
||||
VALIDATE_SW_IF_INDEX (mp);
|
||||
|
||||
rv = bond_dump_ifs (&bondifs);
|
||||
if (rv)
|
||||
return;
|
||||
|
||||
vec_foreach (bond_if, bondifs)
|
||||
{
|
||||
if ((filter_sw_if_index == ~0) ||
|
||||
(bond_if->sw_if_index == filter_sw_if_index))
|
||||
bond_send_sw_bond_interface_details (am, reg, bond_if, mp->context);
|
||||
}
|
||||
|
||||
BAD_SW_IF_INDEX_LABEL;
|
||||
vec_free (bondifs);
|
||||
}
|
||||
|
||||
static void
|
||||
bond_send_sw_member_interface_details (vpe_api_main_t * am,
|
||||
vl_api_registration_t * reg,
|
||||
member_interface_details_t * member_if,
|
||||
u32 context)
|
||||
{
|
||||
vl_api_sw_interface_slave_details_t *mp;
|
||||
|
||||
mp = vl_msg_api_alloc (sizeof (*mp));
|
||||
clib_memset (mp, 0, sizeof (*mp));
|
||||
mp->_vl_msg_id = htons (VL_API_SW_INTERFACE_SLAVE_DETAILS);
|
||||
mp->sw_if_index = htonl (slave_if->sw_if_index);
|
||||
clib_memcpy (mp->interface_name, slave_if->interface_name,
|
||||
mp->sw_if_index = htonl (member_if->sw_if_index);
|
||||
clib_memcpy (mp->interface_name, member_if->interface_name,
|
||||
MIN (ARRAY_LEN (mp->interface_name) - 1,
|
||||
strlen ((const char *) slave_if->interface_name)));
|
||||
mp->is_passive = slave_if->is_passive;
|
||||
mp->is_long_timeout = slave_if->is_long_timeout;
|
||||
mp->is_local_numa = slave_if->is_local_numa;
|
||||
mp->weight = htonl (slave_if->weight);
|
||||
strlen ((const char *) member_if->interface_name)));
|
||||
mp->is_passive = member_if->is_passive;
|
||||
mp->is_long_timeout = member_if->is_long_timeout;
|
||||
mp->is_local_numa = member_if->is_local_numa;
|
||||
mp->weight = htonl (member_if->weight);
|
||||
|
||||
mp->context = context;
|
||||
vl_api_send_msg (reg, (u8 *) mp);
|
||||
@@ -235,23 +334,73 @@ vl_api_sw_interface_slave_dump_t_handler (vl_api_sw_interface_slave_dump_t *
|
||||
int rv;
|
||||
vpe_api_main_t *am = &vpe_api_main;
|
||||
vl_api_registration_t *reg;
|
||||
slave_interface_details_t *slaveifs = NULL;
|
||||
slave_interface_details_t *slave_if = NULL;
|
||||
member_interface_details_t *memberifs = NULL;
|
||||
member_interface_details_t *member_if = NULL;
|
||||
|
||||
reg = vl_api_client_index_to_registration (mp->client_index);
|
||||
if (!reg)
|
||||
return;
|
||||
|
||||
rv = bond_dump_slave_ifs (&slaveifs, ntohl (mp->sw_if_index));
|
||||
rv = bond_dump_member_ifs (&memberifs, ntohl (mp->sw_if_index));
|
||||
if (rv)
|
||||
return;
|
||||
|
||||
vec_foreach (slave_if, slaveifs)
|
||||
vec_foreach (member_if, memberifs)
|
||||
{
|
||||
bond_send_sw_interface_slave_details (am, reg, slave_if, mp->context);
|
||||
bond_send_sw_member_interface_details (am, reg, member_if, mp->context);
|
||||
}
|
||||
|
||||
vec_free (slaveifs);
|
||||
vec_free (memberifs);
|
||||
}
|
||||
|
||||
static void
|
||||
bond_send_member_interface_details (vpe_api_main_t * am,
|
||||
vl_api_registration_t * reg,
|
||||
member_interface_details_t * member_if,
|
||||
u32 context)
|
||||
{
|
||||
vl_api_sw_member_interface_details_t *mp;
|
||||
|
||||
mp = vl_msg_api_alloc (sizeof (*mp));
|
||||
clib_memset (mp, 0, sizeof (*mp));
|
||||
mp->_vl_msg_id = htons (VL_API_SW_MEMBER_INTERFACE_DETAILS);
|
||||
mp->sw_if_index = htonl (member_if->sw_if_index);
|
||||
clib_memcpy (mp->interface_name, member_if->interface_name,
|
||||
MIN (ARRAY_LEN (mp->interface_name) - 1,
|
||||
strlen ((const char *) member_if->interface_name)));
|
||||
mp->is_passive = member_if->is_passive;
|
||||
mp->is_long_timeout = member_if->is_long_timeout;
|
||||
mp->is_local_numa = member_if->is_local_numa;
|
||||
mp->weight = htonl (member_if->weight);
|
||||
|
||||
mp->context = context;
|
||||
vl_api_send_msg (reg, (u8 *) mp);
|
||||
}
|
||||
|
||||
static void
|
||||
vl_api_sw_member_interface_dump_t_handler (vl_api_sw_member_interface_dump_t *
|
||||
mp)
|
||||
{
|
||||
int rv;
|
||||
vpe_api_main_t *am = &vpe_api_main;
|
||||
vl_api_registration_t *reg;
|
||||
member_interface_details_t *memberifs = NULL;
|
||||
member_interface_details_t *member_if = NULL;
|
||||
|
||||
reg = vl_api_client_index_to_registration (mp->client_index);
|
||||
if (!reg)
|
||||
return;
|
||||
|
||||
rv = bond_dump_member_ifs (&memberifs, ntohl (mp->sw_if_index));
|
||||
if (rv)
|
||||
return;
|
||||
|
||||
vec_foreach (member_if, memberifs)
|
||||
{
|
||||
bond_send_member_interface_details (am, reg, member_if, mp->context);
|
||||
}
|
||||
|
||||
vec_free (memberifs);
|
||||
}
|
||||
|
||||
#define vl_msg_name_crc_list
|
||||
|
||||
+224
-220
File diff suppressed because it is too large
Load Diff
+78
-75
File diff suppressed because it is too large
Load Diff
+48
-44
@@ -136,40 +136,40 @@ bond_sw_if_idx_rewrite (vlib_main_t * vm, vlib_node_runtime_t * node,
|
||||
|
||||
static inline void
|
||||
bond_update_next (vlib_main_t * vm, vlib_node_runtime_t * node,
|
||||
u32 * last_slave_sw_if_index, u32 slave_sw_if_index,
|
||||
u32 * last_member_sw_if_index, u32 member_sw_if_index,
|
||||
u32 * bond_sw_if_index, vlib_buffer_t * b,
|
||||
u32 * next_index, vlib_error_t * error)
|
||||
{
|
||||
slave_if_t *sif;
|
||||
member_if_t *mif;
|
||||
bond_if_t *bif;
|
||||
|
||||
*next_index = BOND_INPUT_NEXT_DROP;
|
||||
*error = 0;
|
||||
|
||||
if (PREDICT_TRUE (*last_slave_sw_if_index == slave_sw_if_index))
|
||||
if (PREDICT_TRUE (*last_member_sw_if_index == member_sw_if_index))
|
||||
goto next;
|
||||
|
||||
*last_slave_sw_if_index = slave_sw_if_index;
|
||||
*last_member_sw_if_index = member_sw_if_index;
|
||||
|
||||
sif = bond_get_slave_by_sw_if_index (slave_sw_if_index);
|
||||
ALWAYS_ASSERT (sif);
|
||||
mif = bond_get_member_by_sw_if_index (member_sw_if_index);
|
||||
ALWAYS_ASSERT (mif);
|
||||
|
||||
bif = bond_get_master_by_dev_instance (sif->bif_dev_instance);
|
||||
bif = bond_get_bond_if_by_dev_instance (mif->bif_dev_instance);
|
||||
|
||||
ALWAYS_ASSERT (bif);
|
||||
ASSERT (vec_len (bif->slaves));
|
||||
ASSERT (vec_len (bif->members));
|
||||
|
||||
if (PREDICT_FALSE (bif->admin_up == 0))
|
||||
{
|
||||
*bond_sw_if_index = slave_sw_if_index;
|
||||
*bond_sw_if_index = member_sw_if_index;
|
||||
*error = node->errors[BOND_INPUT_ERROR_IF_DOWN];
|
||||
}
|
||||
|
||||
if (PREDICT_FALSE ((bif->mode == BOND_MODE_ACTIVE_BACKUP) &&
|
||||
vec_len (bif->active_slaves) &&
|
||||
(slave_sw_if_index != bif->active_slaves[0])))
|
||||
vec_len (bif->active_members) &&
|
||||
(member_sw_if_index != bif->active_members[0])))
|
||||
{
|
||||
*bond_sw_if_index = slave_sw_if_index;
|
||||
*bond_sw_if_index = member_sw_if_index;
|
||||
*error = node->errors[BOND_INPUT_ERROR_PASSIVE_IF];
|
||||
return;
|
||||
}
|
||||
@@ -202,7 +202,7 @@ VLIB_NODE_FN (bond_input_node) (vlib_main_t * vm,
|
||||
vlib_buffer_t *bufs[VLIB_FRAME_SIZE], **b;
|
||||
u32 sw_if_indices[VLIB_FRAME_SIZE], *sw_if_index;
|
||||
u16 nexts[VLIB_FRAME_SIZE], *next;
|
||||
u32 last_slave_sw_if_index = ~0;
|
||||
u32 last_member_sw_if_index = ~0;
|
||||
u32 bond_sw_if_index = 0;
|
||||
vlib_error_t error = 0;
|
||||
u32 next_index = 0;
|
||||
@@ -242,17 +242,17 @@ VLIB_NODE_FN (bond_input_node) (vlib_main_t * vm,
|
||||
sw_if_index[2] = vnet_buffer (b[2])->sw_if_index[VLIB_RX];
|
||||
sw_if_index[3] = vnet_buffer (b[3])->sw_if_index[VLIB_RX];
|
||||
|
||||
x |= sw_if_index[0] ^ last_slave_sw_if_index;
|
||||
x |= sw_if_index[1] ^ last_slave_sw_if_index;
|
||||
x |= sw_if_index[2] ^ last_slave_sw_if_index;
|
||||
x |= sw_if_index[3] ^ last_slave_sw_if_index;
|
||||
x |= sw_if_index[0] ^ last_member_sw_if_index;
|
||||
x |= sw_if_index[1] ^ last_member_sw_if_index;
|
||||
x |= sw_if_index[2] ^ last_member_sw_if_index;
|
||||
x |= sw_if_index[3] ^ last_member_sw_if_index;
|
||||
|
||||
if (PREDICT_TRUE (x == 0))
|
||||
{
|
||||
/*
|
||||
* Optimize to call update_next only if there is a feature arc
|
||||
* after bond-input. Test feature count greater than 1 because
|
||||
* bond-input itself is a feature arc for this slave interface.
|
||||
* bond-input itself is a feature arc for this member interface.
|
||||
*/
|
||||
ASSERT ((vnet_buffer (b[0])->feature_arc_index ==
|
||||
vnet_buffer (b[1])->feature_arc_index) &&
|
||||
@@ -262,7 +262,7 @@ VLIB_NODE_FN (bond_input_node) (vlib_main_t * vm,
|
||||
vnet_buffer (b[3])->feature_arc_index));
|
||||
if (PREDICT_FALSE (vnet_get_feature_count
|
||||
(vnet_buffer (b[0])->feature_arc_index,
|
||||
last_slave_sw_if_index) > 1))
|
||||
last_member_sw_if_index) > 1))
|
||||
bond_update_next_x4 (b[0], b[1], b[2], b[3]);
|
||||
|
||||
next[0] = next[1] = next[2] = next[3] = next_index;
|
||||
@@ -287,8 +287,9 @@ VLIB_NODE_FN (bond_input_node) (vlib_main_t * vm,
|
||||
}
|
||||
else
|
||||
{
|
||||
bond_update_next (vm, node, &last_slave_sw_if_index, sw_if_index[0],
|
||||
&bond_sw_if_index, b[0], &next_index, &error);
|
||||
bond_update_next (vm, node, &last_member_sw_if_index,
|
||||
sw_if_index[0], &bond_sw_if_index, b[0],
|
||||
&next_index, &error);
|
||||
next[0] = next_index;
|
||||
if (next_index == BOND_INPUT_NEXT_DROP)
|
||||
b[0]->error = error;
|
||||
@@ -296,8 +297,9 @@ VLIB_NODE_FN (bond_input_node) (vlib_main_t * vm,
|
||||
bond_sw_if_idx_rewrite (vm, node, b[0], bond_sw_if_index,
|
||||
&n_rx_packets, &n_rx_bytes);
|
||||
|
||||
bond_update_next (vm, node, &last_slave_sw_if_index, sw_if_index[1],
|
||||
&bond_sw_if_index, b[1], &next_index, &error);
|
||||
bond_update_next (vm, node, &last_member_sw_if_index,
|
||||
sw_if_index[1], &bond_sw_if_index, b[1],
|
||||
&next_index, &error);
|
||||
next[1] = next_index;
|
||||
if (next_index == BOND_INPUT_NEXT_DROP)
|
||||
b[1]->error = error;
|
||||
@@ -305,8 +307,9 @@ VLIB_NODE_FN (bond_input_node) (vlib_main_t * vm,
|
||||
bond_sw_if_idx_rewrite (vm, node, b[1], bond_sw_if_index,
|
||||
&n_rx_packets, &n_rx_bytes);
|
||||
|
||||
bond_update_next (vm, node, &last_slave_sw_if_index, sw_if_index[2],
|
||||
&bond_sw_if_index, b[2], &next_index, &error);
|
||||
bond_update_next (vm, node, &last_member_sw_if_index,
|
||||
sw_if_index[2], &bond_sw_if_index, b[2],
|
||||
&next_index, &error);
|
||||
next[2] = next_index;
|
||||
if (next_index == BOND_INPUT_NEXT_DROP)
|
||||
b[2]->error = error;
|
||||
@@ -314,8 +317,9 @@ VLIB_NODE_FN (bond_input_node) (vlib_main_t * vm,
|
||||
bond_sw_if_idx_rewrite (vm, node, b[2], bond_sw_if_index,
|
||||
&n_rx_packets, &n_rx_bytes);
|
||||
|
||||
bond_update_next (vm, node, &last_slave_sw_if_index, sw_if_index[3],
|
||||
&bond_sw_if_index, b[3], &next_index, &error);
|
||||
bond_update_next (vm, node, &last_member_sw_if_index,
|
||||
sw_if_index[3], &bond_sw_if_index, b[3],
|
||||
&next_index, &error);
|
||||
next[3] = next_index;
|
||||
if (next_index == BOND_INPUT_NEXT_DROP)
|
||||
b[3]->error = error;
|
||||
@@ -339,7 +343,7 @@ VLIB_NODE_FN (bond_input_node) (vlib_main_t * vm,
|
||||
while (n_left)
|
||||
{
|
||||
sw_if_index[0] = vnet_buffer (b[0])->sw_if_index[VLIB_RX];
|
||||
bond_update_next (vm, node, &last_slave_sw_if_index, sw_if_index[0],
|
||||
bond_update_next (vm, node, &last_member_sw_if_index, sw_if_index[0],
|
||||
&bond_sw_if_index, b[0], &next_index, &error);
|
||||
next[0] = next_index;
|
||||
if (next_index == BOND_INPUT_NEXT_DROP)
|
||||
@@ -430,22 +434,22 @@ static clib_error_t *
|
||||
bond_sw_interface_up_down (vnet_main_t * vnm, u32 sw_if_index, u32 flags)
|
||||
{
|
||||
bond_main_t *bm = &bond_main;
|
||||
slave_if_t *sif;
|
||||
member_if_t *mif;
|
||||
vlib_main_t *vm = bm->vlib_main;
|
||||
|
||||
sif = bond_get_slave_by_sw_if_index (sw_if_index);
|
||||
if (sif)
|
||||
mif = bond_get_member_by_sw_if_index (sw_if_index);
|
||||
if (mif)
|
||||
{
|
||||
if (sif->lacp_enabled)
|
||||
if (mif->lacp_enabled)
|
||||
return 0;
|
||||
|
||||
/* port_enabled is both admin up and hw link up */
|
||||
sif->port_enabled = ((flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP) &&
|
||||
mif->port_enabled = ((flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP) &&
|
||||
vnet_sw_interface_is_link_up (vnm, sw_if_index));
|
||||
if (sif->port_enabled == 0)
|
||||
bond_disable_collecting_distributing (vm, sif);
|
||||
if (mif->port_enabled == 0)
|
||||
bond_disable_collecting_distributing (vm, mif);
|
||||
else
|
||||
bond_enable_collecting_distributing (vm, sif);
|
||||
bond_enable_collecting_distributing (vm, mif);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -457,25 +461,25 @@ static clib_error_t *
|
||||
bond_hw_interface_up_down (vnet_main_t * vnm, u32 hw_if_index, u32 flags)
|
||||
{
|
||||
bond_main_t *bm = &bond_main;
|
||||
slave_if_t *sif;
|
||||
member_if_t *mif;
|
||||
vnet_sw_interface_t *sw;
|
||||
vlib_main_t *vm = bm->vlib_main;
|
||||
|
||||
sw = vnet_get_hw_sw_interface (vnm, hw_if_index);
|
||||
sif = bond_get_slave_by_sw_if_index (sw->sw_if_index);
|
||||
if (sif)
|
||||
mif = bond_get_member_by_sw_if_index (sw->sw_if_index);
|
||||
if (mif)
|
||||
{
|
||||
if (sif->lacp_enabled)
|
||||
if (mif->lacp_enabled)
|
||||
return 0;
|
||||
|
||||
/* port_enabled is both admin up and hw link up */
|
||||
sif->port_enabled = ((flags & VNET_HW_INTERFACE_FLAG_LINK_UP) &&
|
||||
mif->port_enabled = ((flags & VNET_HW_INTERFACE_FLAG_LINK_UP) &&
|
||||
vnet_sw_interface_is_admin_up (vnm,
|
||||
sw->sw_if_index));
|
||||
if (sif->port_enabled == 0)
|
||||
bond_disable_collecting_distributing (vm, sif);
|
||||
if (mif->port_enabled == 0)
|
||||
bond_disable_collecting_distributing (vm, mif);
|
||||
else
|
||||
bond_enable_collecting_distributing (vm, sif);
|
||||
bond_enable_collecting_distributing (vm, mif);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
+43
-42
@@ -92,8 +92,8 @@ typedef struct
|
||||
|
||||
typedef struct
|
||||
{
|
||||
/* slave's sw_if_index */
|
||||
u32 slave;
|
||||
/* member's sw_if_index */
|
||||
u32 member;
|
||||
/* bond's sw_if_index */
|
||||
u32 group;
|
||||
u8 is_passive;
|
||||
@@ -101,15 +101,15 @@ typedef struct
|
||||
/* return */
|
||||
int rv;
|
||||
clib_error_t *error;
|
||||
} bond_enslave_args_t;
|
||||
} bond_add_member_args_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u32 slave;
|
||||
u32 member;
|
||||
/* return */
|
||||
int rv;
|
||||
clib_error_t *error;
|
||||
} bond_detach_slave_args_t;
|
||||
} bond_detach_member_args_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
@@ -126,14 +126,14 @@ typedef struct
|
||||
u32 sw_if_index;
|
||||
u32 id;
|
||||
u8 interface_name[64];
|
||||
u8 mode;
|
||||
u8 lb;
|
||||
u32 mode;
|
||||
u32 lb;
|
||||
u8 numa_only;
|
||||
u32 active_slaves;
|
||||
u32 slaves;
|
||||
u32 active_members;
|
||||
u32 members;
|
||||
} bond_interface_details_t;
|
||||
|
||||
/** slave interface details struct */
|
||||
/** member interface details struct */
|
||||
typedef struct
|
||||
{
|
||||
u32 sw_if_index;
|
||||
@@ -142,8 +142,8 @@ typedef struct
|
||||
u8 is_long_timeout;
|
||||
u8 is_local_numa;
|
||||
u32 weight;
|
||||
u32 active_slaves;
|
||||
} slave_interface_details_t;
|
||||
u32 active_members;
|
||||
} member_interface_details_t;
|
||||
|
||||
typedef CLIB_PACKED (struct
|
||||
{
|
||||
@@ -171,7 +171,7 @@ typedef struct
|
||||
u8 mode;
|
||||
u8 lb;
|
||||
|
||||
/* the last slave index for the rr lb */
|
||||
/* the last member index for the rr lb */
|
||||
u32 lb_rr_last_index;
|
||||
|
||||
/* Real device instance in interface vector */
|
||||
@@ -183,24 +183,24 @@ typedef struct
|
||||
u32 hw_if_index;
|
||||
u32 sw_if_index;
|
||||
|
||||
/* Configured slaves */
|
||||
u32 *slaves;
|
||||
/* Configured members */
|
||||
u32 *members;
|
||||
|
||||
/* Slaves that are in DISTRIBUTING state */
|
||||
u32 *active_slaves;
|
||||
/* Members that are in DISTRIBUTING state */
|
||||
u32 *active_members;
|
||||
|
||||
lacp_port_info_t partner;
|
||||
lacp_port_info_t actor;
|
||||
u8 individual_aggregator;
|
||||
|
||||
/* If the flag numa_only is set, it means that only slaves
|
||||
/* If the flag numa_only is set, it means that only members
|
||||
on local numa node works for lacp mode if have at least one,
|
||||
otherwise it works as usual. */
|
||||
u8 numa_only;
|
||||
u8 gso;
|
||||
|
||||
/* How many slaves on local numa node are there in lacp mode? */
|
||||
word n_numa_slaves;
|
||||
/* How many members on local numa node are there in lacp mode? */
|
||||
word n_numa_members;
|
||||
|
||||
u32 group;
|
||||
uword *port_number_bitmap;
|
||||
@@ -345,12 +345,12 @@ typedef struct
|
||||
/* pdu sent */
|
||||
u64 marker_pdu_sent;
|
||||
|
||||
/* slave is numa node */
|
||||
/* member is numa node */
|
||||
u8 is_local_numa;
|
||||
} slave_if_t;
|
||||
} member_if_t;
|
||||
|
||||
typedef void (*lacp_enable_disable_func) (vlib_main_t * vm, bond_if_t * bif,
|
||||
slave_if_t * sif, u8 enable);
|
||||
member_if_t * mif, u8 enable);
|
||||
|
||||
typedef struct
|
||||
{
|
||||
@@ -366,8 +366,8 @@ typedef struct
|
||||
/* record used interface IDs */
|
||||
uword *id_used;
|
||||
|
||||
/* pool of slave interfaces */
|
||||
slave_if_t *neighbors;
|
||||
/* pool of member interfaces */
|
||||
member_if_t *neighbors;
|
||||
|
||||
/* rapidly find a bond by vlib software interface index */
|
||||
uword *bond_by_sw_if_index;
|
||||
@@ -381,7 +381,7 @@ typedef struct
|
||||
|
||||
lacp_enable_disable_func lacp_enable_disable;
|
||||
|
||||
uword *slave_by_sw_if_index;
|
||||
uword *member_by_sw_if_index;
|
||||
|
||||
bond_per_thread_data_t *per_thread_data;
|
||||
|
||||
@@ -398,7 +398,7 @@ typedef struct
|
||||
|
||||
typedef u32 (*load_balance_func) (vlib_main_t * vm,
|
||||
vlib_node_runtime_t * node, bond_if_t * bif,
|
||||
vlib_buffer_t * b0, uword slave_count);
|
||||
vlib_buffer_t * b0, uword member_count);
|
||||
|
||||
typedef struct
|
||||
{
|
||||
@@ -411,19 +411,20 @@ extern vnet_device_class_t bond_dev_class;
|
||||
extern bond_main_t bond_main;
|
||||
|
||||
void bond_disable_collecting_distributing (vlib_main_t * vm,
|
||||
slave_if_t * sif);
|
||||
void bond_enable_collecting_distributing (vlib_main_t * vm, slave_if_t * sif);
|
||||
member_if_t * mif);
|
||||
void bond_enable_collecting_distributing (vlib_main_t * vm,
|
||||
member_if_t * mif);
|
||||
u8 *format_bond_interface_name (u8 * s, va_list * args);
|
||||
|
||||
void bond_set_intf_weight (vlib_main_t * vm,
|
||||
bond_set_intf_weight_args_t * args);
|
||||
void bond_create_if (vlib_main_t * vm, bond_create_if_args_t * args);
|
||||
int bond_delete_if (vlib_main_t * vm, u32 sw_if_index);
|
||||
void bond_enslave (vlib_main_t * vm, bond_enslave_args_t * args);
|
||||
void bond_detach_slave (vlib_main_t * vm, bond_detach_slave_args_t * args);
|
||||
void bond_add_member (vlib_main_t * vm, bond_add_member_args_t * args);
|
||||
void bond_detach_member (vlib_main_t * vm, bond_detach_member_args_t * args);
|
||||
int bond_dump_ifs (bond_interface_details_t ** out_bondids);
|
||||
int bond_dump_slave_ifs (slave_interface_details_t ** out_slaveids,
|
||||
u32 bond_sw_if_index);
|
||||
int bond_dump_member_ifs (member_interface_details_t ** out_memberids,
|
||||
u32 bond_sw_if_index);
|
||||
|
||||
static inline uword
|
||||
unformat_bond_mode (unformat_input_t * input, va_list * args)
|
||||
@@ -499,7 +500,7 @@ bond_register_callback (lacp_enable_disable_func func)
|
||||
}
|
||||
|
||||
static inline bond_if_t *
|
||||
bond_get_master_by_sw_if_index (u32 sw_if_index)
|
||||
bond_get_bond_if_by_sw_if_index (u32 sw_if_index)
|
||||
{
|
||||
bond_main_t *bm = &bond_main;
|
||||
uword *p;
|
||||
@@ -513,28 +514,28 @@ bond_get_master_by_sw_if_index (u32 sw_if_index)
|
||||
}
|
||||
|
||||
static inline bond_if_t *
|
||||
bond_get_master_by_dev_instance (u32 dev_instance)
|
||||
bond_get_bond_if_by_dev_instance (u32 dev_instance)
|
||||
{
|
||||
bond_main_t *bm = &bond_main;
|
||||
|
||||
return pool_elt_at_index (bm->interfaces, dev_instance);
|
||||
}
|
||||
|
||||
static inline slave_if_t *
|
||||
bond_get_slave_by_sw_if_index (u32 sw_if_index)
|
||||
static inline member_if_t *
|
||||
bond_get_member_by_sw_if_index (u32 sw_if_index)
|
||||
{
|
||||
bond_main_t *bm = &bond_main;
|
||||
slave_if_t *sif = 0;
|
||||
member_if_t *mif = 0;
|
||||
uword p;
|
||||
|
||||
if (sw_if_index < vec_len (bm->slave_by_sw_if_index))
|
||||
if (sw_if_index < vec_len (bm->member_by_sw_if_index))
|
||||
{
|
||||
p = bm->slave_by_sw_if_index[sw_if_index];
|
||||
p = bm->member_by_sw_if_index[sw_if_index];
|
||||
if (p)
|
||||
sif = pool_elt_at_index (bm->neighbors, p >> 1);
|
||||
mif = pool_elt_at_index (bm->neighbors, p >> 1);
|
||||
}
|
||||
|
||||
return sif;
|
||||
return mif;
|
||||
}
|
||||
|
||||
#endif /* __included_vnet_bonding_node_h__ */
|
||||
|
||||
+18
-16
@@ -695,12 +695,12 @@ static void *vl_api_bond_delete_t_print
|
||||
FINISH;
|
||||
}
|
||||
|
||||
static void *vl_api_bond_enslave_t_print
|
||||
(vl_api_bond_enslave_t * mp, void *handle)
|
||||
static void *vl_api_bond_add_member_t_print
|
||||
(vl_api_bond_add_member_t * mp, void *handle)
|
||||
{
|
||||
u8 *s;
|
||||
|
||||
s = format (0, "SCRIPT: bond_enslave ");
|
||||
s = format (0, "SCRIPT: bond_add_member ");
|
||||
s = format (s, "bond_sw_if_index %u ", (mp->bond_sw_if_index));
|
||||
s = format (s, "sw_if_index %u ", (mp->sw_if_index));
|
||||
if (mp->is_passive)
|
||||
@@ -723,33 +723,35 @@ static void *vl_api_sw_interface_set_bond_weight_t_print
|
||||
FINISH;
|
||||
}
|
||||
|
||||
static void *vl_api_bond_detach_slave_t_print
|
||||
(vl_api_bond_detach_slave_t * mp, void *handle)
|
||||
static void *vl_api_bond_detach_member_t_print
|
||||
(vl_api_bond_detach_member_t * mp, void *handle)
|
||||
{
|
||||
u8 *s;
|
||||
|
||||
s = format (0, "SCRIPT: bond_detach_slave ");
|
||||
s = format (0, "SCRIPT: bond_detach_member ");
|
||||
s = format (s, "sw_if_index %d ", (mp->sw_if_index));
|
||||
|
||||
FINISH;
|
||||
}
|
||||
|
||||
static void *vl_api_sw_interface_bond_dump_t_print
|
||||
(vl_api_sw_interface_bond_dump_t * mp, void *handle)
|
||||
static void *vl_api_sw_bond_interface_dump_t_print
|
||||
(vl_api_sw_bond_interface_dump_t * mp, void *handle)
|
||||
{
|
||||
u8 *s;
|
||||
|
||||
s = format (0, "SCRIPT: sw_interface_bond_dump ");
|
||||
s = format (0, "SCRIPT: sw_bond_interface_dump ");
|
||||
if (mp->sw_if_index != ~0)
|
||||
s = format (s, "sw_if_index %d ", (mp->sw_if_index));
|
||||
|
||||
FINISH;
|
||||
}
|
||||
|
||||
static void *vl_api_sw_interface_slave_dump_t_print
|
||||
(vl_api_sw_interface_slave_dump_t * mp, void *handle)
|
||||
static void *vl_api_sw_member_interface_dump_t_print
|
||||
(vl_api_sw_member_interface_dump_t * mp, void *handle)
|
||||
{
|
||||
u8 *s;
|
||||
|
||||
s = format (0, "SCRIPT: sw_interface_slave_dump ");
|
||||
s = format (0, "SCRIPT: sw_member_interface_dump ");
|
||||
s = format (s, "sw_if_index %d ", (mp->sw_if_index));
|
||||
|
||||
FINISH;
|
||||
@@ -3543,11 +3545,11 @@ _(SW_INTERFACE_SET_VXLAN_BYPASS, sw_interface_set_vxlan_bypass) \
|
||||
_(SW_INTERFACE_SET_GENEVE_BYPASS, sw_interface_set_geneve_bypass) \
|
||||
_(BOND_CREATE, bond_create) \
|
||||
_(BOND_DELETE, bond_delete) \
|
||||
_(BOND_ENSLAVE, bond_enslave) \
|
||||
_(BOND_DETACH_SLAVE, bond_detach_slave) \
|
||||
_(BOND_ADD_MEMBER, bond_add_member) \
|
||||
_(BOND_DETACH_MEMBER, bond_detach_member) \
|
||||
_(SW_INTERFACE_SET_BOND_WEIGHT, sw_interface_set_bond_weight) \
|
||||
_(SW_INTERFACE_SLAVE_DUMP, sw_interface_slave_dump) \
|
||||
_(SW_INTERFACE_BOND_DUMP, sw_interface_bond_dump) \
|
||||
_(SW_MEMBER_INTERFACE_DUMP, sw_member_interface_dump) \
|
||||
_(SW_BOND_INTERFACE_DUMP, sw_bond_interface_dump) \
|
||||
_(SW_INTERFACE_RX_PLACEMENT_DUMP, sw_interface_rx_placement_dump) \
|
||||
_(TAP_CREATE_V2, tap_create_v2) \
|
||||
_(TAP_DELETE_V2, tap_delete_v2) \
|
||||
|
||||
+32
-29
@@ -51,11 +51,11 @@ class TestBondInterface(VppTestCase):
|
||||
#
|
||||
# RX-> TX->
|
||||
#
|
||||
# pg2 ------+ +------pg0 (slave)
|
||||
# pg2 ------+ +------pg0 (member)
|
||||
# | |
|
||||
# BondEthernet0 (10.10.10.1)
|
||||
# | |
|
||||
# pg3 ------+ +------pg1 (slave)
|
||||
# pg3 ------+ +------pg1 (memberx)
|
||||
#
|
||||
|
||||
# create interface (BondEthernet0)
|
||||
@@ -83,14 +83,14 @@ class TestBondInterface(VppTestCase):
|
||||
self.logger.info(self.vapi.cli("show interface address"))
|
||||
self.logger.info(self.vapi.cli("show ip neighbors"))
|
||||
|
||||
# enslave pg0 and pg1 to BondEthernet0
|
||||
self.logger.info("bond enslave interface pg0 to BondEthernet0")
|
||||
bond0.enslave_vpp_bond_interface(sw_if_index=self.pg0.sw_if_index)
|
||||
self.logger.info("bond enslave interface pg1 to BondEthernet0")
|
||||
bond0.enslave_vpp_bond_interface(sw_if_index=self.pg1.sw_if_index)
|
||||
# add member pg0 and pg1 to BondEthernet0
|
||||
self.logger.info("bond add member interface pg0 to BondEthernet0")
|
||||
bond0.add_member_vpp_bond_interface(sw_if_index=self.pg0.sw_if_index)
|
||||
self.logger.info("bond add_member interface pg1 to BondEthernet0")
|
||||
bond0.add_member_vpp_bond_interface(sw_if_index=self.pg1.sw_if_index)
|
||||
|
||||
# verify both slaves in BondEthernet0
|
||||
if_dump = self.vapi.sw_interface_slave_dump(bond0.sw_if_index)
|
||||
# verify both members in BondEthernet0
|
||||
if_dump = self.vapi.sw_member_interface_dump(bond0.sw_if_index)
|
||||
self.assertTrue(self.pg0.is_interface_config_in_dump(if_dump))
|
||||
self.assertTrue(self.pg1.is_interface_config_in_dump(if_dump))
|
||||
|
||||
@@ -163,8 +163,8 @@ class TestBondInterface(VppTestCase):
|
||||
|
||||
bond0.remove_vpp_config()
|
||||
|
||||
def test_bond_enslave(self):
|
||||
""" Bond enslave/detach slave test """
|
||||
def test_bond_add_member(self):
|
||||
""" Bond add_member/detach member test """
|
||||
|
||||
# create interface (BondEthernet0) and set bond mode to LACP
|
||||
self.logger.info("create bond")
|
||||
@@ -172,25 +172,27 @@ class TestBondInterface(VppTestCase):
|
||||
bond0.add_vpp_config()
|
||||
bond0.admin_up()
|
||||
|
||||
# verify that interfaces can be enslaved and detached two times
|
||||
# verify that interfaces can be added as_member and detached two times
|
||||
for i in range(2):
|
||||
# verify pg0 and pg1 not in BondEthernet0
|
||||
if_dump = self.vapi.sw_interface_slave_dump(bond0.sw_if_index)
|
||||
if_dump = self.vapi.sw_member_interface_dump(bond0.sw_if_index)
|
||||
self.assertFalse(self.pg0.is_interface_config_in_dump(if_dump))
|
||||
self.assertFalse(self.pg1.is_interface_config_in_dump(if_dump))
|
||||
|
||||
# enslave pg0 and pg1 to BondEthernet0
|
||||
self.logger.info("bond enslave interface pg0 to BondEthernet0")
|
||||
bond0.enslave_vpp_bond_interface(sw_if_index=self.pg0.sw_if_index,
|
||||
is_passive=0,
|
||||
is_long_timeout=0)
|
||||
# add_member pg0 and pg1 to BondEthernet0
|
||||
self.logger.info("bond add_member interface pg0 to BondEthernet0")
|
||||
bond0.add_member_vpp_bond_interface(
|
||||
sw_if_index=self.pg0.sw_if_index,
|
||||
is_passive=0,
|
||||
is_long_timeout=0)
|
||||
|
||||
self.logger.info("bond enslave interface pg1 to BondEthernet0")
|
||||
bond0.enslave_vpp_bond_interface(sw_if_index=self.pg1.sw_if_index,
|
||||
is_passive=0,
|
||||
is_long_timeout=0)
|
||||
# verify both slaves in BondEthernet0
|
||||
if_dump = self.vapi.sw_interface_slave_dump(bond0.sw_if_index)
|
||||
self.logger.info("bond add_member interface pg1 to BondEthernet0")
|
||||
bond0.add_member_vpp_bond_interface(
|
||||
sw_if_index=self.pg1.sw_if_index,
|
||||
is_passive=0,
|
||||
is_long_timeout=0)
|
||||
# verify both members in BondEthernet0
|
||||
if_dump = self.vapi.sw_member_interface_dump(bond0.sw_if_index)
|
||||
self.assertTrue(self.pg0.is_interface_config_in_dump(if_dump))
|
||||
self.assertTrue(self.pg1.is_interface_config_in_dump(if_dump))
|
||||
|
||||
@@ -199,7 +201,7 @@ class TestBondInterface(VppTestCase):
|
||||
bond0.detach_vpp_bond_interface(sw_if_index=self.pg0.sw_if_index)
|
||||
|
||||
# verify pg0 is not in BondEthernet0, but pg1 is
|
||||
if_dump = self.vapi.sw_interface_slave_dump(bond0.sw_if_index)
|
||||
if_dump = self.vapi.sw_member_interface_dump(bond0.sw_if_index)
|
||||
self.assertFalse(self.pg0.is_interface_config_in_dump(if_dump))
|
||||
self.assertTrue(self.pg1.is_interface_config_in_dump(if_dump))
|
||||
|
||||
@@ -208,7 +210,7 @@ class TestBondInterface(VppTestCase):
|
||||
bond0.detach_vpp_bond_interface(sw_if_index=self.pg1.sw_if_index)
|
||||
|
||||
# verify pg0 and pg1 not in BondEthernet0
|
||||
if_dump = self.vapi.sw_interface_slave_dump(bond0.sw_if_index)
|
||||
if_dump = self.vapi.sw_member_interface_dump(bond0.sw_if_index)
|
||||
self.assertFalse(self.pg0.is_interface_config_in_dump(if_dump))
|
||||
self.assertFalse(self.pg1.is_interface_config_in_dump(if_dump))
|
||||
|
||||
@@ -234,7 +236,7 @@ class TestBondInterface(VppTestCase):
|
||||
self.assertIn('BondEthernet1', ifs)
|
||||
|
||||
# verify they are in the dump also
|
||||
if_dump = self.vapi.sw_interface_bond_dump()
|
||||
if_dump = self.vapi.sw_bond_interface_dump(sw_if_index=0xFFFFFFFF)
|
||||
self.assertTrue(bond0.is_interface_config_in_dump(if_dump))
|
||||
self.assertTrue(bond1.is_interface_config_in_dump(if_dump))
|
||||
|
||||
@@ -252,7 +254,7 @@ class TestBondInterface(VppTestCase):
|
||||
self.assertNotIn('BondEthernet1', ifs)
|
||||
|
||||
# verify BondEthernet1 is not in the dump
|
||||
if_dump = self.vapi.sw_interface_bond_dump()
|
||||
if_dump = self.vapi.sw_bond_interface_dump(sw_if_index=0xFFFFFFFF)
|
||||
self.assertFalse(bond1.is_interface_config_in_dump(if_dump))
|
||||
|
||||
# verify BondEthernet0 is still in the dump
|
||||
@@ -269,7 +271,8 @@ class TestBondInterface(VppTestCase):
|
||||
self.assertNotIn('BondEthernet0', ifs)
|
||||
|
||||
# verify BondEthernet0 is not in the dump
|
||||
if_dump = self.vapi.sw_interface_bond_dump()
|
||||
if_dump = self.vapi.sw_bond_interface_dump(
|
||||
sw_if_index=bond0.sw_if_index)
|
||||
self.assertFalse(bond0.is_interface_config_in_dump(if_dump))
|
||||
|
||||
|
||||
|
||||
@@ -27,18 +27,18 @@ class VppBondInterface(VppInterface):
|
||||
def remove_vpp_config(self):
|
||||
self.test.vapi.bond_delete(self.sw_if_index)
|
||||
|
||||
def enslave_vpp_bond_interface(self,
|
||||
sw_if_index,
|
||||
is_passive=0,
|
||||
is_long_timeout=0):
|
||||
self.test.vapi.bond_enslave(sw_if_index,
|
||||
self.sw_if_index,
|
||||
is_passive,
|
||||
is_long_timeout)
|
||||
def add_member_vpp_bond_interface(self,
|
||||
sw_if_index,
|
||||
is_passive=0,
|
||||
is_long_timeout=0):
|
||||
self.test.vapi.bond_add_member(sw_if_index,
|
||||
self.sw_if_index,
|
||||
is_passive,
|
||||
is_long_timeout)
|
||||
|
||||
def detach_vpp_bond_interface(self,
|
||||
sw_if_index):
|
||||
self.test.vapi.bond_detach_slave(sw_if_index)
|
||||
self.test.vapi.bond_detach_member(sw_if_index)
|
||||
|
||||
def is_interface_config_in_dump(self, dump):
|
||||
for i in dump:
|
||||
|
||||
Reference in New Issue
Block a user