]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
QUIC TXP: Allow callbacks on ACK transmission
authorHugo Landau <hlandau@openssl.org>
Tue, 23 May 2023 11:23:06 +0000 (12:23 +0100)
committerPauli <pauli@openssl.org>
Thu, 15 Jun 2023 23:26:28 +0000 (09:26 +1000)
Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Paul Dale <pauli@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/21029)

include/internal/quic_txp.h
ssl/quic/quic_txp.c

index 31578bb1788aa00c16f42442c442578b35a92d49..7238fae1aa0c863fa6099f619676c264ea6bec6c 100644 (file)
@@ -184,6 +184,17 @@ void ossl_quic_tx_packetiser_set_msg_callback_arg(OSSL_QUIC_TX_PACKETISER *txp,
  */
 QUIC_PN ossl_quic_tx_packetiser_get_next_pn(OSSL_QUIC_TX_PACKETISER *txp,
                                             uint32_t pn_space);
+
+/*
+ * Sets a callback which is called whenever TXP sends an ACK frame. The callee
+ * must not modify the ACK frame data. Can be used to snoop on PNs being ACKed.
+ */
+void ossl_quic_tx_packetiser_set_ack_tx_cb(OSSL_QUIC_TX_PACKETISER *txp,
+                                           void (*cb)(const OSSL_QUIC_FRAME_ACK *ack,
+                                                      uint32_t pn_space,
+                                                      void *arg),
+                                           void *cb_arg);
+
 # endif
 
 #endif
index 08f3d7f7b69ef23cb7301258047efbe198c88412..7c5e4295f3812b50521368fbff28d3548dfbe612 100644 (file)
@@ -75,6 +75,11 @@ struct ossl_quic_tx_packetiser_st {
     void *msg_callback_arg;
     SSL *msg_callback_ssl;
 
+    /* Callbacks. */
+    void            (*ack_tx_cb)(const OSSL_QUIC_FRAME_ACK *ack,
+                                 uint32_t pn_space,
+                                 void *arg);
+    void            *ack_tx_cb_arg;
 };
 
 /*
@@ -474,6 +479,16 @@ int ossl_quic_tx_packetiser_set_peer(OSSL_QUIC_TX_PACKETISER *txp,
     return 1;
 }
 
+void ossl_quic_tx_packetiser_set_ack_tx_cb(OSSL_QUIC_TX_PACKETISER *txp,
+                                           void (*cb)(const OSSL_QUIC_FRAME_ACK *ack,
+                                                      uint32_t pn_space,
+                                                      void *arg),
+                                           void *cb_arg)
+{
+    txp->ack_tx_cb      = cb;
+    txp->ack_tx_cb_arg  = cb_arg;
+}
+
 int ossl_quic_tx_packetiser_discard_enc_level(OSSL_QUIC_TX_PACKETISER *txp,
                                               uint32_t enc_level)
 {
@@ -1247,6 +1262,9 @@ static int txp_generate_pre_token(OSSL_QUIC_TX_PACKETISER *txp,
 
             if (ack->num_ack_ranges > 0)
                 tpkt->ackm_pkt.largest_acked = ack->ack_ranges[0].end;
+
+            if (txp->ack_tx_cb != NULL)
+                txp->ack_tx_cb(&ack2, pn_space, txp->ack_tx_cb_arg);
         } else {
             tx_helper_rollback(h);
         }