Clamp ETCP retransmission timeout to 10 ms through 1 second

This commit is contained in:
evgeny committed 2026-10-23 02:20:10 +02:00
1 parent 4aae1f6151
commit c3ac337ef0
3 files changed
+40 -10

No files matched your search

+9 -5
View File
@@ -31,6 +31,8 @@
#define MAX_INFLIGHT_BYTES 65536 // Initial window
#define RETRANS_K1 32 // RTT multiplier for retrans timeout
#define RETRANS_K2 32 // Jitter multiplier
#define RETRANS_MIN_TB 100 // Минимальный RTO 10мс, в единицах 0.1мс
#define RETRANS_MAX_TB 10000 // Максимальный RTO 1с, в единицах 0.1мс
#define ACK_DELAY_TB 20 // ACK timer delay (2ms in 0.1ms units)
#define BURST_DELAY_FACTOR 4 // Delay before burst
#define BURST_SIZE 5 // Packets in burst (1 delayed + 4 burst)
@@ -1091,12 +1093,14 @@ static void input_queue_cb(struct ll_queue* q, void* arg) {
static void ack_timeout_cb(void* arg);
static void ack_timeout_check(struct ETCP_CONN* etcp) {
uint64_t now = get_time_tb();
int32_t timeout = (etcp->rtt_avg_10 * RETRANS_K1 + etcp->jitter * RETRANS_K2) / 16;
if (timeout<50) timeout=50;
if (timeout>10000) timeout=10000;
int32_t raw_timeout = (etcp->rtt_avg_10 * RETRANS_K1 + etcp->jitter * RETRANS_K2) / 16;
int32_t timeout = raw_timeout;
if (timeout < RETRANS_MIN_TB) timeout = RETRANS_MIN_TB;
if (timeout > RETRANS_MAX_TB) timeout = RETRANS_MAX_TB;
DEBUG_TRACE(DEBUG_CATEGORY_ETCP, "starting check, now=%llu, timeout=%llu, rtt_avg_10=%u, jitter=%u",
(unsigned long long)now, (unsigned long long)timeout, etcp->rtt_avg_10, etcp->jitter);
DEBUG_TRACE(DEBUG_CATEGORY_ETCP, "[%s] RTO: raw_tb=%d timeout_tb=%d bounds_tb=%d..%d RTT_tb=%u jitter_tb=%u now_tb=%llu",
etcp->log_name, raw_timeout, timeout, RETRANS_MIN_TB, RETRANS_MAX_TB,
etcp->rtt_avg_10, etcp->jitter, (unsigned long long)now);
struct ll_entry* current;
+3 -3
View File
@@ -173,8 +173,8 @@ struct ETCP_CONN {
uint16_t rtt_last;// round-trip time
uint16_t tt_last;// transmission time (время пакета до меня)
// uint16_t rxt_last;// recv relative time (бустро регаирует на изменение задержки rx и медленно на изменение задержки tx)
uint16_t rtt_avg_10;
uint16_t jitter;
uint16_t rtt_avg_10; // Максимальный RTT среди links, в 0.1мс; имя историческое
uint16_t jitter; // Среднее по links от link->jitter/32768, в 0.1мс (удвоенный EWMA |ΔRTT|)
uint64_t last_rtt_cb_time; // время последнего вызова ping_update_rtt (0.1ms)
uint32_t bytes_sent_total;
// uint32_t bytes_received_total; // Not used
@@ -190,7 +190,7 @@ struct ETCP_CONN {
uint32_t optimal_inflight; // Sum over links
// Timers
void* retrans_timer; // Retrans check timer
void* retrans_timer; // Общий RTO: 2*(rtt_avg_10+jitter), ограничен 10мс..1с; callback проверяет FIFO
void* ack_resp_timer; // ACK send timer
void* down_timer; // удаление после непрерывного DOWN, включая первоначальное ожидание
uint64_t down_deadline_tb; // сохраняется при наличии NCD handles после истечения таймера