From b97169de19036a9e45467554dee8f07213ed2ef7 Mon Sep 17 00:00:00 2001 From: evgeny Date: Fri, 23 Oct 2026 11:04:11 +0200 Subject: [PATCH] Verify DATA pacing independently of piggyback ACK size --- tests/test_etcp_windows.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/tests/test_etcp_windows.c b/tests/test_etcp_windows.c index 31693cbf..996740ae 100644 --- a/tests/test_etcp_windows.c +++ b/tests/test_etcp_windows.c @@ -338,7 +338,7 @@ static void pacing_rate_changes(void) { wait_sends(2); ack_all(); teardown(); setup(); b->link_status = 0; a->data_rtt_us = 1000000; - etcp_loadbalancer_set_pacing_rate(a, 1000000); + etcp_loadbalancer_set_pacing_rate(a, 500000); // 1000 DATA-байтов оставляют долг даже после кредита 1мс. enqueue(1000); wait_sends(1); enqueue(500); etcp_loadbalancer_set_pacing_rate(a, 100); CHECK(a->shaper_timer && a->shaper_load_time_tb > get_time_tb() + 1000); @@ -369,6 +369,24 @@ static void pacing_continuity(void) { ack_all(); teardown(); } +/* Ставка BBR измеряется в DATA B/s: большой piggyback ACK не должен уменьшать допустимую скорость DATA. */ +static void pacing_data_units(void) { + setup(); b->link_status = 0; + etcp_loadbalancer_set_pacing_rate(a, 100000); + uint64_t started = get_time_tb(); + for (unsigned i = 0; i < 50; i++) { + while (!loadbalancer_link_can_send(a)) test_clock_poll(ua, 10); + struct ETCP_DGRAM* pkt = memory_pool_alloc(inst.pkt_pool); CHECK(pkt); + memset(pkt, 0, sizeof(*pkt)); pkt->link = a; pkt->payload_len = 100; pkt->data_len = 1000; + conn->tx_running = 1; CHECK(etcp_loadbalancer_send(pkt) >= 0); conn->tx_running = 0; + } + uint64_t elapsed = get_time_tb() - started; + DEBUG_INFO(DEBUG_CATEGORY_DEBUG, "Pacing DATA units: DATA=5000 encoded=50000 rate=100000 elapsed_tb=%llu", + (unsigned long long)elapsed); + CHECK(elapsed >= 450 && elapsed <= 650); + teardown(); +} + /* Отправитель не превращает pending transport в UP до первого INIT/подтверждения сессии. */ static void initial_readiness(void) { setup(); conn->state = 0; conn->initialized = conn->links_up = conn->tx_state = 0; @@ -621,7 +639,7 @@ int main(void) { grow_and_session, allocation_and_send_failure, removed_link_and_bbr, pacing_reset_close, initial_readiness, config_limits, timer_failure, immediate_send, ack_without_data_pacing, bbr_delivery_clock, bbr_probe_window, tcp_initial_window, retransmission_timeout, pacing_rate_changes, pacing_timer_failure, retry_rotation, independent_attempt_acks, - receive_admission_and_path_acks, peer_window_queries, pacing_continuity}; + receive_admission_and_path_acks, peer_window_queries, pacing_continuity, pacing_data_units}; for (unsigned i = 0; i < sizeof(cases) / sizeof(cases[0]); i++) { cases[i](); CHECK(u_get_allocated_count() == baseline); DEBUG_INFO(DEBUG_CATEGORY_DEBUG, "PASS ETCP window scenario %u", i);