From: Frédéric Lécaille Date: Wed, 16 Feb 2022 13:46:17 +0000 (+0100) Subject: MINOR: quic: Ensure PTO timer is not set in the past X-Git-Tag: v2.6-dev3~87 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5757b4a50eec0c2448ea1f9081b20df59bfa56a5;p=thirdparty%2Fhaproxy.git 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 . --- 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); }