vlib: add tunnel offload flags for vlib_buffer_t
[vpp.git] / src / vnet / pg / pg.h
index 0b06803..963d23a 100644 (file)
@@ -45,6 +45,8 @@
 #include <vppinfra/fifo.h>     /* for buffer_fifo */
 #include <vppinfra/pcap.h>
 #include <vnet/interface.h>
+#include <vnet/ethernet/mac_address.h>
+#include <vnet/gso/gro.h>
 
 extern vnet_device_class_t pg_dev_class;
 
@@ -100,7 +102,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, ...). */
@@ -124,6 +125,12 @@ typedef struct pg_stream_t
      for max_packet_bytes. */
   u32 buffer_bytes;
 
+  /* Buffer flags to set in each packet e.g. l2 valid  flags */
+  u32 buffer_flags;
+
+  /* Buffer offload flags to set in each packet e.g. checksum offload flags */
+  u32 buffer_oflags;
+
   /* Last packet length if packet size edit type is increment. */
   u32 last_increment_packet_size;
 
@@ -156,6 +163,9 @@ typedef struct pg_stream_t
      Zero means no packet limit. */
   u64 n_packets_limit;
 
+  /* Only generate up to n_max_frame per frame. */
+  u32 n_max_frame;
+
   /* Rate for this stream in packets/second.
      Zero means unlimited rate. */
   f64 rate_packets_per_second;
@@ -289,6 +299,13 @@ pg_free_edit_group (pg_stream_t * s)
   _vec_len (s->edit_groups) = i;
 }
 
+typedef enum pg_interface_mode_t_
+{
+  PG_MODE_ETHERNET,
+  PG_MODE_IP4,
+  PG_MODE_IP6,
+} pg_interface_mode_t;
+
 typedef struct
 {
   /* TX lock */
@@ -300,8 +317,15 @@ typedef struct
   /* Identifies stream for this interface. */
   u32 id;
 
+  u8 coalesce_enabled;
+  gro_flow_table_t *flow_table;
+  u8 gso_enabled;
+  u32 gso_size;
   pcap_main_t pcap_main;
-  u8 *pcap_file_name;
+  char *pcap_file_name;
+  pg_interface_mode_t mode;
+
+  mac_address_t *allowed_mcast_macs;
 } pg_interface_t;
 
 /* Per VLIB node data. */
@@ -325,9 +349,15 @@ typedef struct pg_main_t
   /* Pool of interfaces. */
   pg_interface_t *interfaces;
   uword *if_index_by_if_id;
+  uword *if_id_by_sw_if_index;
+
+  /* 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;
+
+  u16 msg_id_base;
 } pg_main_t;
 
 /* Global main structure. */
@@ -342,13 +372,20 @@ 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);
 
+/* Enable/disable packet coalesce on given interface */
+void pg_interface_enable_disable_coalesce (pg_interface_t * pi, u8 enable,
+                                          u32 tx_node_index);
+
 /* 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, u8 coalesce_enabled,
+                            pg_interface_mode_t mode);
 
 always_inline pg_node_t *
 pg_get_node (uword node_index)
@@ -370,7 +407,7 @@ typedef struct
   u32 hw_if_index;
   u32 dev_instance;
   u8 is_enabled;
-  u8 *pcap_file_name;
+  char *pcap_file_name;
   u32 count;
 } pg_capture_args_t;
 
@@ -378,8 +415,8 @@ clib_error_t *pg_capture (pg_capture_args_t * a);
 
 typedef struct
 {
-  vlib_buffer_t buffer;
   u32 buffer_index;
+  vlib_buffer_t buffer;
 }
 pg_output_trace_t;