MPLS tunnel dump fix
[vpp.git] / src / vnet / mpls / mpls_api.c
index 169ee40..97b6696 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 = mpls_route_add_del_t_handler (vnm, mp, &stats_index);
 
-  rv = (rv == 0) ? vnm->api_errno : rv;
-
-  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
@@ -306,6 +316,7 @@ vl_api_mpls_tunnel_add_del_t_handler (vl_api_mpls_tunnel_add_del_t * mp)
   u32 tunnel_sw_if_index;
   int ii;
   fib_route_path_t rpath, *rpaths = NULL;
+  u32 next_hop_via_label;
 
   memset (&rpath, 0, sizeof (rpath));
 
@@ -326,6 +337,14 @@ vl_api_mpls_tunnel_add_del_t_handler (vl_api_mpls_tunnel_add_del_t * mp)
   rpath.frp_sw_if_index = ntohl (mp->mt_next_hop_sw_if_index);
   rpath.frp_weight = 1;
 
+  next_hop_via_label = ntohl (mp->mt_next_hop_via_label);
+  if ((MPLS_LABEL_INVALID != next_hop_via_label) && (0 != next_hop_via_label))
+    {
+      rpath.frp_proto = DPO_PROTO_MPLS;
+      rpath.frp_local_label = next_hop_via_label;
+      rpath.frp_eos = MPLS_NON_EOS;
+    }
+
   if (mp->mt_is_add)
     {
       for (ii = 0; ii < mp->mt_next_hop_n_out_labels; ii++)
@@ -420,6 +439,7 @@ send_mpls_tunnel_entry (u32 mti, void *arg)
   mp->context = ctx->context;
 
   mp->mt_tunnel_index = ntohl (mti);
+  mp->mt_sw_if_index = ntohl (mt->mt_sw_if_index);
   mp->mt_count = ntohl (n);
 
   fib_path_list_walk (mt->mt_path_list, fib_path_encode, &api_rpaths);
@@ -427,12 +447,7 @@ send_mpls_tunnel_entry (u32 mti, void *arg)
   fp = mp->mt_paths;
   vec_foreach (api_rpath, api_rpaths)
   {
-    memset (fp, 0, sizeof (*fp));
-
-    fp->weight = api_rpath->rpath.frp_weight;
-    fp->preference = api_rpath->rpath.frp_preference;
-    fp->sw_if_index = htonl (api_rpath->rpath.frp_sw_if_index);
-    copy_fib_next_hop (api_rpath, fp);
+    fib_api_path_encode (api_rpath, fp);
     fp++;
   }
 
@@ -465,7 +480,7 @@ static void
 send_mpls_fib_details (vpe_api_main_t * am,
                       vl_api_registration_t * reg,
                       const fib_table_t * table,
-                      u32 label, u32 eos,
+                      const fib_prefix_t * pfx,
                       fib_route_path_encode_t * api_rpaths, u32 context)
 {
   vl_api_mpls_fib_details_t *mp;
@@ -484,18 +499,14 @@ send_mpls_fib_details (vpe_api_main_t * am,
   mp->table_id = htonl (table->ft_table_id);
   memcpy (mp->table_name, table->ft_desc,
          clib_min (vec_len (table->ft_desc), sizeof (mp->table_name)));
-  mp->eos_bit = eos;
-  mp->label = htonl (label);
+  mp->eos_bit = pfx->fp_eos;
+  mp->label = htonl (pfx->fp_label);
 
   mp->count = htonl (path_count);
   fp = mp->path;
   vec_foreach (api_rpath, api_rpaths)
   {
-    memset (fp, 0, sizeof (*fp));
-    fp->weight = api_rpath->rpath.frp_weight;
-    fp->preference = api_rpath->rpath.frp_preference;
-    fp->sw_if_index = htonl (api_rpath->rpath.frp_sw_if_index);
-    copy_fib_next_hop (api_rpath, fp);
+    fib_api_path_encode (api_rpath, fp);
     fp++;
   }
 
@@ -526,7 +537,7 @@ vl_api_mpls_fib_dump_t_handler (vl_api_mpls_fib_dump_t * mp)
   fib_table_t *fib_table;
   mpls_fib_t *mpls_fib;
   fib_node_index_t *lfeip = NULL;
-  fib_prefix_t pfx;
+  const fib_prefix_t *pfx;
   u32 fib_index;
   fib_route_path_encode_t *api_rpaths;
   vl_api_mpls_fib_dump_table_walk_ctx_t ctx = {
@@ -549,14 +560,12 @@ vl_api_mpls_fib_dump_t_handler (vl_api_mpls_fib_dump_t * mp)
 
   vec_foreach (lfeip, ctx.lfeis)
   {
-    fib_entry_get_prefix (*lfeip, &pfx);
+    pfx = fib_entry_get_prefix (*lfeip);
     fib_index = fib_entry_get_fib_index (*lfeip);
-    fib_table = fib_table_get (fib_index, pfx.fp_proto);
+    fib_table = fib_table_get (fib_index, pfx->fp_proto);
     api_rpaths = NULL;
     fib_entry_encode (*lfeip, &api_rpaths);
-    send_mpls_fib_details (am, reg,
-                          fib_table, pfx.fp_label,
-                          pfx.fp_eos, api_rpaths, mp->context);
+    send_mpls_fib_details (am, reg, fib_table, pfx, api_rpaths, mp->context);
     vec_free (api_rpaths);
   }