#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)
{
}
}
- 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)
{
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;
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
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);
}
if (fd >= 0)
close (fd);
return error;
-
+
}