ip: force full reassembly before virtual
[vpp.git] / src / vnet / ip / reass / ip4_full_reass.c
index 5e5969e..7f0b8d9 100644 (file)
@@ -1222,8 +1222,10 @@ ip4_full_reass_inline (vlib_main_t *vm, vlib_node_runtime_t *node,
          goto packet_enqueue;
        }
 
-      u32 fib_index = vec_elt (ip4_main.fib_index_by_sw_if_index,
-                              vnet_buffer (b0)->sw_if_index[VLIB_RX]);
+      u32 fib_index = (vnet_buffer (b0)->sw_if_index[VLIB_TX] == (u32) ~0) ?
+                             vec_elt (ip4_main.fib_index_by_sw_if_index,
+                                vnet_buffer (b0)->sw_if_index[VLIB_RX]) :
+                             vnet_buffer (b0)->sw_if_index[VLIB_TX];
 
       ip4_full_reass_kv_t kv = { .k.fib_index = fib_index,
                                 .k.src.as_u32 = ip0->src_address.as_u32,
@@ -1422,11 +1424,11 @@ VLIB_REGISTER_NODE (ip4_full_reass_node_feature) = {
 };
 
 VNET_FEATURE_INIT (ip4_full_reass_feature, static) = {
-    .arc_name = "ip4-unicast",
-    .node_name = "ip4-full-reassembly-feature",
-    .runs_before = VNET_FEATURES ("ip4-lookup",
-                                  "ipsec4-input-feature"),
-    .runs_after = 0,
+  .arc_name = "ip4-unicast",
+  .node_name = "ip4-full-reassembly-feature",
+  .runs_before = VNET_FEATURES ("ip4-lookup", "ipsec4-input-feature",
+                               "ip4-sv-reassembly-feature"),
+  .runs_after = 0,
 };
 
 VLIB_NODE_FN (ip4_full_reass_node_custom) (vlib_main_t * vm,
@@ -1451,15 +1453,6 @@ VLIB_REGISTER_NODE (ip4_full_reass_node_custom) = {
         },
 };
 
-VNET_FEATURE_INIT (ip4_full_reass_custom, static) = {
-    .arc_name = "ip4-unicast",
-    .node_name = "ip4-full-reassembly-feature",
-    .runs_before = VNET_FEATURES ("ip4-lookup",
-                                  "ipsec4-input-feature"),
-    .runs_after = 0,
-};
-
-
 #ifndef CLIB_MARCH_VARIANT
 uword
 ip4_full_reass_custom_register_next_node (uword node_index)