bonding: Add /if/lacp/<bond-sw_if_index>/<slave-sw_if_index>/partner-state

We already had /if/lacp/<bond-sw_if_index>/<slave-sw_if_index>/state in
the stats segment. Add also the partner-state to be complete.
Change to populate stats segment with the states at startup, after processing
an lacp pdu, and after timer expiration.

Unit test
---------
sudo vpp_get_stats dump | grep /if/lacp
63.00 /if/lacp/3/1/state
61.00 /if/lacp/3/1/partner-state
63.00 /if/lacp/3/2/state
61.00 /if/lacp/3/2/partner-state

Type: feature

Signed-off-by: Steven Luong <sluong@cisco.com>
Change-Id: Ib7b8e1183d572bb6e422a846aaa2b7b3559a0dc7
diff --git a/src/vnet/bonding/cli.c b/src/vnet/bonding/cli.c
index 554ffe9..e6d8f1c 100644
--- a/src/vnet/bonding/cli.c
+++ b/src/vnet/bonding/cli.c
@@ -63,10 +63,6 @@
     vlib_process_signal_event (bm->vlib_main, bond_process_node.index,
 			       BOND_SEND_GARP_NA, bif->hw_if_index);
   clib_spinlock_unlock_if_init (&bif->lockp);
-
-  if (bif->mode == BOND_MODE_LACP)
-    stat_segment_set_state_counter (bm->stats[bif->sw_if_index]
-				    [sif->sw_if_index], sif->actor.state);
 }
 
 /*
@@ -175,10 +171,6 @@
 
 done:
   clib_spinlock_unlock_if_init (&bif->lockp);
-
-  if (bif->mode == BOND_MODE_LACP)
-    stat_segment_set_state_counter (bm->stats[bif->sw_if_index]
-				    [sif->sw_if_index], sif->actor.state);
 }
 
 int
@@ -329,8 +321,12 @@
     (*bm->lacp_enable_disable) (vm, bif, sif, 0);
 
   if (bif->mode == BOND_MODE_LACP)
-    stat_segment_deregister_state_counter
-      (bm->stats[bif->sw_if_index][sif->sw_if_index]);
+    {
+      stat_segment_deregister_state_counter
+	(bm->stats[bif->sw_if_index][sif->sw_if_index].actor_state);
+      stat_segment_deregister_state_counter
+	(bm->stats[bif->sw_if_index][sif->sw_if_index].partner_state);
+    }
 
   pool_put (bm->neighbors, sif);
 }
@@ -628,7 +624,19 @@
       vec_validate (bm->stats[bif->sw_if_index], args->slave);
 
       args->error = stat_segment_register_state_counter
-	(name, &bm->stats[bif->sw_if_index][args->slave]);
+	(name, &bm->stats[bif->sw_if_index][args->slave].actor_state);
+      if (args->error != 0)
+	{
+	  args->rv = VNET_API_ERROR_INVALID_INTERFACE;
+	  vec_free (name);
+	  return;
+	}
+
+      vec_reset_length (name);
+      name = format (0, "/if/lacp/%u/%u/partner-state%c", bif->sw_if_index,
+		     args->slave, 0);
+      args->error = stat_segment_register_state_counter
+	(name, &bm->stats[bif->sw_if_index][args->slave].partner_state);
       vec_free (name);
       if (args->error != 0)
 	{