#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;
/* Buffers pre-initialized with fixed buffer data for this stream. */
u32 *buffer_fifo;
- /* Buffer free list for this buffer index in stream. */
- vlib_buffer_free_list_index_t free_list_index;
} pg_buffer_index_t;
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, ...). */
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;
pg_buffer_index_t *buffer_indices;
u8 **replay_packet_templates;
+ u64 *replay_packet_timestamps;
u32 current_replay_packet_index;
} pg_stream_t;
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);
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;
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;
}
/* Identifies stream for this interface. */
u32 id;
+ u8 gso_enabled;
+ u32 gso_size;
pcap_main_t pcap_main;
- u8 *pcap_file_name;
+ char *pcap_file_name;
} pg_interface_t;
/* Per VLIB node data. */
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;
/* 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)
u32 hw_if_index;
u32 dev_instance;
u8 is_enabled;
- u8 *pcap_file_name;
+ char *pcap_file_name;
u32 count;
} pg_capture_args_t;