ikev2: install/remove ipsec tunnels from main thread
[vpp.git] / src / plugins / svs / svs.c
index d9e46a5..8c1487c 100644 (file)
@@ -37,10 +37,16 @@ svs_table_add (fib_protocol_t fproto, u32 table_id)
 int
 svs_table_delete (fib_protocol_t fproto, u32 table_id)
 {
-  u32 fib_index;
+  u32 fib_index, ii;
 
   fib_index = fib_table_find (fproto, table_id);
 
+  vec_foreach_index (ii, svs_itf_db[fproto])
+  {
+    if (svs_itf_db[fproto][ii] == fib_index)
+      return VNET_API_ERROR_INSTANCE_IN_USE;
+  }
+
   if (~0 == fib_index)
     return VNET_API_ERROR_NO_SUCH_FIB;
 
@@ -186,6 +192,9 @@ svs_ip4_table_bind (ip4_main_t * im,
 int
 svs_disable (fib_protocol_t fproto, u32 table_id, u32 sw_if_index)
 {
+  fib_prefix_t pfx = {
+    .fp_proto = fproto,
+  };
   u32 fib_index;
 
   fib_index = fib_table_find (fproto, table_id);
@@ -193,7 +202,7 @@ svs_disable (fib_protocol_t fproto, u32 table_id, u32 sw_if_index)
   if (~0 == fib_index)
     return VNET_API_ERROR_NO_SUCH_FIB;
 
-  if (sw_if_index <= vec_len (svs_itf_db[fproto]))
+  if (sw_if_index >= vec_len (svs_itf_db[fproto]))
     return VNET_API_ERROR_INVALID_SW_IF_INDEX;
 
   svs_itf_db[fproto][sw_if_index] = ~0;
@@ -205,6 +214,8 @@ svs_disable (fib_protocol_t fproto, u32 table_id, u32 sw_if_index)
                                "svs-ip4" :
                                "svs-ip6"), sw_if_index, 0, NULL, 0);
 
+  fib_table_entry_special_remove (fib_index, &pfx, FIB_SOURCE_PLUGIN_LOW);
+
   return (0);
 }
 
@@ -293,8 +304,7 @@ svs_input_inline (vlib_main_t * vm,
              ip6_header_t *ip0;
 
              ip0 = vlib_buffer_get_current (b0);
-             lbi0 = ip6_fib_table_fwding_lookup (&ip6_main,
-                                                 svs_itf_db[fproto]
+             lbi0 = ip6_fib_table_fwding_lookup (svs_itf_db[fproto]
                                                  [sw_if_index0],
                                                  &ip0->src_address);
            }