if (vnet_unlisten (&a))
clib_warning ("unlisten errored");
- quic_eng_crypto_context_release (lctx->crypto_context_index,
- 0 /* thread_index */);
+ quic_eng_crypto_context_release (
+ lctx->crypto_context_index,
+ QUIC_CRCTX_CTX_INDEX_DECODE_THREAD (lctx->crypto_context_index));
quic_ctx_free (&quic_main, lctx);
}
return 0;
static transport_connection_t *
quic_listener_get (u32 listener_index)
{
- QUIC_DBG (2, "Called quic_listener_get");
quic_ctx_t *ctx;
ctx = quic_ctx_get (listener_index, 0);
return &ctx->connection;
return s;
}
-/* TODO improve */
+/* TODO improve */
static u8 *
format_quic_listener (u8 * s, va_list * args)
{
clib_thread_index_t thread_index;
int ret;
- QUIC_DBG (2, "UDP Session connect callback (id %u)",
- udp_session->session_index);
+ QUIC_DBG (2, "UDP Session connect callback: session_index %u, thread %u",
+ udp_session->session_index, udp_session->thread_index);
/* Allocate session on whatever thread udp used, i.e., probably first
* worker, although this may be main thread. If it is main, it's done
* with a worker barrier */
thread_index = udp_session->thread_index;
- ASSERT (thread_index == 0 || thread_index == 1);
+ ASSERT (thread_index == 0 ||
+ thread_index ==
+ 1); /* TODO: FIXME multi-worker support (e.g. thread > 1) */
ctx = quic_ctx_get (ctx_index, thread_index);
if (err)
{
#define QUIC_CTX_POOL_PER_THREAD_SIZE 256
#define QUIC_CRYPTO_CTX_POOL_PER_THREAD_SIZE 256
+#define QUIC_CRCTX_CTX_INDEX_DECODE_INDEX(I) ((I) &0x00ffffff)
+#define QUIC_CRCTX_CTX_INDEX_DECODE_THREAD(I) ((I) >> 24)
+#define QUIC_CRCTX_CTX_INDEX_ENCODE(T, I) (((u32) (T)) << 24 | (I))
+
#if QUIC_DEBUG
#define QUIC_DBG(_lvl, _fmt, _args...) \
if (_lvl <= QUIC_DEBUG) \
pool_get_aligned_safe (wc->crypto_ctx_pool, crctx, CLIB_CACHE_LINE_BYTES);
clib_memset (crctx, 0, sizeof (*crctx));
idx = (crctx - wc->crypto_ctx_pool);
- crctx->ctx_index = ((u32) thread_index) << 24 | idx;
- QUIC_DBG (3, "Allocated crctx %u on thread %u", idx, thread_index);
+ crctx->ctx_index = QUIC_CRCTX_CTX_INDEX_ENCODE (thread_index, idx);
+ QUIC_DBG (2, "Allocated crctx_ndx 0x%08lx (%u) on thread %u",
+ crctx->ctx_index, crctx->ctx_index, thread_index);
return crctx;
}
ptls_context_t *ptls_ctx;
u32 i;
- QUIC_DBG (2, "Init quic crctx %d thread %d", crctx->ctx_index,
- ctx->c_thread_index);
+ ASSERT (QUIC_CRCTX_CTX_INDEX_DECODE_THREAD (crctx->ctx_index) ==
+ ctx->c_thread_index);
+ ASSERT (QUIC_CRCTX_CTX_INDEX_DECODE_THREAD (crctx->ctx_index) ==
+ vlib_get_thread_index ());
+ QUIC_DBG (2, "Init crypto context: crctx_ndx 0x%08lx (%u), thread %d",
+ crctx->ctx_index, crctx->ctx_index, ctx->c_thread_index);
quic_quicly_register_cipher_suite (CRYPTO_ENGINE_PICOTLS,
ptls_openssl_cipher_suites);
0)
{
crctx = quic_quicly_crypto_context_get (kv.value, ctx->c_thread_index);
- QUIC_DBG (2, "Found exisiting crypto context %d", kv.value);
+ QUIC_DBG (
+ 2, "Found existing crypto context: crctx_ndx 0x%lx (%d), thread %u",
+ kv.value, kv.value, ctx->c_thread_index);
ctx->crypto_context_index = kv.value;
crctx->n_subscribers++;
return 0;
static_always_inline crypto_context_t *
quic_quicly_crypto_context_get (u32 cr_index, u32 thread_index)
{
- ASSERT (cr_index >> 24 == thread_index);
+ ASSERT (QUIC_CRCTX_CTX_INDEX_DECODE_THREAD (cr_index) == thread_index);
return pool_elt_at_index (
quic_wrk_ctx_get (quic_quicly_main.qm, thread_index)->crypto_ctx_pool,
- cr_index & 0x00ffffff);
+ QUIC_CRCTX_CTX_INDEX_DECODE_INDEX (cr_index));
}
#define QUIC_IV_LEN 17