+ if (PREDICT_FALSE (~0 == sa0->encrypt_thread_index))
+ {
+ /* this is the first packet to use this SA, claim the SA
+ * for this thread. this could happen simultaneously on
+ * another thread */
+ clib_atomic_cmp_and_swap (&sa0->encrypt_thread_index, ~0,
+ ipsec_sa_assign_thread (thread_index));
+ }
+
+ if (PREDICT_TRUE (thread_index != sa0->encrypt_thread_index))
+ {
+ next[0] = ESP_ENCRYPT_NEXT_HANDOFF;
+ if (is_tun)
+ {
+ b[0]->current_config_index = config_index;
+ }
+ goto trace;
+ }
+