fib: Set the GLEAN flag on attached export routes so that the SAS works
[vpp.git] / src / vnet / fib / fib_types.c
index 2fce6a8..eab5ca2 100644 (file)
@@ -715,9 +715,6 @@ unformat_fib_route_path (unformat_input_t * input, va_list * args)
          rpath->frp_weight = 1;
          rpath->frp_flags |= FIB_ROUTE_PATH_LOCAL;
         }
-      else if (unformat (input, "%U",
-                        unformat_mfib_itf_flags, &rpath->frp_mitf_flags))
-       ;
       else if (unformat (input, "out-labels"))
         {
             while (unformat (input, "%U",
@@ -735,6 +732,9 @@ unformat_fib_route_path (unformat_input_t * input, va_list * args)
         {
             rpath->frp_proto = *payload_proto;
         }
+        else if (unformat (input, "%U",
+                        unformat_mfib_itf_flags, &rpath->frp_mitf_flags))
+       ;
         else if (unformat (input, "via"))
         {
             /* new path, back up and return */
@@ -752,3 +752,36 @@ unformat_fib_route_path (unformat_input_t * input, va_list * args)
 
     return (1);
 }
+
+/*
+ * Return true if the path is attached
+ */
+int
+fib_route_path_is_attached (const fib_route_path_t *rpath)
+{
+    /*
+     * DVR paths are not attached, since we are not playing the
+     * L3 game with these
+     */
+    if (rpath->frp_flags & (FIB_ROUTE_PATH_DVR |
+                            FIB_ROUTE_PATH_UDP_ENCAP))
+    {
+        return (0);
+    }
+
+    /*
+     * - All zeros next-hop
+     * - a valid interface
+     */
+    if (ip46_address_is_zero(&rpath->frp_addr) &&
+       (~0 != rpath->frp_sw_if_index))
+    {
+       return (!0);
+    }
+    else if (rpath->frp_flags & FIB_ROUTE_PATH_ATTACHED ||
+             rpath->frp_flags & FIB_ROUTE_PATH_GLEAN)
+    {
+        return (!0);
+    }
+    return (0);
+}