quic: refactor crypto context index encoding and debug output 05/43705/4
authorDave Wallace <[email protected]>
Tue, 16 Sep 2025 05:29:41 +0000 (01:29 -0400)
committerFlorin Coras <[email protected]>
Wed, 17 Sep 2025 19:29:13 +0000 (19:29 +0000)
- add encode / decode macros for consistency across quic engine
  implementations
- debug code cleanup

Type: refactor

Change-Id: I7d0412b78a7555dbd346c4cfee56481effe054a5
Signed-off-by: Dave Wallace <[email protected]>
src/plugins/quic/quic.c
src/plugins/quic/quic.h
src/plugins/quic_quicly/quic_quicly_crypto.c
src/plugins/quic_quicly/quic_quicly_crypto.h

index 64b0050..0ad0389 100644 (file)
@@ -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)
     {
index 40c0bc0..5f17a9b 100644 (file)
 #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)                \
index cc2780f..12f07c1 100644 (file)
@@ -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;
index 98a712c..c4e09bf 100644 (file)
 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