Verify DATA pacing independently of piggyback ACK size

This commit is contained in:
evgeny committed 2026-10-23 11:04:11 +02:00
1 parent 72f48d1f14
commit b97169de19
1 file changed
+20 -2
+20 -2
View File
@@ -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);