DRAFT ip4/6_frag to support DPO Style based Next Node 52/10252/2
authorVijayabhaskar Katamreddy <vkatamre@cisco.com>
Thu, 25 Jan 2018 23:12:11 +0000 (15:12 -0800)
committerFlorin Coras <florin.coras@gmail.com>
Mon, 29 Jan 2018 15:50:36 +0000 (15:50 +0000)
Change-Id: I1df3d23c1c5668b83d52b41f51c0e3f24183af9e
Signed-off-by: Vijayabhaskar Katamreddy <vkatamre@cisco.com>
src/vnet/buffer.h
src/vnet/ip/ip_frag.c

index 097f68f..dfab874 100644 (file)
@@ -289,6 +289,7 @@ typedef struct
     /* IP Fragmentation */
     struct
     {
+      u32 pad[2];              /* do not overlay w/ ip.adj_index[0,1] */
       u16 header_offset;
       u16 mtu;
       u8 next_index;
index 2af697e..fba25ff 100644 (file)
@@ -131,6 +131,12 @@ ip4_frag_do_fragment (vlib_main_t * vm, u32 pi, u32 ** buffer,
            vnet_buffer (p)->sw_if_index[VLIB_RX];
          vnet_buffer (b)->sw_if_index[VLIB_TX] =
            vnet_buffer (p)->sw_if_index[VLIB_TX];
+         /* Copy Adj_index in case DPO based node is sending for the fragmentation,
+            the packet would be sent back to the proper DPO next node and Index */
+         vnet_buffer (b)->ip.adj_index[VLIB_RX] =
+           vnet_buffer (p)->ip.adj_index[VLIB_RX];
+         vnet_buffer (b)->ip.adj_index[VLIB_TX] =
+           vnet_buffer (p)->ip.adj_index[VLIB_TX];
          fip4 = (ip4_header_t *) (vlib_buffer_get_current (b) + offset);
 
          //Copy offset and ip4 header
@@ -393,6 +399,14 @@ ip6_frag_do_fragment (vlib_main_t * vm, u32 pi, u32 ** buffer,
            vnet_buffer (p)->sw_if_index[VLIB_RX];
          vnet_buffer (b)->sw_if_index[VLIB_TX] =
            vnet_buffer (p)->sw_if_index[VLIB_TX];
+
+         /* Copy Adj_index in case DPO based node is sending for the fragmentation,
+            the packet would be sent back to the proper DPO next node and Index */
+         vnet_buffer (b)->ip.adj_index[VLIB_RX] =
+           vnet_buffer (p)->ip.adj_index[VLIB_RX];
+         vnet_buffer (b)->ip.adj_index[VLIB_TX] =
+           vnet_buffer (p)->ip.adj_index[VLIB_TX];
+
          clib_memcpy (vlib_buffer_get_current (b),
                       vlib_buffer_get_current (p), headers_len);
          clib_memcpy (vlib_buffer_get_current (b) + headers_len,