From e21cd265116e80df9fefb3cc8a2d2e97d41f2bc1 Mon Sep 17 00:00:00 2001 From: evgeny Date: Fri, 23 Oct 2026 02:28:45 +0200 Subject: [PATCH] Apply BBR pacing through one owner and keep burst estimates diagnostic --- src/transport_layer/etcp.c | 12 ++++-------- src/transport_layer/etcp_connections.c | 2 +- src/transport_layer/etcp_connections.h | 6 +++--- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/transport_layer/etcp.c b/src/transport_layer/etcp.c index b558047b..eda9b6e3 100644 --- a/src/transport_layer/etcp.c +++ b/src/transport_layer/etcp.c @@ -1643,8 +1643,7 @@ void etcp_ack_recv(struct ETCP_CONN* etcp, uint32_t seq, uint16_t ts, uint16_t d cwnd_limited); link->cwnd_limited = 0; etcp_link_update_inflight_lim(link, new_cwnd); - link->bbr_pacing_rate = new_pacing; - link->bandwidth = (uint32_t)((uint64_t)new_pacing * 8 / 1000); + etcp_loadbalancer_set_pacing_rate(link, new_pacing); link->bbr_loss_since_ack = 0; DEBUG_DEBUG(DEBUG_CATEGORY_ETCP, "[L%u] BBR out: cwnd %u→%u pace %u→%u bw=%uK mode=%d cyc=%d infl=%u/%u", @@ -1954,12 +1953,9 @@ void etcp_conn_input(struct ETCP_DGRAM* pkt) { if (valid == MEAS_RESP_VALID && gap_min > 0 && link->burst_pkt_size > 0) { uint64_t bw_kbps = (uint64_t)link->burst_pkt_size * 8000ULL / gap_min; if (bw_kbps > 10000000) bw_kbps = 10000000; - link->bandwidth = (uint32_t)bw_kbps; - float rtt_sec = (float)link->bbr->min_rtt_us / 1000000.f; - if (rtt_sec < 0.005f) rtt_sec = 0.005f; - link->burst_target_bdp = (uint32_t)((float)bw_kbps * 1000.f / 8.f * rtt_sec); - // BBR: инициализируем верхнюю границу из burst - if (link->bbr->inflight_hi == ~0U) link->bbr->inflight_hi = link->burst_target_bdp; + // Wire-замер серии — диагностика; DATA pacing/окно принадлежат модели BBR. + uint64_t bdp = link->bbr->min_rtt_us == UINT32_MAX ? 0 : bw_kbps * link->bbr->min_rtt_us / 8000; + link->burst_target_bdp = bdp > UINT32_MAX ? UINT32_MAX : (uint32_t)bdp; DEBUG_INFO(DEBUG_CATEGORY_ETCP, "[%s] burst resp: BW=%u Kbps, BDP=%u gap_min=%u us pkt_cnt=%u", link->etcp->log_name, (uint32_t)bw_kbps, link->burst_target_bdp, gap_min, pkt_cnt); } diff --git a/src/transport_layer/etcp_connections.c b/src/transport_layer/etcp_connections.c index 9d683cb4..6f304d3b 100644 --- a/src/transport_layer/etcp_connections.c +++ b/src/transport_layer/etcp_connections.c @@ -1092,7 +1092,7 @@ struct ETCP_LINK* etcp_link_new(struct ETCP_CONN* etcp, struct ETCP_SOCKET* conn link->ka_announce_attempts = 0; link->ka_announce_max_attempts = 0; link->ka_fail_count = 0; - link->bandwidth = 10000; // начальная оценка 10 Mbps для шейпера + link->bandwidth = 0; // До первого ACK pacing не задан; исходный burst ограничен начальным DATA-окном. link->burst_id = 0; link->burst_active = 0; link->burst_last_time_tb = 0; diff --git a/src/transport_layer/etcp_connections.h b/src/transport_layer/etcp_connections.h index f0d9baa2..72f91acc 100644 --- a/src/transport_layer/etcp_connections.h +++ b/src/transport_layer/etcp_connections.h @@ -270,7 +270,7 @@ struct ETCP_LINK { uint16_t tt_last; // transmit time (время доставки отправленных пакетов) uint16_t rt_last; // recv time (время доставки принятых пакетов) - uint32_t bandwidth; // Link bandwidth in Kbits/sec + uint32_t bandwidth; // Отображение pacing в Kbit/s (вверх); shaper использует точный bbr_pacing_rate // NAT address tracking (from INIT_RESPONSE) struct sockaddr_storage local_as_seen_by_peer; // только наш endpoint, наблюдаемый удалённым пиром @@ -306,7 +306,7 @@ struct ETCP_LINK { uint8_t burst_count; // общее число пакетов в burst uint64_t burst_last_time_tb; // время последнего burst (0.1ms), для MIN_BURST_INTERVAL void* burst_resp_timer; // таймер ожидания ответа на burst - uint32_t burst_target_bdp; // BDP из последнего успешного burst (байты) + uint32_t burst_target_bdp; // Диагностический wire-BDP серии; 0 при неизвестном RTT, не управляет BBR uint16_t burst_pkt_size; // сохранённый размер пакета для вычисления BW // Receiver-сторона @@ -328,7 +328,7 @@ struct ETCP_LINK { uint64_t delivered_bytes; // кумулятивно delivered bytes на линке (для round detection) uint64_t last_ack_time_tb; // время последней доставки/начала первого flight, 0.1мс uint64_t first_tx_time_tb; // начало интервала отправок, продвигается подтверждёнными попытками - uint32_t bbr_pacing_rate; // bytes/sec output BBR → shaper + uint32_t bbr_pacing_rate; // Точный pacing B/s; менять через set_pacing_rate для пересчёта долга/таймера uint32_t bbr_loss_since_ack; // счётчик потерь на линке с последнего ACK (для rs->lost) etcp_udp_send_fn_t send_hook; // NULL = socket_sendto напрямую