From 71764ee2c7448cbe5090db2077dbf5f7cff53384 Mon Sep 17 00:00:00 2001 From: zeejayyang Date: Wed, 19 Feb 2025 10:55:53 +0800 Subject: [PATCH] Fix: no_progress timeout too early. --- src/liblsquic/lsquic_conn_public.h | 2 +- src/liblsquic/lsquic_full_conn.c | 4 +--- src/liblsquic/lsquic_full_conn_ietf.c | 12 ++++++------ src/liblsquic/lsquic_send_ctl.c | 4 ++-- src/liblsquic/lsquic_stream.c | 11 +++++------ 5 files changed, 15 insertions(+), 18 deletions(-) diff --git a/src/liblsquic/lsquic_conn_public.h b/src/liblsquic/lsquic_conn_public.h index c6bbb3afe..2bf3c4916 100644 --- a/src/liblsquic/lsquic_conn_public.h +++ b/src/liblsquic/lsquic_conn_public.h @@ -65,7 +65,7 @@ struct lsquic_conn_public { unsigned bytes_in; /* successfully processed */ unsigned bytes_out; /* Used for no-progress timeout */ - lsquic_time_t last_tick, last_prog; + lsquic_time_t last_prog; unsigned max_peer_ack_usec; uint8_t n_special_streams; }; diff --git a/src/liblsquic/lsquic_full_conn.c b/src/liblsquic/lsquic_full_conn.c index eca099d1c..24460ab50 100644 --- a/src/liblsquic/lsquic_full_conn.c +++ b/src/liblsquic/lsquic_full_conn.c @@ -3355,17 +3355,15 @@ maybe_set_noprogress_alarm (struct full_conn *conn, lsquic_time_t now) if (conn->fc_flags & FC_NOPROG_TIMEOUT) { - if (conn->fc_pub.last_tick) + if (conn->fc_pub.last_prog) { exp = conn->fc_pub.last_prog + conn->fc_enpub->enp_noprog_timeout; if (!lsquic_alarmset_is_set(&conn->fc_alset, AL_IDLE) || exp < conn->fc_alset.as_expiry[AL_IDLE]) lsquic_alarmset_set(&conn->fc_alset, AL_IDLE, exp); - conn->fc_pub.last_tick = now; } else { - conn->fc_pub.last_tick = now; conn->fc_pub.last_prog = now; } } diff --git a/src/liblsquic/lsquic_full_conn_ietf.c b/src/liblsquic/lsquic_full_conn_ietf.c index 060d93de3..3c4ff72e2 100644 --- a/src/liblsquic/lsquic_full_conn_ietf.c +++ b/src/liblsquic/lsquic_full_conn_ietf.c @@ -6055,9 +6055,11 @@ process_ping_frame (struct ietf_full_conn *conn, if (conn->ifc_flags & IFC_SERVER) log_conn_flow_control(conn); - LSQ_DEBUG("received PING frame, update last progress to %"PRIu64, - conn->ifc_pub.last_tick); - conn->ifc_pub.last_prog = conn->ifc_pub.last_tick; + if (conn->ifc_pub.last_prog) { + conn->ifc_pub.last_prog = lsquic_time_now(); + LSQ_DEBUG("received PING frame, update last progress to %"PRIu64, + conn->ifc_pub.last_prog); + } return 1; } @@ -8083,17 +8085,15 @@ maybe_set_noprogress_alarm (struct ietf_full_conn *conn, lsquic_time_t now) if (conn->ifc_mflags & MF_NOPROG_TIMEOUT) { - if (conn->ifc_pub.last_tick) + if (conn->ifc_pub.last_prog) { exp = conn->ifc_pub.last_prog + conn->ifc_enpub->enp_noprog_timeout; if (!lsquic_alarmset_is_set(&conn->ifc_alset, AL_IDLE) || exp < conn->ifc_alset.as_expiry[AL_IDLE]) lsquic_alarmset_set(&conn->ifc_alset, AL_IDLE, exp); - conn->ifc_pub.last_tick = now; } else { - conn->ifc_pub.last_tick = now; conn->ifc_pub.last_prog = now; } } diff --git a/src/liblsquic/lsquic_send_ctl.c b/src/liblsquic/lsquic_send_ctl.c index 652163c8d..6522d016a 100644 --- a/src/liblsquic/lsquic_send_ctl.c +++ b/src/liblsquic/lsquic_send_ctl.c @@ -1299,9 +1299,9 @@ lsquic_send_ctl_got_ack (lsquic_send_ctl_t *ctl, if (packet_out && (packet_out->po_frame_types & QUIC_FTBIT_PING) && ctl->sc_conn_pub->last_prog) { + ctl->sc_conn_pub->last_prog = lsquic_time_now(); LSQ_DEBUG("ACK to PING frame, update last progress to %"PRIu64, - ctl->sc_conn_pub->last_tick); - ctl->sc_conn_pub->last_prog = ctl->sc_conn_pub->last_tick; + ctl->sc_conn_pub->last_prog); } } diff --git a/src/liblsquic/lsquic_stream.c b/src/liblsquic/lsquic_stream.c index 46c0d0485..72e31b78b 100644 --- a/src/liblsquic/lsquic_stream.c +++ b/src/liblsquic/lsquic_stream.c @@ -268,14 +268,13 @@ stream_inside_callback (const lsquic_stream_t *stream) static void maybe_update_last_progress (struct lsquic_stream *stream) { - if (stream->conn_pub && !lsquic_stream_is_critical(stream)) + if (stream->conn_pub && !lsquic_stream_is_critical(stream) && stream->conn_pub->last_prog) { - if (stream->conn_pub->last_prog != stream->conn_pub->last_tick) - LSQ_DEBUG("update last progress to %"PRIu64, - stream->conn_pub->last_tick); - stream->conn_pub->last_prog = stream->conn_pub->last_tick; + stream->conn_pub->last_prog = lsquic_time_now(); + LSQ_DEBUG("update last progress to %"PRIu64, + stream->conn_pub->last_prog); #ifndef NDEBUG - stream->sm_last_prog = stream->conn_pub->last_tick; + stream->sm_last_prog = stream->conn_pub->last_prog; #endif } }