From 7abf5df4b065c036d0af462a2dbe490e591af3ee Mon Sep 17 00:00:00 2001 From: Dave Wallace Date: Tue, 16 Sep 2025 01:29:41 -0400 Subject: [PATCH] quic: refactor crypto context index encoding and debug output - add encode / decode macros for consistency across quic engine implementations - debug code cleanup Type: refactor Change-Id: I7d0412b78a7555dbd346c4cfee56481effe054a5 Signed-off-by: Dave Wallace --- src/plugins/quic/quic.c | 16 +++++++++------- src/plugins/quic/quic.h | 4 ++++ src/plugins/quic_quicly/quic_quicly_crypto.c | 17 ++++++++++++----- src/plugins/quic_quicly/quic_quicly_crypto.h | 4 ++-- 4 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/plugins/quic/quic.c b/src/plugins/quic/quic.c index 64b0050ff39..0ad0389aeb1 100644 --- a/src/plugins/quic/quic.c +++ b/src/plugins/quic/quic.c @@ -446,8 +446,9 @@ quic_stop_listen (u32 lctx_index) 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; @@ -464,7 +465,6 @@ quic_connection_get (u32 ctx_index, clib_thread_index_t thread_index) 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; @@ -523,7 +523,7 @@ format_quic_half_open (u8 * s, va_list * args) return s; } -/* TODO improve */ +/* TODO improve */ static u8 * format_quic_listener (u8 * s, va_list * args) { @@ -578,14 +578,16 @@ quic_udp_session_connected_callback (u32 quic_app_index, u32 ctx_index, 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) { diff --git a/src/plugins/quic/quic.h b/src/plugins/quic/quic.h index 40c0bc0c53c..5f17a9b8f29 100644 --- a/src/plugins/quic/quic.h +++ b/src/plugins/quic/quic.h @@ -43,6 +43,10 @@ #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) \ diff --git a/src/plugins/quic_quicly/quic_quicly_crypto.c b/src/plugins/quic_quicly/quic_quicly_crypto.c index cc2780fc295..12f07c12b07 100644 --- a/src/plugins/quic_quicly/quic_quicly_crypto.c +++ b/src/plugins/quic_quicly/quic_quicly_crypto.c @@ -71,8 +71,9 @@ quic_quicly_crypto_context_alloc (u8 thread_index) 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; } @@ -251,8 +252,12 @@ quic_quicly_init_crypto_context (crypto_context_t *crctx, quic_ctx_t *ctx) 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); @@ -402,7 +407,9 @@ quic_quicly_crypto_context_acquire (quic_ctx_t *ctx) 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; diff --git a/src/plugins/quic_quicly/quic_quicly_crypto.h b/src/plugins/quic_quicly/quic_quicly_crypto.h index 98a712cbfea..c4e09bfef60 100644 --- a/src/plugins/quic_quicly/quic_quicly_crypto.h +++ b/src/plugins/quic_quicly/quic_quicly_crypto.h @@ -16,10 +16,10 @@ 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 -- 2.16.6