From fe0a2c5a45e69eeff318e4419afe651eacfaea21 Mon Sep 17 00:00:00 2001 From: Neale Ranns Date: Mon, 27 Aug 2018 05:45:07 -0700 Subject: [PATCH] IGMP: enable command on cli Change-Id: I1f741b66ab8e3ecbb5c0d248b72e52c56545d5f3 Signed-off-by: Neale Ranns --- src/plugins/igmp/igmp.c | 4 +++ src/plugins/igmp/igmp_cli.c | 65 ++++++++++++++++++++++++++++++++++++++++-- src/plugins/igmp/igmp_format.c | 15 ++++++++++ src/plugins/igmp/igmp_format.h | 2 ++ src/vnet/fib/fib_path_ext.c | 3 +- 5 files changed, 85 insertions(+), 4 deletions(-) diff --git a/src/plugins/igmp/igmp.c b/src/plugins/igmp/igmp.c index 5cb8f02e9f5..98ac27168ea 100644 --- a/src/plugins/igmp/igmp.c +++ b/src/plugins/igmp/igmp.c @@ -450,6 +450,10 @@ igmp_enable_disable (u32 sw_if_index, u8 enable, igmp_mode_t mode) hash_free (config->igmp_group_by_key); pool_put (im->configs, config); } + else + { + return -1; + } return (0); } diff --git a/src/plugins/igmp/igmp_cli.c b/src/plugins/igmp/igmp_cli.c index df8fb642719..33322ac9c58 100644 --- a/src/plugins/igmp/igmp_cli.c +++ b/src/plugins/igmp/igmp_cli.c @@ -159,6 +159,66 @@ VLIB_CLI_COMMAND (igmp_listen_command, static) = { }; /* *INDENT-ON* */ +static clib_error_t * +igmp_enable_cli (vlib_main_t * vm, + unformat_input_t * input, vlib_cli_command_t * cmd) +{ + unformat_input_t _line_input, *line_input = &_line_input; + igmp_mode_t mode = IGMP_MODE_ROUTER; + vnet_main_t *vnm = vnet_get_main (); + clib_error_t *error = NULL; + u32 sw_if_index = ~0; + u8 enable = 1; + int rv; + + if (!unformat_user (input, unformat_line_input, line_input)) + return error; + + while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) + { + if (unformat (line_input, "enable")) + enable = 1; + else if (unformat (line_input, "disable")) + enable = 0; + if (unformat (line_input, "host")) + mode = IGMP_MODE_HOST; + else if (unformat (line_input, "router")) + mode = IGMP_MODE_ROUTER; + else if (unformat (line_input, "%U", + unformat_vnet_sw_interface, vnm, &sw_if_index)); + else + { + error = + clib_error_return (0, "unknown input '%U'", format_unformat_error, + line_input); + goto done; + } + } + + if (~0 == sw_if_index) + { + error = clib_error_return (0, "interface must be specified"); + goto done; + } + + rv = igmp_enable_disable (sw_if_index, enable, mode); + + if (0 != rv) + error = clib_error_return (0, "result: %d", rv); + +done: + unformat_free (line_input); + return error; +} + +/* *INDENT-OFF* */ +VLIB_CLI_COMMAND (igmp_enable_command, static) = { + .path = "igmp", + .short_help = "igmp ", + .function = igmp_enable_cli, +}; +/* *INDENT-ON* */ + static clib_error_t * igmp_show_command_fn (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd) @@ -173,8 +233,9 @@ igmp_show_command_fn (vlib_main_t * vm, unformat_input_t * input, /* *INDENT-OFF* */ pool_foreach (config, im->configs, ({ - vlib_cli_output (vm, "interface: %U", format_vnet_sw_if_index_name, - vnm, config->sw_if_index); + vlib_cli_output (vm, "interface: %U mode:%U", + format_vnet_sw_if_index_name, vnm, config->sw_if_index, + format_igmp_mode, config->mode); FOR_EACH_GROUP (group, config, ({ diff --git a/src/plugins/igmp/igmp_format.c b/src/plugins/igmp/igmp_format.c index 1ae04788a97..08b5f68a74d 100644 --- a/src/plugins/igmp/igmp_format.c +++ b/src/plugins/igmp/igmp_format.c @@ -61,6 +61,21 @@ format_igmp_filter_mode (u8 * s, va_list * args) } +u8 * +format_igmp_mode (u8 * s, va_list * args) +{ + igmp_mode_t mode = va_arg (*args, igmp_mode_t); + + switch (mode) + { +#define _(n,f) case IGMP_MODE_##f: return (format (s, "%s", #f)); + foreach_igmp_mode +#undef _ + } + return (format (s, "unknown:%d", mode)); + +} + u8 * format_igmp_header (u8 * s, va_list * args) { diff --git a/src/plugins/igmp/igmp_format.h b/src/plugins/igmp/igmp_format.h index 92f58e5791a..84862bb3afc 100644 --- a/src/plugins/igmp/igmp_format.h +++ b/src/plugins/igmp/igmp_format.h @@ -30,6 +30,8 @@ extern u8 *format_igmp_query_v3 (u8 * s, va_list * args); extern u8 *format_igmp_filter_mode (u8 * s, va_list * args); +extern u8 *format_igmp_mode (u8 * s, va_list * args); + extern u8 *format_igmp_src_addr_list (u8 * s, va_list * args); extern u8 *format_igmp_key (u8 * s, va_list * args); diff --git a/src/vnet/fib/fib_path_ext.c b/src/vnet/fib/fib_path_ext.c index 6b5b841c2ac..5ecf3a91672 100644 --- a/src/vnet/fib/fib_path_ext.c +++ b/src/vnet/fib/fib_path_ext.c @@ -54,8 +54,7 @@ format_fib_path_ext (u8 * s, va_list * args) } s = format(s, "]"); } - s = format(s, " labels:[", - path_ext->fpe_path_index); + s = format(s, " labels:["); for (ii = 0; ii < vec_len(path_ext->fpe_path.frp_label_stack); ii++) { s = format(s, "[%U]", -- 2.16.6