#include <vlib/vlib.h>
#include <vlib/threads.h>
+#include <vnet/classify/vnet_classify.h>
u8 *vnet_trace_placeholder;
}
/* Free up all trace buffer memory. */
-always_inline void
+void
clear_trace_buffer (void)
{
int i;
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)
*/
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 */
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)
{
{
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;
}
tm->trace_enable = 1;
}));
/* *INDENT-ON* */
+
+ vlib_enable_disable_pkt_trace_filter (! !filter);
}
static clib_error_t *
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);