]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
QUIC TXP: Add a function to query if the TXP wants to generate a packet
authorHugo Landau <hlandau@openssl.org>
Mon, 31 Oct 2022 16:03:03 +0000 (16:03 +0000)
committerHugo Landau <hlandau@openssl.org>
Fri, 13 Jan 2023 13:20:12 +0000 (13:20 +0000)
For use by QUIC CSM.

Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/19703)

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

index e1983a57c71b4bbe1455de3dbcb497ba8ec91b9f..0ba14d356fa7a22ac5047d3547159e6c07eecec4 100644 (file)
@@ -86,6 +86,19 @@ void ossl_quic_tx_packetiser_free(OSSL_QUIC_TX_PACKETISER *txp);
 int ossl_quic_tx_packetiser_generate(OSSL_QUIC_TX_PACKETISER *txp,
                                      uint32_t archetype);
 
+/*
+ * Returns 1 if one or more packets would be generated if
+ * ossl_quic_tx_packetiser_generate were called.
+ *
+ * If TX_PACKETISER_BYPASS_CC is set in flags, congestion control is
+ * ignored for the purposes of making this determination.
+ */
+#define TX_PACKETISER_BYPASS_CC   (1U << 0)
+
+int ossl_quic_tx_packetiser_has_pending(OSSL_QUIC_TX_PACKETISER *txp,
+                                        uint32_t archetype,
+                                        uint32_t flags);
+
 /*
  * Set the token used in Initial packets. The callback is called when the buffer
  * is no longer needed; for example, when the TXP is freed or when this function
index 8508e875031ec1b5fc706d2b2512804f82b6c0b3..6224891a35bf07bb5a7e7cb0d1809542da03d436 100644 (file)
@@ -460,6 +460,25 @@ void ossl_quic_tx_packetiser_schedule_ack_eliciting(OSSL_QUIC_TX_PACKETISER *txp
 #define TXP_ERR_SPACE        2  /* Not enough room for another packet */
 #define TXP_ERR_INPUT        3  /* Invalid/malformed input */
 
+int ossl_quic_tx_packetiser_has_pending(OSSL_QUIC_TX_PACKETISER *txp,
+                                        uint32_t archetype,
+                                        uint32_t flags)
+{
+    uint32_t enc_level;
+    int bypass_cc = ((flags & TX_PACKETISER_BYPASS_CC) != 0);
+
+    if (!bypass_cc && !txp->args.cc_method->can_send(txp->args.cc_data))
+        return 0;
+
+    for (enc_level = QUIC_ENC_LEVEL_INITIAL;
+         enc_level < QUIC_ENC_LEVEL_NUM;
+         ++enc_level)
+        if (txp_el_pending(txp, enc_level, archetype))
+            return 1;
+
+    return 0;
+}
+
 /*
  * Generates a datagram by polling the various ELs to determine if they want to
  * generate any frames, and generating a datagram which coalesces packets for