From 5298fe9f6a069318cd276ceabc51334c4d299cde Mon Sep 17 00:00:00 2001 From: evgeny Date: Fri, 23 Oct 2026 00:43:54 +0200 Subject: [PATCH] Keep BBR loss bounds above the DATA window minimum --- src/transport_layer/etcp_bbr.c | 2 +- src/transport_layer/etcp_bbr.h | 12 ++++++++++-- src/transport_layer/etcp_connections.h | 4 +++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/transport_layer/etcp_bbr.c b/src/transport_layer/etcp_bbr.c index cdbd6c65..a8981ca8 100644 --- a/src/transport_layer/etcp_bbr.c +++ b/src/transport_layer/etcp_bbr.c @@ -792,8 +792,8 @@ static void bbr_bound_cwnd_for_inflight_model(struct bbr* bbr, uint32_t* cwnd, u (bbr->mode == BBR_PROBE_BW && bbr->cycle_idx == BBR_BW_PROBE_CRUISE)) cap = bbr_inflight_with_headroom(bbr); - cap = (uint32_t)(cap > BBR_CWND_MIN_TARGET * mss ? cap : BBR_CWND_MIN_TARGET * mss); cap = (uint32_t)(cap < bbr->inflight_lo ? cap : bbr->inflight_lo); + cap = (uint32_t)(cap > BBR_CWND_MIN_TARGET * mss ? cap : BBR_CWND_MIN_TARGET * mss); *cwnd = (uint32_t)(cap < *cwnd ? cap : *cwnd); } diff --git a/src/transport_layer/etcp_bbr.h b/src/transport_layer/etcp_bbr.h index 88b132c6..2118fdbc 100644 --- a/src/transport_layer/etcp_bbr.h +++ b/src/transport_layer/etcp_bbr.h @@ -1,7 +1,10 @@ /* etcp_bbr — модель congestion control одного ETCP-линка: состояния BBR, окно и pacing rate. * ETCP собирает bbr_rate_sample из ACK/потерь и вызывает init/main/note_loss/tx_start в uasync-потоке. * Модуль не отправляет пакеты: возвращённые лимиты применяет линк/loadbalancer. - * cwnd/inflight/delivered — байты, interval/rtt — микросекунды, pacing_rate — байты в секунду. */ + * cwnd/inflight/delivered — байты DATA, interval/rtt — микросекунды, pacing_rate — байты в секунду. + * MSS — максимальный DATA-фрагмент normalizer, без заголовков; не wire-MTU и не размер кадра STCP. + * Минимальное окно — 4*MSS; PROBE_RTT осушает до max(4*MSS, 0.5*BDP), затем ждёт >=200мс и раунд ACK. + * Транспорт применяет окно с верхним ограничением конфига и не повышает его до собственного минимума. */ #pragma once #include @@ -96,7 +99,7 @@ struct bbr { uint8_t extra_acked_win_idx : 1; uint8_t extra_acked_win_rtts : 5; uint32_t prior_cwnd; - uint8_t init_cwnd : 7; + uint8_t init_cwnd : 7; // начальное окно в DATA-фрагментах; init задаёт BBR_CWND_MIN_TARGET uint8_t full_bw_cnt : 2; uint8_t ack_phase : 3; uint8_t loss_events_in_round : 4; @@ -112,7 +115,12 @@ struct bbr { void* cwnd_update_ctx; }; +// Инициализировать выделенную модель: STARTUP, начальное окно 4 DATA-фрагмента, неизвестные RTT/полоса. void bbr_init(struct bbr* bbr); +/* Обработать ACK rs и обновить входные/выходные cwnd_out (байты DATA) и pacing_rate_out (B/s). + * mss>0 — frag_size normalizer; inflight_bytes — текущий занятый DATA-flight после ACK; + * is_cwnd_limited — отправитель упирался в окно до ACK. Все указатели обязательны. + * При неверных аргументах логирует ошибку и сохраняет выходы; void. */ void bbr_main(struct bbr* bbr, const struct bbr_rate_sample* rs, uint32_t* cwnd_out, uint32_t* pacing_rate_out, uint32_t mss, uint32_t inflight_bytes, int is_cwnd_limited); diff --git a/src/transport_layer/etcp_connections.h b/src/transport_layer/etcp_connections.h index 2c7c4cac..f0d9baa2 100644 --- a/src/transport_layer/etcp_connections.h +++ b/src/transport_layer/etcp_connections.h @@ -30,7 +30,7 @@ extern "C" { #define ACK_REZERV 100// сколько байт резервировать под ack и прочие заголовки #define WIRE_OVERHEAD(fam) ((fam) == AF_INET6 ? IP_UDP_OVERHEAD_V6 + SC_ENCRYPT_OVERHEAD : IP_UDP_OVERHEAD_V4 + SC_ENCRYPT_OVERHEAD) -#define INFLIGHT_LIM_MIN 8192 // 8K +#define INFLIGHT_LIM_MIN 8192 // минимально допустимый bbr_max_cwnd в конфиге; не минимум текущего окна BBR #define INFLIGHT_LIM_MAX 1048576 // 1M #define PACKET_DATA_SIZE 2048 @@ -386,6 +386,8 @@ void tcp_server_on_link(struct stcp_link *link, struct ETCP_SOCKET *tcp_sock); struct ETCP_LINK* etcp_link_new(struct ETCP_CONN* etcp, struct ETCP_SOCKET* conn, const struct sockaddr_storage* remote_addr, uint8_t is_server); +// Применить окно DATA new_lim>0 (байты), ограничить сверху max_inflight и разбудить отправитель. +// Минимум выбирает BBR; ноль отклоняется с логом без изменения окна. Неверный link игнорируется. void etcp_link_update_inflight_lim(struct ETCP_LINK* link, uint32_t new_lim); void etcp_link_close(struct ETCP_LINK* link);