From 5757b4a50eec0c2448ea1f9081b20df59bfa56a5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Fr=C3=A9d=C3=A9ric=20L=C3=A9caille?= Date: Wed, 16 Feb 2022 14:46:17 +0100 Subject: [PATCH] MINOR: quic: Ensure PTO timer is not set in the past Wakeup asap the timer task when setting its timer in the past. Take also the opportunity of this patch to make simplify quic_pto_pktns(): calling tick_first() is useless here to compare with . --- include/haproxy/quic_loss.h | 6 ++---- src/xprt_quic.c | 8 ++++++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/include/haproxy/quic_loss.h b/include/haproxy/quic_loss.h index 0aea165ec3..2ba94a9fab 100644 --- a/include/haproxy/quic_loss.h +++ b/include/haproxy/quic_loss.h @@ -128,7 +128,7 @@ static inline struct quic_pktns *quic_pto_pktns(struct quic_conn *qc, unsigned int *pto) { int i; - unsigned int duration, lpto, time_of_last_eliciting; + unsigned int duration, lpto; struct quic_loss *ql = &qc->path->loss; struct quic_pktns *pktns, *p; @@ -170,9 +170,7 @@ static inline struct quic_pktns *quic_pto_pktns(struct quic_conn *qc, } p = &qc->pktns[i]; - time_of_last_eliciting = p->tx.time_of_last_eliciting; - tmp_pto = - tick_first(lpto, tick_add(time_of_last_eliciting, duration)); + tmp_pto = tick_add(p->tx.time_of_last_eliciting, duration); if (!tick_isset(lpto) || tmp_pto < lpto) { lpto = tmp_pto; pktns = p; diff --git a/src/xprt_quic.c b/src/xprt_quic.c index 6dccb13ba9..e225286534 100644 --- a/src/xprt_quic.c +++ b/src/xprt_quic.c @@ -646,8 +646,12 @@ static inline void qc_set_timer(struct quic_conn *qc) if (tick_isset(pto)) qc->timer = pto; out: - if (qc->timer_task && qc->timer != TICK_ETERNITY) - task_schedule(qc->timer_task, qc->timer); + if (qc->timer_task && qc->timer != TICK_ETERNITY) { + if (tick_is_expired(qc->timer, now_ms)) + task_wakeup(qc->timer_task, TASK_WOKEN_MSG); + else + task_schedule(qc->timer_task, qc->timer); + } TRACE_LEAVE(QUIC_EV_CONN_STIMER, qc, pktns); } -- 2.47.3