fix pcap_write function 70/16770/8
authorJack Xu <jack.c.xu@ericsson.com>
Wed, 27 Mar 2019 15:51:32 +0000 (11:51 -0400)
committerDamjan Marion <dmarion@me.com>
Tue, 20 Aug 2019 11:07:49 +0000 (11:07 +0000)
when use pcap cli to capture pcakets into two files rx01.pcap && rx02.pcap,
the first time:
1)pcap rx trace on max 100 intfc any file rx01.pcap
2)......the process of capture data to buffer......
3)pcap rx trace off

the second time:
4)pcap rx trace on max 100 intfc any file rx02.pcap
5)......the process of capture data to buffer......
6)pcap rx trace off

the pcap_write function bug in this two lines
pm->n_packets_captured = 0;
if (pm->n_packets_captured >= pm->n_packets_to_capture) referring to calling pcap_close()
will result in that the twice pcap cli both writes the packets
into rx01.pcap, but nothing into rx02.pcap. Beside, the rx02.pcap
file will not be created.

solution: separate the pcap_close() out of pcap_write()

Change-Id: Iedeb46f9cf0a4cb12449fd75a4014f95f3bb3fa8
Signed-off-by: Jack Xu <jack.c.xu@ericsson.com>
src/vlib/main.c
src/vnet/interface_cli.c
src/vnet/interface_output.c
src/vnet/pg/output.c
src/vppinfra/pcap.c
src/vppinfra/pcap_funcs.h

index 0786465..66c0023 100644 (file)
@@ -2204,6 +2204,8 @@ pcap_dispatch_trace_command_internal (vlib_main_t * vm,
                {
                  pm->n_packets_to_capture = pm->n_packets_captured;
                  error = pcap_write (pm);
+                 if (pm->file_descriptor >= 0)
+                   pcap_close (pm);
                  if (error)
                    clib_error_report (error);
                  else
index 4378544..8db2639 100644 (file)
@@ -1743,6 +1743,8 @@ pcap_trace_command_internal (vlib_main_t * vm,
                  vm->pcap[rx_tx].pcap_main.n_packets_to_capture =
                    vm->pcap[rx_tx].pcap_main.n_packets_captured;
                  error = pcap_write (&vm->pcap[rx_tx].pcap_main);
+                 if (vm->pcap[rx_tx].pcap_main.file_descriptor >= 0)
+                   pcap_close (&vm->pcap[rx_tx].pcap_main);
                  if (error)
                    clib_error_report (error);
                  else
index 60953b0..c863d44 100644 (file)
@@ -1439,6 +1439,8 @@ pcap_drop_trace_command_fn (vlib_main_t * vm,
                  im->pcap_main.n_packets_to_capture =
                    im->pcap_main.n_packets_captured;
                  error = pcap_write (&im->pcap_main);
+                 if (im->pcap_main.file_descriptor >= 0)
+                   pcap_close (&im->pcap_main);
                  if (error)
                    clib_error_report (error);
                  else
index a84f303..b5ee157 100644 (file)
@@ -79,7 +79,10 @@ pg_output (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame)
     }
   if (pif->pcap_file_name != 0)
     pcap_write (&pif->pcap_main);
-
+  if (pif->pcap_main.file_descriptor >= 0
+      && pif->pcap_main.n_packets_captured >=
+      pif->pcap_main.n_packets_to_capture)
+    pcap_close (&pif->pcap_main);
 
   vlib_buffer_free (vm, vlib_frame_vector_args (frame), n_buffers);
   if (PREDICT_FALSE (pif->lockp != 0))
index 8f644e3..0ca923e 100644 (file)
@@ -157,9 +157,6 @@ pcap_write (pcap_main_t * pm)
       pm->n_pcap_data_written = 0;
     }
 
-  if (pm->n_packets_captured >= pm->n_packets_to_capture)
-    pcap_close (pm);
-
 done:
   if (error)
     {
index 364f4be..a3a3072 100644 (file)
@@ -22,6 +22,9 @@ clib_error_t *pcap_write (pcap_main_t * pm);
 /** Read data from file. */
 clib_error_t *pcap_read (pcap_main_t * pm);
 
+/** Close the file created by pcap_write function. */
+clib_error_t *pcap_close (pcap_main_t * pm);
+
 /**
  * @brief Add packet
  *