nat: nat44-ed add session timing out indicator in api
[vpp.git] / src / vlib / trace.c
index abd1166..4bbd950 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,31 +111,29 @@ 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;
   vlib_trace_main_t *tm;
 
-  /* *INDENT-OFF* */
-  foreach_vlib_main (
-  ({
-    tm = &this_vlib_main->trace_main;
-
-    tm->trace_enable = 0;
-    vec_free (tm->nodes);
-  }));
-
-  foreach_vlib_main (
-  ({
-    tm = &this_vlib_main->trace_main;
-
-    for (i = 0; i < vec_len (tm->trace_buffer_pool); i++)
-      if (! pool_is_free_index (tm->trace_buffer_pool, i))
-        vec_free (tm->trace_buffer_pool[i]);
-    pool_free (tm->trace_buffer_pool);
-  }));
-  /* *INDENT-ON* */
+  foreach_vlib_main ()
+    {
+      tm = &this_vlib_main->trace_main;
+
+      tm->trace_enable = 0;
+      vec_free (tm->nodes);
+    }
+
+  foreach_vlib_main ()
+    {
+      tm = &this_vlib_main->trace_main;
+
+      for (i = 0; i < vec_len (tm->trace_buffer_pool); i++)
+       if (!pool_is_free_index (tm->trace_buffer_pool, i))
+         vec_free (tm->trace_buffer_pool[i]);
+      pool_free (tm->trace_buffer_pool);
+    }
 }
 
 u8 *
@@ -201,6 +200,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 +257,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 */
@@ -299,50 +307,50 @@ cli_show_trace_buffer (vlib_main_t * vm,
 
   /* Get active traces from pool. */
 
-  /* *INDENT-OFF* */
-  foreach_vlib_main (
-  ({
-    fmt = "------------------- Start of thread %d %s -------------------\n";
-    s = format (s, fmt, index, vlib_worker_threads[index].name);
-
-    tm = &this_vlib_main->trace_main;
-
-    trace_apply_filter(this_vlib_main);
-
-    traces = 0;
-    pool_foreach (h, tm->trace_buffer_pool,
-    ({
-      vec_add1 (traces, h[0]);
-    }));
-
-    if (vec_len (traces) == 0)
-      {
-        s = format (s, "No packets in trace buffer\n");
-        goto done;
-      }
-
-    /* Sort them by increasing time. */
-    vec_sort_with_function (traces, trace_time_cmp);
-
-    for (i = 0; i < vec_len (traces); i++)
-      {
-        if (i == max)
-          {
-            vlib_cli_output (vm, "Limiting display to %d packets."
-                                 " To display more specify max.", max);
-            goto done;
-          }
-
-        s = format (s, "Packet %d\n%U\n\n", i + 1,
-                         format_vlib_trace, vm, traces[i]);
-      }
-
-  done:
-    vec_free (traces);
-
-    index++;
-  }));
-  /* *INDENT-ON* */
+  foreach_vlib_main ()
+    {
+      fmt = "------------------- Start of thread %d %s -------------------\n";
+      s = format (s, fmt, index, vlib_worker_threads[index].name);
+
+      tm = &this_vlib_main->trace_main;
+
+      trace_apply_filter (this_vlib_main);
+
+      traces = 0;
+      pool_foreach (h, tm->trace_buffer_pool)
+       {
+         vec_add1 (traces, h[0]);
+       }
+
+      if (vec_len (traces) == 0)
+       {
+         s = format (s, "No packets in trace buffer\n");
+         goto done;
+       }
+
+      /* Sort them by increasing time. */
+      vec_sort_with_function (traces, trace_time_cmp);
+
+      for (i = 0; i < vec_len (traces); i++)
+       {
+         if (i == 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;
+           }
+
+         s = format (s, "Packet %d\n%U\n\n", i + 1, format_vlib_trace, vm,
+                     traces[i]);
+       }
+
+    done:
+      vec_free (traces);
+
+      index++;
+    }
 
   vlib_cli_output (vm, "%v", s);
   vec_free (s);
@@ -382,8 +390,7 @@ trace_update_capture_options (u32 add, u32 node_index, u32 filter, u8 verbose)
   if (add == ~0)
     add = 50;
 
-  /* *INDENT-OFF* */
-  foreach_vlib_main ((
+  foreach_vlib_main ()
     {
       tm = &this_vlib_main->trace_main;
       tm->verbose = verbose;
@@ -399,14 +406,15 @@ trace_update_capture_options (u32 add, u32 node_index, u32 filter, u8 verbose)
          tn->limit = tn->count = 0;
       else
          tn->limit += add;
-    }));
+    }
 
-  foreach_vlib_main ((
+  foreach_vlib_main ()
     {
       tm = &this_vlib_main->trace_main;
       tm->trace_enable = 1;
-    }));
-  /* *INDENT-ON* */
+    }
+
+  vlib_enable_disable_pkt_trace_filter (! !filter);
 }
 
 static clib_error_t *
@@ -455,13 +463,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);
@@ -521,24 +527,22 @@ VLIB_CLI_COMMAND (add_trace_cli,static) = {
 void
 trace_filter_set (u32 node_index, u32 flag, u32 count)
 {
-  /* *INDENT-OFF* */
-  foreach_vlib_main (
-  ({
-    vlib_trace_main_t *tm;
-
-    tm = &this_vlib_main->trace_main;
-    tm->filter_node_index = node_index;
-    tm->filter_flag = flag;
-    tm->filter_count = count;
-
-    /*
-     * Clear the trace limits to stop any in-progress tracing
-     * Prevents runaway trace allocations when the filter changes
-     * (or is removed)
-     */
-    vec_free (tm->nodes);
-  }));
-  /* *INDENT-ON* */
+  foreach_vlib_main ()
+    {
+      vlib_trace_main_t *tm;
+
+      tm = &this_vlib_main->trace_main;
+      tm->filter_node_index = node_index;
+      tm->filter_flag = flag;
+      tm->filter_count = count;
+
+      /*
+       * Clear the trace limits to stop any in-progress tracing
+       * Prevents runaway trace allocations when the filter changes
+       * (or is removed)
+       */
+      vec_free (tm->nodes);
+    }
 }