X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fipsec%2Fipsec_cli.c;h=0d1ab033aec73e8e9d2a3660da9797a12be3a2d2;hb=e6b83059af3365ab12bbe93655a7dea6f691dbda;hp=1ab8bd99db3cda889ef8f2a4d0e0d79268e3048d;hpb=282872127bbeee6ae59ab3f885c09bad601ee0cc;p=vpp.git diff --git a/src/vnet/ipsec/ipsec_cli.c b/src/vnet/ipsec/ipsec_cli.c index 1ab8bd99db3..0d1ab033aec 100644 --- a/src/vnet/ipsec/ipsec_cli.c +++ b/src/vnet/ipsec/ipsec_cli.c @@ -86,8 +86,10 @@ ipsec_sa_add_del_command_fn (vlib_main_t * vm, clib_error_t *error; ipsec_key_t ck = { 0 }; ipsec_key_t ik = { 0 }; - u32 id, spi, salt; + u32 id, spi, salt, sai; + u16 udp_src, udp_dst; int is_add, rv; + u32 m_args = 0; salt = 0; error = NULL; @@ -96,6 +98,7 @@ ipsec_sa_add_del_command_fn (vlib_main_t * vm, proto = IPSEC_PROTOCOL_ESP; integ_alg = IPSEC_INTEG_ALG_NONE; crypto_alg = IPSEC_CRYPTO_ALG_NONE; + udp_src = udp_dst = IPSEC_UDP_PORT_NONE; if (!unformat_user (input, unformat_line_input, line_input)) return 0; @@ -103,11 +106,17 @@ ipsec_sa_add_del_command_fn (vlib_main_t * vm, while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) { if (unformat (line_input, "add %u", &id)) - is_add = 1; + { + is_add = 1; + m_args |= 1 << 0; + } else if (unformat (line_input, "del %u", &id)) - is_add = 0; + { + is_add = 0; + m_args |= 1 << 0; + } else if (unformat (line_input, "spi %u", &spi)) - ; + m_args |= 1 << 1; else if (unformat (line_input, "salt 0x%x", &salt)) ; else if (unformat (line_input, "esp")) @@ -135,6 +144,12 @@ ipsec_sa_add_del_command_fn (vlib_main_t * vm, else if (unformat (line_input, "tunnel-dst %U", unformat_ip46_address, &tun_dst, IP46_TYPE_ANY)) ; + else if (unformat (line_input, "inbound")) + flags |= IPSEC_SA_FLAG_IS_INBOUND; + else if (unformat (line_input, "use-anti-replay")) + flags |= IPSEC_SA_FLAG_USE_ANTI_REPLAY; + else if (unformat (line_input, "use-esn")) + flags |= IPSEC_SA_FLAG_USE_ESN; else if (unformat (line_input, "udp-encap")) flags |= IPSEC_SA_FLAG_UDP_ENCAP; else @@ -144,14 +159,35 @@ ipsec_sa_add_del_command_fn (vlib_main_t * vm, goto done; } } + if ((flags & IPSEC_SA_FLAG_IS_INBOUND) + && !(flags & IPSEC_SA_FLAG_IS_TUNNEL)) + { + error = clib_error_return (0, "inbound specified on non-tunnel SA"); + goto done; + } + + if (!(m_args & 1)) + { + error = clib_error_return (0, "missing id"); + goto done; + } if (is_add) - rv = ipsec_sa_add_and_lock (id, spi, proto, crypto_alg, - &ck, integ_alg, &ik, flags, - 0, clib_host_to_net_u32 (salt), - &tun_src, &tun_dst, NULL); + { + if (!(m_args & 2)) + { + error = clib_error_return (0, "missing spi"); + goto done; + } + rv = ipsec_sa_add_and_lock (id, spi, proto, crypto_alg, + &ck, integ_alg, &ik, flags, + 0, clib_host_to_net_u32 (salt), + &tun_src, &tun_dst, &sai, udp_src, udp_dst); + } else - rv = ipsec_sa_unlock_id (id); + { + rv = ipsec_sa_unlock_id (id); + } if (rv) error = clib_error_return (0, "failed"); @@ -232,13 +268,13 @@ ipsec_policy_add_del_command_fn (vlib_main_t * vm, unformat_input_t _line_input, *line_input = &_line_input; ipsec_policy_t p; int rv, is_add = 0; - u32 tmp, tmp2, stat_index; + u32 tmp, tmp2, stat_index, local_range_set, remote_range_set; clib_error_t *error = NULL; u32 is_outbound; clib_memset (&p, 0, sizeof (p)); p.lport.stop = p.rport.stop = ~0; - is_outbound = 0; + remote_range_set = local_range_set = is_outbound = 0; if (!unformat_user (input, unformat_line_input, line_input)) return 0; @@ -249,6 +285,8 @@ ipsec_policy_add_del_command_fn (vlib_main_t * vm, is_add = 1; else if (unformat (line_input, "del")) is_add = 0; + else if (unformat (line_input, "ip6")) + p.is_ipv6 = 1; else if (unformat (line_input, "spd %u", &p.id)) ; else if (unformat (line_input, "inbound")) @@ -275,22 +313,24 @@ ipsec_policy_add_del_command_fn (vlib_main_t * vm, else if (unformat (line_input, "local-ip-range %U - %U", unformat_ip4_address, &p.laddr.start.ip4, unformat_ip4_address, &p.laddr.stop.ip4)) - ; + local_range_set = 1; else if (unformat (line_input, "remote-ip-range %U - %U", unformat_ip4_address, &p.raddr.start.ip4, unformat_ip4_address, &p.raddr.stop.ip4)) - ; + remote_range_set = 1; else if (unformat (line_input, "local-ip-range %U - %U", unformat_ip6_address, &p.laddr.start.ip6, unformat_ip6_address, &p.laddr.stop.ip6)) { p.is_ipv6 = 1; + local_range_set = 1; } else if (unformat (line_input, "remote-ip-range %U - %U", unformat_ip6_address, &p.raddr.start.ip6, unformat_ip6_address, &p.raddr.stop.ip6)) { p.is_ipv6 = 1; + remote_range_set = 1; } else if (unformat (line_input, "local-port-range %u - %u", &tmp, &tmp2)) { @@ -311,6 +351,21 @@ ipsec_policy_add_del_command_fn (vlib_main_t * vm, } } + if (!remote_range_set) + { + if (p.is_ipv6) + clib_memset (&p.raddr.stop.ip6, 0xff, 16); + else + clib_memset (&p.raddr.stop.ip4, 0xff, 4); + } + if (!local_range_set) + { + if (p.is_ipv6) + clib_memset (&p.laddr.stop.ip6, 0xff, 16); + else + clib_memset (&p.laddr.stop.ip4, 0xff, 4); + } + rv = ipsec_policy_mk_type (is_outbound, p.is_ipv6, p.policy, &p.type); if (rv) @@ -413,6 +468,9 @@ show_ipsec_command_fn (vlib_main_t * vm, ipsec_spd_bindings_show_all (vm, im); ipsec_tun_protect_walk (ipsec_tun_protect_show_one, vm); + vlib_cli_output (vm, "IPSec async mode: %s", + (im->async_mode ? "on" : "off")); + return 0; } @@ -729,13 +787,13 @@ create_ipsec_tunnel_command_fn (vlib_main_t * vm, ip46_address_t local_ip = ip46_address_initializer; ip46_address_t remote_ip = ip46_address_initializer; ip_address_t nh = IP_ADDRESS_V4_ALL_0S; - ipsec_crypto_alg_t crypto_alg; - ipsec_integ_alg_t integ_alg; + ipsec_crypto_alg_t crypto_alg = IPSEC_CRYPTO_ALG_NONE; + ipsec_integ_alg_t integ_alg = IPSEC_INTEG_ALG_NONE; ipsec_sa_flags_t flags; - u32 local_spi, remote_spi, salt, table_id, fib_index; + u32 local_spi, remote_spi, salt = 0, table_id, fib_index; u32 instance = ~0; int rv; - u32 num_m_args = 0; + u32 m_args = 0; u8 ipv4_set = 0; u8 ipv6_set = 0; u8 is_add = 1; @@ -759,7 +817,7 @@ create_ipsec_tunnel_command_fn (vlib_main_t * vm, IP46_TYPE_ANY)) { ip46_address_is_ip4 (&local_ip) ? (ipv4_set = 1) : (ipv6_set = 1); - num_m_args++; + m_args |= 1 << 0; } else if (unformat @@ -767,12 +825,12 @@ create_ipsec_tunnel_command_fn (vlib_main_t * vm, IP46_TYPE_ANY)) { ip46_address_is_ip4 (&remote_ip) ? (ipv4_set = 1) : (ipv6_set = 1); - num_m_args++; + m_args |= 1 << 1; } else if (unformat (line_input, "local-spi %u", &local_spi)) - num_m_args++; + m_args |= 1 << 2; else if (unformat (line_input, "remote-spi %u", &remote_spi)) - num_m_args++; + m_args |= 1 << 3; else if (unformat (line_input, "salt 0x%x", &salt)) ; else if (unformat (line_input, "udp-encap")) @@ -819,7 +877,7 @@ create_ipsec_tunnel_command_fn (vlib_main_t * vm, } } - if (num_m_args < 4) + if (0xf != m_args) { error = clib_error_return (0, "mandatory argument(s) missing"); goto done; @@ -852,14 +910,16 @@ create_ipsec_tunnel_command_fn (vlib_main_t * vm, local_spi, IPSEC_PROTOCOL_ESP, crypto_alg, &lck, integ_alg, &lik, flags, table_id, clib_host_to_net_u32 (salt), &local_ip, - &remote_ip, NULL); + &remote_ip, NULL, IPSEC_UDP_PORT_NONE, + IPSEC_UDP_PORT_NONE); rv |= ipsec_sa_add_and_lock (ipsec_tun_mk_remote_sa_id (sw_if_index), remote_spi, IPSEC_PROTOCOL_ESP, crypto_alg, &rck, integ_alg, &rik, (flags | IPSEC_SA_FLAG_IS_INBOUND), table_id, clib_host_to_net_u32 (salt), &remote_ip, - &local_ip, NULL); + &local_ip, NULL, IPSEC_UDP_PORT_NONE, + IPSEC_UDP_PORT_NONE); rv |= ipsec_tun_protect_update_one (sw_if_index, &nh, ipsec_tun_mk_local_sa_id (sw_if_index), @@ -1037,6 +1097,41 @@ ipsec_cli_init (vlib_main_t * vm) VLIB_INIT_FUNCTION (ipsec_cli_init); +static clib_error_t * +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)); + } + + vnet_crypto_request_async_mode (async_enable); + ipsec_set_async_mode (async_enable); + + unformat_free (line_input); + return (NULL); +} + +/* *INDENT-OFF* */ +VLIB_CLI_COMMAND (set_async_mode_command, static) = { + .path = "set ipsec async mode", + .short_help = "set ipsec async mode on|off", + .function = set_async_mode_command_fn, +}; +/* *INDENT-ON* */ /* * fd.io coding-style-patch-verification: ON