X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvlib%2Fcli.c;h=9c53200f8cf2fd76b9ceeac1cca93850da793721;hb=6a07348f4a5312310c01fdd5af937ce26580eb2d;hp=a88bd3a62f61e5b55baa5beba5e5d9f1c4c26177;hpb=bfa75d6b922ee15d2f0d00999fd36b03a85eda8c;p=vpp.git diff --git a/src/vlib/cli.c b/src/vlib/cli.c index a88bd3a62f6..9c53200f8cf 100644 --- a/src/vlib/cli.c +++ b/src/vlib/cli.c @@ -38,6 +38,7 @@ */ #include +#include #include #include #include @@ -158,6 +159,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) @@ -205,10 +264,11 @@ get_sub_command (vlib_cli_main_t * cm, vlib_cli_command_t * parent, u32 si) static uword unformat_vlib_cli_sub_command (unformat_input_t * i, va_list * args) { - vlib_main_t *vm = va_arg (*args, vlib_main_t *); + vlib_main_t __clib_unused *vm = va_arg (*args, vlib_main_t *); + vlib_global_main_t *vgm = vlib_get_global_main (); vlib_cli_command_t *c = va_arg (*args, vlib_cli_command_t *); vlib_cli_command_t **result = va_arg (*args, vlib_cli_command_t **); - vlib_cli_main_t *cm = &vm->cli_main; + vlib_cli_main_t *cm = &vgm->cli_main; uword *match_bitmap, is_unique, index; match_bitmap = vlib_cli_sub_command_match (c, i); @@ -238,8 +298,8 @@ vlib_cli_get_possible_completions (u8 * str) { vlib_cli_command_t *c; vlib_cli_sub_command_t *sc; - vlib_main_t *vm = vlib_get_main (); - vlib_cli_main_t *vcm = &vm->cli_main; + vlib_global_main_t *vgm = vlib_get_global_main (); + vlib_cli_main_t *vcm = &vgm->cli_main; uword *match_bitmap = 0; uword index, is_unique, help_next_level; u8 **result = 0; @@ -304,7 +364,7 @@ vlib_cli_get_possible_completions (u8 * str) * 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, { + clib_bitmap_foreach (index, match_bitmap) { if (help_next_level && is_unique) { c = get_sub_command (vcm, c, index); vec_foreach (sc, c->sub_commands) { @@ -314,7 +374,7 @@ vlib_cli_get_possible_completions (u8 * str) } sc = &c->sub_commands[index]; vec_add1(result, (u8*) sc->name); - }); + } /* *INDENT-ON* */ done: @@ -388,11 +448,12 @@ vlib_cli_dispatch_sub_commands (vlib_main_t * vm, unformat_input_t * input, uword parent_command_index) { + vlib_global_main_t *vgm = vlib_get_global_main (); vlib_cli_command_t *parent, *c; clib_error_t *error = 0; unformat_input_t sub_input; u8 *string; - uword is_main_dispatch = cm == &vm->cli_main; + uword is_main_dispatch = cm == &vgm->cli_main; parent = vec_elt_at_index (cm->commands, parent_command_index); if (is_main_dispatch && unformat (input, "help")) @@ -472,6 +533,23 @@ vlib_cli_dispatch_sub_commands (vlib_main_t * vm, vec_free (string); } + else if (unformat (input, "vpplog %v", &string)) + { + int i; + /* + * Delete leading whitespace, so "vpplog { this and that }" + * and "vpplog this" line up nicely. + */ + for (i = 0; i < vec_len (string); i++) + if (string[i] != ' ') + break; + if (i > 0) + vec_delete (string, i, 0); + + vlib_log_notice (cm->log, "CLI: %v", string); + vec_free (string); + } + else if (unformat (input, "uncomment %U", unformat_vlib_cli_sub_input, &sub_input)) { @@ -558,8 +636,8 @@ vlib_cli_dispatch_sub_commands (vlib_main_t * vm, { u32 c; } *ed; - ed = ELOG_DATA (&vm->elog_main, e); - ed->c = elog_string (&vm->elog_main, "%v", c->path); + ed = ELOG_DATA (vlib_get_elog_main (), e); + ed->c = elog_string (vlib_get_elog_main (), "%v", c->path); } if (!c->is_mp_safe) @@ -590,17 +668,17 @@ vlib_cli_dispatch_sub_commands (vlib_main_t * vm, { u32 c, err; } *ed; - ed = ELOG_DATA (&vm->elog_main, e); - ed->c = elog_string (&vm->elog_main, "%v", c->path); + ed = ELOG_DATA (vlib_get_elog_main (), e); + ed->c = elog_string (vlib_get_elog_main (), "%v", c->path); if (c_error) { vec_add1 (c_error->what, 0); - ed->err = - elog_string (&vm->elog_main, (char *) c_error->what); - _vec_len (c_error->what) -= 1; + ed->err = elog_string (vlib_get_elog_main (), + (char *) c_error->what); + vec_dec_len (c_error->what, 1); } else - ed->err = elog_string (&vm->elog_main, "OK"); + ed->err = elog_string (vlib_get_elog_main (), "OK"); } if (c_error) @@ -657,6 +735,7 @@ vlib_cli_input (vlib_main_t * vm, unformat_input_t * input, vlib_cli_output_function_t * function, uword function_arg) { + vlib_global_main_t *vgm = vlib_get_global_main (); vlib_process_t *cp = vlib_get_current_process (vm); clib_error_t *error; vlib_cli_output_function_t *save_function; @@ -671,7 +750,7 @@ vlib_cli_input (vlib_main_t * vm, do { - error = vlib_cli_dispatch_sub_commands (vm, &vm->cli_main, input, + error = vlib_cli_dispatch_sub_commands (vm, &vgm->cli_main, input, /* parent */ 0); } while (!error && !unformat (input, "%U", unformat_eof)); @@ -703,6 +782,11 @@ vlib_cli_output (vlib_main_t * vm, char *fmt, ...) s = va_format (0, fmt, &va); va_end (va); + /* some format functions might return 0 + * e.g. show int addr */ + if (NULL == s) + return; + /* Terminate with \n if not present. */ if (vec_len (s) > 0 && s[vec_len (s) - 1] != '\n') vec_add1 (s, '\n'); @@ -728,13 +812,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) @@ -795,14 +872,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) { @@ -824,17 +901,14 @@ show_memory_usage (vlib_main_t * vm, */ was_enabled = clib_mem_trace_enable_disable (0); - /* *INDENT-OFF* */ - foreach_vlib_main ( - ({ - vlib_cli_output (vm, "%sThread %d %s\n", index ? "\n":"", index, - vlib_worker_threads[index].name); - vlib_cli_output (vm, " %U\n", format_clib_mem_heap, - mm->per_cpu_mheaps[index], - verbose); - index++; - })); - /* *INDENT-ON* */ + foreach_vlib_main () + { + vlib_cli_output (vm, "%sThread %d %s\n", index ? "\n" : "", index, + vlib_worker_threads[index].name); + vlib_cli_output (vm, " %U\n", format_clib_mem_heap, + mm->per_cpu_mheaps[index], verbose); + index++; + } /* Restore the trace flag */ clib_mem_trace_enable_disable (was_enabled); @@ -1016,7 +1090,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... */ @@ -1064,6 +1138,7 @@ static clib_error_t * restart_cmd_fn (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd) { + vlib_global_main_t *vgm = vlib_get_global_main (); clib_file_main_t *fm = &file_main; clib_file_t *f; @@ -1072,15 +1147,15 @@ restart_cmd_fn (vlib_main_t * vm, unformat_input_t * input, /* Close all known open files */ /* *INDENT-OFF* */ - pool_foreach(f, fm->file_pool, - ({ + pool_foreach (f, fm->file_pool) + { if (f->file_descriptor > 2) close(f->file_descriptor); - })); + } /* *INDENT-ON* */ /* Exec ourself */ - execve (vm->name, (char **) vm->argv, environ); + execve (vgm->name, (char **) vgm->argv, environ); return 0; } @@ -1162,7 +1237,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; @@ -1201,6 +1276,9 @@ add_sub_command (vlib_cli_main_t * cm, uword parent_index, uword child_index) vec_add (sub_name, c->path + l + 1, vec_len (c->path) - (l + 1)); } + /* "Can't happen," check mainly to shut up coverity */ + ALWAYS_ASSERT (sub_name != 0); + if (sub_name[0] == '%') { uword *q; @@ -1330,7 +1408,8 @@ vlib_cli_command_is_empty (vlib_cli_command_t * c) clib_error_t * vlib_cli_register (vlib_main_t * vm, vlib_cli_command_t * c) { - vlib_cli_main_t *cm = &vm->cli_main; + vlib_global_main_t *vgm = vlib_get_global_main (); + vlib_cli_main_t *cm = &vgm->cli_main; clib_error_t *error = 0; uword ci, *p; char *normalized_path; @@ -1472,8 +1551,9 @@ done: #endif static clib_error_t * -elog_trace_command_fn (vlib_main_t * vm, - unformat_input_t * input, vlib_cli_command_t * cmd) +event_logger_trace_command_fn (vlib_main_t * vm, + unformat_input_t * input, + vlib_cli_command_t * cmd) { unformat_input_t _line_input, *line_input = &_line_input; int enable = 1; @@ -1524,7 +1604,7 @@ elog_trace_command_fn (vlib_main_t * vm, */ if (dispatch || circuit) { - elog_main_t *em = &vm->elog_main; + elog_main_t *em = &vlib_global_main.elog_main; em->n_total_events_disable_limit = em->n_total_events + vec_len (em->event_ring); @@ -1562,21 +1642,20 @@ print_status: * * @cliexpar * @clistart - * elog trace api cli barrier - * elog trace api cli barrier disable - * elog trace dispatch - * elog trace circuit-node ethernet-input - * elog trace + * event-logger trace api cli barrier + * event-logger trace api cli barrier disable + * event-logger trace dispatch + * event-logger trace circuit-node ethernet-input * @cliend - * @cliexcmd{elog trace [api][cli][barrier][disable]} + * @cliexcmd{event-logger trace [api][cli][barrier][disable]} ?*/ /* *INDENT-OFF* */ -VLIB_CLI_COMMAND (elog_trace_command, static) = +VLIB_CLI_COMMAND (event_logger_trace_command, static) = { - .path = "elog trace", - .short_help = "elog trace [api][cli][barrier][dispatch]\n" + .path = "event-logger trace", + .short_help = "event-logger trace [api][cli][barrier][dispatch]\n" "[circuit-node e.g. ethernet-input][disable]", - .function = elog_trace_command_fn, + .function = event_logger_trace_command_fn, }; /* *INDENT-ON* */ @@ -1604,8 +1683,8 @@ sort_cmds_by_path (void *a1, void *a2) { u32 *index1 = a1; u32 *index2 = a2; - vlib_main_t *vm = vlib_get_main (); - vlib_cli_main_t *cm = &vm->cli_main; + vlib_global_main_t *vgm = vlib_get_global_main (); + vlib_cli_main_t *cm = &vgm->cli_main; vlib_cli_command_t *c1, *c2; int i, lmin; @@ -1715,6 +1794,7 @@ static clib_error_t * show_cli_command_fn (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd) { + vlib_global_main_t *vgm = vlib_get_global_main (); int show_mp_safe = 0; int show_not_mp_safe = 0; int show_hit = 0; @@ -1738,8 +1818,8 @@ show_cli_command_fn (vlib_main_t * vm, if (clear_hit == 0 && (show_mp_safe + show_not_mp_safe) == 0) show_mp_safe = show_not_mp_safe = 1; - vlib_cli_output (vm, "%U", format_mp_safe, &vm->cli_main, - show_mp_safe, show_not_mp_safe, show_hit, clear_hit); + vlib_cli_output (vm, "%U", format_mp_safe, &vgm->cli_main, show_mp_safe, + show_not_mp_safe, show_hit, clear_hit); if (clear_hit) vlib_cli_output (vm, "hit counters cleared..."); @@ -1799,7 +1879,8 @@ VLIB_CLI_COMMAND (show_cli_command, static) = static clib_error_t * vlib_cli_init (vlib_main_t * vm) { - vlib_cli_main_t *cm = &vm->cli_main; + vlib_global_main_t *vgm = vlib_get_global_main (); + vlib_cli_main_t *cm = &vgm->cli_main; clib_error_t *error = 0; vlib_cli_command_t *cmd; @@ -1812,6 +1893,9 @@ vlib_cli_init (vlib_main_t * vm) return error; cmd = cmd->next_cli_command; } + + cm->log = vlib_log_register_class_rate_limit ( + "cli", "log", 0x7FFFFFFF /* aka no rate limit */); return error; }