X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Figmp%2Figmp_cli.c;h=5eceb685dbebbdaf2ce19919f520daf5ebc04f65;hb=f5641398aebec2a73ac387a6327e54b43c26d158;hp=5f09589c64491e3449a9f37d4f868dc6a7a973d1;hpb=947ea6222dad1ef04595c34273e9231395aef443;p=vpp.git diff --git a/src/plugins/igmp/igmp_cli.c b/src/plugins/igmp/igmp_cli.c index 5f09589c644..5eceb685dbe 100644 --- a/src/plugins/igmp/igmp_cli.c +++ b/src/plugins/igmp/igmp_cli.c @@ -84,7 +84,7 @@ igmp_listen_command_fn (vlib_main_t * vm, unformat_input_t * input, unformat_input_t _line_input, *line_input = &_line_input; clib_error_t *error = NULL; u8 enable = 1; - ip46_address_t saddr, gaddr; + ip46_address_t saddr, *saddrs = NULL, gaddr; vnet_main_t *vnm = vnet_get_main (); u32 sw_if_index; int rv; @@ -108,7 +108,8 @@ igmp_listen_command_fn (vlib_main_t * vm, unformat_input_t * input, (line_input, "int %U", unformat_vnet_sw_interface, vnm, &sw_if_index)); else - if (unformat (line_input, "saddr %U", unformat_ip46_address, &saddr)); + if (unformat (line_input, "saddr %U", unformat_ip46_address, &saddr)) + vec_add1 (saddrs, saddr); else if (unformat (line_input, "gaddr %U", unformat_ip46_address, &gaddr)); else @@ -127,7 +128,7 @@ igmp_listen_command_fn (vlib_main_t * vm, unformat_input_t * input, goto done; } - rv = igmp_listen (vm, enable, sw_if_index, &saddr, &gaddr); + rv = igmp_listen (vm, enable, sw_if_index, saddrs, &gaddr); if (rv == -1) { @@ -136,7 +137,7 @@ igmp_listen_command_fn (vlib_main_t * vm, unformat_input_t * input, clib_error_return (0, "This igmp configuration already exists"); else error = - clib_error_return (0, "This igmp configuration does not nexist"); + clib_error_return (0, "This igmp configuration does not exist"); } else if (rv == -2) error = @@ -145,6 +146,7 @@ igmp_listen_command_fn (vlib_main_t * vm, unformat_input_t * input, done: unformat_free (line_input); + vec_free (saddrs); return error; } @@ -157,31 +159,206 @@ 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_proxy_device_add_del_command_fn (vlib_main_t * vm, + unformat_input_t * input, + vlib_cli_command_t * cmd) +{ + unformat_input_t _line_input, *line_input = &_line_input; + vnet_main_t *vnm = vnet_get_main (); + clib_error_t *error = NULL; + u32 sw_if_index = ~0; + u32 vrf_id = ~0; + u8 add = 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, "add")) + add = 1; + else if (unformat (line_input, "del")) + add = 0; + else if (unformat (line_input, "vrf-id %u", &vrf_id)) + ; + 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; + } + + if (~0 == vrf_id) + { + error = clib_error_return (0, "VRF must be specified"); + goto done; + } + + rv = igmp_proxy_device_add_del (vrf_id, sw_if_index, add); + + if (0 != rv) + error = clib_error_return (0, "result: %d", rv); + +done: + unformat_free (line_input); + return error; +} +/* *INDENT-OFF* */ +VLIB_CLI_COMMAND (igmp_proxy_device_add_del_command, static) = { + .path = "igmp proxy-dev", + .short_help = "igmp proxy-dev vrf-id ", + .function = igmp_proxy_device_add_del_command_fn, +}; +/* *INDENT-ON* */ + +static clib_error_t * +igmp_proxy_device_add_del_interface_command_fn (vlib_main_t * vm, + unformat_input_t * input, + vlib_cli_command_t * cmd) +{ + unformat_input_t _line_input, *line_input = &_line_input; + vnet_main_t *vnm = vnet_get_main (); + clib_error_t *error = NULL; + u32 sw_if_index = ~0; + u32 vrf_id = ~0; + u8 add = 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, "add")) + add = 1; + else if (unformat (line_input, "del")) + add = 0; + else if (unformat (line_input, "vrf-id %u", &vrf_id)) + ; + 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; + } + + if (~0 == vrf_id) + { + error = clib_error_return (0, "VRF must be specified"); + goto done; + } + + rv = igmp_proxy_device_add_del_interface (vrf_id, sw_if_index, add); + + if (0 != rv) + error = clib_error_return (0, "result: %d", rv); + +done: + unformat_free (line_input); + return error; +} +/* *INDENT-OFF* */ +VLIB_CLI_COMMAND (igmp_proxy_device_add_del_interface_command, static) = { + .path = "igmp proxy-dev itf", + .short_help = "igmp proxy-dev itf vrf-id ", + .function = igmp_proxy_device_add_del_interface_command_fn, +}; +/* *INDENT-ON* */ + static clib_error_t * igmp_show_command_fn (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd) { clib_error_t *error = NULL; igmp_main_t *im = &igmp_main; - vnet_main_t *vnm = vnet_get_main (); igmp_config_t *config; - igmp_group_t *group; - igmp_src_t *src; /* *INDENT-OFF* */ pool_foreach (config, im->configs, ({ - vlib_cli_output (vm, "interface: %U", format_vnet_sw_if_index_name, - vnm, config->sw_if_index); - - FOR_EACH_GROUP (group, config, - ({ - vlib_cli_output (vm, "\t%U", format_igmp_key, group->key); - FOR_EACH_SRC (src, group, IGMP_FILTER_MODE_INCLUDE, - ({ - vlib_cli_output (vm, "\t\t%U", format_igmp_key, src->key); - })); - })); + vlib_cli_output (vm, "%U", format_igmp_config, config); })); /* *INDENT-ON* */