X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fipsec%2Fipsec.c;h=0f4f282034949dc7023b8c751ec5bc799cf1aebc;hb=f62a8c013c6e22c012b9d7df2ef463a6370cf1ce;hp=10b8bf65bd52b8df2238951ab87f49728b0da762;hpb=0224514c28bdee05ea11a89a721c810e5f99ede2;p=vpp.git diff --git a/src/vnet/ipsec/ipsec.c b/src/vnet/ipsec/ipsec.c index 10b8bf65bd5..0f4f2820349 100644 --- a/src/vnet/ipsec/ipsec.c +++ b/src/vnet/ipsec/ipsec.c @@ -30,15 +30,37 @@ ipsec_main_t ipsec_main; static clib_error_t * ipsec_check_ah_support (ipsec_sa_t * sa) { + ipsec_main_t *im = &ipsec_main; + if (sa->integ_alg == IPSEC_INTEG_ALG_NONE) return clib_error_return (0, "unsupported none integ-alg"); + + if (!vnet_crypto_is_set_handler (im->integ_algs[sa->integ_alg].alg)) + return clib_error_return (0, "No crypto engine support for %U", + format_ipsec_integ_alg, sa->integ_alg); + return 0; } static clib_error_t * ipsec_check_esp_support (ipsec_sa_t * sa) { - return 0; + ipsec_main_t *im = &ipsec_main; + + if (IPSEC_INTEG_ALG_NONE != sa->integ_alg) + { + if (!vnet_crypto_is_set_handler (im->integ_algs[sa->integ_alg].alg)) + return clib_error_return (0, "No crypto engine support for %U", + format_ipsec_integ_alg, sa->integ_alg); + } + if (IPSEC_CRYPTO_ALG_NONE != sa->crypto_alg) + { + if (!vnet_crypto_is_set_handler (im->crypto_algs[sa->crypto_alg].alg)) + return clib_error_return (0, "No crypto engine support for %U", + format_ipsec_crypto_alg, sa->crypto_alg); + } + + return (0); } clib_error_t * @@ -100,7 +122,7 @@ ipsec_add_node (vlib_main_t * vm, const char *node_name, *out_next_index = vlib_node_add_next (vm, prev_node->index, node->index); } -static void +void ipsec_add_feature (const char *arc_name, const char *node_name, u32 * out_feature_index) { @@ -184,11 +206,6 @@ ipsec_rsc_in_use (ipsec_main_t * im) "%d SA entries configured", pool_elts (im->sad)); - if (pool_elts (im->tunnel_interfaces)) - return clib_error_return (0, - "%d tunnel-interface entries configured", - pool_elts (im->tunnel_interfaces)); - return (NULL); } @@ -263,7 +280,7 @@ ipsec_init (vlib_main_t * vm) ASSERT (node); im->error_drop_node_index = node->index; - u32 idx = ipsec_register_ah_backend (vm, im, "default openssl backend", + u32 idx = ipsec_register_ah_backend (vm, im, "crypto engine backend", "ah4-encrypt", "ah4-decrypt", "ah6-encrypt", @@ -276,7 +293,7 @@ ipsec_init (vlib_main_t * vm) ASSERT (0 == rv); (void) (rv); // avoid warning - idx = ipsec_register_esp_backend (vm, im, "default openssl backend", + idx = ipsec_register_esp_backend (vm, im, "crypto engine backend", "esp4-encrypt", "esp4-encrypt-tun", "esp4-decrypt", @@ -293,11 +310,15 @@ ipsec_init (vlib_main_t * vm) if ((error = vlib_call_init_function (vm, ipsec_cli_init))) return error; - if ((error = vlib_call_init_function (vm, ipsec_tunnel_if_init))) - return error; - vec_validate (im->crypto_algs, IPSEC_CRYPTO_N_ALG - 1); + a = im->crypto_algs + IPSEC_CRYPTO_ALG_NONE; + a->enc_op_id = VNET_CRYPTO_OP_NONE; + a->dec_op_id = VNET_CRYPTO_OP_NONE; + a->alg = VNET_CRYPTO_ALG_NONE; + a->iv_size = 0; + a->block_size = 1; + a = im->crypto_algs + IPSEC_CRYPTO_ALG_DES_CBC; a->enc_op_id = VNET_CRYPTO_OP_DES_CBC_ENC; a->dec_op_id = VNET_CRYPTO_OP_DES_CBC_DEC; @@ -352,6 +373,11 @@ ipsec_init (vlib_main_t * vm) vec_validate (im->integ_algs, IPSEC_INTEG_N_ALG - 1); ipsec_main_integ_alg_t *i; + i = &im->integ_algs[IPSEC_INTEG_ALG_MD5_96]; + i->op_id = VNET_CRYPTO_OP_MD5_HMAC; + i->alg = VNET_CRYPTO_ALG_HMAC_MD5; + i->icv_size = 12; + i = &im->integ_algs[IPSEC_INTEG_ALG_SHA1_96]; i->op_id = VNET_CRYPTO_OP_SHA1_HMAC; i->alg = VNET_CRYPTO_ALG_HMAC_SHA1; @@ -379,6 +405,32 @@ ipsec_init (vlib_main_t * vm) vec_validate_aligned (im->ptd, vlib_num_workers (), CLIB_CACHE_LINE_BYTES); + im->ah4_enc_fq_index = + vlib_frame_queue_main_init (ah4_encrypt_node.index, 0); + im->ah4_dec_fq_index = + vlib_frame_queue_main_init (ah4_decrypt_node.index, 0); + im->ah6_enc_fq_index = + vlib_frame_queue_main_init (ah6_encrypt_node.index, 0); + im->ah6_dec_fq_index = + vlib_frame_queue_main_init (ah6_decrypt_node.index, 0); + + im->esp4_enc_fq_index = + vlib_frame_queue_main_init (esp4_encrypt_node.index, 0); + im->esp4_dec_fq_index = + vlib_frame_queue_main_init (esp4_decrypt_node.index, 0); + im->esp6_enc_fq_index = + vlib_frame_queue_main_init (esp6_encrypt_node.index, 0); + im->esp6_dec_fq_index = + vlib_frame_queue_main_init (esp6_decrypt_node.index, 0); + im->esp4_enc_tun_fq_index = + vlib_frame_queue_main_init (esp4_encrypt_tun_node.index, 0); + im->esp6_enc_tun_fq_index = + vlib_frame_queue_main_init (esp6_encrypt_tun_node.index, 0); + im->esp4_dec_tun_fq_index = + vlib_frame_queue_main_init (esp4_decrypt_tun_node.index, 0); + im->esp6_dec_tun_fq_index = + vlib_frame_queue_main_init (esp6_decrypt_tun_node.index, 0); + return 0; }