packet-generator: various fixes
Change-Id: I8f1be9a501574ff4d5024ed0d632392708716e77 Signed-off-by: Damjan Marion <damarion@cisco.com>
This commit is contained in:
@ -463,6 +463,7 @@ pg_capture_cmd_fn (vlib_main_t * vm,
|
||||
pg_interface_t * pi;
|
||||
u8 * pcap_file_name = 0;
|
||||
u32 hw_if_index;
|
||||
u32 is_disable = 0;
|
||||
u32 count = ~0;
|
||||
|
||||
if (! unformat_user (input, unformat_line_input, line_input))
|
||||
@ -480,6 +481,8 @@ pg_capture_cmd_fn (vlib_main_t * vm,
|
||||
;
|
||||
else if (unformat (line_input, "count %u", &count))
|
||||
;
|
||||
else if (unformat (line_input, "disable"))
|
||||
is_disable = 1;
|
||||
|
||||
else
|
||||
{
|
||||
@ -495,21 +498,26 @@ pg_capture_cmd_fn (vlib_main_t * vm,
|
||||
if (hi->dev_class_index != pg_dev_class.index)
|
||||
return clib_error_return (0, "Please specify packet-generator interface");
|
||||
|
||||
if (!pcap_file_name)
|
||||
if (!pcap_file_name && is_disable == 0)
|
||||
return clib_error_return (0, "Please specify pcap file name");
|
||||
|
||||
{
|
||||
struct stat sb;
|
||||
if (stat ((char *) pcap_file_name, &sb) != -1)
|
||||
return clib_error_return (0, "Cannot create pcap file");
|
||||
}
|
||||
if (is_disable == 0)
|
||||
{
|
||||
struct stat sb;
|
||||
if (stat ((char *) pcap_file_name, &sb) != -1)
|
||||
return clib_error_return (0, "Cannot create pcap file");
|
||||
}
|
||||
|
||||
unformat_free (line_input);
|
||||
|
||||
pi = pool_elt_at_index (pg->interfaces, hi->dev_instance);
|
||||
vec_free (pi->pcap_file_name);
|
||||
pi->pcap_file_name = pcap_file_name;
|
||||
memset (&pi->pcap_main, 0, sizeof (pi->pcap_main));
|
||||
|
||||
if (is_disable)
|
||||
return 0;
|
||||
|
||||
pi->pcap_file_name = pcap_file_name;
|
||||
pi->pcap_main.file_name = (char *) pi->pcap_file_name;
|
||||
pi->pcap_main.n_packets_to_capture = count;
|
||||
pi->pcap_main.packet_type = PCAP_PACKET_TYPE_ethernet;
|
||||
|
@ -58,6 +58,15 @@ file will be written after n_packets_to_capture or call to pcap_write (&pcap).
|
||||
|
||||
*/
|
||||
|
||||
clib_error_t *
|
||||
pcap_close (pcap_main_t * pm)
|
||||
{
|
||||
close (pm->file_descriptor);
|
||||
pm->flags &= ~PCAP_MAIN_INIT_DONE;
|
||||
pm->file_descriptor = -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
clib_error_t *
|
||||
pcap_write (pcap_main_t * pm)
|
||||
{
|
||||
@ -101,34 +110,29 @@ pcap_write (pcap_main_t * pm)
|
||||
}
|
||||
}
|
||||
|
||||
do {
|
||||
int n = vec_len (pm->pcap_data) - pm->n_pcap_data_written;
|
||||
while (vec_len (pm->pcap_data) > pm->n_pcap_data_written)
|
||||
{
|
||||
int n = vec_len (pm->pcap_data) - pm->n_pcap_data_written;
|
||||
|
||||
if (n > 0)
|
||||
{
|
||||
n = write (pm->file_descriptor,
|
||||
vec_elt_at_index (pm->pcap_data, pm->n_pcap_data_written),
|
||||
n);
|
||||
if (n < 0 && unix_error_is_fatal (errno))
|
||||
{
|
||||
error = clib_error_return_unix (0, "write `%s'", pm->file_name);
|
||||
goto done;
|
||||
}
|
||||
n = write (pm->file_descriptor,
|
||||
vec_elt_at_index (pm->pcap_data, pm->n_pcap_data_written), n);
|
||||
|
||||
if (n < 0 && unix_error_is_fatal (errno))
|
||||
{
|
||||
error = clib_error_return_unix (0, "write `%s'", pm->file_name);
|
||||
goto done;
|
||||
}
|
||||
pm->n_pcap_data_written += n;
|
||||
}
|
||||
pm->n_pcap_data_written += n;
|
||||
if (pm->n_pcap_data_written >= vec_len (pm->pcap_data))
|
||||
{
|
||||
vec_reset_length (pm->pcap_data);
|
||||
break;
|
||||
}
|
||||
} while (pm->n_packets_captured >= pm->n_packets_to_capture);
|
||||
|
||||
if (pm->n_pcap_data_written >= vec_len (pm->pcap_data))
|
||||
{
|
||||
vec_reset_length (pm->pcap_data);
|
||||
pm->n_pcap_data_written = 0;
|
||||
}
|
||||
|
||||
if (pm->n_packets_captured >= pm->n_packets_to_capture)
|
||||
{
|
||||
close (pm->file_descriptor);
|
||||
pm->flags &= ~PCAP_MAIN_INIT_DONE;
|
||||
pm->file_descriptor = -1;
|
||||
}
|
||||
pcap_close(pm);
|
||||
|
||||
done:
|
||||
if (error)
|
||||
|
@ -166,7 +166,7 @@ pcap_add_buffer (pcap_main_t * pm,
|
||||
f64 time_now = vlib_time_now (vm);
|
||||
void * d;
|
||||
|
||||
d = pcap_add_packet (pm, time_now, n_bytes_in_trace, n_left);
|
||||
d = pcap_add_packet (pm, time_now, n_left, n);
|
||||
while (1)
|
||||
{
|
||||
u32 copy_length = clib_min ((u32) n_left, b->current_length);
|
||||
|
Reference in New Issue
Block a user