diff options
Diffstat (limited to 'src/plugins/wireguard/wireguard_cli.c')
-rw-r--r--[-rwxr-xr-x] | src/plugins/wireguard/wireguard_cli.c | 103 |
1 files changed, 72 insertions, 31 deletions
diff --git a/src/plugins/wireguard/wireguard_cli.c b/src/plugins/wireguard/wireguard_cli.c index 3b4bf56a3dc..e412fa36c44 100755..100644 --- a/src/plugins/wireguard/wireguard_cli.c +++ b/src/plugins/wireguard/wireguard_cli.c @@ -25,7 +25,7 @@ wg_if_create_cli (vlib_main_t * vm, { wg_main_t *wmp = &wg_main; unformat_input_t _line_input, *line_input = &_line_input; - u8 private_key[NOISE_PUBLIC_KEY_LEN]; + u8 private_key[NOISE_PUBLIC_KEY_LEN + 1]; u32 instance, sw_if_index; ip_address_t src_ip; clib_error_t *error; @@ -94,14 +94,12 @@ wg_if_create_cli (vlib_main_t * vm, /*? * Create a Wireguard interface. ?*/ -/* *INDENT-OFF* */ VLIB_CLI_COMMAND (wg_if_create_command, static) = { .path = "wireguard create", .short_help = "wireguard create listen-port <port> " "private-key <key> src <IP> [generate-key]", .function = wg_if_create_cli, }; -/* *INDENT-ON* */ static clib_error_t * wg_if_delete_cli (vlib_main_t * vm, @@ -143,13 +141,11 @@ wg_if_delete_cli (vlib_main_t * vm, /*? * Delete a Wireguard interface. ?*/ -/* *INDENT-OFF* */ VLIB_CLI_COMMAND (wg_if_delete_command, static) = { .path = "wireguard delete", .short_help = "wireguard delete <interface>", .function = wg_if_delete_cli, }; -/* *INDENT-ON* */ static clib_error_t * @@ -162,10 +158,10 @@ wg_peer_add_command_fn (vlib_main_t * vm, unformat_input_t _line_input, *line_input = &_line_input; u8 *public_key_64 = 0; - u8 public_key[NOISE_PUBLIC_KEY_LEN]; + u8 public_key[NOISE_PUBLIC_KEY_LEN + 1]; fib_prefix_t allowed_ip, *allowed_ips = NULL; ip_prefix_t pfx; - ip_address_t ip; + ip_address_t ip = ip_address_initializer; u32 portDst = 0, table_id = 0; u32 persistent_keepalive = 0; u32 tun_sw_if_index = ~0; @@ -192,7 +188,7 @@ wg_peer_add_command_fn (vlib_main_t * vm, ; else if (unformat (line_input, "table-id %d", &table_id)) ; - else if (unformat (line_input, "port %d", &portDst)) + else if (unformat (line_input, "dst-port %d", &portDst)) ; else if (unformat (line_input, "persistent-keepalive %d", &persistent_keepalive)) @@ -213,16 +209,14 @@ wg_peer_add_command_fn (vlib_main_t * vm, } } - if (AF_IP6 == ip_addr_version (&ip) || - FIB_PROTOCOL_IP6 == allowed_ip.fp_proto) - rv = VNET_API_ERROR_INVALID_PROTOCOL; - else - rv = wg_peer_add (tun_sw_if_index, - public_key, - table_id, - &ip_addr_46 (&ip), - allowed_ips, - portDst, persistent_keepalive, &peer_index); + if (0 == vec_len (allowed_ips)) + { + error = clib_error_return (0, "Allowed IPs are not specified"); + goto done; + } + + rv = wg_peer_add (tun_sw_if_index, public_key, table_id, &ip_addr_46 (&ip), + allowed_ips, portDst, persistent_keepalive, &peer_index); switch (rv) { @@ -253,16 +247,14 @@ done: return error; } -/* *INDENT-OFF* */ -VLIB_CLI_COMMAND (wg_peer_add_command, static) = -{ +VLIB_CLI_COMMAND (wg_peer_add_command, static) = { .path = "wireguard peer add", - .short_help = "wireguard peer add <wg_int> public-key <pub_key_other>" - "endpoint <ip4_dst> allowed-ip <prefix>" - "dst-port [port_dst] persistent-keepalive [keepalive_interval]", + .short_help = + "wireguard peer add <wg_int> public-key <pub_key_other> " + "endpoint <ip4_dst> allowed-ip <prefix> " + "dst-port [port_dst] persistent-keepalive [keepalive_interval]", .function = wg_peer_add_command_fn, }; -/* *INDENT-ON* */ static clib_error_t * wg_peer_remove_command_fn (vlib_main_t * vm, @@ -301,14 +293,12 @@ done: return error; } -/* *INDENT-OFF* */ VLIB_CLI_COMMAND (wg_peer_remove_command, static) = { .path = "wireguard peer remove", .short_help = "wireguard peer remove <index>", .function = wg_peer_remove_command_fn, }; -/* *INDENT-ON* */ static walk_rc_t wg_peer_show_one (index_t peeri, void *arg) @@ -327,14 +317,12 @@ wg_show_peer_command_fn (vlib_main_t * vm, return NULL; } -/* *INDENT-OFF* */ VLIB_CLI_COMMAND (wg_show_peers_command, static) = { .path = "show wireguard peer", .short_help = "show wireguard peer", .function = wg_show_peer_command_fn, }; -/* *INDENT-ON* */ static walk_rc_t wg_if_show_one (index_t itfi, void *arg) @@ -357,14 +345,67 @@ wg_show_if_command_fn (vlib_main_t * vm, return NULL; } -/* *INDENT-OFF* */ VLIB_CLI_COMMAND (wg_show_itfs_command, static) = { .path = "show wireguard interface", .short_help = "show wireguard", .function = wg_show_if_command_fn, }; -/* *INDENT-ON* */ + +static clib_error_t * +wg_set_async_mode_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 async_enable = 0; + + 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, "on")) + async_enable = 1; + else if (unformat (line_input, "off")) + async_enable = 0; + else + return (clib_error_return (0, "unknown input '%U'", + format_unformat_error, line_input)); + } + + wg_set_async_mode (async_enable); + + unformat_free (line_input); + return (NULL); +} + +VLIB_CLI_COMMAND (wg_set_async_mode_command, static) = { + .path = "set wireguard async mode", + .short_help = "set wireguard async mode on|off", + .function = wg_set_async_mode_command_fn, +}; + +static clib_error_t * +wg_show_mode_command_fn (vlib_main_t *vm, unformat_input_t *input, + vlib_cli_command_t *cmd) +{ + vlib_cli_output (vm, "Wireguard mode"); + +#define _(v, f, s) \ + vlib_cli_output (vm, "\t%s: %s", s, \ + (wg_op_mode_is_set_##f () ? "enabled" : "disabled")); + foreach_wg_op_mode_flags +#undef _ + + return (NULL); +} + +VLIB_CLI_COMMAND (wg_show_modemode_command, static) = { + .path = "show wireguard mode", + .short_help = "show wireguard mode", + .function = wg_show_mode_command_fn, +}; + /* * fd.io coding-style-patch-verification: ON |