Clamp ETCP retransmission timeout to 10 ms through 1 second
This commit is contained in:
1 parent
4aae1f6151
commit
c3ac337ef0
3 files changed
+40
-10
No files matched your search
@@ -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;
|
||||
|
||||
@@ -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 после истечения таймера
|
||||
|
||||
Reference in new issue
Block a user