ip: allow overriding fib index in reass

Type: improvement

Signed-off-by: Florin Coras <fcoras@cisco.com>
Change-Id: Ic28da52b9c8286f71e472ef6c3afc23d464f85b0
diff --git a/src/vnet/ip/reass/ip4_full_reass.c b/src/vnet/ip/reass/ip4_full_reass.c
index 5e5969e..c65f349 100644
--- a/src/vnet/ip/reass/ip4_full_reass.c
+++ b/src/vnet/ip/reass/ip4_full_reass.c
@@ -1222,8 +1222,10 @@
 	  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,
diff --git a/src/vnet/ip/reass/ip6_full_reass.c b/src/vnet/ip/reass/ip6_full_reass.c
index 582dbf6..f14083d 100644
--- a/src/vnet/ip/reass/ip6_full_reass.c
+++ b/src/vnet/ip/reass/ip6_full_reass.c
@@ -1279,15 +1279,17 @@
 	    }
 	  else
 	    {
+	      u32 fib_index =
+		(vnet_buffer (b0)->sw_if_index[VLIB_TX] == (u32) ~0) ?
+			vec_elt (ip6_main.fib_index_by_sw_if_index,
+			   vnet_buffer (b0)->sw_if_index[VLIB_RX]) :
+			vnet_buffer (b0)->sw_if_index[VLIB_TX];
 	      kv.k.as_u64[0] = ip0->src_address.as_u64[0];
 	      kv.k.as_u64[1] = ip0->src_address.as_u64[1];
 	      kv.k.as_u64[2] = ip0->dst_address.as_u64[0];
 	      kv.k.as_u64[3] = ip0->dst_address.as_u64[1];
 	      kv.k.as_u64[4] =
-		((u64) vec_elt (ip6_main.fib_index_by_sw_if_index,
-				vnet_buffer (b0)->sw_if_index[VLIB_RX]))
-		  << 32 |
-		(u64) frag_hdr->identification;
+		((u64) fib_index) << 32 | (u64) frag_hdr->identification;
 	      /* RFC 8200: The Next Header values in the Fragment headers of
 	       * different fragments of the same original packet may differ.
 	       * Only the value from the Offset zero fragment packet is used