Browse Source

fix: INIT reset logic — reset only on session change or got_initial_pkt, always sync session_id

topo_upd
Evgeny 2 months ago
parent
commit
beed7a4e07
  1. 2
      AGENTS.md
  2. 55
      src/etcp_connections.c

2
AGENTS.md

@ -75,7 +75,7 @@ ASAN_OPTIONS=detect_leaks=0:halt_on_error=0 ./src/utun -f -p /tmp/utun.pid -l /t
### Run All Tests ### Run All Tests
```bash ```bash
make check # Run all tests via automake, логи в tests/logs/ make check # Run all tests via automake, логи в tests/logs/ - запускай после make без grep, вывод короткий
``` ```
```powershell ```powershell
powershell check.bat # Windows, запускает каждый .exe из tests/ powershell check.bat # Windows, запускает каждый .exe из tests/

55
src/etcp_connections.c

@ -1472,7 +1472,7 @@ static int handle_init_response_client(struct ETCP_SOCKET* e_sock, struct ETCP_D
link->init_timer = NULL; link->init_timer = NULL;
} }
if (pkt_code == ETCP_INIT_RESPONSE && !link->etcp->reset_done) { if (pkt_code == ETCP_INIT_RESPONSE && link->etcp->got_initial_pkt) {
DEBUG_INFO(DEBUG_CATEGORY_ETCP, "[%s] REINIT from client: INIT_RESPONSE(0x03) received, reinit conn=%p", DEBUG_INFO(DEBUG_CATEGORY_ETCP, "[%s] REINIT from client: INIT_RESPONSE(0x03) received, reinit conn=%p",
link->etcp->log_name, link->etcp); link->etcp->log_name, link->etcp);
etcp_conn_reinit(link->etcp); etcp_conn_reinit(link->etcp);
@ -1779,25 +1779,15 @@ void etcp_connections_read_callback_socket(socket_t sock, void* arg) {
conn->log_name); conn->log_name);
} }
// Normal reinit check (skip if reset_done=1 unless session_id changed) // Always sync session_id; reset if new session or data was flowing
if (!conn->reset_done) { { int sess_changed = (conn->session_id != session_id);
if (code == ETCP_INIT_REQUEST || conn->session_id != session_id || !conn->got_initial_pkt) { conn->session_id = session_id;
send_reset = 1; if (sess_changed || conn->got_initial_pkt) {
DEBUG_INFO(DEBUG_CATEGORY_CONNECTION, "[%s] REINIT existing link: code=0x%02x sess=%08x→%08x got_init=%d initialized=%d links_up=%d", send_reset = 1;
conn->log_name, code, conn->session_id, session_id, conn->got_initial_pkt, conn->initialized, conn->links_up); DEBUG_INFO(DEBUG_CATEGORY_CONNECTION, "[%s] REINIT existing link: code=0x%02x sess=%08x→%08x got_init=%d initialized=%d links_up=%d",
conn->session_id = session_id; conn->log_name, code, conn->session_id, session_id, conn->got_initial_pkt, conn->initialized, conn->links_up);
etcp_conn_reinit(conn); etcp_conn_reinit(conn);
} } }
} else if (conn->session_id != session_id) {
send_reset = 1;
DEBUG_INFO(DEBUG_CATEGORY_CONNECTION, "[%s] REINIT existing link (session changed): sess=%08x→%08x",
conn->log_name, conn->session_id, session_id);
conn->session_id = session_id;
etcp_conn_reinit(conn);
} else {
send_reset = 0;
DEBUG_TRACE(DEBUG_CATEGORY_CONNECTION, "same session_id, skip reinit");
}
} }
// Cancel existing timers // Cancel existing timers
@ -1834,22 +1824,15 @@ void etcp_connections_read_callback_socket(socket_t sock, void* arg) {
return; return;
} }
// Normal reinit check (skip if reset_done=1 unless session_id changed) // Always sync session_id; reset if new session or data was flowing
if (!conn->reset_done) { { int sess_changed = (conn->session_id != session_id);
if (code == ETCP_INIT_REQUEST || conn->session_id != session_id || !conn->got_initial_pkt) { conn->session_id = session_id;
send_reset = 1; if (sess_changed || conn->got_initial_pkt) {
DEBUG_INFO(DEBUG_CATEGORY_CONNECTION, "[%s] REINIT new link: code=0x%02x sess=%08x→%08x got_init=%d initialized=%d links_up=%d", send_reset = 1;
conn->log_name, code, conn->session_id, session_id, conn->got_initial_pkt, conn->initialized, conn->links_up); DEBUG_INFO(DEBUG_CATEGORY_CONNECTION, "[%s] REINIT new link: code=0x%02x sess=%08x→%08x got_init=%d initialized=%d links_up=%d",
conn->session_id = session_id; conn->log_name, code, conn->session_id, session_id, conn->got_initial_pkt, conn->initialized, conn->links_up);
etcp_conn_reinit(conn); etcp_conn_reinit(conn);
} } }
} else if (conn->session_id != session_id) {
send_reset = 1;
DEBUG_INFO(DEBUG_CATEGORY_CONNECTION, "[%s] REINIT new link (session changed): sess=%08x→%08x",
conn->log_name, conn->session_id, session_id);
conn->session_id = session_id;
etcp_conn_reinit(conn);
}
} }
link->keepalive_interval=(req->keepalive[0]<<8) | req->keepalive[1]; link->keepalive_interval=(req->keepalive[0]<<8) | req->keepalive[1];
link->recovery_interval=((req->recovery[0]<<8) | req->recovery[1])*100;// timebase в link, timebase/100 в кодограмме link->recovery_interval=((req->recovery[0]<<8) | req->recovery[1])*100;// timebase в link, timebase/100 в кодограмме

Loading…
Cancel
Save