Route counters in the stats segment
[vpp.git] / src / vnet / mpls / mpls_api.c
index 8fec8e8..dbd1d8b 100644 (file)
@@ -168,7 +168,8 @@ vl_api_mpls_ip_bind_unbind_t_handler (vl_api_mpls_ip_bind_unbind_t * mp)
 
 static int
 mpls_route_add_del_t_handler (vnet_main_t * vnm,
-                             vl_api_mpls_route_add_del_t * mp)
+                             vl_api_mpls_route_add_del_t * mp,
+                             u32 * stats_index)
 {
   fib_mpls_label_t *label_stack = NULL;
   u32 fib_index, next_hop_fib_index;
@@ -227,31 +228,36 @@ mpls_route_add_del_t_handler (vnet_main_t * vnm,
     }
 
   /* *INDENT-OFF* */
-  return (add_del_route_t_handler (mp->mr_is_multipath, mp->mr_is_add,
-                                   0,  // mp->is_drop,
-                                  0,   // mp->is_unreach,
-                                  0,   // mp->is_prohibit,
-                                  0,   // mp->is_local,
-                                  mp->mr_is_multicast,
-                                   mp->mr_is_classify,
-                                   mp->mr_classify_table_index,
-                                   mp->mr_is_resolve_host,
-                                   mp->mr_is_resolve_attached,
-                                   mp->mr_is_interface_rx,
-                                   mp->mr_is_rpf_id,
-                                   0,  // l2_bridged
-                                   0,   // is source_lookup
-                                   0,   // is_udp_encap
+  rv = add_del_route_t_handler (mp->mr_is_multipath, mp->mr_is_add,
+                                0,     // mp->is_drop,
+                                0,     // mp->is_unreach,
+                                0,     // mp->is_prohibit,
+                                0,     // mp->is_local,
+                                mp->mr_is_multicast,
+                                mp->mr_is_classify,
+                                mp->mr_classify_table_index,
+                                mp->mr_is_resolve_host,
+                                mp->mr_is_resolve_attached,
+                                mp->mr_is_interface_rx,
+                                mp->mr_is_rpf_id,
+                                0,     // l2_bridged
+                                0,   // is source_lookup
+                                0,   // is_udp_encap
                                   fib_index, &pfx,
-                                  mp->mr_next_hop_proto,
-                                  &nh, ~0, // next_hop_id
-                                   ntohl (mp->mr_next_hop_sw_if_index),
-                                  next_hop_fib_index,
-                                  mp->mr_next_hop_weight,
-                                  mp->mr_next_hop_preference,
-                                  ntohl (mp->mr_next_hop_via_label),
-                                  label_stack));
+                                mp->mr_next_hop_proto,
+                                &nh, ~0, // next_hop_id
+                                ntohl (mp->mr_next_hop_sw_if_index),
+                                next_hop_fib_index,
+                                mp->mr_next_hop_weight,
+                                mp->mr_next_hop_preference,
+                                ntohl (mp->mr_next_hop_via_label),
+                                label_stack);
   /* *INDENT-ON* */
+
+  if (mp->mr_is_add && 0 == rv)
+    *stats_index = fib_table_entry_get_stats_index (fib_index, &pfx);
+
+  return (rv);
 }
 
 void
@@ -259,16 +265,20 @@ vl_api_mpls_route_add_del_t_handler (vl_api_mpls_route_add_del_t * mp)
 {
   vl_api_mpls_route_add_del_reply_t *rmp;
   vnet_main_t *vnm;
+  u32 stats_index;
   int rv;
 
   vnm = vnet_get_main ();
-  vnm->api_errno = 0;
+  stats_index = ~0;
 
-  rv = mpls_route_add_del_t_handler (vnm, mp);
-
-  rv = (rv == 0) ? vnm->api_errno : rv;
+  rv = mpls_route_add_del_t_handler (vnm, mp, &stats_index);
 
-  REPLY_MACRO (VL_API_MPLS_ROUTE_ADD_DEL_REPLY);
+  /* *INDENT-OFF* */
+  REPLY_MACRO2 (VL_API_MPLS_ROUTE_ADD_DEL_REPLY,
+  ({
+    rmp->stats_index = htonl (stats_index);
+  }));
+  /* *INDENT-ON* */
 }
 
 void