diff options
author | Jakub Grajciar <jgrajcia@cisco.com> | 2018-10-04 11:05:35 +0200 |
---|---|---|
committer | Neale Ranns <nranns@cisco.com> | 2018-10-16 08:28:15 +0000 |
commit | 97748cae2e6261d8fdc7c331a4d82828ac51ed81 (patch) | |
tree | 503ec3556042aef7d0b1575baca06fd239d09828 /src/plugins/igmp/igmp_cli.c | |
parent | 02a95ce8d53caeba07a3c027b12339f44f3093b8 (diff) |
IGMP: proxy device
Create 'proxy device' per VRF and add one upstream
and one or many downstream interfaces.
Change-Id: I1cef05fb01e73a5b483c7a2f4debaaeffe2c8155
Signed-off-by: Jakub Grajciar <jgrajcia@cisco.com>
Diffstat (limited to 'src/plugins/igmp/igmp_cli.c')
-rw-r--r-- | src/plugins/igmp/igmp_cli.c | 132 |
1 files changed, 130 insertions, 2 deletions
diff --git a/src/plugins/igmp/igmp_cli.c b/src/plugins/igmp/igmp_cli.c index e943fbb8349..6247f9a9388 100644 --- a/src/plugins/igmp/igmp_cli.c +++ b/src/plugins/igmp/igmp_cli.c @@ -220,6 +220,134 @@ VLIB_CLI_COMMAND (igmp_enable_command, static) = { /* *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 <add|del> vrf-id <table-id> <interface>", + .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 <add|del> vrf-id <table-id> <interface>", + .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) { @@ -233,9 +361,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 mode:%U", + vlib_cli_output (vm, "interface: %U mode: %U %U", format_vnet_sw_if_index_name, vnm, config->sw_if_index, - format_igmp_mode, config->mode); + format_igmp_mode, config->mode, format_igmp_proxy_device_id, config->proxy_device_id); FOR_EACH_GROUP (group, config, ({ |