Improve Load-Balance MAPs
[vpp.git] / src / vnet / fib / fib_path.c
index f81f417..889317f 100644 (file)
@@ -240,25 +240,6 @@ typedef struct fib_path_t_ {
            } fp_nh;
            /**
             * The FIB table index in which to find the next-hop.
-            * This needs to be fixed. We should lookup the adjacencies in
-            * a separate table of adjacencies, rather than from the FIB.
-            * Two reasons I can think of:
-            *   - consider:
-            *       int ip addr Gig0 10.0.0.1/24
-            *       ip route 10.0.0.2/32 via Gig1 192.168.1.2
-            *       ip route 1.1.1.1/32 via Gig0 10.0.0.2
-            *     this is perfectly valid.
-            *     Packets addressed to 10.0.0.2 should be sent via Gig1.
-            *     Packets address to 1.1.1.1 should be sent via Gig0.
-            *    when we perform the adj resolution from the FIB for the path
-            *    "via Gig0 10.0.0.2" the lookup will result in the route via Gig1
-            *    and so we will pick up the adj via Gig1 - which was not what the
-            *    operator wanted.
-            *  - we can only return link-type IPv4 and so not the link-type MPLS.
-            *    more on this in a later commit.
-            *
-            * The table ID should only belong to a recursive path and indicate
-            * which FIB should be used to resolve the next-hop.
             */
            fib_node_index_t fp_tbl_id;
        } recursive;
@@ -797,7 +778,7 @@ fib_path_to_chain_type (const fib_path_t *path)
         }
         else
         {
-            return (FIB_FORW_CHAIN_TYPE_MPLS_EOS);
+            return (FIB_FORW_CHAIN_TYPE_MPLS_NON_EOS);
         }
     }
     return (FIB_FORW_CHAIN_TYPE_UNICAST_IP4);
@@ -1640,8 +1621,7 @@ fib_path_resolve (fib_node_index_t path_index)
        fei = fib_table_entry_special_add(path->recursive.fp_tbl_id,
                                          &pfx,
                                          FIB_SOURCE_RR,
-                                         FIB_ENTRY_FLAG_NONE,
-                                         ADJ_INDEX_INVALID);
+                                         FIB_ENTRY_FLAG_NONE);
 
        path = fib_path_get(path_index);
        path->fp_via_fib = fei;
@@ -2045,13 +2025,15 @@ fib_path_append_nh_for_multipath_hash (fib_node_index_t path_index,
 }
 
 int
-fib_path_is_recursive (fib_node_index_t path_index)
+fib_path_is_recursive_constrained (fib_node_index_t path_index)
 {
     fib_path_t *path;
 
     path = fib_path_get(path_index);
 
-    return (FIB_PATH_TYPE_RECURSIVE == path->fp_type);
+    return ((FIB_PATH_TYPE_RECURSIVE == path->fp_type) &&
+            ((path->fp_cfg_flags & FIB_PATH_CFG_FLAG_RESOLVE_ATTACHED) ||
+             (path->fp_cfg_flags & FIB_PATH_CFG_FLAG_RESOLVE_HOST)));
 }
 
 int