packet-generator: various fixes

Change-Id: I8f1be9a501574ff4d5024ed0d632392708716e77
Signed-off-by: Damjan Marion <damarion@cisco.com>
This commit is contained in:
Damjan Marion
2016-07-12 21:58:19 +02:00
parent f24e5d79d4
commit 92217f3c1d
3 changed files with 44 additions and 32 deletions

View File

@ -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;

View File

@ -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)

View File

@ -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);