From 90dff0b2f2f46adec296e5e1355d04dfe9ab977a Mon Sep 17 00:00:00 2001 From: evgeny Date: Sat, 24 Oct 2026 16:35:41 +0200 Subject: [PATCH] Refresh pending retransmit timer when timestamp RTT changes --- doc/etcp_protocol.txt | 3 ++- src/transport_layer/etcp.c | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/etcp_protocol.txt b/doc/etcp_protocol.txt index 2afaf0c0..d6e71e38 100644 --- a/doc/etcp_protocol.txt +++ b/doc/etcp_protocol.txt @@ -59,7 +59,8 @@ HELLO/CHALLENGE/CONFIRM и keepalive передаются своим незав попытки доживали до ACK и DATA-измерения продолжались; BBR RTT/min_rtt по этому сигналу не обновляются. Без обоих измерений RTO=1с. - FIFO содержит физические попытки в порядке принятия транспортом. Таймер назначается по старейшей; - при изменении RTO проверяется новый срок. Допускается оставить уже запланированную более раннюю проверку. + при изменении RTO проверяется новый срок. Timestamp handler пересчитывает таймер сразу после обновления RTT, + включая сокращение без новых DATA/ACK. Допускается оставить уже запланированную более раннюю проверку. uasync округляет задержку вверх до миллисекунды; callback может выполниться позже расчётного срока. - Истечение снимает только собственный физический flight и сообщает loss собственному BBR. Если логический seq ещё не доставлен и других активных копий нет, он возвращается в input_send_q. diff --git a/src/transport_layer/etcp.c b/src/transport_layer/etcp.c index 16f8c011..0c0f3367 100644 --- a/src/transport_layer/etcp.c +++ b/src/transport_layer/etcp.c @@ -1473,6 +1473,7 @@ void etcp_conn_input(struct ETCP_DGRAM* pkt) { etcp->last_rtt_cb_time = now_tb; } } + if (new_rtt != prev_rtt) etcp_tx_update_rto(pkt->link); break; } case ETCP_SECTION_PAYLOAD: {