+void
+ipsec_sa_set_crypto_alg (ipsec_sa_t * sa, ipsec_crypto_alg_t crypto_alg)
+{
+ ipsec_main_t *im = &ipsec_main;
+ sa->crypto_alg = crypto_alg;
+ sa->crypto_iv_size = im->crypto_algs[crypto_alg].iv_size;
+ sa->esp_block_align = clib_max (4, im->crypto_algs[crypto_alg].block_align);
+ sa->sync_op_data.crypto_enc_op_id = im->crypto_algs[crypto_alg].enc_op_id;
+ sa->sync_op_data.crypto_dec_op_id = im->crypto_algs[crypto_alg].dec_op_id;
+ sa->crypto_calg = im->crypto_algs[crypto_alg].alg;
+ ASSERT (sa->crypto_iv_size <= ESP_MAX_IV_SIZE);
+ ASSERT (sa->esp_block_align <= ESP_MAX_BLOCK_SIZE);
+ if (IPSEC_CRYPTO_ALG_IS_GCM (crypto_alg))
+ {
+ sa->integ_icv_size = im->crypto_algs[crypto_alg].icv_size;
+ ipsec_sa_set_IS_CTR (sa);
+ ipsec_sa_set_IS_AEAD (sa);
+ }
+ else if (IPSEC_CRYPTO_ALG_IS_CTR (crypto_alg))
+ {
+ ipsec_sa_set_IS_CTR (sa);
+ }
+}
+
+void
+ipsec_sa_set_integ_alg (ipsec_sa_t * sa, ipsec_integ_alg_t integ_alg)
+{
+ ipsec_main_t *im = &ipsec_main;
+ sa->integ_alg = integ_alg;
+ sa->integ_icv_size = im->integ_algs[integ_alg].icv_size;
+ sa->sync_op_data.integ_op_id = im->integ_algs[integ_alg].op_id;
+ sa->integ_calg = im->integ_algs[integ_alg].alg;
+ ASSERT (sa->integ_icv_size <= ESP_MAX_ICV_SIZE);
+}
+
+void
+ipsec_sa_set_async_op_ids (ipsec_sa_t * sa)
+{
+ /* *INDENT-OFF* */
+ if (ipsec_sa_is_set_USE_ESN (sa))
+ {
+#define _(n, s, k) \
+ if( sa->sync_op_data.crypto_enc_op_id == VNET_CRYPTO_OP_##n##_ENC ) \
+ sa->async_op_data.crypto_async_enc_op_id = \
+ VNET_CRYPTO_OP_##n##_TAG16_AAD12_ENC; \
+ if( sa->sync_op_data.crypto_dec_op_id == VNET_CRYPTO_OP_##n##_DEC ) \
+ sa->async_op_data.crypto_async_dec_op_id = \
+ VNET_CRYPTO_OP_##n##_TAG16_AAD12_DEC;
+ foreach_crypto_aead_alg
+#undef _
+ }
+ else
+ {
+#define _(n, s, k) \
+ if( sa->sync_op_data.crypto_enc_op_id == VNET_CRYPTO_OP_##n##_ENC ) \
+ sa->async_op_data.crypto_async_enc_op_id = \
+ VNET_CRYPTO_OP_##n##_TAG16_AAD8_ENC; \
+ if( sa->sync_op_data.crypto_dec_op_id == VNET_CRYPTO_OP_##n##_DEC ) \
+ sa->async_op_data.crypto_async_dec_op_id = \
+ VNET_CRYPTO_OP_##n##_TAG16_AAD8_DEC;
+ foreach_crypto_aead_alg
+#undef _
+ }
+
+#define _(c, h, s, k ,d) \
+ if( sa->sync_op_data.crypto_enc_op_id == VNET_CRYPTO_OP_##c##_ENC && \
+ sa->sync_op_data.integ_op_id == VNET_CRYPTO_OP_##h##_HMAC) \
+ sa->async_op_data.crypto_async_enc_op_id = \
+ VNET_CRYPTO_OP_##c##_##h##_TAG##d##_ENC; \
+ if( sa->sync_op_data.crypto_dec_op_id == VNET_CRYPTO_OP_##c##_DEC && \
+ sa->sync_op_data.integ_op_id == VNET_CRYPTO_OP_##h##_HMAC) \
+ sa->async_op_data.crypto_async_dec_op_id = \
+ VNET_CRYPTO_OP_##c##_##h##_TAG##d##_DEC;
+ foreach_crypto_link_async_alg
+#undef _
+ /* *INDENT-ON* */
+}
+