#include <vppinfra/pool.h>
#include <vppinfra/random_buffer.h>
#include <vppinfra/time.h>
+#include <vppinfra/pmc.h>
+#include <vppinfra/pcap.h>
#include <pthread.h>
#define VLIB_ELOG_MAIN_LOOP 0
#endif
+typedef struct
+{
+ int pcap_enable;
+ u32 pcap_sw_if_index;
+ pcap_main_t pcap_main;
+} vnet_pcap_t;
+
typedef struct vlib_main_t
{
+ CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
/* Instruction level timing state. */
clib_time_t clib_time;
+ /* Offset from main thread time */
+ f64 time_offset;
+ f64 time_last_barrier_release;
/* Time stamp of last node dispatch. */
u64 cpu_time_last_node_dispatch;
u32 vector_counts_per_main_loop[2];
u32 node_counts_per_main_loop[2];
+ /* Main loop hw / sw performance counters */
+ void (*vlib_node_runtime_perf_counter_cb) (struct vlib_main_t *,
+ u64 *, u64 *);
+
/* Every so often we switch to the next counter. */
#define VLIB_LOG2_MAIN_LOOPS_PER_STATS_UPDATE 7
/* Jump target to exit main loop with given code. */
u32 main_loop_exit_set;
+ /* Set e.g. in the SIGTERM signal handler, checked in a safe place... */
+ volatile u32 main_loop_exit_now;
clib_longjmp_t main_loop_exit;
#define VLIB_MAIN_LOOP_EXIT_NONE 0
#define VLIB_MAIN_LOOP_EXIT_PANIC 1
/* Name for e.g. syslog. */
char *name;
- /* Start and size of CLIB heap. */
+ /* Start of the heap. */
void *heap_base;
+
+ /* Truncated version, to create frame indices */
+ void *heap_aligned_base;
+
+ /* Size of the heap */
uword heap_size;
+ /* buffer main structure. */
vlib_buffer_main_t *buffer_main;
+ /* physical memory main structure. */
vlib_physmem_main_t physmem_main;
- /* Allocate/free buffer memory for DMA transfers, descriptor rings, etc.
- buffer memory is guaranteed to be cache-aligned. */
- void *(*os_physmem_alloc_aligned) (vlib_physmem_main_t * pm,
- uword n_bytes, uword alignment);
- void (*os_physmem_free) (void *x);
-
/* Node graph main structure. */
vlib_node_main_t node_main;
/* Packet trace buffer. */
vlib_trace_main_t trace_main;
+ /* Pcap dispatch trace main */
+ pcap_main_t dispatch_pcap_main;
+ uword dispatch_pcap_enable;
+ u8 *pcap_buffer;
+
+ /* pcap rx / tx tracing */
+ vnet_pcap_t pcap[VLIB_N_RX_TX];
+
+ int pcap_enable;
+ pcap_main_t pcap_main;
+ u8 *pcap_filename;
+ u32 pcap_sw_if_index;
+ u32 pcap_pkts_to_capture;
+
/* Error handling. */
vlib_error_main_t error_main;
struct vlib_node_runtime_t * node,
vlib_frame_t * frame);
- /* Multicast distribution. Set to zero for MC disabled. */
- mc_main_t *mc_main;
-
/* Stream index to use for distribution when MC is enabled. */
u32 mc_stream_index;
/* Event logger. */
elog_main_t elog_main;
+ /* Event logger trace flags */
+ int elog_trace_api_messages;
+ int elog_trace_cli_commands;
+ int elog_trace_graph_dispatch;
+ int elog_trace_graph_circuit;
+ u32 elog_trace_graph_circuit_node_index;
+
/* Node call and return event types. */
elog_event_type_t *node_call_elog_event_types;
elog_event_type_t *node_return_elog_event_types;
/* Hash table to record which init functions have been called. */
uword *init_functions_called;
- /* to compare with node runtime */
- u32 cpu_index;
-
- void **mbuf_alloc_list;
+ /* thread, cpu and numa_node indices */
+ u32 thread_index;
+ u32 cpu_id;
+ u32 numa_node;
/* List of init functions to call, setup by constructors */
_vlib_init_function_list_elt_t *init_function_registrations;
+ _vlib_init_function_list_elt_t *worker_init_function_registrations;
_vlib_init_function_list_elt_t *main_loop_enter_function_registrations;
_vlib_init_function_list_elt_t *main_loop_exit_function_registrations;
_vlib_init_function_list_elt_t *api_init_function_registrations;
vlib_config_function_runtime_t *config_function_registrations;
- mc_serialize_msg_t *mc_msg_registrations; /* mc_main is a pointer... */
/* control-plane API queue signal pending, length indication */
volatile u32 queue_signal_pending;
volatile u32 api_queue_nonempty;
void (*queue_signal_callback) (struct vlib_main_t *);
u8 **argv;
+
+ /* Top of (worker) dispatch loop callback */
+ volatile void (*worker_thread_main_loop_callback) (struct vlib_main_t *);
+
+ /* debugging */
+ volatile int parked_at_barrier;
+
+ /* Attempt to do a post-mortem elog dump */
+ int elog_post_mortem_dump;
+
+ /*
+ * Need to call vlib_worker_thread_node_runtime_update before
+ * releasing worker thread barrier. Only valid in vlib_global_main.
+ */
+ int need_vlib_worker_thread_node_runtime_update;
+
+ /*
+ * Barrier epoch - Set to current time, each time barrier_sync or
+ * barrier_release is called with zero recursion.
+ */
+ f64 barrier_epoch;
+
+ /* Earliest barrier can be closed again */
+ f64 barrier_no_close_before;
+
+ /* RPC requests, main thread only */
+ uword *pending_rpc_requests;
+ uword *processing_rpc_requests;
+ clib_spinlock_t pending_rpc_lock;
+
} vlib_main_t;
/* Global main structure. */
extern vlib_main_t vlib_global_main;
+void vlib_worker_loop (vlib_main_t * vm);
+
always_inline f64
vlib_time_now (vlib_main_t * vm)
{
- return clib_time_now (&vm->clib_time);
+ return clib_time_now (&vm->clib_time) + vm->time_offset;
}
always_inline f64
vm->main_loop_nodes_processed = 0;
vm->vector_counts_per_main_loop[i] = v;
vm->node_counts_per_main_loop[i] = n;
+
+ if (PREDICT_FALSE (vm->main_loop_exit_now))
+ clib_longjmp (&vm->main_loop_exit, VLIB_MAIN_LOOP_EXIT_CLI);
}
always_inline void vlib_set_queue_signal_callback
/* Main routine. */
int vlib_main (vlib_main_t * vm, unformat_input_t * input);
-/* Thread stacks, for os_get_cpu_number */
+/* Thread stacks, for os_get_thread_index */
extern u8 **vlib_thread_stacks;
/* Number of thread stacks that the application needs */
extern void vlib_node_sync_stats (vlib_main_t * vm, vlib_node_t * n);
+#define VLIB_PCAP_MAJOR_VERSION 1
+#define VLIB_PCAP_MINOR_VERSION 0
+
#endif /* included_vlib_main_h */
/*