diff options
-rw-r--r-- | vnet/vnet/lisp-cp/control.c | 89 |
1 files changed, 83 insertions, 6 deletions
diff --git a/vnet/vnet/lisp-cp/control.c b/vnet/vnet/lisp-cp/control.c index b6612c44bb4..54a83f48752 100644 --- a/vnet/vnet/lisp-cp/control.c +++ b/vnet/vnet/lisp-cp/control.c @@ -1357,12 +1357,82 @@ lisp_add_del_locator_set_command_fn (vlib_main_t * vm, unformat_input_t * input, VLIB_CLI_COMMAND (lisp_cp_add_del_locator_set_command) = { .path = "lisp locator-set", - .short_help = "lisp locator-set add/del <name> iface <iface-name> " - "p <priority> w <weight>", + .short_help = "lisp locator-set add/del <name> [iface <iface-name> " + "p <priority> w <weight>]", .function = lisp_add_del_locator_set_command_fn, }; static clib_error_t * +lisp_add_del_locator_in_set_command_fn (vlib_main_t * vm, unformat_input_t * input, + vlib_cli_command_t * cmd) +{ + lisp_gpe_main_t * lgm = &lisp_gpe_main; + vnet_main_t * vnm = lgm->vnet_main; + unformat_input_t _line_input, * line_input = &_line_input; + u8 is_add = 1; + clib_error_t * error = 0; + u8 * locator_set_name = 0; + u8 locator_set_name_set = 0; + locator_t locator, * locators = 0; + vnet_lisp_add_del_locator_set_args_t _a, * a = &_a; + u32 ls_index = 0; + + memset(&locator, 0, sizeof(locator)); + memset(a, 0, sizeof(a[0])); + + /* Get a line of input. */ + if (! unformat_user (input, unformat_line_input, line_input)) + return 0; + + while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) + { + if (unformat (line_input, "add")) + is_add = 1; + else if (unformat (line_input, "del")) + is_add = 0; + else if (unformat(line_input, "locator-set %_%v%_", &locator_set_name)) + locator_set_name_set = 1; + else if (unformat (line_input, "iface %U p %d w %d", + unformat_vnet_sw_interface, vnm, &locator.sw_if_index, + &locator.priority, &locator.weight)) + { + locator.local = 1; + vec_add1(locators, locator); + } + else + { + error = unformat_parse_error(line_input); + goto done; + } + } + + if (!locator_set_name_set) + { + error = clib_error_return(0, "locator_set name not set!"); + goto done; + } + + a->name = locator_set_name; + a->locators = locators; + a->is_add = is_add; + a->local = 1; + + vnet_lisp_add_del_locator(a, 0, &ls_index); + + done: + vec_free(locators); + vec_free (locator_set_name); + return error; +} + +VLIB_CLI_COMMAND (lisp_cp_add_del_locator_in_set_command) = { + .path = "lisp locator", + .short_help = "lisp locator add/del locator-set <name> iface <iface-name> " + "p <priority> w <weight>", + .function = lisp_add_del_locator_in_set_command_fn, +}; + +static clib_error_t * lisp_cp_show_locator_sets_command_fn (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd) @@ -1377,16 +1447,23 @@ lisp_cp_show_locator_sets_command_fn (vlib_main_t * vm, pool_foreach (lsit, lcm->locator_set_pool, ({ u8 * msg = 0; - msg = format (msg, "%-16v", lsit->name); + int next_line = 0; + msg = format (msg, "%=16v", lsit->name); vec_foreach (locit, lsit->locator_indices) { + if (next_line) + { + msg = format (msg, "%16s", " "); + } loc = pool_elt_at_index (lcm->locator_pool, locit[0]); if (loc->local) - msg = format (msg, "%16d%16d%16d", loc->sw_if_index, loc->priority, + msg = format (msg, "%16d%16d%16d\n", loc->sw_if_index, loc->priority, loc->weight); else - msg = format (msg, "%16U%16d%16d", format_gid_address, &loc->address, - loc->priority, loc->weight); + msg = format (msg, "%16U%16d%16d\n", format_ip_address, + gid_address_ip(&loc->address), loc->priority, + loc->weight); + next_line = 1; } vlib_cli_output (vm, "%v", msg); vec_free (msg); |