summaryrefslogtreecommitdiffstats
path: root/src/vnet/unix
diff options
context:
space:
mode:
Diffstat (limited to 'src/vnet/unix')
-rw-r--r--src/vnet/unix/pcap.c1
-rw-r--r--src/vnet/unix/pcap.h5
2 files changed, 6 insertions, 0 deletions
diff --git a/src/vnet/unix/pcap.c b/src/vnet/unix/pcap.c
index 473430a670e..e91b8792c2a 100644
--- a/src/vnet/unix/pcap.c
+++ b/src/vnet/unix/pcap.c
@@ -110,6 +110,7 @@ pcap_write (pcap_main_t * pm)
pm->flags |= PCAP_MAIN_INIT_DONE;
pm->n_packets_captured = 0;
pm->n_pcap_data_written = 0;
+ clib_spinlock_init (&pm->lock);
/* Write file header. */
memset (&fh, 0, sizeof (fh));
diff --git a/src/vnet/unix/pcap.h b/src/vnet/unix/pcap.h
index 1ab1531cfa3..2c174fbedf9 100644
--- a/src/vnet/unix/pcap.h
+++ b/src/vnet/unix/pcap.h
@@ -123,6 +123,9 @@ typedef struct
*/
typedef struct
{
+ /** spinlock to protect e.g. pcap_data */
+ clib_spinlock_t lock;
+
/** File name of pcap output. */
char *file_name;
@@ -213,6 +216,7 @@ pcap_add_buffer (pcap_main_t * pm,
if (PREDICT_TRUE (pm->n_packets_captured < pm->n_packets_to_capture))
{
+ clib_spinlock_lock_if_init (&pm->lock);
d = pcap_add_packet (pm, time_now, n_left, n);
while (1)
{
@@ -225,6 +229,7 @@ pcap_add_buffer (pcap_main_t * pm,
ASSERT (b->flags & VLIB_BUFFER_NEXT_PRESENT);
b = vlib_get_buffer (vm, b->next_buffer);
}
+ clib_spinlock_unlock_if_init (&pm->lock);
}
}