From ade0e93f7f438c697264598f80be31ba828ef2d3 Mon Sep 17 00:00:00 2001 From: evgeny Date: Fri, 23 Oct 2026 00:08:15 +0200 Subject: [PATCH] Measure actual channel queueing delay independently of propagation RTT --- src/transport_layer/dummynet.c | 6 ++++++ src/transport_layer/dummynet.h | 1 + 2 files changed, 7 insertions(+) diff --git a/src/transport_layer/dummynet.c b/src/transport_layer/dummynet.c index 46e9a783..536248ca 100644 --- a/src/transport_layer/dummynet.c +++ b/src/transport_layer/dummynet.c @@ -39,6 +39,7 @@ struct dummynet_pkt { struct sockaddr_storage src_addr; socklen_t src_len; uint64_t recv_time_tb; + uint32_t delay_ms; int direction; }; @@ -150,6 +151,10 @@ static void dummynet_process_queue(struct dummynet* dn, int dir_idx) { dir->stats.dropped++; } else { dir->stats.sent++; dir->stats.sent_bytes += n; + uint64_t elapsed_us = (get_time_tb() - pkt->recv_time_tb) * 100; + uint64_t propagation_us = (uint64_t)pkt->delay_ms * 1000; + uint64_t queued_us = elapsed_us > propagation_us ? elapsed_us - propagation_us : 0; + if (queued_us > dir->stats.max_queue_delay_us) dir->stats.max_queue_delay_us = queued_us; } dir->stats.queue_size--; queue_entry_free(entry); @@ -243,6 +248,7 @@ static void dummynet_read_callback(socket_t sock, void* user_arg) { delay_ms = DUMMYNET_MAX_DELAY_MS; } int delay_tb = MS_TO_TB(delay_ms); + pkt->delay_ms = delay_ms; DEBUG_DEBUG(DEBUG_CATEGORY_DUMMYNET, "Dir %d: packet recv (%zd bytes), delay %u ms", dir_idx, n, delay_ms); diff --git a/src/transport_layer/dummynet.h b/src/transport_layer/dummynet.h index 734bf736..87dcf380 100644 --- a/src/transport_layer/dummynet.h +++ b/src/transport_layer/dummynet.h @@ -67,6 +67,7 @@ struct dummynet_stats { uint64_t recv_bytes; // Принято UDP-байт, без IP/UDP заголовков uint64_t sent_bytes; // Передано UDP-байт, включая протокольные накладные расходы ETCP uint64_t blocked; // Пакетов отброшено режимом DROP (включены в lost) + uint64_t max_queue_delay_us; // максимум времени до отправки минус заданная propagation delay; включает сериализацию/HOLD uint32_t queue_size; // Все ожидающие пакеты, включая delay и HOLD uint32_t queue_max; // Максимальный размер очереди (пиковый) };