packet-generator: various fixes 46/1946/1
authorDamjan Marion <damarion@cisco.com>
Tue, 12 Jul 2016 19:58:19 +0000 (21:58 +0200)
committerDamjan Marion <damarion@cisco.com>
Tue, 12 Jul 2016 19:58:19 +0000 (21:58 +0200)
Change-Id: I8f1be9a501574ff4d5024ed0d632392708716e77
Signed-off-by: Damjan Marion <damarion@cisco.com>
vnet/vnet/pg/cli.c
vnet/vnet/unix/pcap.c
vnet/vnet/unix/pcap.h

index 201e4fb..d73add1 100644 (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;
index 16b8443..1c5f033 100644 (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,35 +110,30 @@ pcap_write (pcap_main_t * pm)
        }
     }
 
-  do {
-    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;
-         }
-      }
-    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 (vec_len (pm->pcap_data) > pm->n_pcap_data_written)
+    {
+      int n = vec_len (pm->pcap_data) - pm->n_pcap_data_written;
+
+      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;
       }
-  } while (pm->n_packets_captured >= pm->n_packets_to_capture);
 
-  if (pm->n_packets_captured >= pm->n_packets_to_capture)
+  if (pm->n_pcap_data_written >= vec_len (pm->pcap_data))
     {
-      close (pm->file_descriptor);
-      pm->flags &= ~PCAP_MAIN_INIT_DONE;
-      pm->file_descriptor = -1;
+      vec_reset_length (pm->pcap_data);
+      pm->n_pcap_data_written = 0;
     }
 
+  if (pm->n_packets_captured >= pm->n_packets_to_capture)
+    pcap_close(pm);
+
  done:
   if (error)
     {
index 563eafc..89eca03 100644 (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);