Metadata / opaque formatting belongs in vpp
[vpp.git] / src / vlib / main.h
index 4c0cde3..474756b 100644 (file)
@@ -46,6 +46,8 @@
 #include <vppinfra/pool.h>
 #include <vppinfra/random_buffer.h>
 #include <vppinfra/time.h>
+#include <vppinfra/pmc.h>
+#include <vppinfra/pcap.h>
 
 #include <pthread.h>
 
@@ -58,6 +60,7 @@
 
 typedef struct vlib_main_t
 {
+  CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
   /* Instruction level timing state. */
   clib_time_t clib_time;
 
@@ -80,11 +83,18 @@ typedef struct vlib_main_t
   u32 vector_counts_per_main_loop[2];
   u32 node_counts_per_main_loop[2];
 
+  /* Main loop hw / sw performance counters */
+    u64 (*vlib_node_runtime_perf_counter_cb) (struct vlib_main_t *);
+  int perf_counter_id;
+  int perf_counter_fd;
+
   /* 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
@@ -97,31 +107,20 @@ typedef struct vlib_main_t
   /* Name for e.g. syslog. */
   char *name;
 
-  /* Start and size of CLIB heap. */
+  /* Start of the heap. */
   void *heap_base;
-  uword heap_size;
-
-  vlib_buffer_main_t *buffer_main;
-
-  vlib_physmem_main_t physmem_main;
 
-  /* Allocate/free buffer memory for DMA transfers, descriptor rings, etc.
-     buffer memory is guaranteed to be cache-aligned. */
+  /* Truncated version, to create frame indices */
+  void *heap_aligned_base;
 
-  clib_error_t *(*os_physmem_region_alloc) (struct vlib_main_t * vm,
-                                           char *name, u32 size,
-                                           u8 numa_node, u32 flags,
-                                           vlib_physmem_region_index_t *
-                                           idx);
+  /* Size of the heap */
+  uword heap_size;
 
-  void (*os_physmem_region_free) (struct vlib_main_t * vm,
-                                 vlib_physmem_region_index_t idx);
+  /* Pool of buffer free lists. */
+  vlib_buffer_free_list_t *buffer_free_list_pool;
 
-  void *(*os_physmem_alloc_aligned) (struct vlib_main_t * vm,
-                                    vlib_physmem_region_index_t idx,
-                                    uword n_bytes, uword alignment);
-  void (*os_physmem_free) (struct vlib_main_t * vm,
-                          vlib_physmem_region_index_t idx, void *x);
+  /* physical memory main structure. */
+  vlib_physmem_main_t physmem_main;
 
   /* Node graph main structure. */
   vlib_node_main_t node_main;
@@ -132,6 +131,11 @@ typedef struct vlib_main_t
   /* 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;
+
   /* Error handling. */
   vlib_error_main_t error_main;
 
@@ -141,9 +145,6 @@ typedef struct vlib_main_t
                         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;
 
@@ -152,6 +153,10 @@ typedef struct vlib_main_t
   /* Event logger. */
   elog_main_t elog_main;
 
+  /* Event logger trace flags */
+  int elog_trace_api_messages;
+  int elog_trace_cli_commands;
+
   /* Node call and return event types. */
   elog_event_type_t *node_call_elog_event_types;
   elog_event_type_t *node_return_elog_event_types;
@@ -170,8 +175,6 @@ typedef struct vlib_main_t
   /* to compare with node runtime */
   u32 thread_index;
 
-  void **mbuf_alloc_list;
-
   /* 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;
@@ -179,7 +182,6 @@ typedef struct vlib_main_t
   _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;
@@ -187,6 +189,9 @@ typedef struct vlib_main_t
   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;
 
@@ -199,6 +204,20 @@ typedef struct vlib_main_t
    */
   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. */
@@ -331,6 +350,9 @@ vlib_increment_main_loop_counter (vlib_main_t * vm)
   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
@@ -350,6 +372,9 @@ u32 vlib_app_num_thread_stacks_needed (void) __attribute__ ((weak));
 
 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 */
 
 /*