lacp: faster convergence for slow-rate config option 61/11461/2
authorSteven <sluong@cisco.com>
Thu, 29 Mar 2018 17:35:41 +0000 (10:35 -0700)
committerDamjan Marion <dmarion.lists@gmail.com>
Fri, 30 Mar 2018 20:44:56 +0000 (20:44 +0000)
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>
src/plugins/lacp/lacp.c
src/plugins/lacp/mux_machine.c
src/plugins/lacp/ptx_machine.c
src/plugins/lacp/ptx_machine.h
src/plugins/lacp/rx_machine.c
src/plugins/lacp/tx_machine.c

index 5fe505a..378d22b 100644 (file)
@@ -89,7 +89,7 @@ lacp_send_ethernet_lacp_pdu (slave_if_t * sif)
 
   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);
 }
 
 /*
@@ -106,8 +106,6 @@ lacp_pick_packet_template (slave_if_t * sif)
 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);
@@ -133,10 +131,6 @@ lacp_send_lacp_pdu (vlib_main_t * vm, slave_if_t * sif)
     default:
       ASSERT (0);
     }
-
-  lacp_start_periodic_timer (lm->vlib_main, sif, sif->is_long_timeout ?
-                            LACP_SLOW_PERIODIC_TIMER :
-                            LACP_FAST_PERIODIC_TIMER);
 }
 
 void
index f33c264..9c7cf74 100644 (file)
@@ -98,14 +98,14 @@ lacp_mux_action_detached (void *p1, void *p2)
 {
   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,
@@ -123,14 +123,14 @@ lacp_mux_action_attached (void *p1, void *p2)
 {
   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))
@@ -171,13 +171,13 @@ lacp_mux_action_collecting_distributing (void *p1, void *p2)
 {
   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))
index ac83444..5a1c6d8 100644 (file)
@@ -99,7 +99,7 @@ lacp_ptx_action_slow_periodic (void *p1, void *p2)
   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,
index a9af4bb..6183b63 100644 (file)
@@ -69,6 +69,21 @@ lacp_start_periodic_timer (vlib_main_t * vm, slave_if_t * sif, u8 expiration)
   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__ */
 
 /*
index 374e3f8..fd65aa3 100644 (file)
@@ -174,6 +174,7 @@ lacp_update_ntt (vlib_main_t * vm, slave_if_t * sif)
   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)
@@ -181,8 +182,7 @@ lacp_update_ntt (vlib_main_t * vm, slave_if_t * sif)
                 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);
     }
 }
 
@@ -292,7 +292,7 @@ lacp_rx_action_expired (void *p1, void *p2)
     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,
index 794b4f1..21b767c 100644 (file)
@@ -40,7 +40,8 @@ lacp_tx_action_transmit (void *p1, void *p2)
 {
   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;
@@ -52,6 +53,7 @@ lacp_tx_action_transmit (void *p1, void *p2)
   if (sif->ntt)
     {
       lacp_send_lacp_pdu (vm, sif);
+      lacp_schedule_periodic_timer (lm->vlib_main, sif);
     }
   sif->ntt = 0;