52 .path =
"packet-generator",
53 .short_help =
"Packet generator commands",
63 if (stream_index == ~0)
68 pg_stream_enable_disable (pg, s, is_enable);
116 u32 stream_index = ~0;
140 .path =
"packet-generator enable-stream",
141 .short_help =
"Enable packet generator streams",
149 .path =
"packet-generator disable-stream",
150 .short_help =
"Disable packet generator streams",
171 while (*junk_after_name && *junk_after_name !=
' ')
173 *junk_after_name = 0;
174 s =
format (s,
"edit-function %s, ", function_name);
185 int verbose = va_arg (*va,
int);
188 return format (s,
"%-16s%=12s%=16s%s",
189 "Name",
"Enabled",
"Count",
"Parameters");
191 s =
format (s,
"%-16v%=12s%=16Ld",
200 s =
format (s,
"size %d%c%d, ",
246 vlib_cli_output (vm,
"%U", format_pg_stream, s, verbose);
256 .path =
"show packet-generator ",
257 .short_help =
"show packet-generator [verbose]",
292 if (
unformat (input,
"limit %f", &x))
295 else if (
unformat (input,
"rate %f", &x))
339 u32 maxframe, hw_if_index;
341 int sub_input_given = 0;
345 char *pcap_file_name;
357 if (
unformat (input,
"name %v", &tmp))
364 else if (
unformat (input,
"node %U",
376 else if (
unformat (input,
"node %U",
379 else if (
unformat (input,
"maxframe %u", &maxframe))
384 else if (
unformat (input,
"interface %U",
388 else if (
unformat (input,
"tx-interface %U",
393 else if (
unformat (input,
"pcap %s", &pcap_file_name))
396 else if (!sub_input_given
411 if (!sub_input_given && !pcap_file_name)
419 if (pcap_file_name != 0)
443 if (pcap_file_name != 0)
458 (
"failed to parse packet data from `%U'",
479 .path =
"packet-generator new",
481 .short_help =
"Create packet generator stream",
483 "Create packet generator stream\n" 487 "name STRING sets stream name\n" 488 "interface STRING interface for stream output \n" 489 "node NODE-NAME node for stream output\n" 490 "data STRING specifies packet data\n" 491 "pcap FILENAME read packet data from pcap file\n" 492 "rate PPS rate to transfer packet data\n" 493 "maxframe NPKTS maximum number of packets per frame\n",
515 .path =
"packet-generator delete",
517 .short_help =
"Delete stream with given name",
527 u32 stream_index = ~0;
562 .path =
"packet-generator configure",
563 .short_help =
"Change packet generator stream parameters",
576 u8 *pcap_file_name = 0;
592 else if (
unformat (line_input,
"pcap %s", &pcap_file_name))
594 else if (
unformat (line_input,
"count %u", &count))
596 else if (
unformat (line_input,
"disable"))
620 if (!pcap_file_name && is_disable == 0)
645 .path =
"packet-generator capture",
646 .short_help =
"packet-generator capture <interface name> pcap <filename> [count <n>]",
657 u32 if_id, gso_enabled = 0, gso_size = 0;
665 if (
unformat (line_input,
"interface pg%u", &if_id))
667 else if (
unformat (line_input,
"gso-enabled"))
670 if (
unformat (line_input,
"gso-size %u", &gso_size))
696 .path =
"create packet-generator",
697 .short_help =
"create packet-generator interface <interface name> [gso-enabled gso-size <size>]",
unformat_function_t unformat_vnet_hw_interface
static int pg_stream_is_enabled(pg_stream_t *s)
clib_error_t * pg_capture(pg_capture_args_t *a)
void pg_stream_add(pg_main_t *pg, pg_stream_t *s_init)
char * file_name
File name of pcap output.
static u8 * format_pg_edit_group(u8 *s, va_list *va)
u32 n_packets_to_capture
Number of packets to capture.
vnet_main_t * vnet_get_main(void)
pg_edit_group_t * edit_groups
static clib_error_t * pg_cli_init(vlib_main_t *vm)
PCAP utility definitions.
clib_memset(h->entries, 0, sizeof(h->entries[0]) *entries)
void(* edit_function)(struct pg_main_t *pg, struct pg_stream_t *s, struct pg_edit_group_t *g, u32 *buffers, u32 n_buffers)
uword * stream_index_by_name
static vnet_hw_interface_t * vnet_get_hw_interface(vnet_main_t *vnm, u32 hw_if_index)
unformat_function_t unformat_vnet_sw_interface
u32 pg_interface_add_or_get(pg_main_t *pg, uword stream_index, u8 gso_enabled, u32 gso_size)
pg_edit_type_t packet_size_edit_type
void pg_stream_del(pg_main_t *pg, uword index)
PCAP main state data structure.
#define pool_foreach(VAR, POOL, BODY)
Iterate through pool.
static uword unformat_pg_stream_parameter(unformat_input_t *input, va_list *args)
#define VLIB_INIT_FUNCTION(x)
uword unformat_pg_payload(unformat_input_t *input, va_list *args)
static clib_error_t * del_stream(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define clib_error_return(e, args...)
#define clib_error_create(args...)
static clib_error_t * new_stream(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
static clib_error_t * enable_disable_stream(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
static void pg_stream_free(pg_stream_t *s)
unformat_function_t unformat_hash_vec_string
clib_error_t * pcap_read(pcap_main_t *pm)
Read PCAP file.
static_always_inline u32 vlib_buffer_get_default_data_size(vlib_main_t *vm)
static clib_error_t * create_pg_if_cmd_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
u64 * replay_packet_timestamps
#define vec_free(V)
Free vector's memory (no header).
static clib_error_t * pg_pcap_read(pg_stream_t *s, char *file_name)
static uword pg_edit_group_n_bytes(pg_stream_t *s, u32 group_index)
void pg_stream_change(pg_main_t *pg, pg_stream_t *s)
unformat_function_t * unformat_edit
static u8 * format_pg_stream(u8 *s, va_list *va)
vlib_node_t * vlib_get_node_by_name(vlib_main_t *vm, u8 *name)
u8 ** replay_packet_templates
#define VLIB_CLI_COMMAND(x,...)
static clib_error_t * validate_stream(pg_stream_t *s)
static clib_error_t * pg_capture_cmd_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
void pg_enable_disable(u32 stream_index, int is_enable)
void pg_stream_enable_disable(pg_main_t *pg, pg_stream_t *s, int is_enable)
static clib_error_t * show_streams(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
unsigned char function_name[]
u32 min_packet_bytes
Min/Max Packet bytes.
u64 * timestamps
Timestamps.
pcap_packet_type_t packet_type
Packet type.
u32 sw_if_index[VLIB_N_RX_TX]
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
unformat_function_t unformat_vlib_node
format_function_t format_clib_elf_symbol_with_address
f64 rate_packets_per_second
static u32 vlib_num_workers()
#define vec_foreach(var, vec)
Vector iterator.
u8 ** packets_read
Packets read from file.
vnet_device_class_t pg_dev_class
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
static clib_error_t * change_stream_parameters(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
pg_interface_t * interfaces
static uword pool_elts(void *v)
Number of active elements in a pool.