X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Fcrypto_ia32%2Fmain.c;h=194182fd57a04c7c38df789d793b89c672d070a7;hb=5f9f3c8de8d5d9f83a437661a98e5cc2453705f9;hp=45bf34e7814468d3fcc5e178773ecdbb4bad39e8;hpb=1d1985de91833a5483a6b7ee96ef4090d530a7a6;p=vpp.git diff --git a/src/plugins/crypto_ia32/main.c b/src/plugins/crypto_ia32/main.c index 45bf34e7814..194182fd57a 100644 --- a/src/plugins/crypto_ia32/main.c +++ b/src/plugins/crypto_ia32/main.c @@ -19,7 +19,6 @@ #include #include #include -#include crypto_ia32_main_t crypto_ia32_main; @@ -29,17 +28,9 @@ crypto_ia32_key_handler (vlib_main_t * vm, vnet_crypto_key_op_t kop, { vnet_crypto_key_t *key = vnet_crypto_get_key (idx); crypto_ia32_main_t *cm = &crypto_ia32_main; - aesni_key_data_t *kd; - switch (key->alg) - { - case VNET_CRYPTO_ALG_AES_128_CBC: - case VNET_CRYPTO_ALG_AES_192_CBC: - case VNET_CRYPTO_ALG_AES_256_CBC: - break; - default: - return; - } + if (cm->key_fn[key->alg] == 0) + return; if (kop == VNET_CRYPTO_KEY_OP_DEL) { @@ -49,9 +40,7 @@ crypto_ia32_key_handler (vlib_main_t * vm, vnet_crypto_key_op_t kop, if (cm->key_data[idx] == 0) return; - clib_memset_u8 (cm->key_data[idx], 0, - clib_mem_size (cm->key_data[idx])); - clib_mem_free (cm->key_data[idx]); + clib_mem_free_s (cm->key_data[idx]); cm->key_data[idx] = 0; return; } @@ -60,36 +49,10 @@ crypto_ia32_key_handler (vlib_main_t * vm, vnet_crypto_key_op_t kop, if (kop == VNET_CRYPTO_KEY_OP_MODIFY && cm->key_data[idx]) { - clib_memset_u8 (cm->key_data[idx], 0, - clib_mem_size (cm->key_data[idx])); - clib_mem_free (cm->key_data[idx]); + clib_mem_free_s (cm->key_data[idx]); } - kd = cm->key_data[idx] = clib_mem_alloc_aligned (sizeof (aesni_key_data_t), - CLIB_CACHE_LINE_BYTES); - - /* ADD or MODIFY */ - switch (key->alg) - { - case VNET_CRYPTO_ALG_AES_128_CBC: - aes_key_expand (kd->encrypt_key, key->data, AESNI_KEY_128); - aes_key_expand (kd->decrypt_key, key->data, AESNI_KEY_128); - aes_key_enc_to_dec (kd->decrypt_key, AESNI_KEY_128); - break; - case VNET_CRYPTO_ALG_AES_192_CBC: - aes_key_expand (kd->encrypt_key, key->data, AESNI_KEY_192); - aes_key_expand (kd->decrypt_key, key->data, AESNI_KEY_192); - aes_key_enc_to_dec (kd->decrypt_key, AESNI_KEY_192); - break; - case VNET_CRYPTO_ALG_AES_256_CBC: - aes_key_expand (kd->encrypt_key, key->data, AESNI_KEY_256); - aes_key_expand (kd->decrypt_key, key->data, AESNI_KEY_256); - aes_key_enc_to_dec (kd->decrypt_key, AESNI_KEY_256); - break; - default: - break; - } - return; + cm->key_data[idx] = cm->key_fn[key->alg] (key); } clib_error_t * @@ -97,10 +60,10 @@ crypto_ia32_init (vlib_main_t * vm) { crypto_ia32_main_t *cm = &crypto_ia32_main; vlib_thread_main_t *tm = vlib_get_thread_main (); - clib_error_t *error; + clib_error_t *error = 0; - if ((error = vlib_call_init_function (vm, vnet_crypto_init))) - return error; + if (clib_cpu_supports_x86_aes () == 0) + return 0; vec_validate_aligned (cm->per_thread_data, tm->n_vlib_mains - 1, CLIB_CACHE_LINE_BYTES); @@ -109,10 +72,29 @@ crypto_ia32_init (vlib_main_t * vm) vnet_crypto_register_engine (vm, "ia32", 100, "Intel IA32 ISA Optimized Crypto"); - if (clib_cpu_supports_x86_aes () && - (error = crypto_ia32_aesni_cbc_init (vm))) + if (clib_cpu_supports_avx512f ()) + error = crypto_ia32_aesni_cbc_init_avx512 (vm); + else if (clib_cpu_supports_avx2 ()) + error = crypto_ia32_aesni_cbc_init_avx2 (vm); + else + error = crypto_ia32_aesni_cbc_init_sse42 (vm); + + if (error) goto error; + if (clib_cpu_supports_pclmulqdq ()) + { + if (clib_cpu_supports_avx512f ()) + error = crypto_ia32_aesni_gcm_init_avx512 (vm); + else if (clib_cpu_supports_avx2 ()) + error = crypto_ia32_aesni_gcm_init_avx2 (vm); + else + error = crypto_ia32_aesni_gcm_init_sse42 (vm); + + if (error) + goto error; + } + vnet_crypto_register_key_handler (vm, cm->crypto_engine_index, crypto_ia32_key_handler); @@ -124,7 +106,12 @@ error: return error; } -VLIB_INIT_FUNCTION (crypto_ia32_init); +/* *INDENT-OFF* */ +VLIB_INIT_FUNCTION (crypto_ia32_init) = +{ + .runs_after = VLIB_INITS ("vnet_crypto_init"), +}; +/* *INDENT-ON* */ #include