Revert "Enforce FIB table creation before use"
[vpp.git] / src / vnet / ip / ip_api.c
index f3712d3..a64c5b7 100644 (file)
@@ -830,6 +830,7 @@ add_del_route_t_handler (u8 is_multipath,
                         u8 is_interface_rx,
                         u8 is_rpf_id,
                         u8 is_l2_bridged,
+                        u8 is_source_lookup,
                         u32 fib_index,
                         const fib_prefix_t * prefix,
                         dpo_proto_t next_hop_proto,
@@ -877,6 +878,8 @@ add_del_route_t_handler (u8 is_multipath,
     path_flags |= FIB_ROUTE_PATH_INTF_RX;
   if (is_rpf_id)
     path_flags |= FIB_ROUTE_PATH_RPF_ID;
+  if (is_source_lookup)
+    path_flags |= FIB_ROUTE_PATH_SOURCE_LOOKUP;
   if (is_multicast)
     entry_flags |= FIB_ENTRY_FLAG_MULTICAST;
 
@@ -986,11 +989,23 @@ add_del_route_check (fib_protocol_t table_proto,
 {
   vnet_main_t *vnm = vnet_get_main ();
 
+  /* Temporaray whilst I do the CSIT dance */
+  u8 create_missing_tables = 1;
+
   *fib_index = fib_table_find (table_proto, ntohl (table_id));
   if (~0 == *fib_index)
     {
-      /* No such VRF */
-      return VNET_API_ERROR_NO_SUCH_FIB;
+      if (create_missing_tables)
+       {
+         *fib_index = fib_table_find_or_create_and_lock (table_proto,
+                                                         ntohl (table_id),
+                                                         FIB_SOURCE_API);
+       }
+      else
+       {
+         /* No such VRF, and we weren't asked to create one */
+         return VNET_API_ERROR_NO_SUCH_FIB;
+       }
     }
 
   if (!is_rpf_id && ~0 != ntohl (next_hop_sw_if_index))
@@ -1019,7 +1034,26 @@ add_del_route_check (fib_protocol_t table_proto,
 
       if (~0 == *next_hop_fib_index)
        {
-         return VNET_API_ERROR_NO_SUCH_FIB;
+         if (create_missing_tables)
+           {
+             if (is_rpf_id)
+               *next_hop_fib_index =
+                 mfib_table_find_or_create_and_lock (fib_nh_proto,
+                                                     ntohl
+                                                     (next_hop_table_id),
+                                                     MFIB_SOURCE_API);
+             else
+               *next_hop_fib_index =
+                 fib_table_find_or_create_and_lock (fib_nh_proto,
+                                                    ntohl
+                                                    (next_hop_table_id),
+                                                    FIB_SOURCE_API);
+           }
+         else
+           {
+             /* No such VRF, and we weren't asked to create one */
+             return VNET_API_ERROR_NO_SUCH_FIB;
+           }
        }
     }
 
@@ -1076,6 +1110,7 @@ ip4_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp)
                                   mp->is_resolve_host,
                                   mp->is_resolve_attached, 0, 0,
                                   mp->is_l2_bridged,
+                                  mp->is_source_lookup,
                                   fib_index, &pfx, DPO_PROTO_IP4,
                                   &nh,
                                   ntohl (mp->next_hop_sw_if_index),
@@ -1136,6 +1171,7 @@ ip6_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp)
                                   mp->is_resolve_host,
                                   mp->is_resolve_attached, 0, 0,
                                   mp->is_l2_bridged,
+                                  mp->is_source_lookup,
                                   fib_index, &pfx, DPO_PROTO_IP6,
                                   &nh, ntohl (mp->next_hop_sw_if_index),
                                   next_hop_fib_index,