40 #ifndef included_vlib_node_h 41 #define included_vlib_node_h 78 typedef struct _vlib_node_fn_registration
82 struct _vlib_node_fn_registration *next_registration;
86 typedef struct _vlib_node_registration
104 vlib_node_type_t type;
107 char **error_strings;
126 u16 process_log2_n_stack_bytes;
129 u8 runtime_data_bytes;
147 struct _vlib_node_registration *next_registration;
154 #ifndef CLIB_MARCH_VARIANT 155 #define VLIB_REGISTER_NODE(x,...) \ 156 __VA_ARGS__ vlib_node_registration_t x; \ 157 static void __vlib_add_node_registration_##x (void) \ 158 __attribute__((__constructor__)) ; \ 159 static void __vlib_add_node_registration_##x (void) \ 161 vlib_main_t * vm = vlib_get_main(); \ 162 x.next_registration = vm->node_main.node_registrations; \ 163 vm->node_main.node_registrations = &x; \ 165 static void __vlib_rm_node_registration_##x (void) \ 166 __attribute__((__destructor__)) ; \ 167 static void __vlib_rm_node_registration_##x (void) \ 169 vlib_main_t * vm = vlib_get_main(); \ 170 VLIB_REMOVE_FROM_LINKED_LIST (vm->node_main.node_registrations, \ 171 &x, next_registration); \ 173 __VA_ARGS__ vlib_node_registration_t x 175 #define VLIB_REGISTER_NODE(x,...) \ 176 static __clib_unused vlib_node_registration_t __clib_unused_##x 179 #ifndef CLIB_MARCH_VARIANT 180 #define CLIB_MARCH_VARIANT_STR "default" 182 #define _CLIB_MARCH_VARIANT_STR(s) __CLIB_MARCH_VARIANT_STR(s) 183 #define __CLIB_MARCH_VARIANT_STR(s) #s 184 #define CLIB_MARCH_VARIANT_STR _CLIB_MARCH_VARIANT_STR(CLIB_MARCH_VARIANT) 187 #define VLIB_NODE_FN(node) \ 188 uword CLIB_MARCH_SFX (node##_fn)(); \ 189 static vlib_node_fn_registration_t \ 190 CLIB_MARCH_SFX(node##_fn_registration) = \ 191 { .function = &CLIB_MARCH_SFX (node##_fn), }; \ 193 static void __clib_constructor \ 194 CLIB_MARCH_SFX (node##_multiarch_register) (void) \ 196 extern vlib_node_registration_t node; \ 197 vlib_node_fn_registration_t *r; \ 198 r = & CLIB_MARCH_SFX (node##_fn_registration); \ 199 r->priority = CLIB_MARCH_FN_PRIORITY(); \ 200 r->name = CLIB_MARCH_VARIANT_STR; \ 201 r->next_registration = node.node_fn_registrations; \ 202 node.node_fn_registrations = r; \ 204 uword CLIB_CPU_OPTIMIZED CLIB_MARCH_SFX (node##_fn) 207 #define VLIB_NODE_FUNCTION_CLONE_TEMPLATE(arch, fn) 208 #define VLIB_NODE_FUNCTION_MULTIARCH_CLONE(fn) 209 #define VLIB_NODE_FUNCTION_MULTIARCH(node, fn) 211 #define VLIB_NODE_FUNCTION_CLONE_TEMPLATE(arch, fn, tgt) \ 213 __attribute__ ((flatten)) \ 214 __attribute__ ((target (tgt))) \ 216 fn ## _ ## arch ( struct vlib_main_t * vm, \ 217 struct vlib_node_runtime_t * node, \ 218 struct vlib_frame_t * frame) \ 219 { return fn (vm, node, frame); } 221 #define VLIB_NODE_FUNCTION_MULTIARCH_CLONE(fn) \ 222 foreach_march_variant(VLIB_NODE_FUNCTION_CLONE_TEMPLATE, fn) 224 #define VLIB_NODE_FUNCTION_MULTIARCH(node, fn) \ 225 VLIB_NODE_FUNCTION_MULTIARCH_CLONE(fn) \ 226 CLIB_MULTIARCH_SELECT_FN(fn, static inline) \ 227 static void __attribute__((__constructor__)) \ 228 __vlib_node_function_multiarch_select_##node (void) \ 229 { node.function = fn ## _multiarch_select(); } 237 c->n_next_nodes * sizeof (c->next_nodes[0]));
249 #define foreach_vlib_node_state \ 260 #define _(f) VLIB_NODE_STATE_##f, 301 #define VLIB_NODE_FLAG_FRAME_NO_FREE_AFTER_DISPATCH (1 << 0) 304 #define VLIB_NODE_FLAG_IS_OUTPUT (1 << 1) 305 #define VLIB_NODE_FLAG_IS_DROP (1 << 2) 306 #define VLIB_NODE_FLAG_IS_PUNT (1 << 3) 307 #define VLIB_NODE_FLAG_IS_HANDOFF (1 << 4) 310 #define VLIB_NODE_FLAG_TRACE (1 << 5) 312 #define VLIB_NODE_FLAG_SWITCH_FROM_INTERRUPT_TO_POLLING_MODE (1 << 6) 313 #define VLIB_NODE_FLAG_SWITCH_FROM_POLLING_TO_INTERRUPT_MODE (1 << 7) 379 #define VLIB_INVALID_NODE_INDEX ((u32) ~0) 382 #define VLIB_FRAME_SIZE 256 383 #define VLIB_FRAME_ALIGN CLIB_CACHE_LINE_BYTES 419 #define VLIB_FRAME_NO_FREE_AFTER_DISPATCH \ 420 VLIB_NODE_FLAG_FRAME_NO_FREE_AFTER_DISPATCH 424 #define VLIB_FRAME_OWNER (1 << 15) 427 #define VLIB_FRAME_IS_ALLOCATED VLIB_NODE_FLAG_IS_OUTPUT 430 #define VLIB_FRAME_PENDING VLIB_NODE_FLAG_IS_DROP 433 #define VLIB_FRAME_FREE_AFTER_DISPATCH VLIB_NODE_FLAG_IS_PUNT 436 #define VLIB_FRAME_TRACE VLIB_NODE_FLAG_TRACE 445 memset (nf, 0,
sizeof (nf[0]));
463 #define VLIB_PENDING_FRAME_NO_NEXT_FRAME ((u32) ~0) 474 #if __SIZEOF_POINTER__ == 4 505 u32 main_loop_vector_stats[2];
532 #define VLIB_NODE_RUNTIME_DATA_SIZE (sizeof (vlib_node_runtime_t) - STRUCT_OFFSET_OF (vlib_node_runtime_t, runtime_data)) 557 #define VLIB_PROCESS_RETURN_LONGJMP_RETURN ((uword) ~0 - 0) 558 #define VLIB_PROCESS_RETURN_LONGJMP_SUSPEND ((uword) ~0 - 1) 562 #define VLIB_PROCESS_RESUME_LONGJMP_SUSPEND 0 563 #define VLIB_PROCESS_RESUME_LONGJMP_RESUME 1 566 #define VLIB_PROCESS_IS_SUSPENDED_WAITING_FOR_CLOCK (1 << 0) 567 #define VLIB_PROCESS_IS_SUSPENDED_WAITING_FOR_EVENT (1 << 1) 569 #define VLIB_PROCESS_RESUME_PENDING (1 << 2) 572 #define VLIB_PROCESS_IS_RUNNING (1 << 3) 614 #define PAGE_SIZE_MULTIPLE 0x1000 615 #define ALIGN_ON_MULTIPLE_PAGE_BOUNDARY_FOR_MPROTECT __attribute__ ((aligned (PAGE_SIZE_MULTIPLE))) 617 #define ALIGN_ON_MULTIPLE_PAGE_BOUNDARY_FOR_MPROTECT 623 #define VLIB_PROCESS_STACK_MAGIC (0xdead7ead) 662 u8 inline_event_data[64 - 3 *
sizeof (
u32) - 2 *
sizeof (
u16)];
703 #define VLIB_NODE_MAIN_RUNTIME_STARTED (1 << 0) 766 #define FRAME_QUEUE_MAX_NELTS 32
uword output_function_arg
u32 max_clock
Maximum clock cycle for an invocation.
u32 next_frame_index
Start of next frames for this node.
u8 pad[3]
log2 (size of the packing page block)
#define CLIB_CACHE_LINE_ALIGN_MARK(mark)
u32 interrupt_threshold_vector_length
vlib_process_t ** processes
vlib_node_runtime_t node_runtime
format_function_t * format_trace
void ** pending_event_data_by_type_index
u32 current_process_index
u32 clocks_since_last_overflow
Number of clock cycles.
#define PAGE_SIZE_MULTIPLE
u8 * event_data_as_vector
clib_spinlock_t pending_interrupt_lock
vlib_error_t * errors
Vector of errors for this node.
struct vlib_frame_t vlib_frame_t
static vlib_node_registration_t * vlib_node_next_registered(vlib_node_registration_t *c)
u16 thread_index
thread this node runs on
u32 * pending_interrupt_node_runtime_indices
u32 input_main_loops_per_call
For input nodes: decremented on each main loop interation until it reaches zero and function is calle...
vlib_node_stats_t stats_last_clear
u32 main_loop_count_last_dispatch
Saved main loop counter of last dispatch of this node.
memset(h->entries, 0, sizeof(h->entries[0])*entries)
void ** recycled_event_data_vectors
u32 vectors_since_last_overflow
Number of vector elements processed by this node.
static uword vlib_timing_wheel_data_is_timed_event(u32 d)
struct _vlib_node_fn_registration vlib_node_fn_registration_t
vhost_vring_state_t state
u32 calls_since_last_overflow
Number of calls.
vlib_node_stats_t stats_total
u16 state
Input node state.
vlib_signal_timed_event_data_t * signal_timed_event_data_pool
static void vlib_next_frame_init(vlib_next_frame_t *nf)
f64 time_last_runtime_stats_clear
vlib_node_registration_t * node_registrations
static uword vlib_timing_wheel_data_get_index(u32 d)
u32 polling_threshold_vector_length
u64 * n_vectors_by_next_node
format_function_t * format_buffer
u32 node_index
Node index.
uword( vlib_node_function_t)(struct vlib_main_t *vm, struct vlib_node_runtime_t *node, struct vlib_frame_t *frame)
vlib_pending_frame_t * pending_frames
unformat_function_t * unformat_buffer
u32 stack[0] ALIGN_ON_MULTIPLE_PAGE_BOUNDARY_FOR_MPROTECT
vlib_node_fn_registration_t * node_fn_registrations
uword * one_time_event_type_bitmap
#define clib_elf_section_data_next(a, extra)
u16 cached_next_index
Next frame index that vector arguments were last enqueued to last time this node ran.
struct vlib_node_runtime_t vlib_node_runtime_t
void( vlib_cli_output_function_t)(uword arg, u8 *buffer, uword buffer_bytes)
uword * next_slot_by_node
#define foreach_vlib_node_state
struct _vlib_node_registration vlib_node_registration_t
vlib_process_event_type_t * event_type_pool
u32 * data_from_advancing_timing_wheel
vlib_pending_frame_t * suspended_process_frames
char assert_process_stack_must_be_aligned_exactly_to_page_size_multiple[(sizeof(vlib_process_t)-PAGE_SIZE_MULTIPLE)==0?0:-1]
vlib_next_frame_t * next_frames
static u32 vlib_timing_wheel_data_set_timed_event(u32 i)
uword * event_type_index_by_type_opaque
vlib_frame_size_t * frame_sizes
u64 resume_clock_interval
u32 suspended_process_frame_index
clib_longjmp_t return_longjmp
u16 flags
Copy of main node flags.
vlib_cli_output_function_t * output_function
clib_longjmp_t resume_longjmp
#define CLIB_CACHE_LINE_BYTES
static u32 vlib_timing_wheel_data_set_suspended_process(u32 i)
#define FRAME_QUEUE_MAX_NELTS
f64 time_next_process_ready
struct vlib_node_t vlib_node_t
u32 vectors_since_last_overflow
u32 max_clock_n
Number of vectors in the recorded max_clock.
uword * non_empty_event_type_bitmap