VPP-305: Documentation for vnet/vnet/unix
[vpp.git] / vnet / vnet / unix / pcap.c
index 16b8443..5c8a14b 100644 (file)
 #include <vnet/unix/pcap.h>
 #include <sys/fcntl.h>
 
-/* Usage
-
-#include <vnet/unix/pcap.h>
-
-static pcap_main_t pcap = {
-  .file_name = "/tmp/ip4",
-  .n_packets_to_capture = 2,
-  .packet_type = PCAP_PACKET_TYPE_ip,
-};
-
-To add a buffer:
-
-  pcap_add_buffer (&pcap, vm, pi0, 128);
-
-file will be written after n_packets_to_capture or call to pcap_write (&pcap).
-
+/**
+ * @file
+ * @brief PCAP function.
+ *  Usage
+ *
+ * #include <vnet/unix/pcap.h>
+ *
+ * static pcap_main_t pcap = {
+ *  .file_name = "/tmp/ip4",
+ *  .n_packets_to_capture = 2,
+ *  .packet_type = PCAP_PACKET_TYPE_ip,
+ * };
+ *
+ * To add a buffer:
+ *
+ *  pcap_add_buffer (&pcap, vm, pi0, 128);
+ *
+ * File will be written after n_packets_to_capture or call to pcap_write (&pcap).
+ *
 */
 
+/**
+ * @brief Close PCAP file
+ *
+ * @return rc - clib_error_t
+ *
+ */
+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;
+}
+
+/**
+ * @brief Write PCAP file
+ *
+ * @return rc - clib_error_t
+ *
+ */
 clib_error_t *
 pcap_write (pcap_main_t * pm)
 {
@@ -101,35 +125,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)
     {
@@ -139,6 +158,12 @@ pcap_write (pcap_main_t * pm)
   return error;
 }
 
+/**
+ * @brief Read PCAP file
+ *
+ * @return rc - clib_error_t
+ *
+ */
 clib_error_t * pcap_read (pcap_main_t * pm)
 {
   clib_error_t * error = 0;
@@ -193,7 +218,7 @@ clib_error_t * pcap_read (pcap_main_t * pm)
          error = clib_error_return (0, "short read `%s'", pm->file_name);
          goto done;
        }
-       
+
       if (vec_len (pm->packets_read) == 0)
        pm->min_packet_bytes = pm->max_packet_bytes = ph.n_bytes_in_packet;
       else
@@ -201,7 +226,7 @@ clib_error_t * pcap_read (pcap_main_t * pm)
          pm->min_packet_bytes = clib_min (pm->min_packet_bytes, ph.n_bytes_in_packet);
          pm->max_packet_bytes = clib_max (pm->max_packet_bytes, ph.n_bytes_in_packet);
        }
-       
+
       vec_add1 (pm->packets_read, data);
     }
 
@@ -209,5 +234,5 @@ clib_error_t * pcap_read (pcap_main_t * pm)
   if (fd >= 0)
     close (fd);
   return error;
-  
+
 }