QUIC FIFD: Allow QLOG instance retrieval via callback
authorHugo Landau <hlandau@openssl.org>
Mon, 12 Feb 2024 09:49:32 +0000 (09:49 +0000)
committerTomas Mraz <tomas@openssl.org>
Mon, 19 Feb 2024 09:15:46 +0000 (10:15 +0100)
Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Neil Horman <nhorman@openssl.org>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/23535)

include/internal/quic_fifd.h
ssl/quic/quic_fifd.c
test/quic_fifd_test.c

index 0f5462c2a34d24ed171436aca63084b0cad9a082..a0354bdf788b3f631b51a08a2476216b72b85ae6 100644 (file)
@@ -46,7 +46,8 @@ struct quic_fifd_st {
     void          (*sstream_updated)(uint64_t stream_id,
                                    void *arg);
     void           *sstream_updated_arg;
-    QLOG           *qlog;
+    QLOG         *(*get_qlog_cb)(void *arg);
+    void           *get_qlog_cb_arg;
 };
 
 int ossl_quic_fifd_init(QUIC_FIFD *fifd,
@@ -72,13 +73,15 @@ int ossl_quic_fifd_init(QUIC_FIFD *fifd,
                         void (*sstream_updated)(uint64_t stream_id,
                                                 void *arg),
                         void *sstream_updated_arg,
-                        QLOG *qlog);
+                        QLOG *(*get_qlog_cb)(void *arg),
+                        void *get_qlog_cb_arg);
 
 void ossl_quic_fifd_cleanup(QUIC_FIFD *fifd); /* (no-op) */
 
 int ossl_quic_fifd_pkt_commit(QUIC_FIFD *fifd, QUIC_TXPIM_PKT *pkt);
 
-void ossl_quic_fifd_set0_qlog(QUIC_FIFD *fifd, QLOG *qlog);
+void ossl_quic_fifd_set_qlog_cb(QUIC_FIFD *fifd, QLOG *(*get_qlog_cb)(void *arg),
+                                void *arg);
 
 # endif
 
index 0abc8cb628798b61cfba13bbcb96cabeee319db0..89e0c3ca01b7637a4debba054ce41f89ca26c975 100644 (file)
@@ -36,7 +36,8 @@ int ossl_quic_fifd_init(QUIC_FIFD *fifd,
                         void (*sstream_updated)(uint64_t stream_id,
                                                 void *arg),
                         void *sstream_updated_arg,
-                        QLOG *qlog)
+                        QLOG *(*get_qlog_cb)(void *arg),
+                        void *get_qlog_cb_arg)
 {
     if (cfq == NULL || ackm == NULL || txpim == NULL
         || get_sstream_by_id == NULL || regen_frame == NULL)
@@ -53,7 +54,8 @@ int ossl_quic_fifd_init(QUIC_FIFD *fifd,
     fifd->confirm_frame_arg     = confirm_frame_arg;
     fifd->sstream_updated       = sstream_updated;
     fifd->sstream_updated_arg   = sstream_updated_arg;
-    fifd->qlog                  = qlog;
+    fifd->get_qlog_cb           = get_qlog_cb;
+    fifd->get_qlog_cb_arg       = get_qlog_cb_arg;
     return 1;
 }
 
@@ -110,6 +112,14 @@ static void on_acked(void *arg)
     ossl_quic_txpim_pkt_release(fifd->txpim, pkt);
 }
 
+static QLOG *fifd_get_qlog(QUIC_FIFD *fifd)
+{
+    if (fifd->get_qlog_cb == NULL)
+        return NULL;
+
+    return fifd->get_qlog_cb(fifd->get_qlog_cb_arg);
+}
+
 static void on_lost(void *arg)
 {
     QUIC_TXPIM_PKT *pkt = arg;
@@ -120,7 +130,7 @@ static void on_lost(void *arg)
     QUIC_CFQ_ITEM *cfq_item, *cfq_item_next;
     int sstream_updated;
 
-    ossl_qlog_event_recovery_packet_lost(fifd->qlog, pkt);
+    ossl_qlog_event_recovery_packet_lost(fifd_get_qlog(fifd), pkt);
 
     /* STREAM and CRYPTO stream chunks, FIN and stream FC frames */
     for (i = 0; i < num_chunks; ++i) {
@@ -294,7 +304,9 @@ int ossl_quic_fifd_pkt_commit(QUIC_FIFD *fifd, QUIC_TXPIM_PKT *pkt)
     return ossl_ackm_on_tx_packet(fifd->ackm, &pkt->ackm_pkt);
 }
 
-void ossl_quic_fifd_set0_qlog(QUIC_FIFD *fifd, QLOG *qlog)
+void ossl_quic_fifd_set_qlog_cb(QUIC_FIFD *fifd, QLOG *(*get_qlog_cb)(void *arg),
+                                void *get_qlog_cb_arg)
 {
-    fifd->qlog = qlog;
+    fifd->get_qlog_cb       = get_qlog_cb;
+    fifd->get_qlog_cb_arg   = get_qlog_cb_arg;
 }
index e560e5a253ca1242281f65c416a04691b3c8e0b8..6a70843ceb1d248f088b361488325bfeebaaf3bf 100644 (file)
@@ -339,7 +339,7 @@ static int test_fifd(int idx)
                                           regen_frame, NULL,
                                           confirm_frame, NULL,
                                           sstream_updated, NULL,
-                                          NULL)))
+                                          NULL, NULL)))
         goto err;
 
     for (i = 0; i < OSSL_NELEM(info.sstream); ++i)