FIB: encode the label stack in the FIB path during table dump
[vpp.git] / src / vnet / fib / fib_path.c
index baf8275..d4a701d 100644 (file)
@@ -37,6 +37,7 @@
 #include <vnet/fib/fib_internal.h>
 #include <vnet/fib/fib_urpf_list.h>
 #include <vnet/fib/mpls_fib.h>
+#include <vnet/fib/fib_path_ext.h>
 #include <vnet/udp/udp_encap.h>
 #include <vnet/bier/bier_fmask.h>
 #include <vnet/bier/bier_table.h>
@@ -605,10 +606,14 @@ format_fib_path (u8 * s, va_list * args)
                         vnm,
                         path->dvr.fp_interface));
         break;
+    case FIB_PATH_TYPE_DEAG:
+        s = format (s, " %sfib-index:%d",
+                    (path->fp_cfg_flags & FIB_PATH_CFG_FLAG_RPF_ID ?  "m" : ""),
+                    path->deag.fp_tbl_id);
+        break;
     case FIB_PATH_TYPE_RECEIVE:
     case FIB_PATH_TYPE_INTF_RX:
     case FIB_PATH_TYPE_SPECIAL:
-    case FIB_PATH_TYPE_DEAG:
     case FIB_PATH_TYPE_EXCLUSIVE:
        if (dpo_id_is_valid(&path->fp_dpo))
        {
@@ -1802,7 +1807,7 @@ fib_path_recursive_loop_detect (fib_node_index_t path_index,
        {
            /*
             * no loop here yet. keep forward walking the graph.
-            */     
+            */
            if (fib_entry_recursive_loop_detect(path->fp_via_fib, entry_indicies))
            {
                FIB_PATH_DBG(path, "recursive loop formed");
@@ -1818,6 +1823,18 @@ fib_path_recursive_loop_detect (fib_node_index_t path_index,
     }
     case FIB_PATH_TYPE_ATTACHED_NEXT_HOP:
     case FIB_PATH_TYPE_ATTACHED:
+       if (adj_recursive_loop_detect(path->fp_dpo.dpoi_index,
+                                      entry_indicies))
+       {
+           FIB_PATH_DBG(path, "recursive loop formed");
+           path->fp_oper_flags |= FIB_PATH_OPER_FLAG_RECURSIVE_LOOP;
+       }
+        else
+        {
+            FIB_PATH_DBG(path, "recursive loop cleared");
+            path->fp_oper_flags &= ~FIB_PATH_OPER_FLAG_RECURSIVE_LOOP;
+        }
+        break;
     case FIB_PATH_TYPE_SPECIAL:
     case FIB_PATH_TYPE_DEAG:
     case FIB_PATH_TYPE_DVR:
@@ -2597,7 +2614,8 @@ fib_path_is_looped (fib_node_index_t path_index)
 
 fib_path_list_walk_rc_t
 fib_path_encode (fib_node_index_t path_list_index,
-                fib_node_index_t path_index,
+                 fib_node_index_t path_index,
+                 const fib_path_ext_t *path_ext,
                  void *ctx)
 {
     fib_route_path_encode_t **api_rpaths = ctx;
@@ -2616,7 +2634,7 @@ fib_path_encode (fib_node_index_t path_list_index,
     api_rpath->dpo = path->fp_dpo;
 
     switch (path->fp_type)
-      {
+    {
       case FIB_PATH_TYPE_RECEIVE:
         api_rpath->rpath.frp_addr = path->receive.fp_addr;
         api_rpath->rpath.frp_sw_if_index = path->receive.fp_interface;
@@ -2635,6 +2653,10 @@ fib_path_encode (fib_node_index_t path_list_index,
         break;
       case FIB_PATH_TYPE_DEAG:
         api_rpath->rpath.frp_fib_index = path->deag.fp_tbl_id;
+        if (path->fp_cfg_flags & FIB_PATH_CFG_FLAG_RPF_ID)
+        {
+            api_rpath->rpath.frp_flags |= FIB_ROUTE_PATH_RPF_ID;
+        }
         break;
       case FIB_PATH_TYPE_RECURSIVE:
         api_rpath->rpath.frp_addr = path->recursive.fp_nh.fp_ip;
@@ -2648,9 +2670,18 @@ fib_path_encode (fib_node_index_t path_list_index,
           api_rpath->rpath.frp_udp_encap_id = path->udp_encap.fp_udp_encap_id;
           api_rpath->rpath.frp_flags |= FIB_ROUTE_PATH_UDP_ENCAP;
           break;
+      case FIB_PATH_TYPE_INTF_RX:
+         api_rpath->rpath.frp_sw_if_index = path->receive.fp_interface;
+         api_rpath->rpath.frp_flags |= FIB_ROUTE_PATH_INTF_RX;
+         break;
       default:
         break;
-      }
+    }
+
+    if (path_ext && path_ext->fpe_type == FIB_PATH_EXT_MPLS) 
+    {
+        api_rpath->rpath.frp_label_stack = path_ext->fpe_path.frp_label_stack;
+    }
 
     return (FIB_PATH_LIST_WALK_CONTINUE);
 }
@@ -2690,7 +2721,7 @@ show_fib_path_command (vlib_main_t * vm,
            path = fib_path_get(pi);
            u8 *s = format(NULL, "%U", format_fib_path, pi, 1,
                            FIB_PATH_FORMAT_FLAGS_NONE);
-           s = format(s, "children:");
+           s = format(s, "\n  children:");
            s = fib_node_children_format(path->fp_node.fn_children, s);
            vlib_cli_output (vm, "%s", s);
            vec_free(s);