bpf_trace_filter: plugin for BPF Trace Filtering
[vpp.git] / src / vnet / gso / gro_func.h
index c9464bd..e2e4e93 100644 (file)
@@ -25,6 +25,7 @@
 #include <vnet/udp/udp_packet.h>
 #include <vnet/tcp/tcp_packet.h>
 #include <vnet/vnet.h>
+#include <vnet/interface.h>
 
 #define GRO_MIN_PACKET_SIZE    256
 #define GRO_PADDED_PACKET_SIZE 64
@@ -383,6 +384,7 @@ gro_fixup_header (vlib_main_t *vm, vlib_buffer_t *b0, u32 ack_number, u8 is_l2)
                                       1 /* is_ip6 */ );
 
   vnet_buffer2 (b0)->gso_size = b0->current_length - gho0.hdr_sz;
+  vnet_buffer (b0)->l2_hdr_offset = b0->current_data;
 
   if (gho0.gho_flags & GHO_F_IP4)
     {
@@ -391,6 +393,7 @@ gro_fixup_header (vlib_main_t *vm, vlib_buffer_t *b0, u32 ack_number, u8 is_l2)
       ip4->length =
        clib_host_to_net_u16 (vlib_buffer_length_in_chain (vm, b0) -
                              gho0.l3_hdr_offset);
+      vnet_buffer (b0)->l3_hdr_offset = (u8 *) ip4 - b0->data;
       b0->flags |= (VNET_BUFFER_F_GSO | VNET_BUFFER_F_IS_IP4);
       vnet_buffer_offload_flags_set (b0, (VNET_BUFFER_OFFLOAD_F_TCP_CKSUM |
                                          VNET_BUFFER_OFFLOAD_F_IP_CKSUM));
@@ -402,12 +405,15 @@ gro_fixup_header (vlib_main_t *vm, vlib_buffer_t *b0, u32 ack_number, u8 is_l2)
       ip6->payload_length =
        clib_host_to_net_u16 (vlib_buffer_length_in_chain (vm, b0) -
                              gho0.l4_hdr_offset);
+      vnet_buffer (b0)->l3_hdr_offset = (u8 *) ip6 - b0->data;
       b0->flags |= (VNET_BUFFER_F_GSO | VNET_BUFFER_F_IS_IP6);
       vnet_buffer_offload_flags_set (b0, VNET_BUFFER_OFFLOAD_F_TCP_CKSUM);
     }
 
   tcp_header_t *tcp0 =
     (tcp_header_t *) (vlib_buffer_get_current (b0) + gho0.l4_hdr_offset);
+  vnet_buffer (b0)->l4_hdr_offset = (u8 *) tcp0 - b0->data;
+  vnet_buffer2 (b0)->gso_l4_hdr_sz = tcp_header_bytes (tcp0);
   tcp0->ack_number = ack_number;
   b0->flags &= ~VLIB_BUFFER_IS_TRACED;
 }
@@ -444,9 +450,9 @@ vnet_gro_flow_table_flush (vlib_main_t * vm, gro_flow_table_t * flow_table,
 }
 
 static_always_inline void
-vnet_gro_flow_table_schedule_node_on_dispatcher (vlib_main_t * vm,
-                                                gro_flow_table_t *
-                                                flow_table)
+vnet_gro_flow_table_schedule_node_on_dispatcher (vlib_main_t *vm,
+                                                vnet_hw_if_tx_queue_t *txq,
+                                                gro_flow_table_t *flow_table)
 {
   if (gro_flow_table_is_timeout (vm, flow_table))
     {
@@ -457,9 +463,13 @@ vnet_gro_flow_table_schedule_node_on_dispatcher (vlib_main_t * vm,
        {
          u32 node_index = flow_table->node_index;
          vlib_frame_t *f = vlib_get_frame_to_node (vm, node_index);
+         vnet_hw_if_tx_frame_t *ft = vlib_frame_scalar_args (f);
          u32 *f_to = vlib_frame_vector_args (f);
          u32 i = 0;
 
+         ft->shared_queue = txq->shared_queue;
+         ft->queue_id = txq->queue_id;
+
          while (i < n_to)
            {
              f_to[f->n_vectors] = to[i];