From 41e0736b7520d30e2c4a1c80d604817fd6824edd Mon Sep 17 00:00:00 2001 From: Evgeny Date: Mon, 13 Jul 2026 13:29:58 +0300 Subject: [PATCH] etcp_connections: force reinit when client sends ETCP_INIT_REQUEST (reset) Server now checks both code==ETCP_INIT_REQUEST and session_id mismatch to decide send_reset. Previously only session_id was checked, so if session matched (both sides had 00000000), reinit was skipped even when client explicitly requested reset (code 0x02). Client side already correct: handle_init_response_client:1473 calls etcp_conn_reinit if pkt_code==ETCP_INIT_RESPONSE (0x03). --- src/etcp_connections.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/etcp_connections.c b/src/etcp_connections.c index e6e68cc2..3214fc7e 100644 --- a/src/etcp_connections.c +++ b/src/etcp_connections.c @@ -1727,14 +1727,14 @@ void etcp_connections_read_callback_socket(socket_t sock, void* arg) { // For CHANNEL_INIT (0x04): if link already initialized - no reset, otherwise reset // For INIT_REQUEST (0x02): always reset // Check session_id: if same - no reinit, if different - client restarted, do reinit - if (conn->session_id == session_id) { - send_reset = 0; // Same session, no reinit needed - DEBUG_TRACE(DEBUG_CATEGORY_CONNECTION, "same session_id, skip reinit"); - } else { - send_reset = 1; // New session or uninitialized link - send reset - DEBUG_TRACE(DEBUG_CATEGORY_CONNECTION, "new session_id %08x (was %08x), do reinit", session_id, conn->session_id); + if (code == ETCP_INIT_REQUEST || conn->session_id != session_id) { + send_reset = 1; // Client explicitly requested reset, or new session + DEBUG_TRACE(DEBUG_CATEGORY_CONNECTION, "do reinit (code=%02x session was %08x now %08x)", code, conn->session_id, session_id); conn->session_id = session_id; etcp_conn_reinit(conn); + } else { + send_reset = 0; // Same session, no reinit needed + DEBUG_TRACE(DEBUG_CATEGORY_CONNECTION, "same session_id, skip reinit"); } // Cancel existing timers @@ -1752,10 +1752,10 @@ void etcp_connections_read_callback_socket(socket_t sock, void* arg) { link->remote_only_local = req->only_local; link->remote_type = req->type; - // For new links: check session_id to avoid false reinit - if (conn->session_id != session_id) { - send_reset = 1; // New session or uninitialized link - send reset - DEBUG_TRACE(DEBUG_CATEGORY_CONNECTION, "new session_id %08x (was %08x) for new link, do reinit", session_id, conn->session_id); + // For new links: reset if client requested or session changed + if (code == ETCP_INIT_REQUEST || conn->session_id != session_id) { + send_reset = 1; + DEBUG_TRACE(DEBUG_CATEGORY_CONNECTION, "do reinit for new link (code=%02x session was %08x now %08x)", code, conn->session_id, session_id); conn->session_id = session_id; etcp_conn_reinit(conn); }