X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fipsec%2Fipsec_cli.c;h=8a4d068f9f70b366c56809d4217b6fb9acede046;hb=9f231d4f147c7e3fdf562680488ec5dfe7655b5e;hp=52a30a428d08f5e413acfaad981a8ff78e6821f9;hpb=72b3bce0b6850f136748ba78bfa01b0192a0756d;p=vpp.git diff --git a/src/vnet/ipsec/ipsec_cli.c b/src/vnet/ipsec/ipsec_cli.c index 52a30a428d0..8a4d068f9f7 100644 --- a/src/vnet/ipsec/ipsec_cli.c +++ b/src/vnet/ipsec/ipsec_cli.c @@ -82,7 +82,8 @@ ipsec_sa_add_del_command_fn (vlib_main_t * vm, ipsec_protocol_t proto; ipsec_sa_flags_t flags; clib_error_t *error; - ipsec_key_t ck, ik; + ipsec_key_t ck = { 0 }; + ipsec_key_t ik = { 0 }; int is_add, rv; u32 id, spi; @@ -225,12 +226,14 @@ ipsec_policy_add_del_command_fn (vlib_main_t * vm, int rv, is_add = 0; u32 tmp, tmp2, stat_index; clib_error_t *error = NULL; + u32 is_outbound; clib_memset (&p, 0, sizeof (p)); p.lport.stop = p.rport.stop = ~0; p.laddr.stop.ip4.as_u32 = p.raddr.stop.ip4.as_u32 = (u32) ~ 0; p.laddr.stop.ip6.as_u64[0] = p.laddr.stop.ip6.as_u64[1] = (u64) ~ 0; p.raddr.stop.ip6.as_u64[0] = p.raddr.stop.ip6.as_u64[1] = (u64) ~ 0; + is_outbound = 0; if (!unformat_user (input, unformat_line_input, line_input)) return 0; @@ -244,9 +247,9 @@ ipsec_policy_add_del_command_fn (vlib_main_t * vm, else if (unformat (line_input, "spd %u", &p.id)) ; else if (unformat (line_input, "inbound")) - p.is_outbound = 0; + is_outbound = 0; else if (unformat (line_input, "outbound")) - p.is_outbound = 1; + is_outbound = 1; else if (unformat (line_input, "priority %d", &p.priority)) ; else if (unformat (line_input, "protocol %u", &tmp)) @@ -324,6 +327,19 @@ ipsec_policy_add_del_command_fn (vlib_main_t * vm, goto done; } } + + rv = ipsec_policy_mk_type (is_outbound, p.is_ipv6, p.policy, &p.type); + + if (rv) + { + error = clib_error_return (0, "unsupported policy type for:", + " outboud:%s %s action:%U", + (is_outbound ? "yes" : "no"), + (p.is_ipv6 ? "IPv4" : "IPv6"), + format_ipsec_policy_action, p.policy); + goto done; + } + rv = ipsec_add_del_policy (vm, &p, is_add, &stat_index); if (!rv) @@ -594,6 +610,7 @@ clear_ipsec_counters_command_fn (vlib_main_t * vm, vlib_cli_command_t * cmd) { vlib_clear_combined_counters (&ipsec_spd_policy_counters); + vlib_clear_combined_counters (&ipsec_sa_counters); return (NULL); } @@ -618,6 +635,10 @@ create_ipsec_tunnel_command_fn (vlib_main_t * vm, u8 ipv4_set = 0; u8 ipv6_set = 0; clib_error_t *error = NULL; + ipsec_key_t rck = { 0 }; + ipsec_key_t lck = { 0 }; + ipsec_key_t lik = { 0 }; + ipsec_key_t rik = { 0 }; clib_memset (&a, 0, sizeof (a)); a.is_add = 1; @@ -658,6 +679,28 @@ create_ipsec_tunnel_command_fn (vlib_main_t * vm, a.anti_replay = 1; else if (unformat (line_input, "tx-table %u", &a.tx_table_id)) ; + else + if (unformat + (line_input, "local-crypto-key %U", unformat_ipsec_key, &lck)) + ; + else + if (unformat + (line_input, "remote-crypto-key %U", unformat_ipsec_key, &rck)) + ; + else if (unformat (line_input, "crypto-alg %U", + unformat_ipsec_crypto_alg, &a.crypto_alg)) + ; + else + if (unformat + (line_input, "local-integ-key %U", unformat_ipsec_key, &lik)) + ; + else + if (unformat + (line_input, "rmote-integ-key %U", unformat_ipsec_key, &rik)) + ; + else if (unformat (line_input, "integ-alg %U", + unformat_ipsec_integ_alg, &a.integ_alg)) + ; else if (unformat (line_input, "del")) a.is_add = 0; else @@ -680,6 +723,16 @@ create_ipsec_tunnel_command_fn (vlib_main_t * vm, if (ipv4_set && ipv6_set) return clib_error_return (0, "both IPv4 and IPv6 addresses specified"); + clib_memcpy (a.local_crypto_key, lck.data, lck.len); + a.local_crypto_key_len = lck.len; + clib_memcpy (a.remote_crypto_key, rck.data, rck.len); + a.remote_crypto_key_len = rck.len; + + clib_memcpy (a.local_integ_key, lik.data, lik.len); + a.local_integ_key_len = lck.len; + clib_memcpy (a.remote_integ_key, rik.data, rik.len); + a.remote_integ_key_len = rck.len; + rv = ipsec_add_del_tunnel_if (&a); switch (rv)