ipsec: compress ipsec_sa_t so data used by dataplane code fits in cacheline
[vpp.git] / src / vnet / crypto / crypto.h
index 9f4c85b..62db291 100644 (file)
@@ -28,6 +28,7 @@
   _(AES_256_CBC, "aes-256-cbc")
 
 #define foreach_hmac_alg \
+  _(MD5, "md5") \
   _(SHA1, "sha-1") \
   _(SHA224, "sha-224")  \
   _(SHA256, "sha-256")  \
@@ -56,9 +57,12 @@ typedef enum
   foreach_hmac_alg
 #undef _
     VNET_CRYPTO_N_OP_TYPES,
-} vnet_crypto_op_type_t;
+} __attribute__ ((packed)) vnet_crypto_op_type_t;
 /* *INDENT-ON* */
 
+STATIC_ASSERT (sizeof (vnet_crypto_op_type_t) <= 2,
+              "crypto op type > 2 bytes");
+
 typedef struct
 {
   char *name;
@@ -69,14 +73,17 @@ typedef enum
   VNET_CRYPTO_OP_STATUS_PENDING,
   VNET_CRYPTO_OP_STATUS_COMPLETED,
   VNET_CRYPTO_OP_STATUS_FAIL_NO_HANDLER,
-} vnet_crypto_op_status_t;
+} __attribute__ ((packed)) vnet_crypto_op_status_t;
+
+STATIC_ASSERT (sizeof (vnet_crypto_op_status_t) == 1,
+              "crypto op status > 1 byte");
 
 typedef struct
 {
   CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
-  vnet_crypto_op_type_t op:16;
-  vnet_crypto_op_status_t status:8;
-  u8 key_len;
+  vnet_crypto_op_type_t op;
+  vnet_crypto_op_status_t status;
+  u8 key_len, hmac_trunc_len;
   u16 flags;
 #define VNET_CRYPTO_OP_FLAG_INIT_IV 1
   u32 len;
@@ -84,6 +91,7 @@ typedef struct
   u8 *iv;
   u8 *src;
   u8 *dst;
+  uword user_data;
 } vnet_crypto_op_t;
 
 typedef struct
@@ -138,6 +146,8 @@ typedef struct
   vnet_crypto_ops_handler_t **ops_handlers;
   vnet_crypto_op_type_data_t opt_data[VNET_CRYPTO_N_OP_TYPES];
   vnet_crypto_engine_t *engines;
+  uword *engine_index_by_name;
+  uword *ops_handler_index_by_name;
 } vnet_crypto_main_t;
 
 extern vnet_crypto_main_t crypto_main;
@@ -148,6 +158,9 @@ u32 vnet_crypto_submit_ops (vlib_main_t * vm, vnet_crypto_op_t ** jobs,
 u32 vnet_crypto_process_ops (vlib_main_t * vm, vnet_crypto_op_t ops[],
                             u32 n_ops);
 
+
+int vnet_crypto_set_handler (char *ops_handler_name, char *engine);
+
 format_function_t format_vnet_crypto_alg;
 format_function_t format_vnet_crypto_engine;
 format_function_t format_vnet_crypto_op;