From 6704a18897b22aa343c7f941bf15e4df0344f4c0 Mon Sep 17 00:00:00 2001 From: evgeny Date: Mon, 12 Oct 2026 01:11:07 +0200 Subject: [PATCH] Clarify independent RX watchdog and sleep-aware graceful close deadlines --- src/transport_layer/etcp_keepalive.h | 8 ++++++-- src/transport_layer/node_conn_direct.c | 8 ++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/transport_layer/etcp_keepalive.h b/src/transport_layer/etcp_keepalive.h index 04a3f9ab..a47c2fcd 100644 --- a/src/transport_layer/etcp_keepalive.h +++ b/src/transport_layer/etcp_keepalive.h @@ -15,8 +15,8 @@ extern "C" { * Обычный keepalive (normal-режим) и спячка (standby) — раздельные механизмы * (разные таймеры, разный код): * - * normal: периодический flagless-keepalive (адаптивный период) + dead-link - * по keepalive_timeout. Активен только когда бодрствуют обе стороны. + * normal: периодический flagless-keepalive (адаптивный период). + * Отправка активна только когда бодрствуют обе стороны. * * standby (спящий узел): периодический flagless НЕ шлётся вовсе. На фазовых * переходах duty-cycle (SLEEP 120с / ACTIVE 2с) шлётся анонс @@ -25,6 +25,10 @@ extern "C" { * KA_SLEEP_MIN_ATTEMPTS). Кумулятивные провалы (сброс по ACK) — при * KA_SLEEP_MAX_FAILS → link down (детект мёртвого пира в спячке). * + * RX watchdog: отдельный конечный deadline работает в обоих режимах. Учитывает + * объявленный ACTIVE+SLEEP и keepalive_timeout; фазы и отправки его + * не продлевают. Пробуждение сразу сокращает срок до normal timeout. + * * Формат пакета: * data[0] = ETCP_KEEPALIVE (0x08) * data[1] = flags (bit0 = KA_FLAG_SLEEP — «я сплю», bit1 = KA_FLAG_SLEEP_ACK — ответ) diff --git a/src/transport_layer/node_conn_direct.c b/src/transport_layer/node_conn_direct.c index b3b46d90..9ea8e292 100644 --- a/src/transport_layer/node_conn_direct.c +++ b/src/transport_layer/node_conn_direct.c @@ -611,8 +611,8 @@ static void ncd_cancel_deliver_up(struct NODE_CONN_DIRECT* h, struct UASYNC* ua) /* * fin_wait — состояние ожидания подтверждения закрытия от пира. * Вызывающая сторона: мы отправили CLOSE и ждём ответа (KEEP_ALIVE или DOWN). - * Максимальное время ожидания — NCD_FIN_WAIT_TIMEOUT_TB (5 сек), после чего - * соединение форсированно закрывается. + * Обычное ожидание — NCD_FIN_WAIT_TIMEOUT_TB (5 сек); объявленный сон продлевает + * его до RX deadline живого линка. По истечении закрываем транспорт. */ /* @@ -627,7 +627,7 @@ static void ncd_fin_wait_cancelled(struct ETCP_CONN* conn, void* arg) { } /* - * Таймаут fin_wait: peer не ответил на CLOSE за NCD_FIN_WAIT_TIMEOUT_TB (5 сек). + * Таймаут fin_wait: peer не ответил на CLOSE в отведённый срок с учётом сна. * Форсированно закрываем conn и освобождаем entry — соединение разорвано * без подтверждения от пира. */ @@ -1125,7 +1125,7 @@ int node_conn_direct_open_node(struct UTUN_INSTANCE* inst, uint64_t node_id, * * Если это был последний handle (handle_count стал 0): * - Запускается протокол graceful shutdown: пиру отправляется CLOSE, conn - * переводится в fin_wait, ставится таймер на 5 сек. + * переводится в fin_wait, ставится таймер на 5 сек либо до пробуждения пира. * - Если пир ответит KEEP_ALIVE (у него ещё есть handle'ы) — conn останется жив, * просто без наших handle'ов. * - Если пир не ответит — conn закрывается форсированно по таймауту.