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 <lpto> with <tmp_pto>.
diff --git a/include/haproxy/quic_loss.h b/include/haproxy/quic_loss.h
index 0aea165..2ba94a9 100644
--- a/include/haproxy/quic_loss.h
+++ b/include/haproxy/quic_loss.h
@@ -128,7 +128,7 @@
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 @@
}
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 6dccb13..e225286 100644
--- a/src/xprt_quic.c
+++ b/src/xprt_quic.c
@@ -646,8 +646,12 @@
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);
}