From fc6a873b5c7dc02b4147b87d38d8b616eb12caab Mon Sep 17 00:00:00 2001 From: Evgeny Date: Wed, 15 Jul 2026 10:46:33 +0300 Subject: [PATCH] etcp_connections: reuse existing outbound link for incoming INIT by addr When two peers send INIT simultaneously, the first link occupies the socket. Incoming INIT arriving after finds the existing outbound link by (ip,port) instead of failing with 'Can not insert link to socket'. --- src/etcp_connections.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/etcp_connections.c b/src/etcp_connections.c index 3f88fe5b..aa05de04 100644 --- a/src/etcp_connections.c +++ b/src/etcp_connections.c @@ -1695,6 +1695,15 @@ void etcp_connections_read_callback_socket(socket_t sock, void* arg) { // Check if link already exists (for CHANNEL_INIT recovery) struct ETCP_LINK* existing_link = etcp_link_find_by_remote_id(conn, req->link_id); + if (!existing_link) { + existing_link = etcp_link_find_by_addr(e_sock, &addr); + if (existing_link && existing_link->etcp == conn) { + DEBUG_INFO(DEBUG_CATEGORY_CONNECTION, "[%s] found existing outbound link by addr for incoming INIT, reusing link=%p", + conn->log_name, existing_link); + } else { + existing_link = NULL; + } + } uint8_t send_reset = 0;