From: Matt Caswell Date: Fri, 18 Aug 2023 10:55:50 +0000 (+0100) Subject: Don't keep creating CONNECTION_CLOSE frames X-Git-Tag: openssl-3.2.0-alpha1~161 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0b31072e086dc9a53f62cec60ea8d565320e640a;p=thirdparty%2Fopenssl.git Don't keep creating CONNECTION_CLOSE frames If we want to send a CONNECTION_CLOSE frame then one is enough unless we are scheduled to send another one. Now that we can create more than one datagram in one go this is now required. Reviewed-by: Hugo Landau Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/21798) --- diff --git a/include/internal/quic_txpim.h b/include/internal/quic_txpim.h index 3415230c727..0f1f11c6309 100644 --- a/include/internal/quic_txpim.h +++ b/include/internal/quic_txpim.h @@ -40,6 +40,7 @@ typedef struct quic_txpim_pkt_st { unsigned int had_max_streams_bidi_frame : 1; unsigned int had_max_streams_uni_frame : 1; unsigned int had_ack_frame : 1; + unsigned int had_conn_close : 1; /* Private data follows. */ } QUIC_TXPIM_PKT; diff --git a/ssl/quic/quic_txp.c b/ssl/quic/quic_txp.c index 54b691c9bab..51802ba7b61 100644 --- a/ssl/quic/quic_txp.c +++ b/ssl/quic/quic_txp.c @@ -1804,6 +1804,7 @@ static int txp_generate_pre_token(OSSL_QUIC_TX_PACKETISER *txp, if (!tx_helper_commit(h)) return 0; + tpkt->had_conn_close = 1; *can_be_non_inflight = 0; } else { tx_helper_rollback(h); @@ -2944,6 +2945,9 @@ static int txp_pkt_commit(OSSL_QUIC_TX_PACKETISER *txp, if (tpkt->had_ack_frame) txp->want_ack &= ~(1UL << pn_space); + if (tpkt->had_conn_close) + txp->want_conn_close = 0; + /* * Decrement probe request counts if we have sent a packet that meets * the requirement of a probe, namely being ACK-eliciting. diff --git a/ssl/quic/quic_txpim.c b/ssl/quic/quic_txpim.c index 3a7662292b9..716a0141ab5 100644 --- a/ssl/quic/quic_txpim.c +++ b/ssl/quic/quic_txpim.c @@ -115,6 +115,7 @@ static void txpim_clear(QUIC_TXPIM_PKT_EX *ex) ex->public.had_max_streams_bidi_frame = 0; ex->public.had_max_streams_uni_frame = 0; ex->public.had_ack_frame = 0; + ex->public.had_conn_close = 0; } QUIC_TXPIM_PKT *ossl_quic_txpim_pkt_alloc(QUIC_TXPIM *txpim)