diff options
Diffstat (limited to 'src/vlib/cli.c')
-rw-r--r-- | src/vlib/cli.c | 112 |
1 files changed, 66 insertions, 46 deletions
diff --git a/src/vlib/cli.c b/src/vlib/cli.c index a00ae6245f9..98d57c6ccb0 100644 --- a/src/vlib/cli.c +++ b/src/vlib/cli.c @@ -38,6 +38,7 @@ */ #include <vlib/vlib.h> +#include <vlib/stats/stats.h> #include <vlib/unix/unix.h> #include <vppinfra/callback.h> #include <vppinfra/cpu.h> @@ -54,36 +55,28 @@ int vl_api_get_elog_trace_api_messages (void); static void *current_traced_heap; /* Root of all show commands. */ -/* *INDENT-OFF* */ VLIB_CLI_COMMAND (vlib_cli_show_command, static) = { .path = "show", .short_help = "Show commands", }; -/* *INDENT-ON* */ /* Root of all clear commands. */ -/* *INDENT-OFF* */ VLIB_CLI_COMMAND (vlib_cli_clear_command, static) = { .path = "clear", .short_help = "Clear commands", }; -/* *INDENT-ON* */ /* Root of all set commands. */ -/* *INDENT-OFF* */ VLIB_CLI_COMMAND (vlib_cli_set_command, static) = { .path = "set", .short_help = "Set commands", }; -/* *INDENT-ON* */ /* Root of all test commands. */ -/* *INDENT-OFF* */ VLIB_CLI_COMMAND (vlib_cli_test_command, static) = { .path = "test", .short_help = "Test commands", }; -/* *INDENT-ON* */ /* Returns bitmap of commands which match key. */ static uword * @@ -158,6 +151,64 @@ done: return match; } +uword +unformat_vlib_cli_line (unformat_input_t *i, va_list *va) +{ + unformat_input_t *result = va_arg (*va, unformat_input_t *); + u8 *line = 0; + uword c; + int skip; + +next_line: + skip = 0; + + /* skip leading whitespace if any */ + unformat_skip_white_space (i); + + if (unformat_is_eof (i)) + return 0; + + while ((c = unformat_get_input (i)) != UNFORMAT_END_OF_INPUT) + { + if (c == '\\') + { + c = unformat_get_input (i); + + if (c == '\n') + { + if (!skip) + vec_add1 (line, '\n'); + skip = 0; + continue; + } + + if (!skip) + vec_add1 (line, '\\'); + + if (c == UNFORMAT_END_OF_INPUT) + break; + + if (!skip) + vec_add1 (line, c); + continue; + } + + if (c == '#') + skip = 1; + else if (c == '\n') + break; + + if (!skip) + vec_add1 (line, c); + } + + if (line == 0) + goto next_line; + + unformat_init_vector (result, line); + return 1; +} + /* Looks for string based sub-input formatted { SUB-INPUT }. */ uword unformat_vlib_cli_sub_input (unformat_input_t * i, va_list * args) @@ -304,7 +355,6 @@ vlib_cli_get_possible_completions (u8 * str) /* if we have a space at the end of input, and a unique match, * autocomplete the next level of subcommands */ help_next_level = (vec_len (str) == 0) || isspace (str[vec_len (str) - 1]); - /* *INDENT-OFF* */ clib_bitmap_foreach (index, match_bitmap) { if (help_next_level && is_unique) { c = get_sub_command (vcm, c, index); @@ -316,7 +366,6 @@ vlib_cli_get_possible_completions (u8 * str) sc = &c->sub_commands[index]; vec_add1(result, (u8*) sc->name); } - /* *INDENT-ON* */ done: clib_bitmap_free (match_bitmap); @@ -566,13 +615,11 @@ vlib_cli_dispatch_sub_commands (vlib_main_t * vm, { if (PREDICT_FALSE (vm->elog_trace_cli_commands)) { - /* *INDENT-OFF* */ ELOG_TYPE_DECLARE (e) = { .format = "cli-cmd: %s", .format_args = "T4", }; - /* *INDENT-ON* */ struct { u32 c; @@ -598,13 +645,11 @@ vlib_cli_dispatch_sub_commands (vlib_main_t * vm, if (PREDICT_FALSE (vm->elog_trace_cli_commands)) { - /* *INDENT-OFF* */ ELOG_TYPE_DECLARE (e) = { .format = "cli-cmd: %s %s", .format_args = "T4T4", }; - /* *INDENT-ON* */ struct { u32 c, err; @@ -616,7 +661,7 @@ vlib_cli_dispatch_sub_commands (vlib_main_t * vm, vec_add1 (c_error->what, 0); ed->err = elog_string (vlib_get_elog_main (), (char *) c_error->what); - _vec_len (c_error->what) -= 1; + vec_dec_len (c_error->what, 1); } else ed->err = elog_string (vlib_get_elog_main (), "OK"); @@ -753,13 +798,6 @@ vl_msg_pop_heap (void *oldheap) { } -void *vlib_stats_push_heap (void *) __attribute__ ((weak)); -void * -vlib_stats_push_heap (void *notused) -{ - return 0; -} - static clib_error_t * show_memory_usage (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd) @@ -820,14 +858,14 @@ show_memory_usage (vlib_main_t * vm, } if (stats_segment) { - void *oldheap = vlib_stats_push_heap (0); + void *oldheap = vlib_stats_set_heap (); was_enabled = clib_mem_trace_enable_disable (0); u8 *s_in_svm = format (0, "%U\n", format_clib_mem_heap, 0, 1); if (oldheap) clib_mem_set_heap (oldheap); u8 *s = vec_dup (s_in_svm); - oldheap = vlib_stats_push_heap (0); + oldheap = vlib_stats_set_heap (); vec_free (s_in_svm); if (oldheap) { @@ -925,14 +963,12 @@ show_memory_usage (vlib_main_t * vm, return 0; } -/* *INDENT-OFF* */ VLIB_CLI_COMMAND (show_memory_usage_command, static) = { .path = "show memory", .short_help = "show memory [api-segment][stats-segment][verbose]\n" - " [numa-heaps][map]", + " [numa-heaps][map][main-heap]", .function = show_memory_usage, }; -/* *INDENT-ON* */ static clib_error_t * show_cpu (vlib_main_t * vm, unformat_input_t * input, @@ -959,13 +995,11 @@ show_cpu (vlib_main_t * vm, unformat_input_t * input, * Base Frequency: 3.20 GHz * @cliexend ?*/ -/* *INDENT-OFF* */ VLIB_CLI_COMMAND (show_cpu_command, static) = { .path = "show cpu", .short_help = "Show cpu information", .function = show_cpu, }; -/* *INDENT-ON* */ static clib_error_t * enable_disable_memory_trace (vlib_main_t * vm, @@ -1038,7 +1072,7 @@ enable_disable_memory_trace (vlib_main_t * vm, /* Stats segment */ if (stats_segment) { - oldheap = vlib_stats_push_heap (0); + oldheap = vlib_stats_set_heap (); current_traced_heap = clib_mem_get_heap (); clib_mem_trace (stats_segment); /* We don't want to call vlib_stats_pop_heap... */ @@ -1073,14 +1107,12 @@ enable_disable_memory_trace (vlib_main_t * vm, return 0; } -/* *INDENT-OFF* */ VLIB_CLI_COMMAND (enable_disable_memory_trace_command, static) = { .path = "memory-trace", .short_help = "memory-trace on|off [api-segment][stats-segment][main-heap]\n" " [numa-heap <numa-id>]\n", .function = enable_disable_memory_trace, }; -/* *INDENT-ON* */ static clib_error_t * restart_cmd_fn (vlib_main_t * vm, unformat_input_t * input, @@ -1094,27 +1126,23 @@ restart_cmd_fn (vlib_main_t * vm, unformat_input_t * input, extern char **environ; /* Close all known open files */ - /* *INDENT-OFF* */ pool_foreach (f, fm->file_pool) { if (f->file_descriptor > 2) close(f->file_descriptor); } - /* *INDENT-ON* */ /* Exec ourself */ - execve (vgm->name, (char **) vm->argv, environ); + execve (vgm->name, (char **) vgm->argv, environ); return 0; } -/* *INDENT-OFF* */ VLIB_CLI_COMMAND (restart_cmd,static) = { .path = "restart", .short_help = "restart process", .function = restart_cmd_fn, }; -/* *INDENT-ON* */ #ifdef TEST_CODE /* @@ -1140,13 +1168,11 @@ sleep_ten_seconds (vlib_main_t * vm, return 0; } -/* *INDENT-OFF* */ VLIB_CLI_COMMAND (ping_command, static) = { .path = "test sleep", .function = sleep_ten_seconds, .short_help = "Sleep for 10 seconds", }; -/* *INDENT-ON* */ #endif /* ifdef TEST_CODE */ static uword @@ -1185,7 +1211,7 @@ vlib_cli_normalize_path (char *input, char **result) /* Remove any extra space at end. */ if (l > 0 && s[l - 1] == ' ') - _vec_len (s) -= 1; + vec_dec_len (s, 1); *result = s; return index_of_last_space; @@ -1597,7 +1623,6 @@ print_status: * @cliend * @cliexcmd{event-logger trace [api][cli][barrier][disable]} ?*/ -/* *INDENT-OFF* */ VLIB_CLI_COMMAND (event_logger_trace_command, static) = { .path = "event-logger trace", @@ -1605,7 +1630,6 @@ VLIB_CLI_COMMAND (event_logger_trace_command, static) = "[circuit-node <name> e.g. ethernet-input][disable]", .function = event_logger_trace_command_fn, }; -/* *INDENT-ON* */ static clib_error_t * suspend_command_fn (vlib_main_t * vm, @@ -1615,7 +1639,6 @@ suspend_command_fn (vlib_main_t * vm, return 0; } -/* *INDENT-OFF* */ VLIB_CLI_COMMAND (suspend_command, static) = { .path = "suspend", @@ -1623,7 +1646,6 @@ VLIB_CLI_COMMAND (suspend_command, static) = .function = suspend_command_fn, .is_mp_safe = 1, }; -/* *INDENT-ON* */ static int @@ -1814,7 +1836,6 @@ show_cli_command_fn (vlib_main_t * vm, * @cliexend ?*/ -/* *INDENT-OFF* */ VLIB_CLI_COMMAND (show_cli_command, static) = { .path = "show cli", @@ -1822,7 +1843,6 @@ VLIB_CLI_COMMAND (show_cli_command, static) = .function = show_cli_command_fn, .is_mp_safe = 1, }; -/* *INDENT-ON* */ static clib_error_t * vlib_cli_init (vlib_main_t * vm) |