59 .short_help =
"Show commands",
67 .short_help =
"Clear commands",
75 .short_help =
"Set commands",
83 .short_help =
"Test commands",
186 if (c ==
'{' &&
unformat (i,
"%v", &s))
211 uword *match_bitmap, is_unique, index;
229 u8 *c1 = *(
u8 **) a1;
230 u8 *c2 = *(
u8 **) a2;
242 uword *match_bitmap = 0;
243 uword index, is_unique, help_next_level;
250 while (
vec_len (input.buffer) >= 2 &&
251 isspace (input.buffer[
vec_len (input.buffer) - 1]) &&
252 isspace (input.buffer[
vec_len (input.buffer) - 2]))
258 if (
vec_len (input.buffer) == 0 ||
259 (
vec_len (input.buffer) == 1 && isspace (input.buffer[0])))
276 if (match_bitmap == 0)
285 if (input.index >=
vec_len (input.buffer) - 1)
304 help_next_level = (
vec_len (str) == 0) || isspace (str[
vec_len (str) - 1]);
307 if (help_next_level && is_unique) {
332 int is_long = va_arg (*args,
int);
347 s =
format (s,
"%v", path);
388 uword parent_command_index)
397 if (is_main_dispatch &&
unformat (input,
"help"))
399 uword help_at_end_of_line,
i;
401 help_at_end_of_line =
419 if (!help_at_end_of_line)
441 for (i = 0; i <
vec_len (subs); i++)
447 (vm,
" %-30v %U", subs[i].
name,
455 else if (is_main_dispatch
460 subs =
all_subs (cm, 0, parent_command_index);
469 else if (
unformat (input,
"comment %v", &
string))
474 else if (
unformat (input,
"uncomment %U",
479 parent_command_index);
482 else if (
unformat (input,
"leak-check %U",
497 parent_command_index);
520 uword has_sub_commands =
527 if (has_sub_commands)
530 if (has_sub_commands && !error)
552 .format =
"cli-cmd: %s",
578 .format =
"cli-cmd: %s %s",
579 .format_args =
"T4T4",
593 _vec_len (c_error->
what) -= 1;
640 __attribute__ ((weak));
656 uword save_function_arg;
678 rv = error->
code != 0 ? error->
code : -1;
735 int verbose __attribute__ ((unused)) = 0;
736 int api_segment = 0, stats_segment = 0, main_heap = 0;
747 else if (
unformat (input,
"api-segment"))
749 else if (
unformat (input,
"stats-segment"))
751 else if (
unformat (input,
"main-heap"))
761 if ((api_segment + stats_segment + main_heap) == 0)
763 (0,
"Please supply one of api-segment, stats-segment or main-heap");
804 #if USE_DLMALLOC == 0 859 .path =
"show memory",
860 .short_help =
"show memory [api-segment][stats-segment][verbose]",
869 #define _(a,b,c) vlib_cli_output (vm, "%-25s " b, a ":", c); 873 _(
"Base frequency",
"%.2f GHz",
893 .short_help =
"Show cpu information",
906 int stats_segment = 0;
917 else if (
unformat (line_input,
"api-segment"))
919 else if (
unformat (line_input,
"stats-segment"))
921 else if (
unformat (line_input,
"main-heap"))
931 if ((api_segment + stats_segment + main_heap + (enable == 0)) == 0)
934 (0,
"Need one of main-heap, stats-segment or api-segment");
983 .path =
"memory-trace",
984 .short_help =
"memory-trace on|off [api-segment][stats-segment][main-heap]\n",
994 #if USE_DLMALLOC == 0 1049 .path =
"test heap-validate",
1050 .short_help =
"<on/off/now> validate heap on future allocs/frees or right now",
1063 extern char **environ;
1069 if (f->file_descriptor > 2)
1070 close(f->file_descriptor);
1075 execve (vm->
name, (
char **) vm->
argv, environ);
1083 .short_help =
"restart process",
1099 u16 my_id = rand ();
1101 vlib_cli_output (vm,
"Starting 10 seconds sleep with id %u\n", my_id);
1103 for (i = 0; i < 10; i++)
1114 .path =
"test sleep",
1115 .function = sleep_ten_seconds,
1116 .short_help =
"Sleep for 10 seconds",
1127 uword index_of_last_space = ~0;
1139 if (l > 0 && s[l - 1] !=
' ')
1147 if (l > 0 && s[l - 1] ==
' ')
1148 index_of_last_space =
vec_len (s);
1156 if (l > 0 && s[l - 1] ==
' ')
1160 return index_of_last_space;
1167 for (i =
vec_len (path) - 1; i >= 0; i--)
1196 if (sub_name[0] ==
'%')
1206 sizeof (sub_name[0]),
1219 sr->
name = sub_name;
1227 sizeof (c->
path[0]),
1238 sub_c->
index = child_index;
1239 sub_c->
name = sub_name;
1271 uword p_len, pi, *p;
1298 parent->
path = p_path;
1328 char *normalized_path;
1337 sizeof (c->
path[0]),
1392 c->
path = normalized_path;
1415 if (!cm->parse_rule_index_by_name)
1417 sizeof (r->
name[0]),
1423 if ((p =
hash_get_mem (cm->parse_rule_index_by_name, r_name)))
1432 r->
name = (
char *) r_name;
1443 __attribute__ ((unused))
1450 if (!r->
name || strlen (r->
name) == 0)
1472 int api = 0, cli = 0, barrier = 0, dispatch = 0, circuit = 0;
1473 u32 circuit_node_index;
1482 else if (
unformat (line_input,
"dispatch"))
1484 else if (
unformat (line_input,
"circuit-node %U",
1487 else if (
unformat (line_input,
"cli"))
1489 else if (
unformat (line_input,
"barrier"))
1491 else if (
unformat (line_input,
"disable"))
1493 else if (
unformat (line_input,
"enable"))
1517 if (dispatch || circuit)
1530 (vm,
" Event log API message trace: %s\n CLI command trace: %s",
1534 (vm,
" Barrier sync trace: %s",
1537 (vm,
" Graph Dispatch: %s",
1540 (vm,
" Graph Circuit: %s",
1568 .path =
"elog trace",
1569 .short_help =
"elog trace [api][cli][barrier][dispatch]\n" 1570 "[circuit-node <name> e.g. ethernet-input][disable]",
1587 .short_help =
"suspend debug CLI for 30ms",
1610 for (i = 0; i < lmin; i++)
1614 else if (c1->
path[i] > c2->
path[i])
1671 int show_mp_safe = va_arg (*args,
int);
1672 int show_not_mp_safe = va_arg (*args,
int);
1673 int show_hit = va_arg (*args,
int);
1674 int clear_hit = va_arg (*args,
int);
1678 char *format_string =
"\n%v";
1681 format_string =
"\n%v: %u";
1710 int show_mp_safe = 0;
1711 int show_not_mp_safe = 0;
1719 if (
unformat (input,
"not-mp-safe"))
1720 show_not_mp_safe = 1;
1723 else if (
unformat (input,
"clear-hit"))
1730 if (clear_hit == 0 && (show_mp_safe + show_not_mp_safe) == 0)
1731 show_mp_safe = show_not_mp_safe = 1;
1734 show_mp_safe, show_not_mp_safe, show_hit, clear_hit);
1785 .short_help =
"show cli [mp-safe][not-mp-safe][hit][clear-hit]",
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment) ...
uword output_function_arg
void * vlib_stats_push_heap(void *)
void * clib_per_cpu_mheaps[CLIB_MAX_MHEAPS]
static clib_error_t * show_cpu(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
static f64 vlib_process_wait_for_event_or_clock(vlib_main_t *vm, f64 dt)
Suspend a cooperative multi-tasking thread Waits for an event, or for the indicated number of seconds...
format_function_t format_vlib_node_name
uword vm_alloc_offset_from_header
static clib_error_t * show_cli_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
int elog_trace_cli_commands
vlib_cli_command_t * commands
format_function_t format_cpu_flags
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
#define vec_add2(V, P, N)
Add N elements to end of vector V, return pointer to new elements in P.
static uword parent_path_len(char *path)
static mheap_t * mheap_header(u8 *v)
uword * sub_rule_index_by_name
#define hash_set_mem(h, key, value)
DLMALLOC_EXPORT struct dlmallinfo mspace_mallinfo(mspace msp)
static vlib_cli_command_t * all_subs(vlib_cli_main_t *cm, vlib_cli_command_t *subs, u32 command_index)
#define clib_bitmap_dup(v)
Duplicate a bitmap.
#define vec_reset_length(v)
Reset vector length to zero NULL-pointer tolerant.
#define vlib_worker_thread_barrier_sync(X)
clib_error_t * vlib_cli_register_parse_rule(struct vlib_main_t *vm, vlib_cli_parse_rule_t *c)
#define vec_add(V, E, N)
Add N elements to end of vector V (no header, unspecified alignment)
static uword vlib_process_suspend(vlib_main_t *vm, f64 dt)
Suspend a vlib cooperative multi-tasking thread for a period of time.
static clib_error_t * test_heap_validate(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define pool_foreach(VAR, POOL, BODY)
Iterate through pool.
MALLINFO_FIELD_TYPE arena
#define VLIB_INIT_FUNCTION(x)
static uword clib_bitmap_is_zero(uword *ai)
predicate function; is an entire bitmap empty?
#define vec_elt_at_index(v, i)
Get vector value at index i checking that i is in bounds.
#define clib_error_return(e, args...)
void * vl_msg_push_heap(void)
uword * command_index_by_path
clib_file_main_t file_main
#define vec_resize(V, N)
Resize a vector (no header, unspecified alignment) Add N elements to end of given vector V...
#define vlib_call_init_function(vm, x)
static void add_sub_command(vlib_cli_main_t *cm, uword parent_index, uword child_index)
static uword unformat_vlib_cli_sub_command(unformat_input_t *i, va_list *args)
static int vlib_cli_cmp_strings(void *a1, void *a2)
uword clib_mem_trace_enable_disable(uword enable)
static int vlib_cli_cmp_rule(void *a1, void *a2)
u8 * format_mheap(u8 *s, va_list *va)
vlib_worker_thread_t * vlib_worker_threads
static clib_error_t * enable_disable_memory_trace(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define clib_bitmap_foreach(i, ai, body)
Macro to iterate across set bits in a bitmap.
static vlib_cli_command_t * get_sub_command(vlib_cli_main_t *cm, vlib_cli_command_t *parent, u32 si)
#define vec_insert(V, N, M)
Insert N vector elements starting at element M, initialize new elements to zero (no header...
vlib_cli_command_function_t * function
static uword clib_bitmap_first_set(uword *ai)
Return the lowest numbered set bit in a bitmap.
static clib_error_t * elog_trace_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
u8 ** vlib_cli_get_possible_completions(u8 *str)
vlib_cli_sub_rule_t * sub_rules
#define vec_dup(V)
Return copy of vector (no header, no alignment)
elog_event_t * event_ring
Vector of events (circular buffer).
#define vec_del1(v, i)
Delete the element at index I.
void vl_msg_pop_heap(void *oldheap)
static clib_error_t * vlib_cli_dispatch_sub_commands(vlib_main_t *vm, vlib_cli_main_t *cm, unformat_input_t *input, uword parent_command_index)
#define foreach_vlib_main(body)
The fine-grained event logger allows lightweight, thread-safe event logging at minimum cost...
vlib_cli_sub_command_t * sub_commands
static vlib_process_t * vlib_get_current_process(vlib_main_t *vm)
static u8 * format_mp_safe(u8 *s, va_list *args)
int elog_trace_graph_dispatch
#define vec_free(V)
Free vector's memory (no header).
static void * clib_mem_set_heap(void *heap)
static uword * clib_bitmap_andnot(uword *ai, uword *bi)
Logical operator across two bitmaps.
int vl_api_get_elog_trace_api_messages(void)
static void cli_recursive_walk(vlib_cli_walk_args_t *aa)
#define ELOG_TYPE_DECLARE(f)
static u8 * format_vlib_cli_command_help(u8 *s, va_list *args)
u32 n_total_events_disable_limit
When count reaches limit logging is disabled.
static uword * vlib_cli_sub_command_match(vlib_cli_command_t *c, unformat_input_t *input)
static uword vlib_cli_command_is_empty(vlib_cli_command_t *c)
static void * clib_mem_get_heap(void)
#define VLIB_CLI_COMMAND(x,...)
static int vlib_cli_cmp_command(void *a1, void *a2)
#define clib_elf_section_data_next(a, extra)
static void vlib_cli_make_parent(vlib_cli_main_t *cm, uword ci)
static clib_error_t * vlib_cli_init(vlib_main_t *vm)
#define vec_delete(V, N, M)
Delete N elements starting at element M.
import vnet interface_types api
#define MHEAP_FLAG_VALIDATE
#define clib_bitmap_free(v)
Free a bitmap.
int vl_api_set_elog_trace_api_messages(int enable)
uword * sub_command_index_by_name
u32 elog_trace_graph_circuit_node_index
#define vec_cmp(v1, v2)
Compare two vectors (only applicable to vectors of signed numbers).
int vlib_cli_input(vlib_main_t *vm, unformat_input_t *input, vlib_cli_output_function_t *function, uword function_arg)
static uword pointer_to_uword(const void *p)
static clib_error_t * show_memory_usage(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
static vlib_main_t * vlib_get_main(void)
#define MHEAP_FLAG_SMALL_OBJECT_CACHE
static uword clib_bitmap_count_set_bits(uword *ai)
Return the number of set bits in a bitmap.
static int sort_cmds_by_path(void *a1, void *a2)
struct vlib_cli_command_t * next_cli_command
#define hash_create_vec(elts, key_bytes, value_bytes)
static void * current_traced_heap
u32 elog_string(elog_main_t *em, char *fmt,...)
add a string to the event-log string table
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
uword unformat_vlib_cli_sub_input(unformat_input_t *i, va_list *args)
#define vec_sort_with_function(vec, f)
Sort a vector using the supplied element comparison function.
format_function_t format_cpu_uarch
#define clib_error_free(e)
static clib_error_t * suspend_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
unformat_function_t unformat_vlib_node
#define hash_get_mem(h, key)
clib_error_t * vlib_cli_register(vlib_main_t *vm, vlib_cli_command_t *c)
vlib_cli_command_t * cli_command_registrations
void vlib_unix_error_report(vlib_main_t *, clib_error_t *)
void vlib_worker_thread_barrier_release(vlib_main_t *vm)
void mheap_validate(void *v)
static clib_error_t * restart_cmd_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define vec_foreach(var, vec)
Vector iterator.
vlib_cli_parse_position_t * sub_command_positions
u32 n_total_events
Total number of events in buffer.
static uword vlib_cli_normalize_path(char *input, char **result)
void() vlib_cli_output_function_t(uword arg, u8 *buffer, uword buffer_bytes)
vlib_cli_output_function_t * output_function
void clib_mem_trace(int enable)
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
format_function_t format_cpu_model_name
DLMALLOC_EXPORT void * mspace_least_addr(mspace msp)
int elog_trace_graph_circuit
static uword * clib_bitmap_and(uword *ai, uword *bi)
Logical operator across two bitmaps.
static u8 * format_vlib_cli_path(u8 *s, va_list *args)