FD.io VPP  v17.07-30-g839fa73
Vector Packet Processing
node.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015 Cisco and/or its affiliates.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 /*
16  * node.h: VLIB processing nodes
17  *
18  * Copyright (c) 2008 Eliot Dresselhaus
19  *
20  * Permission is hereby granted, free of charge, to any person obtaining
21  * a copy of this software and associated documentation files (the
22  * "Software"), to deal in the Software without restriction, including
23  * without limitation the rights to use, copy, modify, merge, publish,
24  * distribute, sublicense, and/or sell copies of the Software, and to
25  * permit persons to whom the Software is furnished to do so, subject to
26  * the following conditions:
27  *
28  * The above copyright notice and this permission notice shall be
29  * included in all copies or substantial portions of the Software.
30  *
31  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
32  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
33  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
34  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
35  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
36  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
37  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
38  */
39 
40 #ifndef included_vlib_node_h
41 #define included_vlib_node_h
42 
43 #include <vppinfra/cpu.h>
44 #include <vppinfra/longjmp.h>
45 #include <vppinfra/lock.h>
46 #include <vppinfra/timing_wheel.h>
47 #include <vlib/trace.h> /* for vlib_trace_filter_t */
48 
49 /* Forward declaration. */
50 struct vlib_node_runtime_t;
51 struct vlib_frame_t;
52 
53 /* Internal nodes (including output nodes) move data from node to
54  node (or out of the graph for output nodes). */
55 typedef uword (vlib_node_function_t) (struct vlib_main_t * vm,
56  struct vlib_node_runtime_t * node,
57  struct vlib_frame_t * frame);
58 
59 typedef enum
60 {
61  /* An internal node on the call graph (could be output). */
63 
64  /* Nodes which input data into the processing graph.
65  Input nodes are called for each iteration of main loop. */
67 
68  /* Nodes to be called before all input nodes.
69  Used, for example, to clean out driver TX rings before
70  processing input. */
72 
73  /* "Process" nodes which can be suspended and later resumed. */
75 
78 
79 typedef struct _vlib_node_registration
80 {
81  /* Vector processing function for this node. */
82  vlib_node_function_t *function;
83 
84  /* Node name. */
85  char *name;
86 
87  /* Name of sibling (if applicable). */
88  char *sibling_of;
89 
90  /* Node index filled in by registration. */
91  u32 index;
92 
93  /* Type of this node. */
94  vlib_node_type_t type;
95 
96  /* Error strings indexed by error code for this node. */
97  char **error_strings;
98 
99  /* Buffer format/unformat for this node. */
100  format_function_t *format_buffer;
101  unformat_function_t *unformat_buffer;
102 
103  /* Trace format/unformat for this node. */
104  format_function_t *format_trace;
105  unformat_function_t *unformat_trace;
106 
107  /* Function to validate incoming frames. */
108  u8 *(*validate_frame) (struct vlib_main_t * vm,
109  struct vlib_node_runtime_t *,
110  struct vlib_frame_t * f);
111 
112  /* Per-node runtime data. */
113  void *runtime_data;
114 
115  /* Process stack size. */
116  u16 process_log2_n_stack_bytes;
117 
118  /* Number of bytes of per-node run time data. */
119  u8 runtime_data_bytes;
120 
121  /* State for input nodes. */
122  u8 state;
123 
124  /* Node flags. */
125  u16 flags;
126 
127  /* Size of scalar and vector arguments in bytes. */
129 
130  /* Number of error codes used by this node. */
131  u16 n_errors;
132 
133  /* Number of next node names that follow. */
134  u16 n_next_nodes;
135 
136  /* Constructor link-list, don't ask... */
137  struct _vlib_node_registration *next_registration;
138 
139  /* Names of next nodes which this node feeds into. */
140  char *next_nodes[];
141 
143 
144 #define VLIB_REGISTER_NODE(x,...) \
145  __VA_ARGS__ vlib_node_registration_t x; \
146 static void __vlib_add_node_registration_##x (void) \
147  __attribute__((__constructor__)) ; \
148 static void __vlib_add_node_registration_##x (void) \
149 { \
150  vlib_main_t * vm = vlib_get_main(); \
151  x.next_registration = vm->node_main.node_registrations; \
152  vm->node_main.node_registrations = &x; \
153 } \
154 __VA_ARGS__ vlib_node_registration_t x
155 
156 #if CLIB_DEBUG > 0
157 #define VLIB_NODE_FUNCTION_CLONE_TEMPLATE(arch, fn)
158 #define VLIB_NODE_FUNCTION_MULTIARCH_CLONE(fn)
159 #define VLIB_NODE_FUNCTION_MULTIARCH(node, fn)
160 #else
161 #define VLIB_NODE_FUNCTION_CLONE_TEMPLATE(arch, fn, tgt) \
162  uword \
163  __attribute__ ((flatten)) \
164  __attribute__ ((target (tgt))) \
165  CLIB_CPU_OPTIMIZED \
166  fn ## _ ## arch ( struct vlib_main_t * vm, \
167  struct vlib_node_runtime_t * node, \
168  struct vlib_frame_t * frame) \
169  { return fn (vm, node, frame); }
170 
171 #define VLIB_NODE_FUNCTION_MULTIARCH_CLONE(fn) \
172  foreach_march_variant(VLIB_NODE_FUNCTION_CLONE_TEMPLATE, fn)
173 
174 #define VLIB_NODE_FUNCTION_MULTIARCH(node, fn) \
175  VLIB_NODE_FUNCTION_MULTIARCH_CLONE(fn) \
176  CLIB_MULTIARCH_SELECT_FN(fn, static inline) \
177  static void __attribute__((__constructor__)) \
178  __vlib_node_function_multiarch_select_##node (void) \
179  { node.function = fn ## _multiarch_select(); }
180 #endif
181 
184 {
185  c =
187  c->n_next_nodes * sizeof (c->next_nodes[0]));
188  return c;
189 }
190 
191 typedef struct
192 {
193  /* Total calls, clock ticks and vector elements processed for this node. */
194  u64 calls, vectors, clocks, suspends;
198 
199 #define foreach_vlib_node_state \
200  /* Input node is called each iteration of main loop. \
201  This is the default (zero). */ \
202  _ (POLLING) \
203  /* Input node is called when device signals an interrupt. */ \
204  _ (INTERRUPT) \
205  /* Input node is never called. */ \
206  _ (DISABLED)
207 
208 typedef enum
209 {
210 #define _(f) VLIB_NODE_STATE_##f,
212 #undef _
215 
216 typedef struct vlib_node_t
217 {
218  /* Vector processing function for this node. */
220 
221  /* Node name. */
223 
224  /* Node name index in elog string table. */
226 
227  /* Total statistics for this node. */
229 
230  /* Saved values as of last clear (or zero if never cleared).
231  Current values are always stats_total - stats_last_clear. */
233 
234  /* Type of this node. */
235  vlib_node_type_t type;
236 
237  /* Node index. */
239 
240  /* Index of corresponding node runtime. */
242 
243  /* Runtime data for this node. */
245 
246  /* Node flags. */
248 
249  /* Processing function keeps frame. Tells node dispatching code not
250  to free frame after dispatch is done. */
251 #define VLIB_NODE_FLAG_FRAME_NO_FREE_AFTER_DISPATCH (1 << 0)
252 
253  /* Node counts as output/drop/punt node for stats purposes. */
254 #define VLIB_NODE_FLAG_IS_OUTPUT (1 << 1)
255 #define VLIB_NODE_FLAG_IS_DROP (1 << 2)
256 #define VLIB_NODE_FLAG_IS_PUNT (1 << 3)
257 #define VLIB_NODE_FLAG_IS_HANDOFF (1 << 4)
258 
259  /* Set if current node runtime has traced vectors. */
260 #define VLIB_NODE_FLAG_TRACE (1 << 5)
261 
262 #define VLIB_NODE_FLAG_SWITCH_FROM_INTERRUPT_TO_POLLING_MODE (1 << 6)
263 #define VLIB_NODE_FLAG_SWITCH_FROM_POLLING_TO_INTERRUPT_MODE (1 << 7)
264 
265  /* State for input nodes. */
267 
268  /* Number of bytes of run time data. */
270 
271  /* Number of error codes used by this node. */
273 
274  /* Size of scalar and vector arguments in bytes. */
275  u16 scalar_size, vector_size;
276 
277  /* Handle/index in error heap for this node. */
280 
281  /* Error strings indexed by error code for this node. */
283 
284  /* Vector of next node names.
285  Only used before next_nodes array is initialized. */
287 
288  /* Next node indices for this node. */
290 
291  /* Name of node that we are sibling of. */
292  char *sibling_of;
293 
294  /* Bitmap of all of this node's siblings. */
296 
297  /* Total number of vectors sent to each next node. */
299 
300  /* Hash table mapping next node index into slot in
301  next_nodes vector. Quickly determines whether this node
302  is connected to given next node and, if so, with which slot. */
304 
305  /* Bitmap of node indices which feed this node. */
307 
308  /* Node/next-index which own enqueue rights with to this node. */
309  u32 owner_node_index, owner_next_index;
310 
311  /* Buffer format/unformat for this node. */
314 
315  /* Trace buffer format/unformat for this node. */
317 
318  /* Function to validate incoming frames. */
319  u8 *(*validate_frame) (struct vlib_main_t * vm,
320  struct vlib_node_runtime_t *,
321  struct vlib_frame_t * f);
322  /* for pretty-printing, not typically valid */
324 } vlib_node_t;
325 
326 #define VLIB_INVALID_NODE_INDEX ((u32) ~0)
327 
328 /* Max number of vector elements to process at once per node. */
329 #define VLIB_FRAME_SIZE 256
330 #define VLIB_FRAME_ALIGN VLIB_MAX_CPUS
331 
332 /* Calling frame (think stack frame) for a node. */
333 typedef struct vlib_frame_t
334 {
335  /* Frame flags. */
337 
338  /* Number of scalar bytes in arguments. */
340 
341  /* Number of bytes per vector argument. */
343 
344  /* Number of vector elements currently in frame. */
346 
347  /* Owner thread / heap id */
349 
350  /* Scalar and vector arguments to next node. */
351  u8 arguments[0];
352 } vlib_frame_t;
353 
354 typedef struct
355 {
356  /* Frame index. */
358 
359  /* Node runtime for this next. */
361 
362  /* Next frame flags. */
364 
365  /* Reflects node frame-used flag for this next. */
366 #define VLIB_FRAME_NO_FREE_AFTER_DISPATCH \
367  VLIB_NODE_FLAG_FRAME_NO_FREE_AFTER_DISPATCH
368 
369  /* This next frame owns enqueue to node
370  corresponding to node_runtime_index. */
371 #define VLIB_FRAME_OWNER (1 << 15)
372 
373  /* Set when frame has been allocated for this next. */
374 #define VLIB_FRAME_IS_ALLOCATED VLIB_NODE_FLAG_IS_OUTPUT
375 
376  /* Set when frame has been added to pending vector. */
377 #define VLIB_FRAME_PENDING VLIB_NODE_FLAG_IS_DROP
378 
379  /* Set when frame is to be freed after dispatch. */
380 #define VLIB_FRAME_FREE_AFTER_DISPATCH VLIB_NODE_FLAG_IS_PUNT
381 
382  /* Set when frame has traced packets. */
383 #define VLIB_FRAME_TRACE VLIB_NODE_FLAG_TRACE
384 
385  /* Number of vectors enqueue to this next since last overflow. */
388 
389 always_inline void
391 {
392  memset (nf, 0, sizeof (nf[0]));
393  nf->frame_index = ~0;
394  nf->node_runtime_index = ~0;
395 }
396 
397 /* A frame pending dispatch by main loop. */
398 typedef struct
399 {
400  /* Node and runtime for this frame. */
402 
403  /* Frame index (in the heap). */
405 
406  /* Start of next frames for this node. */
408 
409  /* Special value for next_frame_index when there is no next frame. */
410 #define VLIB_PENDING_FRAME_NO_NEXT_FRAME ((u32) ~0)
412 
413 typedef struct vlib_node_runtime_t
414 {
415  CLIB_CACHE_LINE_ALIGN_MARK (cacheline0); /**< cacheline mark */
416 
417  vlib_node_function_t *function; /**< Node function to call. */
418 
419  vlib_error_t *errors; /**< Vector of errors for this node. */
420 
421 #if __SIZEOF_POINTER__ == 4
422  u8 pad[8];
423 #endif
424 
425  u32 clocks_since_last_overflow; /**< Number of clock cycles. */
426 
427  u32 max_clock; /**< Maximum clock cycle for an
428  invocation. */
429 
430  u32 max_clock_n; /**< Number of vectors in the recorded
431  max_clock. */
432 
433  u32 calls_since_last_overflow; /**< Number of calls. */
434 
435  u32 vectors_since_last_overflow; /**< Number of vector elements
436  processed by this node. */
437 
438  u32 next_frame_index; /**< Start of next frames for this
439  node. */
440 
441  u32 node_index; /**< Node index. */
442 
443  u32 input_main_loops_per_call; /**< For input nodes: decremented
444  on each main loop interation until
445  it reaches zero and function is
446  called. Allows some input nodes to
447  be called more than others. */
448 
449  u32 main_loop_count_last_dispatch; /**< Saved main loop counter of last
450  dispatch of this node. */
451 
452  u32 main_loop_vector_stats[2];
453 
454  u16 flags; /**< Copy of main node flags. */
455 
456  u16 state; /**< Input node state. */
457 
459 
460  u16 cached_next_index; /**< Next frame index that vector
461  arguments were last enqueued to
462  last time this node ran. Set to
463  zero before first run of this
464  node. */
465 
466  u16 thread_index; /**< thread this node runs on */
467 
468  u8 runtime_data[0]; /**< Function dependent
469  node-runtime data. This data is
470  thread local, and it is not
471  cloned from main thread. It needs
472  to be initialized for each thread
473  before it is used unless
474  runtime_data template exists in
475  vlib_node_t. */
476 }
478 
479 #define VLIB_NODE_RUNTIME_DATA_SIZE (sizeof (vlib_node_runtime_t) - STRUCT_OFFSET_OF (vlib_node_runtime_t, runtime_data))
480 
481 typedef struct
482 {
483  /* Number of allocated frames for this scalar/vector size. */
485 
486  /* Vector of free frame indices for this scalar/vector size. */
489 
490 typedef struct
491 {
492  /* Users opaque value for event type. */
495 
496 typedef struct
497 {
498  /* Node runtime for this process. */
500 
501  /* Where to longjmp when process is done. */
503 
504 #define VLIB_PROCESS_RETURN_LONGJMP_RETURN ((uword) ~0 - 0)
505 #define VLIB_PROCESS_RETURN_LONGJMP_SUSPEND ((uword) ~0 - 1)
506 
507  /* Where to longjmp to resume node after suspend. */
509 #define VLIB_PROCESS_RESUME_LONGJMP_SUSPEND 0
510 #define VLIB_PROCESS_RESUME_LONGJMP_RESUME 1
511 
513 #define VLIB_PROCESS_IS_SUSPENDED_WAITING_FOR_CLOCK (1 << 0)
514 #define VLIB_PROCESS_IS_SUSPENDED_WAITING_FOR_EVENT (1 << 1)
515  /* Set to indicate that this process has been added to resume vector. */
516 #define VLIB_PROCESS_RESUME_PENDING (1 << 2)
517 
518  /* Process function is currently running. */
519 #define VLIB_PROCESS_IS_RUNNING (1 << 3)
520 
521  /* Size of process stack. */
523 
525 
526  /* Number of times this process was suspended. */
528 
529  /* Vectors of pending event data indexed by event type index. */
531 
532  /* Bitmap of event type-indices with non-empty vectors. */
534 
535  /* Bitmap of event type-indices which are one time events. */
537 
538  /* Type is opaque pointer -- typically a pointer to an event handler
539  function. Hash table to map opaque to a type index. */
541 
542  /* Pool of currently valid event types. */
544 
545  /* When suspending saves cpu cycle counter when process is to be resumed. */
547 
548  /* Default output function and its argument for any CLI outputs
549  within the process. */
552 
553 #ifdef CLIB_UNIX
554  /* Pad to a multiple of the page size so we can mprotect process stacks */
555 #define PAGE_SIZE_MULTIPLE 0x1000
556 #define ALIGN_ON_MULTIPLE_PAGE_BOUNDARY_FOR_MPROTECT __attribute__ ((aligned (PAGE_SIZE_MULTIPLE)))
557 #else
558 #define ALIGN_ON_MULTIPLE_PAGE_BOUNDARY_FOR_MPROTECT
559 #endif
560 
561  /* Process stack. Starts here and extends 2^log2_n_stack_bytes
562  bytes. */
563 
564 #define VLIB_PROCESS_STACK_MAGIC (0xdead7ead)
566 } vlib_process_t __attribute__ ((aligned (CLIB_CACHE_LINE_BYTES)));
567 
568 #ifdef CLIB_UNIX
569  /* Ensure that the stack is aligned on the multiple of the page size */
570 typedef char
573  -
575  ==
576  0 ? 0 :
577  -1];
578 #endif
579 
580 typedef struct
581 {
583 
586 
587 typedef struct
588 {
590 
592 
593  /* n_data_elts * n_data_elt_bytes */
595 
596  /* Process node & event type to be used to signal event. */
598 
600 
601  union
602  {
603  u8 inline_event_data[64 - 3 * sizeof (u32) - 2 * sizeof (u16)];
604 
605  /* Vector of event data used only when data does not fit inline. */
607  };
608 }
610 
613 {
614  return d & 1;
615 }
616 
619 {
620  return 0 + 2 * i;
621 }
622 
625 {
626  return 1 + 2 * i;
627 }
628 
631 {
632  return d / 2;
633 }
634 
635 typedef struct
636 {
637  /* Public nodes. */
639 
640  /* Node index hashed by node name. */
642 
644 #define VLIB_NODE_MAIN_RUNTIME_STARTED (1 << 0)
645 
646  /* Nodes segregated by type for cache locality.
647  Does not apply to nodes of type VLIB_NODE_TYPE_INTERNAL. */
649 
650  /* Node runtime indices for input nodes with pending interrupts. */
653 
654  /* Input nodes are switched from/to interrupt to/from polling mode
655  when average vector length goes above/below polling/interrupt
656  thresholds. */
659 
660  /* Vector of next frames. */
662 
663  /* Vector of internal node's frames waiting to be called. */
665 
666  /* Timing wheel for scheduling time-based node dispatch. */
668 
670 
671  /* Opaque data vector added via timing_wheel_advance. */
673 
674  /* CPU time of next process to be ready on timing wheel. */
676 
677  /* Vector of process nodes.
678  One for each node of type VLIB_NODE_TYPE_PROCESS. */
680 
681  /* Current running process or ~0 if no process running. */
683 
684  /* Pool of pending process frames. */
686 
687  /* Vector of event data vectors pending recycle. */
689 
690  /* Current counts of nodes in each state. */
691  u32 input_node_counts_by_state[VLIB_N_NODE_STATE];
692 
693  /* Hash of (scalar_size,vector_size) to frame_sizes index. */
695 
696  /* Per-size frame allocation information. */
698 
699  /* Time of last node runtime stats clear. */
701 
702  /* Node registrations added by constructors */
705 
706 
707 #define FRAME_QUEUE_MAX_NELTS 32
708 typedef struct
709 {
710  CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
720 
721 typedef struct
722 {
725 
726 #endif /* included_vlib_node_h */
727 
728 /*
729  * fd.io coding-style-patch-verification: ON
730  *
731  * Local Variables:
732  * eval: (c-set-style "gnu")
733  * End:
734  */
uword * sibling_bitmap
Definition: node.h:295
u32 * next_nodes
Definition: node.h:289
uword output_function_arg
Definition: node.h:551
u8 * state_string
Definition: node.h:323
uword( vlib_node_function_t)(struct vlib_main_t *vm, struct vlib_node_runtime_t *node, struct vlib_frame_t *frame)
Definition: node.h:55
uword( unformat_function_t)(unformat_input_t *input, va_list *args)
Definition: format.h:231
struct vlib_node_t vlib_node_t
u16 vector_size
Definition: node.h:275
u32 error_heap_index
Definition: node.h:279
u32 max_clock
Maximum clock cycle for an invocation.
Definition: node.h:427
u32 next_frame_index
Start of next frames for this node.
Definition: node.h:438
u8 pad[3]
log2 (size of the packing page block)
Definition: bihash_doc.h:61
#define CLIB_CACHE_LINE_ALIGN_MARK(mark)
Definition: cache.h:68
sll srl srl sll sra u16x4 i
Definition: vector_sse2.h:337
u32 interrupt_threshold_vector_length
Definition: node.h:658
vlib_process_t ** processes
Definition: node.h:679
struct vlib_node_runtime_t vlib_node_runtime_t
vlib_node_runtime_t node_runtime
Definition: node.h:499
u32 n_suspends
Definition: node.h:527
static u32 vlib_timing_wheel_data_set_timed_event(u32 i)
Definition: node.h:624
u32 index
Definition: node.h:238
format_function_t * format_trace
Definition: node.h:316
void ** pending_event_data_by_type_index
Definition: node.h:530
u32 current_process_index
Definition: node.h:682
u16 thread_index
Definition: node.h:348
u16 flags
Definition: node.h:247
char ** error_strings
Definition: node.h:282
u64 cpu_time_next_process_ready
Definition: node.h:675
struct _vlib_node_registration vlib_node_registration_t
u32 clocks_since_last_overflow
Number of clock cycles.
Definition: node.h:425
u8 *( format_function_t)(u8 *s, va_list *args)
Definition: format.h:48
clib_spinlock_t pending_interrupt_lock
Definition: node.h:652
void * runtime_data
Definition: node.h:244
vlib_error_t * errors
Vector of errors for this node.
Definition: node.h:419
vlib_node_state_t
Definition: node.h:208
u16 thread_index
thread this node runs on
Definition: node.h:466
u8 state
Definition: node.h:266
u32 * pending_interrupt_node_runtime_indices
Definition: node.h:651
u32 input_main_loops_per_call
For input nodes: decremented on each main loop interation until it reaches zero and function is calle...
Definition: node.h:443
vlib_node_stats_t stats_last_clear
Definition: node.h:232
u32 main_loop_count_last_dispatch
Saved main loop counter of last dispatch of this node.
Definition: node.h:449
void ** recycled_event_data_vectors
Definition: node.h:688
#define always_inline
Definition: clib.h:84
u16 log2_n_stack_bytes
Definition: node.h:522
vlib_node_t ** nodes
Definition: node.h:638
u32 vectors_since_last_overflow
Number of vector elements processed by this node.
Definition: node.h:435
int i32
Definition: types.h:81
char ** next_node_names
Definition: node.h:286
char * sibling_of
Definition: node.h:292
unsigned long u64
Definition: types.h:89
u32 * free_frame_indices
Definition: node.h:487
u64 max_clock_n
Definition: node.h:196
u32 calls_since_last_overflow
Number of calls.
Definition: node.h:433
u32 next_frame_index
Definition: node.h:407
u32 error_heap_handle
Definition: node.h:278
vlib_node_stats_t stats_total
Definition: node.h:228
u16 state
Input node state.
Definition: node.h:456
u32 frame_index
Definition: node.h:357
vlib_signal_timed_event_data_t * signal_timed_event_data_pool
Definition: node.h:669
vlib_node_type_t
Definition: node.h:59
f64 time_last_runtime_stats_clear
Definition: node.h:700
vlib_node_registration_t * node_registrations
Definition: node.h:703
u32 n_alloc_frames
Definition: node.h:484
#define FRAME_QUEUE_MAX_NELTS
Definition: node.h:707
u32 polling_threshold_vector_length
Definition: node.h:657
u64 * n_vectors_by_next_node
Definition: node.h:298
u32 vlib_error_t
Definition: error.h:44
static u32 vlib_timing_wheel_data_set_suspended_process(u32 i)
Definition: node.h:618
format_function_t * format_buffer
Definition: node.h:312
u32 node_index
Node index.
Definition: node.h:441
#define foreach_vlib_node_state
Definition: node.h:199
uword * frame_size_hash
Definition: node.h:694
u8 * name
Definition: node.h:222
timing_wheel_t timing_wheel
Definition: node.h:667
static vlib_node_registration_t * vlib_node_next_registered(vlib_node_registration_t *c)
Definition: node.h:183
u32 owner_node_index
Definition: node.h:309
svmdb_client_t * c
u16 n_vectors
Definition: node.h:345
u32 runtime_index
Definition: node.h:241
vlib_pending_frame_t * pending_frames
Definition: node.h:664
u32 node_runtime_index
Definition: node.h:401
unformat_function_t * unformat_buffer
Definition: node.h:313
uword * node_by_name
Definition: node.h:641
u32 stack[0] ALIGN_ON_MULTIPLE_PAGE_BOUNDARY_FOR_MPROTECT
Definition: node.h:565
static void vlib_next_frame_init(vlib_next_frame_t *nf)
Definition: node.h:390
uword * one_time_event_type_bitmap
Definition: node.h:536
#define clib_elf_section_data_next(a, extra)
Definition: elf_clib.h:57
static uword vlib_timing_wheel_data_is_timed_event(u32 d)
Definition: node.h:612
u16 cached_next_index
Next frame index that vector arguments were last enqueued to last time this node ran.
Definition: node.h:460
unsigned int u32
Definition: types.h:88
struct vlib_frame_t vlib_frame_t
u16 flags
Definition: node.h:336
void( vlib_cli_output_function_t)(uword arg, u8 *buffer, uword buffer_bytes)
Definition: cli.h:131
vhost_vring_state_t state
Definition: vhost-user.h:81
uword * next_slot_by_node
Definition: node.h:303
#define PAGE_SIZE_MULTIPLE
Definition: node.h:555
uword * prev_node_bitmap
Definition: node.h:306
char assert_process_stack_must_be_aligned_exactly_to_page_size_multiple[(sizeof(vlib_process_t)-PAGE_SIZE_MULTIPLE)==0?0:-1]
Definition: node.h:577
u64 uword
Definition: types.h:112
unsigned short u16
Definition: types.h:57
vlib_process_event_type_t * event_type_pool
Definition: node.h:543
u32 * data_from_advancing_timing_wheel
Definition: node.h:672
double f64
Definition: types.h:142
unsigned char u8
Definition: types.h:56
vlib_pending_frame_t * suspended_process_frames
Definition: node.h:685
u8 vector_size
Definition: node.h:342
vlib_next_frame_t * next_frames
Definition: node.h:661
uword * event_type_index_by_type_opaque
Definition: node.h:540
vlib_frame_size_t * frame_sizes
Definition: node.h:697
u16 flags
Definition: node.h:512
vlib_node_type_t type
Definition: node.h:235
u32 name_elog_string
Definition: node.h:225
u16 n_errors
Definition: node.h:272
u32 suspended_process_frame_index
Definition: node.h:524
u64 resume_cpu_time
Definition: node.h:546
static uword vlib_timing_wheel_data_get_index(u32 d)
Definition: node.h:630
clib_longjmp_t return_longjmp
Definition: node.h:502
u16 flags
Copy of main node flags.
Definition: node.h:454
u32 node_runtime_index
Definition: node.h:360
u8 scalar_size
Definition: node.h:339
vlib_cli_output_function_t * output_function
Definition: node.h:550
clib_longjmp_t resume_longjmp
Definition: node.h:508
u32 flags
Definition: vhost-user.h:76
#define CLIB_CACHE_LINE_BYTES
Definition: cache.h:67
u8 runtime_data_bytes
Definition: node.h:269
u32 vectors_since_last_overflow
Definition: node.h:386
u32 max_clock_n
Number of vectors in the recorded max_clock.
Definition: node.h:430
uword * non_empty_event_type_bitmap
Definition: node.h:533