Browse Source

Clarify independent RX watchdog and sleep-aware graceful close deadlines

master
evgeny 1 week ago
parent
commit
6704a18897
  1. 8
      src/transport_layer/etcp_keepalive.h
  2. 8
      src/transport_layer/node_conn_direct.c

8
src/transport_layer/etcp_keepalive.h

@ -15,8 +15,8 @@ extern "C" {
* Обычный keepalive (normal-режим) и спячка (standby) — раздельные механизмы * Обычный keepalive (normal-режим) и спячка (standby) — раздельные механизмы
* (разные таймеры, разный код): * (разные таймеры, разный код):
* *
* normal: периодический flagless-keepalive (адаптивный период) + dead-link * normal: периодический flagless-keepalive (адаптивный период).
* по keepalive_timeout. Активен только когда бодрствуют обе стороны. * Отправка активна только когда бодрствуют обе стороны.
* *
* standby (спящий узел): периодический flagless НЕ шлётся вовсе. На фазовых * standby (спящий узел): периодический flagless НЕ шлётся вовсе. На фазовых
* переходах duty-cycle (SLEEP 120с / ACTIVE 2с) шлётся анонс * переходах duty-cycle (SLEEP 120с / ACTIVE 2с) шлётся анонс
@ -25,6 +25,10 @@ extern "C" {
* KA_SLEEP_MIN_ATTEMPTS). Кумулятивные провалы (сброс по ACK) — при * KA_SLEEP_MIN_ATTEMPTS). Кумулятивные провалы (сброс по ACK) — при
* KA_SLEEP_MAX_FAILS → link down (детект мёртвого пира в спячке). * KA_SLEEP_MAX_FAILS → link down (детект мёртвого пира в спячке).
* *
* RX watchdog: отдельный конечный deadline работает в обоих режимах. Учитывает
* объявленный ACTIVE+SLEEP и keepalive_timeout; фазы и отправки его
* не продлевают. Пробуждение сразу сокращает срок до normal timeout.
*
* Формат пакета: * Формат пакета:
* data[0] = ETCP_KEEPALIVE (0x08) * data[0] = ETCP_KEEPALIVE (0x08)
* data[1] = flags (bit0 = KA_FLAG_SLEEP — «я сплю», bit1 = KA_FLAG_SLEEP_ACK — ответ) * data[1] = flags (bit0 = KA_FLAG_SLEEP — «я сплю», bit1 = KA_FLAG_SLEEP_ACK — ответ)

8
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 — состояние ожидания подтверждения закрытия от пира. * fin_wait — состояние ожидания подтверждения закрытия от пира.
* Вызывающая сторона: мы отправили CLOSE и ждём ответа (KEEP_ALIVE или DOWN). * Вызывающая сторона: мы отправили 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 — соединение разорвано * Форсированно закрываем conn и освобождаем entry — соединение разорвано
* без подтверждения от пира. * без подтверждения от пира.
*/ */
@ -1125,7 +1125,7 @@ int node_conn_direct_open_node(struct UTUN_INSTANCE* inst, uint64_t node_id,
* *
* Если это был последний handle (handle_count стал 0): * Если это был последний handle (handle_count стал 0):
* - Запускается протокол graceful shutdown: пиру отправляется CLOSE, conn * - Запускается протокол graceful shutdown: пиру отправляется CLOSE, conn
* переводится в fin_wait, ставится таймер на 5 сек. * переводится в fin_wait, ставится таймер на 5 сек либо до пробуждения пира.
* - Если пир ответит KEEP_ALIVE (у него ещё есть handle'ы) — conn останется жив, * - Если пир ответит KEEP_ALIVE (у него ещё есть handle'ы) — conn останется жив,
* просто без наших handle'ов. * просто без наших handle'ов.
* - Если пир не ответит — conn закрывается форсированно по таймауту. * - Если пир не ответит — conn закрывается форсированно по таймауту.

Loading…
Cancel
Save