lacp: missing endian conversions for trace packet format
[vpp.git] / src / plugins / lacp / input.c
index 9b1f3b6..fd1296a 100644 (file)
@@ -16,6 +16,7 @@
 #define _GNU_SOURCE
 #include <vnet/bonding/node.h>
 #include <lacp/node.h>
+#include <vpp/stats/stat_segment.h>
 
 static int
 lacp_packet_scan (vlib_main_t * vm, slave_if_t * sif)
@@ -61,7 +62,7 @@ marker_fill_request_pdu (marker_pdu_t * marker, slave_if_t * sif)
 }
 
 static void
-send_ethernet_marker_response_pdu (slave_if_t * sif)
+send_ethernet_marker_response_pdu (vlib_main_t * vm, slave_if_t * sif)
 {
   lacp_main_t *lm = &lacp_main;
   u32 *to_next;
@@ -70,7 +71,6 @@ send_ethernet_marker_response_pdu (slave_if_t * sif)
   u32 bi0;
   vlib_buffer_t *b0;
   vlib_frame_t *f;
-  vlib_main_t *vm = lm->vlib_main;
   vnet_main_t *vnm = lm->vnet_main;
 
   /*
@@ -108,6 +108,8 @@ send_ethernet_marker_response_pdu (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++;
 }
 
 static int
@@ -123,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 (sif);
+  send_ethernet_marker_response_pdu (vm, sif);
 
   return LACP_ERROR_NONE;
 }
@@ -134,7 +136,7 @@ handle_marker_protocol (vlib_main_t * vm, slave_if_t * sif)
 lacp_error_t
 lacp_input (vlib_main_t * vm, vlib_buffer_t * b0, u32 bi0)
 {
-  lacp_main_t *lm = &lacp_main;
+  bond_main_t *bm = &bond_main;
   slave_if_t *sif;
   uword nbytes;
   lacp_error_t e;
@@ -153,6 +155,7 @@ 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,
@@ -160,8 +163,13 @@ lacp_input (vlib_main_t * vm, vlib_buffer_t * b0, u32 bi0)
       nbytes = vlib_buffer_contents (vm, bi0, sif->last_marker_pkt);
       ASSERT (nbytes <= vec_len (sif->last_marker_pkt));
       if (nbytes < sizeof (lacp_pdu_t))
-       return LACP_ERROR_TOO_SMALL;
-      return (handle_marker_protocol (vm, sif));
+       {
+         sif->marker_bad_pdu_received++;
+         return LACP_ERROR_TOO_SMALL;
+       }
+      e = handle_marker_protocol (vm, sif);
+      sif->marker_pdu_received++;
+      return e;
     }
 
   /*
@@ -185,30 +193,38 @@ lacp_input (vlib_main_t * vm, vlib_buffer_t * b0, u32 bi0)
   nbytes = vlib_buffer_contents (vm, bi0, sif->last_rx_pkt);
   ASSERT (nbytes <= vec_len (sif->last_rx_pkt));
 
+  sif->last_lacpdu_recd_time = vlib_time_now (vm);
   if (nbytes < sizeof (lacp_pdu_t))
     {
+      sif->bad_pdu_received++;
       return LACP_ERROR_TOO_SMALL;
     }
 
   last_packet_signature =
     hash_memory (sif->last_rx_pkt, vec_len (sif->last_rx_pkt), 0xd00b);
 
-  bif = bond_get_master_by_dev_instance (sif->bif_dev_instance);
   if (sif->last_packet_signature_valid &&
       (sif->last_packet_signature == last_packet_signature) &&
-      hash_get (bif->active_slave_by_sw_if_index, sif->sw_if_index))
+      ((sif->actor.state & LACP_STEADY_STATE) == LACP_STEADY_STATE))
     {
-      lacp_start_current_while_timer (lm->vlib_main, sif,
-                                     sif->ttl_in_seconds);
+      lacp_start_current_while_timer (vm, sif, sif->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);
+      stat_segment_set_state_counter (bm->stats[bif->sw_if_index]
+                                     [sif->sw_if_index].actor_state,
+                                     sif->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;
     }
+  sif->pdu_received++;
 
   if (sif->last_rx_pkt)
     _vec_len (sif->last_rx_pkt) = 0;
@@ -222,15 +238,15 @@ lacp_input (vlib_main_t * vm, vlib_buffer_t * b0, u32 bi0)
 static clib_error_t *
 lacp_init (vlib_main_t * vm)
 {
-  clib_error_t *error;
-
-  if ((error = vlib_call_init_function (vm, lacp_periodic_init)))
-    return error;
-
   return 0;
 }
 
-VLIB_INIT_FUNCTION (lacp_init);
+/* *INDENT-OFF* */
+VLIB_INIT_FUNCTION (lacp_init) =
+{
+  .runs_after = VLIB_INITS("lacp_periodic_init"),
+};
+/* *INDENT-ON* */
 
 /*
  * packet trace format function, very similar to
@@ -267,11 +283,11 @@ lacp_input_format_trace (u8 * s, va_list * args)
          s = format (s, "  Marker Information TLV: length %u\n",
                      marker->marker_info.tlv_length);
          s = format (s, "  Requester port: %u\n",
-                     marker->marker_info.requester_port);
+                     ntohs (marker->marker_info.requester_port));
          s = format (s, "  Requester system: %U\n", format_ethernet_address,
                      marker->marker_info.requester_system);
          s = format (s, "  Requester transaction ID: %u\n",
-                     marker->marker_info.requester_transaction_id);
+                     ntohl (marker->marker_info.requester_transaction_id));
          break;
 
        case LACP_SUBTYPE: