crypto-native: add AES-CTR
[vpp.git] / src / plugins / crypto_native / main.c
index 5d6e647..8a59be3 100644 (file)
@@ -29,6 +29,10 @@ crypto_native_key_handler (vlib_main_t * vm, vnet_crypto_key_op_t kop,
   vnet_crypto_key_t *key = vnet_crypto_get_key (idx);
   crypto_native_main_t *cm = &crypto_native_main;
 
+  /** TODO: add linked alg support **/
+  if (key->type == VNET_CRYPTO_KEY_TYPE_LINK)
+    return;
+
   if (cm->key_fn[key->alg] == 0)
     return;
 
@@ -45,10 +49,6 @@ crypto_native_key_handler (vlib_main_t * vm, vnet_crypto_key_op_t kop,
       return;
     }
 
-  /** TODO: add linked alg support **/
-  if (key->type == VNET_CRYPTO_KEY_TYPE_LINK)
-    return;
-
   vec_validate_aligned (cm->key_data, idx, CLIB_CACHE_LINE_BYTES);
 
   if (kop == VNET_CRYPTO_KEY_OP_MODIFY && cm->key_data[idx])
@@ -63,24 +63,23 @@ clib_error_t *
 crypto_native_init (vlib_main_t * vm)
 {
   crypto_native_main_t *cm = &crypto_native_main;
-  vlib_thread_main_t *tm = vlib_get_thread_main ();
   clib_error_t *error = 0;
 
   if (clib_cpu_supports_x86_aes () == 0 &&
       clib_cpu_supports_aarch64_aes () == 0)
     return 0;
 
-  vec_validate_aligned (cm->per_thread_data, tm->n_vlib_mains - 1,
-                       CLIB_CACHE_LINE_BYTES);
-
   cm->crypto_engine_index =
     vnet_crypto_register_engine (vm, "native", 100,
                                 "Native ISA Optimized Crypto");
 
   if (0);
 #if __x86_64__
-  else if (crypto_native_aes_cbc_init_icl && clib_cpu_supports_vaes ())
+  else if (crypto_native_aes_cbc_init_icl && clib_cpu_supports_vaes () &&
+          clib_cpu_supports_avx512f ())
     error = crypto_native_aes_cbc_init_icl (vm);
+  else if (crypto_native_aes_cbc_init_adl && clib_cpu_supports_vaes ())
+    error = crypto_native_aes_cbc_init_adl (vm);
   else if (crypto_native_aes_cbc_init_skx && clib_cpu_supports_avx512f ())
     error = crypto_native_aes_cbc_init_skx (vm);
   else if (crypto_native_aes_cbc_init_hsw && clib_cpu_supports_avx2 ())
@@ -96,13 +95,41 @@ crypto_native_init (vlib_main_t * vm)
     error = clib_error_return (0, "No AES CBC implemenation available");
 
   if (error)
-    goto error;
+    return error;
+
+  if (0)
+    ;
+#if __x86_64__
+  else if (crypto_native_aes_ctr_init_icl && clib_cpu_supports_vaes () &&
+          clib_cpu_supports_avx512f ())
+    error = crypto_native_aes_ctr_init_icl (vm);
+  else if (crypto_native_aes_ctr_init_adl && clib_cpu_supports_vaes ())
+    error = crypto_native_aes_ctr_init_adl (vm);
+  else if (crypto_native_aes_ctr_init_skx && clib_cpu_supports_avx512f ())
+    error = crypto_native_aes_ctr_init_skx (vm);
+  else if (crypto_native_aes_ctr_init_hsw && clib_cpu_supports_avx2 ())
+    error = crypto_native_aes_ctr_init_hsw (vm);
+  else if (crypto_native_aes_ctr_init_slm)
+    error = crypto_native_aes_ctr_init_slm (vm);
+#endif
+#if __aarch64__
+  else if (crypto_native_aes_ctr_init_neon)
+    error = crypto_native_aes_ctr_init_neon (vm);
+#endif
+  else
+    error = clib_error_return (0, "No AES CTR implemenation available");
+
+  if (error)
+    return error;
 
 #if __x86_64__
   if (clib_cpu_supports_pclmulqdq ())
     {
-      if (crypto_native_aes_gcm_init_icl && clib_cpu_supports_vaes ())
+      if (crypto_native_aes_gcm_init_icl && clib_cpu_supports_vaes () &&
+         clib_cpu_supports_avx512f ())
        error = crypto_native_aes_gcm_init_icl (vm);
+      else if (crypto_native_aes_gcm_init_adl && clib_cpu_supports_vaes ())
+       error = crypto_native_aes_gcm_init_adl (vm);
       else if (crypto_native_aes_gcm_init_skx && clib_cpu_supports_avx512f ())
        error = crypto_native_aes_gcm_init_skx (vm);
       else if (crypto_native_aes_gcm_init_hsw && clib_cpu_supports_avx2 ())
@@ -113,7 +140,7 @@ crypto_native_init (vlib_main_t * vm)
        error = clib_error_return (0, "No AES GCM implemenation available");
 
       if (error)
-       goto error;
+       return error;
     }
 #endif
 #if __aarch64__
@@ -123,40 +150,22 @@ crypto_native_init (vlib_main_t * vm)
     error = clib_error_return (0, "No AES GCM implemenation available");
 
   if (error)
-    goto error;
+    return error;
 #endif
 
   vnet_crypto_register_key_handler (vm, cm->crypto_engine_index,
                                    crypto_native_key_handler);
-
-
-error:
-  if (error)
-    vec_free (cm->per_thread_data);
-
-  return error;
+  return 0;
 }
 
-/* *INDENT-OFF* */
 VLIB_INIT_FUNCTION (crypto_native_init) =
 {
   .runs_after = VLIB_INITS ("vnet_crypto_init"),
 };
-/* *INDENT-ON* */
 
 #include <vpp/app/version.h>
 
-/* *INDENT-OFF* */
 VLIB_PLUGIN_REGISTER () = {
   .version = VPP_BUILD_VER,
-  .description = "Intel IA32 Software Crypto Engine",
+  .description = "Native Crypto Engine",
 };
-/* *INDENT-ON* */
-
-/*
- * fd.io coding-style-patch-verification: ON
- *
- * Local Variables:
- * eval: (c-set-style "gnu")
- * End:
- */