lacp: remove duplicated code
[vpp.git] / src / plugins / lacp / lacp.c
index 5fe505a..57d8bb0 100644 (file)
@@ -89,7 +89,8 @@ 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_sent_time = vlib_time_now (lm->vlib_main);
+  sif->pdu_sent++;
 }
 
 /*
@@ -106,8 +107,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 +132,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
@@ -185,6 +180,7 @@ lacp_interface_enable_disable (vlib_main_t * vm, bond_if_t * bif,
 
   if (enable)
     {
+      lacp_create_periodic_process ();
       port_number = clib_bitmap_first_clear (bif->port_number_bitmap);
       bif->port_number_bitmap = clib_bitmap_set (bif->port_number_bitmap,
                                                 port_number, 1);
@@ -200,11 +196,23 @@ lacp_interface_enable_disable (vlib_main_t * vm, bond_if_t * bif,
     }
   else
     {
-      lm->lacp_int--;
+      ASSERT (lm->lacp_int >= 1);
       if (lm->lacp_int == 0)
        {
-         vlib_process_signal_event (vm, lm->lacp_process_node_index,
-                                    LACP_PROCESS_EVENT_STOP, 0);
+         /* *INDENT-OFF* */
+         ELOG_TYPE_DECLARE (e) =
+           {
+             .format = "lacp-int-en-dis: BUG lacp_int == 0",
+           };
+         /* *INDENT-ON* */
+         ELOG_DATA (&vlib_global_main.elog_main, e);
+       }
+      else
+       {
+         lm->lacp_int--;
+         if (lm->lacp_int == 0)
+           vlib_process_signal_event (vm, lm->lacp_process_node_index,
+                                      LACP_PROCESS_EVENT_STOP, 0);
        }
     }
 }
@@ -222,7 +230,7 @@ lacp_periodic_init (vlib_main_t * vm)
 
   /* Create the ethernet lacp packet template */
 
-  memset (&h, 0, sizeof (h));
+  clib_memset (&h, 0, sizeof (h));
 
   memcpy (h.ethernet.dst_address, dst, sizeof (h.ethernet.dst_address));
 
@@ -259,7 +267,7 @@ lacp_periodic_init (vlib_main_t * vm)
 
   /* Create the ethernet marker protocol packet template */
 
-  memset (&m, 0, sizeof (m));
+  clib_memset (&m, 0, sizeof (m));
 
   memcpy (m.ethernet.dst_address, dst, sizeof (m.ethernet.dst_address));
 
@@ -313,7 +321,10 @@ lacp_init_neighbor (slave_if_t * sif, u8 * hw_address, u16 port_number,
   lacp_stop_timer (&sif->actor_churn_timer);
   lacp_stop_timer (&sif->partner_churn_timer);
   lacp_stop_timer (&sif->periodic_timer);
-  lacp_stop_timer (&sif->last_lacpdu_time);
+  lacp_stop_timer (&sif->last_lacpdu_sent_time);
+  lacp_stop_timer (&sif->last_lacpdu_recd_time);
+  lacp_stop_timer (&sif->last_marker_pdu_sent_time);
+  lacp_stop_timer (&sif->last_marker_pdu_recd_time);
   sif->lacp_enabled = 1;
   sif->loopback_port = 0;
   sif->ready = 0;
@@ -336,8 +347,7 @@ lacp_init_neighbor (slave_if_t * sif, u8 * hw_address, u16 port_number,
   sif->partner.key = htons (group);
   sif->partner.port_number = htons (port_number);
   sif->partner.port_priority = htons (LACP_DEFAULT_PORT_PRIORITY);
-  sif->partner.key = htons (group);
-  sif->partner.state = LACP_STATE_LACP_ACTIVITY;
+  sif->partner.state = 0;
 
   sif->actor_admin = sif->actor;
   sif->partner_admin = sif->partner;
@@ -369,10 +379,10 @@ lacp_sw_interface_up_down (vnet_main_t * vnm, u32 sw_if_index, u32 flags)
        {
          if (sif->lacp_enabled)
            {
-             lacp_init_state_machines (vm, sif);
              lacp_init_neighbor (sif, sif->actor_admin.system,
                                  ntohs (sif->actor_admin.port_number),
                                  ntohs (sif->actor_admin.key));
+             lacp_init_state_machines (vm, sif);
            }
        }
     }
@@ -389,9 +399,8 @@ lacp_hw_interface_up_down (vnet_main_t * vnm, u32 hw_if_index, u32 flags)
   slave_if_t *sif;
   vnet_sw_interface_t *sw;
   vlib_main_t *vm = lm->vlib_main;
-  vnet_interface_main_t *im = &vnm->interface_main;
 
-  sw = pool_elt_at_index (im->sw_interfaces, hw_if_index);
+  sw = vnet_get_hw_sw_interface (vnm, hw_if_index);
   sif = bond_get_slave_by_sw_if_index (sw->sw_if_index);
   if (sif)
     {
@@ -399,10 +408,10 @@ lacp_hw_interface_up_down (vnet_main_t * vnm, u32 hw_if_index, u32 flags)
        {
          if (sif->lacp_enabled)
            {
-             lacp_init_state_machines (vm, sif);
              lacp_init_neighbor (sif, sif->actor_admin.system,
                                  ntohs (sif->actor_admin.port_number),
                                  ntohs (sif->actor_admin.key));
+             lacp_init_state_machines (vm, sif);
            }
        }
     }
@@ -415,7 +424,7 @@ VNET_HW_INTERFACE_LINK_UP_DOWN_FUNCTION (lacp_hw_interface_up_down);
 /* *INDENT-OFF* */
 VLIB_PLUGIN_REGISTER () = {
     .version = VPP_BUILD_VER,
-    .description = "Link Aggregation Control Protocol",
+    .description = "Link Aggregation Control Protocol (LACP)",
 };
 /* *INDENT-ON* */