From 1f651f1df099340fc9a00754154cee652699cfa3 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Tue, 9 Jun 2026 12:18:40 +0300 Subject: [PATCH] fix: revert etcp_link_update_inflight_lim + BBR callback in etcp_link_new 52f32da replaced direct inflight_lim_bytes assignment and inline optimal_inflight recalculation with etcp_link_update_inflight_lim() + BBR on_cwnd_update callback. This broke test_etcp_reconnect (flaky FAIL in phase 4, recv=0 after server restart). Revert etcp_connections.c/h back to inline init. Keep BBR callback infrastructure (etcp_bbr.c/h) and IPv6/sockaddr changes (config_parser, utun_instance) which are harmless. --- src/etcp_connections.c | 23 ++++++----------------- src/etcp_connections.h | 1 - 2 files changed, 6 insertions(+), 18 deletions(-) diff --git a/src/etcp_connections.c b/src/etcp_connections.c index d142d3b6..e808aabd 100644 --- a/src/etcp_connections.c +++ b/src/etcp_connections.c @@ -746,8 +746,6 @@ void etcp_socket_remove(struct ETCP_SOCKET* conn) { } -static void bbr_cwnd_updated(void* ctx, uint32_t new_cwnd); - struct ETCP_LINK* etcp_link_new(struct ETCP_CONN* etcp, struct ETCP_SOCKET* conn, struct sockaddr_storage* remote_addr, uint8_t is_server) { DEBUG_TRACE(DEBUG_CATEGORY_CONNECTION, ""); if (!remote_addr) return NULL; @@ -833,9 +831,12 @@ struct ETCP_LINK* etcp_link_new(struct ETCP_CONN* etcp, struct ETCP_SOCKET* conn while (l && l->next) l=l->next; if (l) l->next = link; else etcp->links = link; - etcp_link_update_inflight_lim(link, link->mtu * 4); - link->bbr->on_cwnd_update = bbr_cwnd_updated; - link->bbr->cwnd_update_ctx = link; + link->inflight_lim_bytes = link->mtu * 4; // BBR init_cwnd (~4 packets) + +// пересчитать connection-level optimal_inflight + { uint32_t sum = 0; + for (struct ETCP_LINK* tl = etcp->links; tl; tl = tl->next) sum += tl->inflight_lim_bytes; + etcp->optimal_inflight = sum; } DEBUG_INFO(DEBUG_CATEGORY_CONNECTION, "NEW link initialized on etcp=[%s] link=%p socket=%s id=%d is_server=%d mtu=%d", etcp->log_name, link, conn->name, link->local_link_id, link->is_server, link->mtu); @@ -847,18 +848,6 @@ struct ETCP_LINK* etcp_link_new(struct ETCP_CONN* etcp, struct ETCP_SOCKET* conn return link; } -static void bbr_cwnd_updated(void* ctx, uint32_t new_cwnd) { - etcp_link_update_inflight_lim((struct ETCP_LINK*)ctx, new_cwnd); -} - -void etcp_link_update_inflight_lim(struct ETCP_LINK* link, uint32_t new_lim) { - link->inflight_lim_bytes = new_lim; - struct ETCP_CONN* etcp = link->etcp; - uint32_t sum = 0; - for (struct ETCP_LINK* tl = etcp->links; tl; tl = tl->next) sum += tl->inflight_lim_bytes; - etcp->optimal_inflight = sum; -} - void etcp_link_close(struct ETCP_LINK* link) { DEBUG_TRACE(DEBUG_CATEGORY_CONNECTION, ""); if (!link) return; diff --git a/src/etcp_connections.h b/src/etcp_connections.h index 98943c1e..4bb68cf6 100644 --- a/src/etcp_connections.h +++ b/src/etcp_connections.h @@ -262,7 +262,6 @@ void etcp_socket_remove(struct ETCP_SOCKET* conn); // connection functions // создает новый канал связи для etcp подключения (ETCP_CONN) struct ETCP_LINK* etcp_link_new(struct ETCP_CONN* etcp, struct ETCP_SOCKET* conn, struct sockaddr_storage* remote_addr, uint8_t is_server); -void etcp_link_update_inflight_lim(struct ETCP_LINK* link, uint32_t new_lim); void etcp_link_close(struct ETCP_LINK* link); //int etcp_input_cbk(struct packet_buffer* pkt, struct ETCP_SOCKET* conn);// получает расшифрованный пакет int etcp_encrypt_send(struct ETCP_DGRAM* dgram);// зашифровывает и отправляет пакет