pg: add GSO support
[vpp.git] / src / vnet / pg / pg.h
index 111df91..aef7a5b 100644 (file)
@@ -43,7 +43,7 @@
 #include <vlib/vlib.h>         /* for VLIB_N_RX_TX */
 #include <vnet/pg/edit.h>
 #include <vppinfra/fifo.h>     /* for buffer_fifo */
-#include <vnet/unix/pcap.h>
+#include <vppinfra/pcap.h>
 #include <vnet/interface.h>
 
 extern vnet_device_class_t pg_dev_class;
@@ -89,8 +89,6 @@ typedef struct
   /* Buffers pre-initialized with fixed buffer data for this stream. */
   u32 *buffer_fifo;
 
-  /* Buffer free list for this buffer index in stream. */
-  u32 free_list_index;
 } pg_buffer_index_t;
 
 typedef struct pg_stream_t
@@ -102,7 +100,6 @@ typedef struct pg_stream_t
 
   /* Stream is currently enabled. */
 #define PG_STREAM_FLAGS_IS_ENABLED (1 << 0)
-#define PG_STREAM_FLAGS_DISABLE_BUFFER_RECYCLE (1 << 1)
 
   /* Edit groups are created by each protocol level (e.g. ethernet,
      ip4, tcp, ...). */
@@ -169,6 +166,7 @@ typedef struct pg_stream_t
   pg_buffer_index_t *buffer_indices;
 
   u8 **replay_packet_templates;
+  u64 *replay_packet_timestamps;
   u32 current_replay_packet_index;
 } pg_stream_t;
 
@@ -192,6 +190,7 @@ pg_edit_group_free (pg_edit_group_t * g)
 always_inline void
 pg_stream_free (pg_stream_t * s)
 {
+  int i;
   pg_edit_group_t *g;
   pg_edit_t *e;
   vec_foreach (e, s->non_fixed_edits) pg_edit_free (e);
@@ -201,6 +200,10 @@ pg_stream_free (pg_stream_t * s)
   vec_free (s->fixed_packet_data);
   vec_free (s->fixed_packet_data_mask);
   vec_free (s->name);
+  for (i = 0; i < vec_len (s->replay_packet_templates); i++)
+    vec_free (s->replay_packet_templates[i]);
+  vec_free (s->replay_packet_templates);
+  vec_free (s->replay_packet_timestamps);
 
   {
     pg_buffer_index_t *bi;
@@ -281,7 +284,7 @@ pg_free_edit_group (pg_stream_t * s)
   pg_edit_group_t *g = pg_stream_get_group (s, i);
 
   pg_edit_group_free (g);
-  memset (g, 0, sizeof (g[0]));
+  clib_memset (g, 0, sizeof (g[0]));
   _vec_len (s->edit_groups) = i;
 }
 
@@ -296,6 +299,8 @@ typedef struct
   /* Identifies stream for this interface. */
   u32 id;
 
+  u8 gso_enabled;
+  u32 gso_size;
   pcap_main_t pcap_main;
   u8 *pcap_file_name;
 } pg_interface_t;
@@ -322,6 +327,9 @@ typedef struct pg_main_t
   pg_interface_t *interfaces;
   uword *if_index_by_if_id;
 
+  /* Vector of buffer indices for use in pg_stream_fill_replay, per thread */
+  u32 **replay_buffers_by_thread;
+
   /* Per VLIB node information. */
   pg_node_t *nodes;
 } pg_main_t;
@@ -338,13 +346,15 @@ vlib_node_function_t pg_input, pg_output;
 /* Stream add/delete. */
 void pg_stream_del (pg_main_t * pg, uword index);
 void pg_stream_add (pg_main_t * pg, pg_stream_t * s_init);
+void pg_stream_change (pg_main_t * pg, pg_stream_t * s);
 
 /* Enable/disable stream. */
 void pg_stream_enable_disable (pg_main_t * pg, pg_stream_t * s,
                               int is_enable);
 
 /* Find/create free packet-generator interface index. */
-u32 pg_interface_add_or_get (pg_main_t * pg, uword stream_index);
+u32 pg_interface_add_or_get (pg_main_t * pg, uword stream_index,
+                            u8 gso_enabled, u32 gso_size);
 
 always_inline pg_node_t *
 pg_get_node (uword node_index)