+static void *
+openssl_ctx_detach (tls_ctx_t *ctx)
+{
+ openssl_ctx_t *oc = (openssl_ctx_t *) ctx, *oc_copy;
+
+ oc_copy = clib_mem_alloc (sizeof (*oc_copy));
+ clib_memcpy (oc_copy, oc, sizeof (*oc));
+
+ return oc_copy;
+}
+
+static u32
+openssl_ctx_attach (u32 thread_index, void *ctx_ptr)
+{
+ openssl_main_t *om = &openssl_main;
+ session_handle_t sh;
+ openssl_ctx_t **oc;
+
+ pool_get (om->ctx_pool[thread_index], oc);
+ /* Free the old instance instead of looking for an empty spot */
+ if (*oc)
+ clib_mem_free (*oc);
+
+ *oc = ctx_ptr;
+ (*oc)->openssl_ctx_index = oc - om->ctx_pool[thread_index];
+ (*oc)->ctx.c_thread_index = thread_index;
+
+ sh = (*oc)->ctx.tls_session_handle;
+ BIO_set_data ((*oc)->rbio, uword_to_pointer (sh, void *));
+ BIO_set_data ((*oc)->wbio, uword_to_pointer (sh, void *));
+
+ return ((*oc)->openssl_ctx_index);
+}
+