Do fast-rate if we are not yet synchronized with the partner.
Stop sending LACP updates as a flash in the worker thread. Just expire the
timer and let the lacp_process handle sending LACP PDU.
Change-Id: I8b36fe74e752e7f45bd4a8d70512c0341cc197a1
Signed-off-by: Steven <sluong@cisco.com>
vlib_put_frame_to_node (vm, hw->output_node_index, f);
- sif->last_lacpdu_time = vlib_time_now (vm);
+ sif->last_lacpdu_time = vlib_time_now (lm->vlib_main);
}
/*
void
lacp_send_lacp_pdu (vlib_main_t * vm, slave_if_t * sif)
{
- lacp_main_t *lm = &lacp_main;
-
if (sif->mode != BOND_MODE_LACP)
{
lacp_stop_timer (&sif->periodic_timer);
default:
ASSERT (0);
}
-
- lacp_start_periodic_timer (lm->vlib_main, sif, sif->is_long_timeout ?
- LACP_SLOW_PERIODIC_TIMER :
- LACP_FAST_PERIODIC_TIMER);
}
void
{
vlib_main_t *vm = (vlib_main_t *) p1;
slave_if_t *sif = (slave_if_t *) p2;
+ lacp_main_t *lm = &lacp_main;
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_machine_dispatch (&lacp_tx_machine, vm, sif, LACP_TX_EVENT_NTT,
- &sif->tx_state);
+ lacp_start_periodic_timer (lm->vlib_main, sif, 0);
if (sif->selected == LACP_PORT_SELECTED)
lacp_machine_dispatch (&lacp_mux_machine, vm, sif,
{
vlib_main_t *vm = (vlib_main_t *) p1;
slave_if_t *sif = (slave_if_t *) p2;
+ lacp_main_t *lm = &lacp_main;
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_machine_dispatch (&lacp_tx_machine, vm, sif, LACP_TX_EVENT_NTT,
- &sif->tx_state);
+ lacp_start_periodic_timer (lm->vlib_main, sif, 0);
if ((sif->selected == LACP_PORT_UNSELECTED) ||
(sif->selected == LACP_PORT_STANDBY))
{
vlib_main_t *vm = (vlib_main_t *) p1;
slave_if_t *sif = (slave_if_t *) p2;
+ lacp_main_t *lm = &lacp_main;
sif->actor.state |= LACP_STATE_SYNCHRONIZATION | LACP_STATE_COLLECTING |
LACP_STATE_DISTRIBUTING;
bond_enable_collecting_distributing (vm, sif);
sif->ntt = 1;
- lacp_machine_dispatch (&lacp_tx_machine, vm, sif, LACP_TX_EVENT_NTT,
- &sif->tx_state);
+ lacp_start_periodic_timer (lm->vlib_main, sif, 0);
if ((sif->selected == LACP_PORT_UNSELECTED) ||
(sif->selected == LACP_PORT_STANDBY) ||
!(sif->partner.state & LACP_STATE_SYNCHRONIZATION))
else
timer_expired = 0;
- lacp_start_periodic_timer (lm->vlib_main, sif, LACP_SLOW_PERIODIC_TIMER);
+ lacp_schedule_periodic_timer (lm->vlib_main, sif);
if (timer_expired || (sif->partner.state & LACP_STATE_LACP_TIMEOUT))
lacp_machine_dispatch (&lacp_ptx_machine, vm, sif,
sif->periodic_timer = vlib_time_now (vm) + expiration;
}
+static inline void
+lacp_schedule_periodic_timer (vlib_main_t * vm, slave_if_t * sif)
+{
+ // do fast rate if we are not yet synchronized
+ if (((sif->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);
+ else
+ lacp_start_periodic_timer (vm, sif, LACP_SLOW_PERIODIC_TIMER);
+}
+
#endif /* __LACP_PTX_MACHINE_H__ */
/*
lacp_pdu_t *lacpdu = (lacp_pdu_t *) sif->last_rx_pkt;
u8 states = LACP_STATE_LACP_ACTIVITY | LACP_STATE_LACP_TIMEOUT |
LACP_STATE_SYNCHRONIZATION | LACP_STATE_AGGREGATION;
+ lacp_main_t *lm = &lacp_main;
if ((states & lacpdu->partner.port_info.state) !=
(states & sif->actor.state)
sizeof (sif->actor) - sizeof (sif->actor.state)))
{
sif->ntt = 1;
- lacp_machine_dispatch (&lacp_tx_machine, vm, sif, LACP_TX_EVENT_NTT,
- &sif->tx_state);
+ lacp_start_periodic_timer (lm->vlib_main, sif, 0);
}
}
timer_expired = 1;
else
timer_expired = 0;
- lacp_start_current_while_timer (lm->vlib_main, sif, LACP_SHORT_TIMOUT_TIME);
+ lacp_start_current_while_timer (lm->vlib_main, sif, sif->ttl_in_seconds);
sif->actor.state |= LACP_STATE_EXPIRED;
if (timer_expired)
lacp_machine_dispatch (&lacp_rx_machine, vm, sif,
{
vlib_main_t *vm = (vlib_main_t *) p1;
slave_if_t *sif = (slave_if_t *) p2;
- f64 now = vlib_time_now (vm);
+ lacp_main_t *lm = &lacp_main;
+ f64 now = vlib_time_now (lm->vlib_main);
if (!lacp_timer_is_running (sif->periodic_timer))
return 0;
if (sif->ntt)
{
lacp_send_lacp_pdu (vm, sif);
+ lacp_schedule_periodic_timer (lm->vlib_main, sif);
}
sif->ntt = 0;