]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: quic: Wake up the mux to probe with new data
authorFrédéric Lécaille <flecaille@haproxy.com>
Tue, 26 Apr 2022 11:54:28 +0000 (13:54 +0200)
committerAmaury Denoyelle <adenoyelle@haproxy.com>
Thu, 28 Apr 2022 14:22:40 +0000 (16:22 +0200)
When we have to probe the peer, we must first try to send new data. This is done
here waking up the mux after having set the number of maximum number of datagrams
to send to QUIC_MAX_NB_PTO_DGRAMS (2). Of course, this is only the case if the
mux was subscribed to SEND events.

src/xprt_quic.c

index f1e4d28fe0bf50e5025ee3efe62340a509aa1811..12833c352efcd4baa5d39b15a6cbbf6a87a436ab 100644 (file)
@@ -4244,12 +4244,24 @@ static struct task *process_timer(struct task *task, void *ctx, unsigned int sta
        }
 
        if (qc->path->in_flight) {
-               qc->flags |= QUIC_FL_CONN_RETRANS_NEEDED;
                pktns = quic_pto_pktns(qc, qc->state >= QUIC_HS_ST_COMPLETE, NULL);
-               pktns->flags |= QUIC_FL_PKTNS_PROBE_NEEDED;
-               if (pktns == &qc->pktns[QUIC_TLS_PKTNS_INITIAL]) {
-                       if (qc->pktns[QUIC_TLS_PKTNS_HANDSHAKE].tx.in_flight)
-                               qc->pktns[QUIC_TLS_PKTNS_HANDSHAKE].flags |= QUIC_FL_PKTNS_PROBE_NEEDED;
+               if (qc->mux_state == QC_MUX_READY && qc->qcc->subs &&
+                   qc->qcc->subs->events & SUB_RETRY_SEND) {
+                       struct qcc *qcc = qc->qcc;
+
+                       pktns->tx.pto_probe = QUIC_MAX_NB_PTO_DGRAMS;
+                       tasklet_wakeup(qcc->subs->tasklet);
+                       qcc->subs->events &= ~SUB_RETRY_SEND;
+                       if (!qcc->subs->events)
+                               qcc->subs = NULL;
+               }
+               else {
+                       qc->flags |= QUIC_FL_CONN_RETRANS_NEEDED;
+                       pktns->flags |= QUIC_FL_PKTNS_PROBE_NEEDED;
+                       if (pktns == &qc->pktns[QUIC_TLS_PKTNS_INITIAL]) {
+                               if (qc->pktns[QUIC_TLS_PKTNS_HANDSHAKE].tx.in_flight)
+                                       qc->pktns[QUIC_TLS_PKTNS_HANDSHAKE].flags |= QUIC_FL_PKTNS_PROBE_NEEDED;
+                       }
                }
        }
        else if (!qc_is_listener(qc) && qc->state <= QUIC_HS_ST_COMPLETE) {