+static u8 *
+format_vl_api_fib_path_type (u8 * s, va_list * args)
+{
+ vl_api_fib_path_type_t t = va_arg (*args, vl_api_fib_path_type_t);
+
+ switch (t)
+ {
+ case FIB_API_PATH_TYPE_NORMAL:
+ s = format (s, "normal");
+ break;
+ case FIB_API_PATH_TYPE_LOCAL:
+ s = format (s, "local");
+ break;
+ case FIB_API_PATH_TYPE_DROP:
+ s = format (s, "drop");
+ break;
+ case FIB_API_PATH_TYPE_UDP_ENCAP:
+ s = format (s, "udp-encap");
+ break;
+ case FIB_API_PATH_TYPE_BIER_IMP:
+ s = format (s, "bier-imp");
+ break;
+ case FIB_API_PATH_TYPE_ICMP_UNREACH:
+ s = format (s, "unreach");
+ break;
+ case FIB_API_PATH_TYPE_ICMP_PROHIBIT:
+ s = format (s, "prohibit");
+ break;
+ case FIB_API_PATH_TYPE_SOURCE_LOOKUP:
+ s = format (s, "src-lookup");
+ break;
+ case FIB_API_PATH_TYPE_DVR:
+ s = format (s, "dvr");
+ break;
+ case FIB_API_PATH_TYPE_INTERFACE_RX:
+ s = format (s, "interface-rx");
+ break;
+ case FIB_API_PATH_TYPE_CLASSIFY:
+ s = format (s, "classify");
+ break;
+ }
+
+ return (s);
+}
+
+static void
+vl_api_fib_path_print (vat_main_t * vam, vl_api_fib_path_t * fp)
+{
+ print (vam->ofp,
+ " weight %d, sw_if_index %d, type %U, afi %U, next_hop %U",
+ ntohl (fp->weight), ntohl (fp->sw_if_index),
+ format_vl_api_fib_path_type, fp->type,
+ format_fib_api_path_nh_proto, fp->proto,
+ format_vl_api_ip_address_union, &fp->nh.address);
+}
+
+static void
+vl_api_mpls_fib_path_json_print (vat_json_node_t * node,
+ vl_api_fib_path_t * fp)
+{
+ struct in_addr ip4;
+ struct in6_addr ip6;
+
+ vat_json_object_add_uint (node, "weight", ntohl (fp->weight));
+ vat_json_object_add_uint (node, "sw_if_index", ntohl (fp->sw_if_index));
+ vat_json_object_add_uint (node, "type", fp->type);
+ vat_json_object_add_uint (node, "next_hop_proto", fp->proto);
+ if (fp->proto == FIB_API_PATH_NH_PROTO_IP4)
+ {
+ clib_memcpy (&ip4, &fp->nh.address.ip4, sizeof (ip4));
+ vat_json_object_add_ip4 (node, "next_hop", ip4);
+ }
+ else if (fp->proto == FIB_API_PATH_NH_PROTO_IP4)
+ {
+ clib_memcpy (&ip6, &fp->nh.address.ip6, sizeof (ip6));
+ vat_json_object_add_ip6 (node, "next_hop", ip6);
+ }
+}
+
+static void
+vl_api_mpls_tunnel_details_t_handler (vl_api_mpls_tunnel_details_t * mp)
+{
+ vat_main_t *vam = &vat_main;
+ int count = ntohl (mp->mt_tunnel.mt_n_paths);
+ vl_api_fib_path_t *fp;
+ i32 i;
+
+ print (vam->ofp, "sw_if_index %d via:",
+ ntohl (mp->mt_tunnel.mt_sw_if_index));
+ fp = mp->mt_tunnel.mt_paths;
+ for (i = 0; i < count; i++)
+ {
+ vl_api_fib_path_print (vam, fp);
+ fp++;
+ }
+
+ print (vam->ofp, "");
+}
+
+#define vl_api_mpls_tunnel_details_t_endian vl_noop_handler
+#define vl_api_mpls_tunnel_details_t_print vl_noop_handler