FD.io VPP  v18.10-34-gcce845e
Vector Packet Processing
node_cli.c
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_cli.c: node CLI
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 #include <vlib/vlib.h>
41 #include <vlib/threads.h>
42 
43 static int
44 node_cmp (void *a1, void *a2)
45 {
46  vlib_node_t **n1 = a1;
47  vlib_node_t **n2 = a2;
48 
49  return vec_cmp (n1[0]->name, n2[0]->name);
50 }
51 
52 static clib_error_t *
54  unformat_input_t * input, vlib_cli_command_t * cmd)
55 {
56  vlib_node_main_t *nm = &vm->node_main;
57  vlib_node_t *n;
58  u32 node_index;
59 
60  vlib_cli_output (vm, "%U\n", format_vlib_node_graph, nm, 0);
61 
62  if (unformat (input, "%U", unformat_vlib_node, vm, &node_index))
63  {
64  n = vlib_get_node (vm, node_index);
65  vlib_cli_output (vm, "%U\n", format_vlib_node_graph, nm, n);
66  }
67  else
68  {
69  vlib_node_t **nodes = vec_dup (nm->nodes);
70  uword i;
71 
73 
74  for (i = 0; i < vec_len (nodes); i++)
75  vlib_cli_output (vm, "%U\n\n", format_vlib_node_graph, nm, nodes[i]);
76 
77  vec_free (nodes);
78  }
79 
80  return 0;
81 }
82 
83 /* *INDENT-OFF* */
84 VLIB_CLI_COMMAND (show_node_graph_command, static) = {
85  .path = "show vlib graph",
86  .short_help = "Show packet processing node graph",
87  .function = show_node_graph,
88 };
89 /* *INDENT-ON* */
90 
91 static u8 *
92 format_vlib_node_state (u8 * s, va_list * va)
93 {
94  vlib_main_t *vm = va_arg (*va, vlib_main_t *);
95  vlib_node_t *n = va_arg (*va, vlib_node_t *);
96  char *state;
97 
98  state = "active";
99  if (n->type == VLIB_NODE_TYPE_PROCESS)
100  {
102 
105  {
106  default:
107  if (!(p->flags & VLIB_PROCESS_IS_RUNNING))
108  state = "done";
109  break;
110 
112  state = "time wait";
113  break;
114 
116  state = "event wait";
117  break;
118 
120  state =
121  "any wait";
122  break;
123  }
124  }
125  else if (n->type != VLIB_NODE_TYPE_INTERNAL)
126  {
127  state = "polling";
128  if (n->state == VLIB_NODE_STATE_DISABLED)
129  state = "disabled";
130  else if (n->state == VLIB_NODE_STATE_INTERRUPT)
131  state = "interrupt wait";
132  }
133 
134  return format (s, "%s", state);
135 }
136 
137 static u8 *
138 format_vlib_node_stats (u8 * s, va_list * va)
139 {
140  vlib_main_t *vm = va_arg (*va, vlib_main_t *);
141  vlib_node_t *n = va_arg (*va, vlib_node_t *);
142  int max = va_arg (*va, int);
143  f64 v;
144  u8 *ns;
145  u8 *misc_info = 0;
146  u64 c, p, l, d;
147  f64 x;
148  f64 maxc, maxcn;
149  u32 maxn;
150  u32 indent;
151 
152  if (!n)
153  {
154  if (max)
155  return format (s,
156  "%=30s%=17s%=16s%=16s%=16s%=16s",
157  "Name", "Max Node Clocks", "Vectors at Max",
158  "Max Clocks", "Avg Clocks", "Avg Vectors/Call");
159  else
160  return format (s,
161  "%=30s%=12s%=16s%=16s%=16s%=16s%=16s",
162  "Name", "State", "Calls", "Vectors", "Suspends",
163  "Clocks", "Vectors/Call");
164  }
165 
166  indent = format_get_indent (s);
167 
172  maxc = (f64) n->stats_total.max_clock;
173  maxn = n->stats_total.max_clock_n;
174  if (n->stats_total.max_clock_n)
175  maxcn = (f64) n->stats_total.max_clock / (f64) maxn;
176  else
177  maxcn = 0.0;
178 
179  /* Clocks per packet, per call or per suspend. */
180  x = 0;
181  if (p > 0)
182  x = (f64) l / (f64) p;
183  else if (c > 0)
184  x = (f64) l / (f64) c;
185  else if (d > 0)
186  x = (f64) l / (f64) d;
187 
188  if (c > 0)
189  v = (double) p / (double) c;
190  else
191  v = 0;
192 
193  if (n->type == VLIB_NODE_TYPE_PROCESS)
194  {
196 
197  /* Show processes with events pending. This helps spot bugs where events are not
198  being handled. */
200  misc_info = format (misc_info, "events pending, ");
201  }
202  ns = n->name;
203 
204  if (max)
205  s = format (s, "%-30v%=17.2e%=16d%=16.2e%=16.2e%=16.2e",
206  ns, maxc, maxn, maxcn, x, v);
207  else
208  s = format (s, "%-30v%=12U%16Ld%16Ld%16Ld%16.2e%16.2f", ns,
209  format_vlib_node_state, vm, n, c, p, d, x, v);
210 
211  if (ns != n->name)
212  vec_free (ns);
213 
214  if (misc_info)
215  {
216  s = format (s, "\n%U%v", format_white_space, indent + 4, misc_info);
217  vec_free (misc_info);
218  }
219 
220  return s;
221 }
222 
223 static clib_error_t *
225  unformat_input_t * input, vlib_cli_command_t * cmd)
226 {
227  vlib_node_main_t *nm = &vm->node_main;
228  vlib_node_t *n;
229  f64 time_now;
230  u32 node_index;
231  vlib_node_t ***node_dups = 0;
232  f64 *vectors_per_main_loop = 0;
233  f64 *last_vector_length_per_node = 0;
234 
235  time_now = vlib_time_now (vm);
236 
237  if (unformat (input, "%U", unformat_vlib_node, vm, &node_index))
238  {
239  n = vlib_get_node (vm, node_index);
240  vlib_node_sync_stats (vm, n);
241  vlib_cli_output (vm, "%U\n", format_vlib_node_stats, vm, 0, 0);
242  vlib_cli_output (vm, "%U\n", format_vlib_node_stats, vm, n, 0);
243  }
244  else
245  {
246  vlib_node_t **nodes;
247  uword i, j;
248  f64 dt;
249  u64 n_input, n_output, n_drop, n_punt;
250  u64 n_internal_vectors, n_internal_calls;
251  u64 n_clocks, l, v, c, d;
252  int brief = 1;
253  int max = 0;
254  vlib_main_t **stat_vms = 0, *stat_vm;
255 
256  /* Suppress nodes with zero calls since last clear */
257  if (unformat (input, "brief") || unformat (input, "b"))
258  brief = 1;
259  if (unformat (input, "verbose") || unformat (input, "v"))
260  brief = 0;
261  if (unformat (input, "max") || unformat (input, "m"))
262  max = 1;
263 
264  for (i = 0; i < vec_len (vlib_mains); i++)
265  {
266  stat_vm = vlib_mains[i];
267  if (stat_vm)
268  vec_add1 (stat_vms, stat_vm);
269  }
270 
271  /*
272  * Barrier sync across stats scraping.
273  * Otherwise, the counts will be grossly inaccurate.
274  */
276 
277  for (j = 0; j < vec_len (stat_vms); j++)
278  {
279  stat_vm = stat_vms[j];
280  nm = &stat_vm->node_main;
281 
282  for (i = 0; i < vec_len (nm->nodes); i++)
283  {
284  n = nm->nodes[i];
285  vlib_node_sync_stats (stat_vm, n);
286  }
287 
288  nodes = vec_dup (nm->nodes);
289 
290  vec_add1 (node_dups, nodes);
291  vec_add1 (vectors_per_main_loop,
293  vec_add1 (last_vector_length_per_node,
295  }
297 
298 
299  for (j = 0; j < vec_len (stat_vms); j++)
300  {
301  stat_vm = stat_vms[j];
302  nodes = node_dups[j];
303 
305 
306  n_input = n_output = n_drop = n_punt = n_clocks = 0;
307  n_internal_vectors = n_internal_calls = 0;
308  for (i = 0; i < vec_len (nodes); i++)
309  {
310  n = nodes[i];
311 
313  n_clocks += l;
314 
317 
318  switch (n->type)
319  {
320  default:
321  continue;
322 
324  n_output += (n->flags & VLIB_NODE_FLAG_IS_OUTPUT) ? v : 0;
325  n_drop += (n->flags & VLIB_NODE_FLAG_IS_DROP) ? v : 0;
326  n_punt += (n->flags & VLIB_NODE_FLAG_IS_PUNT) ? v : 0;
327  if (!(n->flags & VLIB_NODE_FLAG_IS_OUTPUT))
328  {
329  n_internal_vectors += v;
330  n_internal_calls += c;
331  }
333  n_input += v;
334  break;
335 
337  n_input += v;
338  break;
339  }
340  }
341 
342  if (vec_len (vlib_mains) > 1)
343  {
345  if (j > 0)
346  vlib_cli_output (vm, "---------------");
347 
348  if (w->cpu_id > -1)
349  vlib_cli_output (vm, "Thread %d %s (lcore %u)", j, w->name,
350  w->cpu_id);
351  else
352  vlib_cli_output (vm, "Thread %d %s", j, w->name);
353  }
354 
355  dt = time_now - nm->time_last_runtime_stats_clear;
357  (vm,
358  "Time %.1f, average vectors/node %.2f, last %d main loops %.2f per node %.2f"
359  "\n vector rates in %.4e, out %.4e, drop %.4e, punt %.4e",
360  dt,
361  (n_internal_calls > 0
362  ? (f64) n_internal_vectors / (f64) n_internal_calls
363  : 0),
365  vectors_per_main_loop[j],
366  last_vector_length_per_node[j],
367  (f64) n_input / dt,
368  (f64) n_output / dt, (f64) n_drop / dt, (f64) n_punt / dt);
369 
370  vlib_cli_output (vm, "%U", format_vlib_node_stats, stat_vm, 0, max);
371  for (i = 0; i < vec_len (nodes); i++)
372  {
373  c =
374  nodes[i]->stats_total.calls -
375  nodes[i]->stats_last_clear.calls;
376  d =
377  nodes[i]->stats_total.suspends -
378  nodes[i]->stats_last_clear.suspends;
379  if (c || d || !brief)
380  {
381  vlib_cli_output (vm, "%U", format_vlib_node_stats, stat_vm,
382  nodes[i], max);
383  }
384  }
385  vec_free (nodes);
386  }
387  vec_free (stat_vms);
388  vec_free (node_dups);
389  vec_free (vectors_per_main_loop);
390  vec_free (last_vector_length_per_node);
391  }
392 
393  return 0;
394 }
395 
396 /* *INDENT-OFF* */
397 VLIB_CLI_COMMAND (show_node_runtime_command, static) = {
398  .path = "show runtime",
399  .short_help = "Show packet processing runtime",
400  .function = show_node_runtime,
401  .is_mp_safe = 1,
402 };
403 /* *INDENT-ON* */
404 
405 static clib_error_t *
407  unformat_input_t * input, vlib_cli_command_t * cmd)
408 {
409  vlib_node_main_t *nm;
410  vlib_node_t *n;
411  int i, j;
412  vlib_main_t **stat_vms = 0, *stat_vm;
414 
415  for (i = 0; i < vec_len (vlib_mains); i++)
416  {
417  stat_vm = vlib_mains[i];
418  if (stat_vm)
419  vec_add1 (stat_vms, stat_vm);
420  }
421 
423 
424  for (j = 0; j < vec_len (stat_vms); j++)
425  {
426  stat_vm = stat_vms[j];
427  nm = &stat_vm->node_main;
428 
429  for (i = 0; i < vec_len (nm->nodes); i++)
430  {
431  n = nm->nodes[i];
432  vlib_node_sync_stats (stat_vm, n);
434 
435  r = vlib_node_get_runtime (stat_vm, n->index);
436  r->max_clock = 0;
437  }
438  /* Note: input/output rates computed using vlib_global_main */
440  }
441 
443 
444  vec_free (stat_vms);
445 
446  return 0;
447 }
448 
449 /* *INDENT-OFF* */
450 VLIB_CLI_COMMAND (clear_node_runtime_command, static) = {
451  .path = "clear runtime",
452  .short_help = "Clear packet processing runtime statistics",
453  .function = clear_node_runtime,
454 };
455 /* *INDENT-ON* */
456 
457 static clib_error_t *
459  vlib_cli_command_t * cmd)
460 {
461  unformat_input_t _line_input, *line_input = &_line_input;
462  clib_error_t *error = 0;
463  vlib_node_main_t *nm = &vm->node_main;
464  vlib_node_t *n;
465  u8 *s = 0, *s2 = 0;
466  u32 i, node_index = ~0;
467  char *type_str;
468  u8 valid_node_name = 0;
469 
470  if (!unformat_user (input, unformat_line_input, line_input))
471  return 0;
472 
473  while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
474  {
475  if (unformat (line_input, "index %u", &node_index))
476  ;
477  else
478  if (unformat (line_input, "%U", unformat_vlib_node, vm, &node_index))
479  valid_node_name = 1;
480  else if (!valid_node_name)
481  error = clib_error_return (0, "unknown node name: '%U'",
482  format_unformat_error, line_input);
483  else
484  error = clib_error_return (0, "unknown input '%U'",
485  format_unformat_error, line_input);
486  }
487 
488  unformat_free (line_input);
489 
490  if (error)
491  return error;
492 
493  if (node_index >= vec_len (vm->node_main.nodes))
494  return clib_error_return (0, "please specify valid node");
495 
496  n = vlib_get_node (vm, node_index);
497  vlib_node_sync_stats (vm, n);
498 
499  switch (n->type)
500  {
502  type_str = "internal";
503  break;
505  type_str = "input";
506  break;
508  type_str = "pre-input";
509  break;
511  type_str = "process";
512  break;
513  default:
514  type_str = "unknown";
515  }
516 
517  if (n->sibling_of)
518  s = format (s, ", sibling-of %s", n->sibling_of);
519 
520  vlib_cli_output (vm, "node %s, type %s, state %U, index %d%v\n",
521  n->name, type_str, format_vlib_node_state, vm, n,
522  n->index, s);
523  vec_reset_length (s);
524 
525  if (n->node_fn_registrations)
526  {
528  while (fnr)
529  {
530  if (vec_len (s) == 0)
531  s = format (s, "\n %-15s %=8s %6s",
532  "Name", "Priority", "Active");
533  s = format (s, "\n %-15s %=8u %=6s", fnr->name, fnr->priority,
534  fnr->function == n->function ? "yes" : "");
535  fnr = fnr->next_registration;
536  }
537  }
538  else
539  s = format (s, "\n default only");
540  vlib_cli_output (vm, " node function variants:%v\n", s);
541  vec_reset_length (s);
542 
543  for (i = 0; i < vec_len (n->next_nodes); i++)
544  {
545  vlib_node_t *pn;
546  if (n->next_nodes[i] == VLIB_INVALID_NODE_INDEX)
547  continue;
548 
549  pn = vec_elt (nm->nodes, n->next_nodes[i]);
550 
551  if (vec_len (s) == 0)
552  s = format (s, "\n %10s %10s %=30s %8s",
553  "next-index", "node-index", "Node", "Vectors");
554 
555  s = format (s, "\n %=10u %=10u %-30v %=8llu", i, n->next_nodes[i],
556  pn->name, vec_elt (n->n_vectors_by_next_node, i));
557  }
558 
559  if (vec_len (s) == 0)
560  s = format (s, "\n none");
561  vlib_cli_output (vm, "\n next nodes:%v\n", s);
562  vec_reset_length (s);
563 
564  if (n->type == VLIB_NODE_TYPE_INTERNAL)
565  {
566  int j = 0;
567  /* *INDENT-OFF* */
569  vlib_node_t *pn = vlib_get_node (vm, i);
570  if (j++ % 3 == 0)
571  s = format (s, "\n ");
572  s2 = format (s2, "%v (%u)", pn->name, i);
573  s = format (s, "%-35v", s2);
574  vec_reset_length (s2);
575  }));
576  /* *INDENT-ON* */
577 
578  if (vec_len (s) == 0)
579  s = format (s, "\n none");
580  vlib_cli_output (vm, "\n known previous nodes:%v\n", s);
581  vec_reset_length (s);
582  }
583 
584  vec_free (s);
585  vec_free (s2);
586  return 0;
587 }
588 
589 /* *INDENT-OFF* */
590 VLIB_CLI_COMMAND (show_node_command, static) = {
591  .path = "show node",
592  .short_help = "show node [index] <node-name | node-index>",
593  .function = show_node,
594 };
595 
596 static clib_error_t *
598 {
599  unformat_input_t _line_input, *line_input = &_line_input;
600  u32 node_index;
601  vlib_node_t *n;
602  clib_error_t *err = 0;
604  u8 *variant = 0;
605 
606  if (!unformat_user (input, unformat_line_input, line_input))
607  return 0;
608 
609  if (!unformat (line_input, "%U", unformat_vlib_node, vm, &node_index))
610  {
611  err = clib_error_return (0, "please specify valid node name");
612  goto done;
613  }
614 
615  if (!unformat (line_input, "%s", &variant))
616  {
617  err = clib_error_return (0, "please specify node functional variant");
618  goto done;
619  }
620 
621  n = vlib_get_node (vm, node_index);
622 
623  if (n->node_fn_registrations == 0)
624  {
625  err = clib_error_return (0, "node doesn't have functional variants");
626  goto done;
627  }
628 
629  fnr = n->node_fn_registrations;
630  vec_add1 (variant, 0);
631 
632  while (fnr)
633  {
634  if (!strncmp (fnr->name, (char *) variant, vec_len (variant) - 1))
635  {
636  int i;
637 
638  n->function = fnr->function;
639 
640  for (i = 0; i < vec_len (vlib_mains); i++)
641  {
642  vlib_node_runtime_t *nrt;
643  nrt = vlib_node_get_runtime (vlib_mains[i], n->index);
644  nrt->function = fnr->function;
645  }
646  goto done;
647  }
648  fnr = fnr->next_registration;
649  }
650 
651  err = clib_error_return (0, "node functional variant '%s' not found", variant);
652 
653 done:
654  vec_free (variant);
655  unformat_free (line_input);
656  return err;
657 }
658 
659 /* *INDENT-OFF* */
660 VLIB_CLI_COMMAND (set_node_fn_command, static) = {
661  .path = "set node function",
662  .short_help = "set node function <node-name> <variant-name>",
663  .function = set_node_fn,
664 };
665 /* *INDENT-ON* */
666 
667 /* Dummy function to get us linked in. */
668 void
670 {
671 }
672 
673 /*
674  * fd.io coding-style-patch-verification: ON
675  *
676  * Local Variables:
677  * eval: (c-set-style "gnu")
678  * End:
679  */
u32 * next_nodes
Definition: node.h:339
static f64 vlib_last_vectors_per_main_loop_as_f64(vlib_main_t *vm)
Definition: main.h:309
u32 max_clock
Maximum clock cycle for an invocation.
Definition: node.h:480
unsigned long u64
Definition: types.h:89
u32 index
Definition: node.h:288
static f64 vlib_time_now(vlib_main_t *vm)
Definition: main.h:227
u16 flags
Definition: node.h:297
static int node_cmp(void *a1, void *a2)
Definition: node_cli.c:44
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
Definition: vec.h:523
#define VLIB_NODE_FLAG_IS_PUNT
Definition: node.h:306
int i
uword unformat_user(unformat_input_t *input, unformat_function_t *func,...)
Definition: unformat.c:983
static u32 format_get_indent(u8 *s)
Definition: format.h:72
u8 * format(u8 *s, const char *fmt,...)
Definition: format.c:419
vlib_main_t ** vlib_mains
Definition: buffer.c:303
unsigned char u8
Definition: types.h:56
#define vec_reset_length(v)
Reset vector length to zero NULL-pointer tolerant.
double f64
Definition: types.h:142
u8 state
Definition: node.h:316
vlib_node_function_t * function
Definition: node.h:269
#define vlib_worker_thread_barrier_sync(X)
Definition: threads.h:204
static f64 vlib_last_vector_length_per_node(vlib_main_t *vm)
Definition: main.h:318
vlib_node_stats_t stats_last_clear
Definition: node.h:282
static clib_error_t * show_node_runtime(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: node_cli.c:224
vlib_node_function_t * function
Node function to call.
Definition: node.h:470
#define VLIB_INVALID_NODE_INDEX
Definition: node.h:379
static uword clib_bitmap_is_zero(uword *ai)
predicate function; is an entire bitmap empty?
Definition: bitmap.h:57
u8 * format_white_space(u8 *s, va_list *va)
Definition: std-formats.c:113
vlib_node_t ** nodes
Definition: node.h:697
#define VLIB_LOG2_MAIN_LOOPS_PER_STATS_UPDATE
Definition: main.h:85
char * sibling_of
Definition: node.h:342
#define clib_error_return(e, args...)
Definition: error.h:99
struct _vlib_node_fn_registration vlib_node_fn_registration_t
vhost_vring_state_t state
Definition: vhost_user.h:120
#define VLIB_PROCESS_IS_SUSPENDED_WAITING_FOR_CLOCK
Definition: node.h:566
unsigned int u32
Definition: types.h:88
static clib_error_t * show_node(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: node_cli.c:458
#define VLIB_PROCESS_IS_RUNNING
Definition: node.h:572
u64 max_clock_n
Definition: node.h:246
unformat_function_t unformat_line_input
Definition: format.h:282
static u8 * format_vlib_node_stats(u8 *s, va_list *va)
Definition: node_cli.c:138
vlib_worker_thread_t * vlib_worker_threads
Definition: threads.c:36
#define clib_bitmap_foreach(i, ai, body)
Macro to iterate across set bits in a bitmap.
Definition: bitmap.h:361
vlib_node_stats_t stats_total
Definition: node.h:278
f64 time_last_runtime_stats_clear
Definition: node.h:759
#define v
Definition: acl.c:496
struct _unformat_input_t unformat_input_t
#define vec_dup(V)
Return copy of vector (no header, no alignment)
Definition: vec.h:373
static clib_error_t * set_node_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: node_cli.c:597
u64 * n_vectors_by_next_node
Definition: node.h:348
u8 name[64]
Definition: memclnt.api:151
u8 * name
Definition: node.h:272
#define UNFORMAT_END_OF_INPUT
Definition: format.h:144
svmdb_client_t * c
vlib_main_t * vm
Definition: buffer.c:294
#define vec_free(V)
Free vector&#39;s memory (no header).
Definition: vec.h:339
static vlib_node_runtime_t * vlib_node_get_runtime(vlib_main_t *vm, u32 node_index)
Get node runtime by node index.
Definition: node_funcs.h:89
static u8 * format_vlib_node_state(u8 *s, va_list *va)
Definition: node_cli.c:92
vlib_node_fn_registration_t * node_fn_registrations
Definition: node.h:376
#define VLIB_CLI_COMMAND(x,...)
Definition: cli.h:155
static clib_error_t * clear_node_runtime(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: node_cli.c:406
void vlib_node_cli_reference(void)
Definition: node_cli.c:669
#define vec_cmp(v1, v2)
Compare two vectors (only applicable to vectors of signed numbers).
Definition: vec.h:921
uword * prev_node_bitmap
Definition: node.h:356
void vlib_node_sync_stats(vlib_main_t *vm, vlib_node_t *n)
Definition: main.c:571
#define vec_elt(v, i)
Get vector value at index i.
#define VLIB_NODE_FLAG_IS_HANDOFF
Definition: node.h:307
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
vlib_node_main_t node_main
Definition: main.h:134
u64 uword
Definition: types.h:112
#define vec_sort_with_function(vec, f)
Sort a vector using the supplied element comparison function.
Definition: vec.h:982
static void unformat_free(unformat_input_t *i)
Definition: format.h:162
static clib_error_t * show_node_graph(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: node_cli.c:53
unformat_function_t unformat_vlib_node
Definition: node_funcs.h:1173
#define VLIB_NODE_FLAG_IS_DROP
Definition: node.h:305
u16 flags
Definition: node.h:565
vlib_node_type_t type
Definition: node.h:285
static vlib_process_t * vlib_get_process_from_node(vlib_main_t *vm, vlib_node_t *node)
Definition: node_funcs.h:207
u8 * format_unformat_error(u8 *s, va_list *va)
Definition: unformat.c:91
void vlib_worker_thread_barrier_release(vlib_main_t *vm)
Definition: threads.c:1455
static vlib_node_t * vlib_get_node(vlib_main_t *vm, u32 i)
Get vlib node by index.
Definition: node_funcs.h:59
#define VLIB_NODE_FLAG_IS_OUTPUT
Definition: node.h:304
#define VLIB_PROCESS_IS_SUSPENDED_WAITING_FOR_EVENT
Definition: node.h:567
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
Definition: cli.c:725
format_function_t format_vlib_node_graph
Definition: node_funcs.h:1166
uword unformat(unformat_input_t *i, const char *fmt,...)
Definition: unformat.c:972
static uword unformat_check_input(unformat_input_t *i)
Definition: format.h:170
uword * non_empty_event_type_bitmap
Definition: node.h:586