+void
+ipsec_set_async_mode (u32 is_enabled)
+{
+ ipsec_main_t *im = &ipsec_main;
+ ipsec_sa_t *sa;
+
+ /* lock all SAs before change im->async_mode */
+ pool_foreach (sa, im->sad)
+ {
+ fib_node_lock (&sa->node);
+ }
+
+ im->async_mode = is_enabled;
+
+ /* change SA crypto op data before unlock them */
+ pool_foreach (sa, im->sad)
+ {
+ sa->crypto_op_data = is_enabled ?
+ sa->async_op_data.data : sa->sync_op_data.data;
+ fib_node_unlock (&sa->node);
+ }
+}
+
+static void
+crypto_engine_backend_register_post_node (vlib_main_t * vm)
+{
+ esp_async_post_next_t *eit;
+ esp_async_post_next_t *dit;
+
+ eit = &esp_encrypt_async_next;
+ eit->esp4_post_next =
+ vnet_crypto_register_post_node (vm, "esp4-encrypt-post");
+ eit->esp6_post_next =
+ vnet_crypto_register_post_node (vm, "esp6-encrypt-post");
+ eit->esp4_tun_post_next =
+ vnet_crypto_register_post_node (vm, "esp4-encrypt-tun-post");
+ eit->esp6_tun_post_next =
+ vnet_crypto_register_post_node (vm, "esp6-encrypt-tun-post");
+ eit->esp_mpls_tun_post_next =
+ vnet_crypto_register_post_node (vm, "esp-mpls-encrypt-tun-post");
+
+ dit = &esp_decrypt_async_next;
+ dit->esp4_post_next =
+ vnet_crypto_register_post_node (vm, "esp4-decrypt-post");
+ dit->esp6_post_next =
+ vnet_crypto_register_post_node (vm, "esp6-decrypt-post");
+ dit->esp4_tun_post_next =
+ vnet_crypto_register_post_node (vm, "esp4-decrypt-tun-post");
+ dit->esp6_tun_post_next =
+ vnet_crypto_register_post_node (vm, "esp6-decrypt-tun-post");
+}
+