-static clib_error_t *
-create_ipsec_tunnel_command_fn (vlib_main_t * vm,
- unformat_input_t * input,
- vlib_cli_command_t * cmd)
-{
- unformat_input_t _line_input, *line_input = &_line_input;
- ipsec_add_del_tunnel_args_t a;
- int rv;
- u32 num_m_args = 0;
- 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;
-
- /* Get a line of input. */
- 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, "local-ip %U", unformat_ip46_address, &a.local_ip,
- IP46_TYPE_ANY))
- {
- ip46_address_is_ip4 (&a.local_ip) ? (ipv4_set = 1) : (ipv6_set = 1);
- num_m_args++;
- }
- else
- if (unformat
- (line_input, "remote-ip %U", unformat_ip46_address, &a.remote_ip,
- IP46_TYPE_ANY))
- {
- ip46_address_is_ip4 (&a.remote_ip) ? (ipv4_set = 1) : (ipv6_set =
- 1);
- num_m_args++;
- }
- else if (unformat (line_input, "local-spi %u", &a.local_spi))
- num_m_args++;
- else if (unformat (line_input, "remote-spi %u", &a.remote_spi))
- num_m_args++;
- else if (unformat (line_input, "instance %u", &a.show_instance))
- a.renumber = 1;
- else if (unformat (line_input, "salt 0x%x", &a.salt))
- ;
- else if (unformat (line_input, "udp-encap"))
- a.udp_encap = 1;
- else if (unformat (line_input, "use-esn"))
- a.esn = 1;
- else if (unformat (line_input, "use-anti-replay"))
- 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, "remote-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
- {
- error = clib_error_return (0, "unknown input `%U'",
- format_unformat_error, line_input);
- goto done;
- }
- }
-
- if (num_m_args < 4)
- {
- error = clib_error_return (0, "mandatory argument(s) missing");
- goto done;
- }
-
- if (ipv4_set && ipv6_set)
- return clib_error_return (0, "both IPv4 and IPv6 addresses specified");
-
- a.is_ip6 = ipv6_set;
-
- 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)
- {
- case 0:
- break;
- case VNET_API_ERROR_INVALID_VALUE:
- if (a.is_add)
- error = clib_error_return (0,
- "IPSec tunnel interface already exists...");
- else
- error = clib_error_return (0, "IPSec tunnel interface not exists...");
- goto done;
- default:
- error = clib_error_return (0, "ipsec_register_interface returned %d",
- rv);
- goto done;
- }
-
-done:
- unformat_free (line_input);
-
- return error;
-}
-
-/* *INDENT-OFF* */
-VLIB_CLI_COMMAND (create_ipsec_tunnel_command, static) = {
- .path = "create ipsec tunnel",
- .short_help = "create ipsec tunnel local-ip <addr> local-spi <spi> "
- "remote-ip <addr> remote-spi <spi> [instance <inst_num>] [udp-encap] [use-esn] [use-anti-replay] "
- "[tx-table <table-id>]",
- .function = create_ipsec_tunnel_command_fn,
-};
-/* *INDENT-ON* */
-