diff --git a/src/quic_conn.c b/src/quic_conn.c index f13f474d0..e49b91c27 100644 --- a/src/quic_conn.c +++ b/src/quic_conn.c @@ -1716,9 +1716,13 @@ void qc_idle_timer_do_rearm(struct quic_conn *qc, int arm_ack) { unsigned int expire; + TRACE_ENTER(QUIC_EV_CONN_IDLE_TIMER, qc); + /* It is possible the idle timer task has been already released. */ - if (!qc->idle_timer_task) - return; + if (!qc->idle_timer_task) { + TRACE_PROTO("idle timer already released", QUIC_EV_CONN_IDLE_TIMER, qc); + goto leave; + } if (qc->flags & (QUIC_FL_CONN_CLOSING|QUIC_FL_CONN_DRAINING)) { /* RFC 9000 10.2. Immediate Close @@ -1747,6 +1751,8 @@ void qc_idle_timer_do_rearm(struct quic_conn *qc, int arm_ack) expire = QUIC_MAX(3 * quic_pto(qc), qc->max_idle_timeout); } + TRACE_PRINTF(TRACE_LEVEL_PROTO, QUIC_EV_CONN_IDLE_TIMER, qc, 0, 0, 0, + "quic_pto=%u expire=%u", quic_pto(qc), expire); qc->idle_expire = tick_add(now_ms, MS_TO_TICKS(expire)); /* Note that the ACK timer is not armed during the handshake. So, * the handshake expiration date is taken into an account only @@ -1768,6 +1774,9 @@ void qc_idle_timer_do_rearm(struct quic_conn *qc, int arm_ack) task_queue(qc->idle_timer_task); TRACE_PROTO("idle timer armed", QUIC_EV_CONN_IDLE_TIMER, qc); } + + leave: + TRACE_LEAVE(QUIC_EV_CONN_IDLE_TIMER, qc); } /* Rearm the idle timer or ack timer for QUIC connection depending on diff --git a/src/quic_trace.c b/src/quic_trace.c index a19e65b37..6911893f5 100644 --- a/src/quic_trace.c +++ b/src/quic_trace.c @@ -119,6 +119,9 @@ static void quic_trace(enum trace_level level, uint64_t mask, const struct trace chunk_appendf(&trace_buf, " : qc@%p(%c) idle_timer_task@%p flags=0x%x", qc, (qc->flags & QUIC_FL_CONN_IS_BACK) ? 'B' : 'F', qc->idle_timer_task, qc->flags); + if (qc->conn) + chunk_appendf(&trace_buf, " conn@%p(err_code=%d flags=0x%llx)", + qc->conn, qc->conn->err_code, (ull)qc->conn->flags); if (mask & QUIC_EV_CONN_NEW) { const int *ssl_err = a2;