bonding lacp: replace slave string with member
[vpp.git] / src / plugins / lacp / ptx_machine.c
index ac83444..bb9d033 100644 (file)
  *  LACP State = NO_PERIODIC
  */
 static lacp_fsm_state_t lacp_ptx_state_no_periodic[] = {
-  {LACP_ACTION_NO_PERIODIC, LACP_PTX_STATE_FAST_PERIODIC},     // event 0 BEGIN
-  {LACP_NOACTION, LACP_PTX_STATE_NO_PERIODIC}, // event 1 LONG_TIMEOUT
-  {LACP_NOACTION, LACP_PTX_STATE_NO_PERIODIC}, // event 2 TIMER_EXPIRED
-  {LACP_NOACTION, LACP_PTX_STATE_NO_PERIODIC}, // event 3 SHORT_TIMEOUT
+  {LACP_ACTION_NO_PERIODIC, LACP_PTX_STATE_NO_PERIODIC},       // event 0 NO_PERIODIC
+  {LACP_ACTION_SLOW_PERIODIC, LACP_PTX_STATE_SLOW_PERIODIC},   // event 1 LONG_TIMEOUT
+  {LACP_ACTION_NO_PERIODIC, LACP_PTX_STATE_NO_PERIODIC},       // event 2 TIMER_EXPIRED
+  {LACP_ACTION_FAST_PERIODIC, LACP_PTX_STATE_FAST_PERIODIC},   // event 3 SHORT_TIMEOUT
 };
 
 /*
  *  LACP State = FAST_PERIODIC
  */
 static lacp_fsm_state_t lacp_ptx_state_fast_periodic[] = {
-  {LACP_ACTION_FAST_PERIODIC, LACP_PTX_STATE_FAST_PERIODIC},   // event 0 BEGIN
+  {LACP_ACTION_NO_PERIODIC, LACP_PTX_STATE_NO_PERIODIC},       // event 0 NO_PERIODIC
   {LACP_ACTION_SLOW_PERIODIC, LACP_PTX_STATE_SLOW_PERIODIC},   // event 1 LONG_TIMEOUT
   {LACP_ACTION_TIMER_EXPIRED, LACP_PTX_STATE_PERIODIC_TX},     // event 2 TIMER_EXPIRED
   {LACP_ACTION_FAST_PERIODIC, LACP_PTX_STATE_FAST_PERIODIC},   // event 3 SHORT_TIMEOUT
@@ -42,7 +42,7 @@ static lacp_fsm_state_t lacp_ptx_state_fast_periodic[] = {
  *  LACP State = SLOW_PERIODIC
  */
 static lacp_fsm_state_t lacp_ptx_state_slow_periodic[] = {
-  {LACP_ACTION_NO_PERIODIC, LACP_PTX_STATE_NO_PERIODIC},       // event 0 BEGIN
+  {LACP_ACTION_NO_PERIODIC, LACP_PTX_STATE_NO_PERIODIC},       // event 0 NO_PERIODIC
   {LACP_ACTION_SLOW_PERIODIC, LACP_PTX_STATE_SLOW_PERIODIC},   // event 1 LONG_TIMEOUT
   {LACP_ACTION_TIMER_EXPIRED, LACP_PTX_STATE_PERIODIC_TX},     // event 2 TIMER_EXPIRED
   {LACP_ACTION_FAST_PERIODIC, LACP_PTX_STATE_FAST_PERIODIC},   // event 3 SHORT_TIMEOUT
@@ -52,7 +52,7 @@ static lacp_fsm_state_t lacp_ptx_state_slow_periodic[] = {
  *  LACP State = PERIODIC_TX
  */
 static lacp_fsm_state_t lacp_ptx_state_periodic_tx[] = {
-  {LACP_ACTION_NO_PERIODIC, LACP_PTX_STATE_NO_PERIODIC},       // event 0 BEGIN
+  {LACP_ACTION_NO_PERIODIC, LACP_PTX_STATE_NO_PERIODIC},       // event 0 NO_PERIODIC
   {LACP_NOACTION, LACP_PTX_STATE_PERIODIC_TX}, // event 1 LONG_TIMEOUT
   {LACP_ACTION_TIMER_EXPIRED, LACP_PTX_STATE_PERIODIC_TX},     // event 2 TIMER_EXPIRED
   {LACP_NOACTION, LACP_PTX_STATE_PERIODIC_TX}, // event 3 SHORT_TIMEOUT
@@ -74,36 +74,39 @@ lacp_machine_t lacp_ptx_machine = {
 int
 lacp_ptx_action_no_periodic (void *p1, void *p2)
 {
-  vlib_main_t *vm = (vlib_main_t *) p1;
-  slave_if_t *sif = (slave_if_t *) p2;
-
-  lacp_stop_timer (&sif->periodic_timer);
-
-  lacp_machine_dispatch (&lacp_ptx_machine, vm, sif,
-                        LACP_PTX_EVENT_BEGIN, &sif->ptx_state);
+  vlib_main_t *vm = p1;
+  member_if_t *mif = p2;
 
+  lacp_stop_timer (&mif->periodic_timer);
+  lacp_ptx_post_short_timeout_event (vm, mif);
   return 0;
 }
 
 int
 lacp_ptx_action_slow_periodic (void *p1, void *p2)
 {
-  vlib_main_t *vm = (vlib_main_t *) p1;
-  slave_if_t *sif = (slave_if_t *) p2;
+  vlib_main_t *vm = p1;
+  member_if_t *mif = p2;
   u8 timer_expired;
-  lacp_main_t *lm = &lacp_main;
 
-  if (lacp_timer_is_running (sif->periodic_timer) &&
-      lacp_timer_is_expired (lm->vlib_main, sif->periodic_timer))
-    timer_expired = 1;
+  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
-    timer_expired = 0;
+    {
+      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 (lm->vlib_main, sif, LACP_SLOW_PERIODIC_TIMER);
+      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;
 }
@@ -111,26 +114,32 @@ lacp_ptx_action_slow_periodic (void *p1, void *p2)
 int
 lacp_ptx_action_fast_periodic (void *p1, void *p2)
 {
-  vlib_main_t *vm = (vlib_main_t *) p1;
-  slave_if_t *sif = (slave_if_t *) p2;
+  vlib_main_t *vm = p1;
+  member_if_t *mif = p2;
   u8 timer_expired;
-  lacp_main_t *lm = &lacp_main;
 
-  if (lacp_timer_is_running (sif->periodic_timer) &&
-      lacp_timer_is_expired (lm->vlib_main, sif->periodic_timer))
-    timer_expired = 1;
+  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
-    timer_expired = 0;
+    {
+      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 (lm->vlib_main, 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);
+      if (timer_expired)
+       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;
 }
@@ -138,18 +147,25 @@ lacp_ptx_action_fast_periodic (void *p1, void *p2)
 int
 lacp_ptx_action_timer_expired (void *p1, void *p2)
 {
-  vlib_main_t *vm = (vlib_main_t *) p1;
-  slave_if_t *sif = (slave_if_t *) p2;
-
-  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);
+  vlib_main_t *vm = p1;
+  member_if_t *mif = p2;
+
+  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
-    lacp_machine_dispatch (&lacp_ptx_machine, vm, sif,
-                          LACP_PTX_EVENT_LONG_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, mif,
+                              LACP_PTX_EVENT_LONG_TIMEOUT, &mif->ptx_state);
+    }
 
   return 0;
 }
@@ -164,8 +180,7 @@ format_ptx_event (u8 * s, va_list * args)
     {.str = NULL}
   };
   int e = va_arg (*args, int);
-  lacp_event_struct *event_entry =
-    (lacp_event_struct *) & lacp_ptx_event_array;
+  lacp_event_struct *event_entry = lacp_ptx_event_array;
 
   if (e >= (sizeof (lacp_ptx_event_array) / sizeof (*event_entry)))
     s = format (s, "Bad event %d", e);
@@ -176,21 +191,36 @@ 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)
 {
-  clib_warning ("%U-PTX: event %U, old state %U, new state %U",
-               format_vnet_sw_if_index_name, vnet_get_main (),
-               sif->sw_if_index, format_ptx_event,
-               event, format_ptx_sm_state, state, format_ptx_sm_state,
-               transition->next_state);
+  vlib_worker_thread_t *w = vlib_worker_threads + os_get_thread_index ();
+  /* *INDENT-OFF* */
+  ELOG_TYPE_DECLARE (e) =
+    {
+      .format = "%s",
+      .format_args = "T4",
+    };
+  /* *INDENT-ON* */
+  struct
+  {
+    u32 event;
+  } *ed = 0;
+
+  ed = ELOG_TRACK_DATA (&vlib_global_main.elog_main, e, w->elog_track);
+  ed->event =
+    elog_string (&vlib_global_main.elog_main, "%U-PTX: %U, %U->%U%c",
+                format_vnet_sw_if_index_name, vnet_get_main (),
+                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_BEGIN,
-                        &sif->ptx_state);
+  lacp_machine_dispatch (&lacp_ptx_machine, vm, mif,
+                        LACP_PTX_EVENT_NO_PERIODIC, &mif->ptx_state);
 }
 
 /*