From: Amaury Denoyelle Date: Mon, 8 Aug 2022 16:15:24 +0000 (+0200) Subject: MINOR: quic: skip sending if no frame to send in io-cb X-Git-Tag: v2.7-dev4~67 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c09ef0c5fcfaf9cce9d7e0dd072e6e04e3db2bc9;p=thirdparty%2Fhaproxy.git MINOR: quic: skip sending if no frame to send in io-cb Check on quic_conn_io_cb() if sending is required. This allows to skip over Tx buffer allocation if not needed. To implement this, we check if frame lists on current and next encryption level are empty. We also need to check if there is no need to send ACK, PROBE or CONNECTION_CLOSE. This has been isolated in a new function qc_need_sending() which may be reuse in some other functions in the future. --- diff --git a/src/xprt_quic.c b/src/xprt_quic.c index cc2afd1fee..076d93699b 100644 --- a/src/xprt_quic.c +++ b/src/xprt_quic.c @@ -3837,6 +3837,15 @@ out: return t; } +/* Returns a boolean if needs to emit frames for encryption level. */ +static int qc_need_sending(struct quic_conn *qc, struct quic_enc_level *qel) +{ + return (qc->flags & QUIC_FL_CONN_IMMEDIATE_CLOSE) || + (qel->pktns->flags & QUIC_FL_PKTNS_ACK_REQUIRED) || + qel->pktns->tx.pto_probe || + !LIST_ISEMPTY(&qel->pktns->tx.frms); +} + /* QUIC connection packet handler task. */ struct task *quic_conn_io_cb(struct task *t, void *context, unsigned int state) { @@ -3952,6 +3961,9 @@ struct task *quic_conn_io_cb(struct task *t, void *context, unsigned int state) if (!quic_get_tls_enc_levels(&tel, &next_tel, st, 0)) goto err; + if (!qc_need_sending(qc, qel) && !qc_need_sending(qc, next_qel)) + goto skip_send; + buf = qc_txb_alloc(qc); if (!buf) goto err;