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>.
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;
}
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;
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);
}