misc: finish removing deprecated cop API
[vpp.git] / src / vlib / trace.c
index abd1166..836e8b4 100644 (file)
@@ -39,6 +39,7 @@
 
 #include <vlib/vlib.h>
 #include <vlib/threads.h>
+#include <vnet/classify/vnet_classify.h>
 
 u8 *vnet_trace_placeholder;
 
@@ -110,7 +111,7 @@ vlib_trace_frame_buffers_only (vlib_main_t * vm,
 }
 
 /* Free up all trace buffer memory. */
-always_inline void
+void
 clear_trace_buffer (void)
 {
   int i;
@@ -201,6 +202,15 @@ filter_accept (vlib_trace_main_t * tm, vlib_trace_header_t * h)
   if (tm->filter_flag == 0)
     return 1;
 
+  /*
+   * When capturing a post-mortem dispatch trace,
+   * toss all existing traces once per dispatch cycle.
+   * So we can trace 4 billion pkts without running out of
+   * memory...
+   */
+  if (tm->filter_flag == FILTER_FLAG_POST_MORTEM)
+    return 0;
+
   if (tm->filter_flag == FILTER_FLAG_INCLUDE)
     {
       while (h < e)
@@ -249,15 +259,15 @@ trace_apply_filter (vlib_main_t * vm)
    */
   n_accepted = 0;
   /* *INDENT-OFF* */
-  pool_foreach (h, tm->trace_buffer_pool,
-   ({
+  pool_foreach (h, tm->trace_buffer_pool)
+    {
       accept = filter_accept(tm, h[0]);
 
       if ((n_accepted == tm->filter_count) || !accept)
           vec_add1 (traces_to_remove, h);
       else
           n_accepted++;
-  }));
+  }
   /* *INDENT-ON* */
 
   /* remove all traces that we don't want to keep */
@@ -310,10 +320,10 @@ cli_show_trace_buffer (vlib_main_t * vm,
     trace_apply_filter(this_vlib_main);
 
     traces = 0;
-    pool_foreach (h, tm->trace_buffer_pool,
-    ({
+    pool_foreach (h, tm->trace_buffer_pool)
+     {
       vec_add1 (traces, h[0]);
-    }));
+    }
 
     if (vec_len (traces) == 0)
       {
@@ -328,8 +338,10 @@ cli_show_trace_buffer (vlib_main_t * vm,
       {
         if (i == max)
           {
-            vlib_cli_output (vm, "Limiting display to %d packets."
-                                 " To display more specify max.", max);
+            char *warn = "Limiting display to %d packets."
+                               " To display more specify max.";
+            vlib_cli_output (vm, warn, max);
+            s = format (s, warn, max);
             goto done;
           }
 
@@ -407,6 +419,8 @@ trace_update_capture_options (u32 add, u32 node_index, u32 filter, u8 verbose)
       tm->trace_enable = 1;
     }));
   /* *INDENT-ON* */
+
+  vlib_enable_disable_pkt_trace_filter (! !filter);
 }
 
 static clib_error_t *
@@ -455,13 +469,11 @@ cli_add_trace_buffer (vlib_main_t * vm,
       goto done;
     }
 
-  if (filter)
+  u32 filter_table = classify_get_trace_chain ();
+  if (filter && filter_table == ~0)
     {
-      if (vlib_enable_disable_pkt_trace_filter (1 /* enable */ ))
-       {
-         error = clib_error_create ("No packet trace filter configured...");
-         goto done;
-       }
+      error = clib_error_create ("No packet trace filter configured...");
+      goto done;
     }
 
   trace_update_capture_options (add, node_index, filter, verbose);