Browse Source

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.
tmo
Evgeny 4 months ago
parent
commit
1f651f1df0
  1. 23
      src/etcp_connections.c
  2. 1
      src/etcp_connections.h

23
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) { 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, ""); DEBUG_TRACE(DEBUG_CATEGORY_CONNECTION, "");
if (!remote_addr) return NULL; 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; while (l && l->next) l=l->next;
if (l) l->next = link; else etcp->links = link; if (l) l->next = link; else etcp->links = link;
etcp_link_update_inflight_lim(link, link->mtu * 4); link->inflight_lim_bytes = link->mtu * 4; // BBR init_cwnd (~4 packets)
link->bbr->on_cwnd_update = bbr_cwnd_updated;
link->bbr->cwnd_update_ctx = link; // пересчитать 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); 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; 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) { void etcp_link_close(struct ETCP_LINK* link) {
DEBUG_TRACE(DEBUG_CATEGORY_CONNECTION, ""); DEBUG_TRACE(DEBUG_CATEGORY_CONNECTION, "");
if (!link) return; if (!link) return;

1
src/etcp_connections.h

@ -262,7 +262,6 @@ void etcp_socket_remove(struct ETCP_SOCKET* conn);
// connection functions // connection functions
// создает новый канал связи для etcp подключения (ETCP_CONN) // создает новый канал связи для 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); 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); void etcp_link_close(struct ETCP_LINK* link);
//int etcp_input_cbk(struct packet_buffer* pkt, struct ETCP_SOCKET* conn);// получает расшифрованный пакет //int etcp_input_cbk(struct packet_buffer* pkt, struct ETCP_SOCKET* conn);// получает расшифрованный пакет
int etcp_encrypt_send(struct ETCP_DGRAM* dgram);// зашифровывает и отправляет пакет int etcp_encrypt_send(struct ETCP_DGRAM* dgram);// зашифровывает и отправляет пакет

Loading…
Cancel
Save