ipsec: make algo data constant 56/42156/3
authorDamjan Marion <[email protected]>
Thu, 16 Jan 2025 11:53:55 +0000 (11:53 +0000)
committerDamjan Marion <[email protected]>
Thu, 16 Jan 2025 14:40:58 +0000 (14:40 +0000)
Type: improvement
Change-Id: I554418fca0cbe1a2b42eddc24eccf25ede5f678a
Signed-off-by: Damjan Marion <[email protected]>
src/vnet/CMakeLists.txt
src/vnet/ipsec/ipsec.c
src/vnet/ipsec/ipsec.h
src/vnet/ipsec/main.c [new file with mode: 0644]

index 9bd3500..36cbb7e 100644 (file)
@@ -552,6 +552,7 @@ list(APPEND VNET_SOURCES
   ipsec/ipsec_spd_policy.c
   ipsec/ipsec_tun.c
   ipsec/ipsec_tun_in.c
+  ipsec/main.c
   ipsec/esp_format.c
   ipsec/esp_encrypt.c
   ipsec/esp_decrypt.c
index 8b43dd2..a1d4d56 100644 (file)
@@ -36,8 +36,6 @@
  */
 #define IPSEC4_SPD_DEFAULT_HASH_NUM_BUCKETS (1 << 22)
 
-ipsec_main_t ipsec_main;
-
 esp_async_post_next_t esp_encrypt_async_next;
 esp_async_post_next_t esp_decrypt_async_next;
 
@@ -424,7 +422,6 @@ ipsec_init (vlib_main_t * vm)
 {
   clib_error_t *error;
   ipsec_main_t *im = &ipsec_main;
-  ipsec_main_crypto_alg_t *a;
 
   /* Backend registration requires the feature arcs to be set up */
   if ((error = vlib_call_init_function (vm, vnet_feature_init)))
@@ -471,154 +468,6 @@ ipsec_init (vlib_main_t * vm)
   if ((error = vlib_call_init_function (vm, ipsec_cli_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_align = 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;
-  a->alg = VNET_CRYPTO_ALG_DES_CBC;
-  a->iv_size = a->block_align = 8;
-
-  a = im->crypto_algs + IPSEC_CRYPTO_ALG_3DES_CBC;
-  a->enc_op_id = VNET_CRYPTO_OP_3DES_CBC_ENC;
-  a->dec_op_id = VNET_CRYPTO_OP_3DES_CBC_DEC;
-  a->alg = VNET_CRYPTO_ALG_3DES_CBC;
-  a->iv_size = a->block_align = 8;
-
-  a = im->crypto_algs + IPSEC_CRYPTO_ALG_AES_CBC_128;
-  a->enc_op_id = VNET_CRYPTO_OP_AES_128_CBC_ENC;
-  a->dec_op_id = VNET_CRYPTO_OP_AES_128_CBC_DEC;
-  a->alg = VNET_CRYPTO_ALG_AES_128_CBC;
-  a->iv_size = a->block_align = 16;
-
-  a = im->crypto_algs + IPSEC_CRYPTO_ALG_AES_CBC_192;
-  a->enc_op_id = VNET_CRYPTO_OP_AES_192_CBC_ENC;
-  a->dec_op_id = VNET_CRYPTO_OP_AES_192_CBC_DEC;
-  a->alg = VNET_CRYPTO_ALG_AES_192_CBC;
-  a->iv_size = a->block_align = 16;
-
-  a = im->crypto_algs + IPSEC_CRYPTO_ALG_AES_CBC_256;
-  a->enc_op_id = VNET_CRYPTO_OP_AES_256_CBC_ENC;
-  a->dec_op_id = VNET_CRYPTO_OP_AES_256_CBC_DEC;
-  a->alg = VNET_CRYPTO_ALG_AES_256_CBC;
-  a->iv_size = a->block_align = 16;
-
-  a = im->crypto_algs + IPSEC_CRYPTO_ALG_AES_CTR_128;
-  a->enc_op_id = VNET_CRYPTO_OP_AES_128_CTR_ENC;
-  a->dec_op_id = VNET_CRYPTO_OP_AES_128_CTR_DEC;
-  a->alg = VNET_CRYPTO_ALG_AES_128_CTR;
-  a->iv_size = 8;
-  a->block_align = 1;
-
-  a = im->crypto_algs + IPSEC_CRYPTO_ALG_AES_CTR_192;
-  a->enc_op_id = VNET_CRYPTO_OP_AES_192_CTR_ENC;
-  a->dec_op_id = VNET_CRYPTO_OP_AES_192_CTR_DEC;
-  a->alg = VNET_CRYPTO_ALG_AES_192_CTR;
-  a->iv_size = 8;
-  a->block_align = 1;
-
-  a = im->crypto_algs + IPSEC_CRYPTO_ALG_AES_CTR_256;
-  a->enc_op_id = VNET_CRYPTO_OP_AES_256_CTR_ENC;
-  a->dec_op_id = VNET_CRYPTO_OP_AES_256_CTR_DEC;
-  a->alg = VNET_CRYPTO_ALG_AES_256_CTR;
-  a->iv_size = 8;
-  a->block_align = 1;
-
-  a = im->crypto_algs + IPSEC_CRYPTO_ALG_AES_GCM_128;
-  a->enc_op_id = VNET_CRYPTO_OP_AES_128_GCM_ENC;
-  a->dec_op_id = VNET_CRYPTO_OP_AES_128_GCM_DEC;
-  a->alg = VNET_CRYPTO_ALG_AES_128_GCM;
-  a->iv_size = 8;
-  a->block_align = 1;
-  a->icv_size = 16;
-
-  a = im->crypto_algs + IPSEC_CRYPTO_ALG_AES_GCM_192;
-  a->enc_op_id = VNET_CRYPTO_OP_AES_192_GCM_ENC;
-  a->dec_op_id = VNET_CRYPTO_OP_AES_192_GCM_DEC;
-  a->alg = VNET_CRYPTO_ALG_AES_192_GCM;
-  a->iv_size = 8;
-  a->block_align = 1;
-  a->icv_size = 16;
-
-  a = im->crypto_algs + IPSEC_CRYPTO_ALG_AES_GCM_256;
-  a->enc_op_id = VNET_CRYPTO_OP_AES_256_GCM_ENC;
-  a->dec_op_id = VNET_CRYPTO_OP_AES_256_GCM_DEC;
-  a->alg = VNET_CRYPTO_ALG_AES_256_GCM;
-  a->iv_size = 8;
-  a->block_align = 1;
-  a->icv_size = 16;
-
-  a = im->crypto_algs + IPSEC_CRYPTO_ALG_CHACHA20_POLY1305;
-  a->enc_op_id = VNET_CRYPTO_OP_CHACHA20_POLY1305_ENC;
-  a->dec_op_id = VNET_CRYPTO_OP_CHACHA20_POLY1305_DEC;
-  a->alg = VNET_CRYPTO_ALG_CHACHA20_POLY1305;
-  a->iv_size = 8;
-  a->icv_size = 16;
-
-  a = im->crypto_algs + IPSEC_CRYPTO_ALG_AES_NULL_GMAC_128;
-  a->enc_op_id = VNET_CRYPTO_OP_AES_128_NULL_GMAC_ENC;
-  a->dec_op_id = VNET_CRYPTO_OP_AES_128_NULL_GMAC_DEC;
-  a->alg = VNET_CRYPTO_ALG_AES_128_GCM;
-  a->iv_size = 8;
-  a->block_align = 1;
-  a->icv_size = 16;
-
-  a = im->crypto_algs + IPSEC_CRYPTO_ALG_AES_NULL_GMAC_192;
-  a->enc_op_id = VNET_CRYPTO_OP_AES_192_NULL_GMAC_ENC;
-  a->dec_op_id = VNET_CRYPTO_OP_AES_192_NULL_GMAC_DEC;
-  a->alg = VNET_CRYPTO_ALG_AES_192_GCM;
-  a->iv_size = 8;
-  a->block_align = 1;
-  a->icv_size = 16;
-
-  a = im->crypto_algs + IPSEC_CRYPTO_ALG_AES_NULL_GMAC_256;
-  a->enc_op_id = VNET_CRYPTO_OP_AES_256_NULL_GMAC_ENC;
-  a->dec_op_id = VNET_CRYPTO_OP_AES_256_NULL_GMAC_DEC;
-  a->alg = VNET_CRYPTO_ALG_AES_256_GCM;
-  a->iv_size = 8;
-  a->block_align = 1;
-  a->icv_size = 16;
-
-  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;
-  i->icv_size = 12;
-
-  i = &im->integ_algs[IPSEC_INTEG_ALG_SHA_256_96];
-  i->op_id = VNET_CRYPTO_OP_SHA1_HMAC;
-  i->alg = VNET_CRYPTO_ALG_HMAC_SHA256;
-  i->icv_size = 12;
-
-  i = &im->integ_algs[IPSEC_INTEG_ALG_SHA_256_128];
-  i->op_id = VNET_CRYPTO_OP_SHA256_HMAC;
-  i->alg = VNET_CRYPTO_ALG_HMAC_SHA256;
-  i->icv_size = 16;
-
-  i = &im->integ_algs[IPSEC_INTEG_ALG_SHA_384_192];
-  i->op_id = VNET_CRYPTO_OP_SHA384_HMAC;
-  i->alg = VNET_CRYPTO_ALG_HMAC_SHA384;
-  i->icv_size = 24;
-
-  i = &im->integ_algs[IPSEC_INTEG_ALG_SHA_512_256];
-  i->op_id = VNET_CRYPTO_OP_SHA512_HMAC;
-  i->alg = VNET_CRYPTO_ALG_HMAC_SHA512;
-  i->icv_size = 32;
-
   vec_validate_aligned (im->ptd, vlib_num_workers (), CLIB_CACHE_LINE_BYTES);
 
   im->async_mode = 0;
index 9ab054c..3409d0e 100644 (file)
@@ -112,19 +112,19 @@ typedef struct
 
 typedef struct
 {
-  vnet_crypto_op_id_t enc_op_id;
-  vnet_crypto_op_id_t dec_op_id;
-  vnet_crypto_alg_t alg;
-  u8 iv_size;
-  u8 block_align;
-  u8 icv_size;
+  const vnet_crypto_op_id_t enc_op_id;
+  const vnet_crypto_op_id_t dec_op_id;
+  const vnet_crypto_alg_t alg;
+  const u8 iv_size;
+  const u8 block_align;
+  const u8 icv_size;
 } ipsec_main_crypto_alg_t;
 
 typedef struct
 {
-  vnet_crypto_op_id_t op_id;
-  vnet_crypto_alg_t alg;
-  u8 icv_size;
+  const vnet_crypto_op_id_t op_id;
+  const vnet_crypto_alg_t alg;
+  const u8 icv_size;
 } ipsec_main_integ_alg_t;
 
 typedef struct
@@ -224,10 +224,10 @@ typedef struct
   u32 esp_default_backend;
 
   /* crypto alg data */
-  ipsec_main_crypto_alg_t *crypto_algs;
+  ipsec_main_crypto_alg_t crypto_algs[IPSEC_CRYPTO_N_ALG];
 
   /* crypto integ data */
-  ipsec_main_integ_alg_t *integ_algs;
+  ipsec_main_integ_alg_t integ_algs[IPSEC_INTEG_N_ALG];
 
   /* per-thread data */
   ipsec_per_thread_data_t *ptd;
diff --git a/src/vnet/ipsec/main.c b/src/vnet/ipsec/main.c
new file mode 100644 (file)
index 0000000..e17d1dc
--- /dev/null
@@ -0,0 +1,181 @@
+/* SPDX-License-Identifier: Apache-2.0
+ * Copyright(c) 2025 Cisco Systems, Inc.
+ */
+
+#include <vlib/vlib.h>
+#include <vnet/ipsec/ipsec.h>
+
+ipsec_main_t ipsec_main = {
+  .crypto_algs = {
+    [IPSEC_CRYPTO_ALG_NONE] = {
+      .enc_op_id = VNET_CRYPTO_OP_NONE,
+      .dec_op_id = VNET_CRYPTO_OP_NONE,
+      .alg = VNET_CRYPTO_ALG_NONE,
+      .iv_size = 0,
+      .block_align = 1,
+    },
+
+    [IPSEC_CRYPTO_ALG_DES_CBC] = {
+      .enc_op_id = VNET_CRYPTO_OP_DES_CBC_ENC,
+      .dec_op_id = VNET_CRYPTO_OP_DES_CBC_DEC,
+      .alg = VNET_CRYPTO_ALG_DES_CBC,
+      .iv_size = 8,
+      .block_align = 8,
+    },
+
+    [IPSEC_CRYPTO_ALG_3DES_CBC] = {
+      .enc_op_id = VNET_CRYPTO_OP_3DES_CBC_ENC,
+      .dec_op_id = VNET_CRYPTO_OP_3DES_CBC_DEC,
+      .alg = VNET_CRYPTO_ALG_3DES_CBC,
+      .iv_size = 8,
+      .block_align = 8,
+    },
+
+    [IPSEC_CRYPTO_ALG_AES_CBC_128] = {
+      .enc_op_id = VNET_CRYPTO_OP_AES_128_CBC_ENC,
+      .dec_op_id = VNET_CRYPTO_OP_AES_128_CBC_DEC,
+      .alg = VNET_CRYPTO_ALG_AES_128_CBC,
+      .iv_size = 16,
+      .block_align = 16,
+    },
+
+    [IPSEC_CRYPTO_ALG_AES_CBC_192] = {
+      .enc_op_id = VNET_CRYPTO_OP_AES_192_CBC_ENC,
+      .dec_op_id = VNET_CRYPTO_OP_AES_192_CBC_DEC,
+      .alg = VNET_CRYPTO_ALG_AES_192_CBC,
+      .iv_size = 16,
+      .block_align = 16,
+    },
+
+    [IPSEC_CRYPTO_ALG_AES_CBC_256] = {
+      .enc_op_id = VNET_CRYPTO_OP_AES_256_CBC_ENC,
+      .dec_op_id = VNET_CRYPTO_OP_AES_256_CBC_DEC,
+      .alg = VNET_CRYPTO_ALG_AES_256_CBC,
+      .iv_size = 16,
+      .block_align = 16,
+    },
+
+    [IPSEC_CRYPTO_ALG_AES_CTR_128] = {
+      .enc_op_id = VNET_CRYPTO_OP_AES_128_CTR_ENC,
+      .dec_op_id = VNET_CRYPTO_OP_AES_128_CTR_DEC,
+      .alg = VNET_CRYPTO_ALG_AES_128_CTR,
+      .iv_size = 8,
+      .block_align = 1,
+    },
+
+    [IPSEC_CRYPTO_ALG_AES_CTR_192] = {
+      .enc_op_id = VNET_CRYPTO_OP_AES_192_CTR_ENC,
+      .dec_op_id = VNET_CRYPTO_OP_AES_192_CTR_DEC,
+      .alg = VNET_CRYPTO_ALG_AES_192_CTR,
+      .iv_size = 8,
+      .block_align = 1,
+    },
+
+    [IPSEC_CRYPTO_ALG_AES_CTR_256] = {
+      .enc_op_id = VNET_CRYPTO_OP_AES_256_CTR_ENC,
+      .dec_op_id = VNET_CRYPTO_OP_AES_256_CTR_DEC,
+      .alg = VNET_CRYPTO_ALG_AES_256_CTR,
+      .iv_size = 8,
+      .block_align = 1,
+    },
+
+    [IPSEC_CRYPTO_ALG_AES_GCM_128] = {
+      .enc_op_id = VNET_CRYPTO_OP_AES_128_GCM_ENC,
+      .dec_op_id = VNET_CRYPTO_OP_AES_128_GCM_DEC,
+      .alg = VNET_CRYPTO_ALG_AES_128_GCM,
+      .iv_size = 8,
+      .block_align = 1,
+      .icv_size = 16,
+    },
+
+    [IPSEC_CRYPTO_ALG_AES_GCM_192] = {
+      .enc_op_id = VNET_CRYPTO_OP_AES_192_GCM_ENC,
+      .dec_op_id = VNET_CRYPTO_OP_AES_192_GCM_DEC,
+      .alg = VNET_CRYPTO_ALG_AES_192_GCM,
+      .iv_size = 8,
+      .block_align = 1,
+      .icv_size = 16,
+    },
+
+    [IPSEC_CRYPTO_ALG_AES_GCM_256] = {
+      .enc_op_id = VNET_CRYPTO_OP_AES_256_GCM_ENC,
+      .dec_op_id = VNET_CRYPTO_OP_AES_256_GCM_DEC,
+      .alg = VNET_CRYPTO_ALG_AES_256_GCM,
+      .iv_size = 8,
+      .block_align = 1,
+      .icv_size = 16,
+    },
+
+    [IPSEC_CRYPTO_ALG_CHACHA20_POLY1305] = {
+      .enc_op_id = VNET_CRYPTO_OP_CHACHA20_POLY1305_ENC,
+      .dec_op_id = VNET_CRYPTO_OP_CHACHA20_POLY1305_DEC,
+      .alg = VNET_CRYPTO_ALG_CHACHA20_POLY1305,
+      .iv_size = 8,
+      .icv_size = 16,
+    },
+
+    [IPSEC_CRYPTO_ALG_AES_NULL_GMAC_128] = {
+      .enc_op_id = VNET_CRYPTO_OP_AES_128_NULL_GMAC_ENC,
+      .dec_op_id = VNET_CRYPTO_OP_AES_128_NULL_GMAC_DEC,
+      .alg = VNET_CRYPTO_ALG_AES_128_GCM,
+      .iv_size = 8,
+      .block_align = 1,
+      .icv_size = 16,
+    },
+
+    [IPSEC_CRYPTO_ALG_AES_NULL_GMAC_192] = {
+      .enc_op_id = VNET_CRYPTO_OP_AES_192_NULL_GMAC_ENC,
+      .dec_op_id = VNET_CRYPTO_OP_AES_192_NULL_GMAC_DEC,
+      .alg = VNET_CRYPTO_ALG_AES_192_GCM,
+      .iv_size = 8,
+      .block_align = 1,
+      .icv_size = 16,
+    },
+
+    [IPSEC_CRYPTO_ALG_AES_NULL_GMAC_256] = {
+      .enc_op_id = VNET_CRYPTO_OP_AES_256_NULL_GMAC_ENC,
+      .dec_op_id = VNET_CRYPTO_OP_AES_256_NULL_GMAC_DEC,
+      .alg = VNET_CRYPTO_ALG_AES_256_GCM,
+      .iv_size = 8,
+      .block_align = 1,
+      .icv_size = 16,
+    },
+  },
+  .integ_algs = {
+    [IPSEC_INTEG_ALG_MD5_96] = {
+      .op_id = VNET_CRYPTO_OP_MD5_HMAC,
+      .alg = VNET_CRYPTO_ALG_HMAC_MD5,
+      .icv_size = 12,
+    },
+
+    [IPSEC_INTEG_ALG_SHA1_96] = {
+      .op_id = VNET_CRYPTO_OP_SHA1_HMAC,
+      .alg = VNET_CRYPTO_ALG_HMAC_SHA1,
+      .icv_size = 12,
+    },
+
+    [IPSEC_INTEG_ALG_SHA_256_96] = {
+      .op_id = VNET_CRYPTO_OP_SHA1_HMAC,
+      .alg = VNET_CRYPTO_ALG_HMAC_SHA256,
+      .icv_size = 12,
+    },
+
+    [IPSEC_INTEG_ALG_SHA_256_128] = {
+      .op_id = VNET_CRYPTO_OP_SHA256_HMAC,
+      .alg = VNET_CRYPTO_ALG_HMAC_SHA256,
+      .icv_size = 16,
+    },
+
+    [IPSEC_INTEG_ALG_SHA_384_192] = {
+      .op_id = VNET_CRYPTO_OP_SHA384_HMAC,
+      .alg = VNET_CRYPTO_ALG_HMAC_SHA384,
+      .icv_size = 24,
+    },
+
+    [IPSEC_INTEG_ALG_SHA_512_256] = {
+      .op_id = VNET_CRYPTO_OP_SHA512_HMAC,
+      .alg = VNET_CRYPTO_ALG_HMAC_SHA512,
+      .icv_size = 32,
+    },
+  },
+};