Document INIT liveness and response validation contracts

This commit is contained in:
evgeny committed 2026-10-23 14:16:28 +02:00
1 parent a87d3116af
commit 35ef504423
2 files changed
+12 -1

No files matched your search

+9
View File
@@ -259,6 +259,15 @@ link_state: 0=just init, 1=handshake, 2=reconnect, 3=connected.
При получении INIT получатель создаёт или переиспользует ETCP_CONN и подходящий линк;
для существующего соединения проверяет совпадение ключа пира. Эпоха из INIT учитывается
через etcp_conn_apply_peer_reset_id, без немедленного сброса потока при смене известной эпохи.
Принятый INIT обновляет recv_keepalive, время последнего RX и входной remote_keepalive=flag_up
до переиспользования буфера для ответа. INIT с flag_up=0 снимает прежний UP UDP-линка:
получение запроса доказывает только входящую достижимость, обратный путь ещё не подтверждён.
Ответ и keepalive отправляются и при DOWN, чтобы холодное подключение и восстановление
могли завершить двустороннюю проверку. При DOWN одного линка соединение остаётся UP,
если есть другой работоспособный линк. Повтор неизменного состояния не создаёт нового DOWN/UP.
INIT_RESPONSE должен содержать полное обязательное тело (64 байта без timestamp/flag_up)
и node_id, соответствующий аутентифицированному ключу пира. Усечённый ответ или чужой node_id
отклоняются до изменения живости, эпохи и параметров линка. Дополнительный padding разрешён.
приём кодограмм из UDP выглядит так:
uasync select -> etcp_connection.c etcp_connections_read_callback: memory_pool_alloc, decrypt (or init) -> etcp_conn_input (etcp.c/h - сам tcp механизм) -> ETCP_CONN output_queue
+3 -1
View File
@@ -111,7 +111,8 @@ struct ETCP_INIT_REQUEST_PKT {
#define ETCP_INIT_REQ_SIZE sizeof(struct ETCP_INIT_REQUEST_PKT)
// INIT RESPONSE: server → client
// INIT RESPONSE: server → client. Обязательное тело — 64 байта без timestamp/flag_up и padding.
// Полнота тела и node_id проверяются до изменения RX/эпохи/параметров линка.
struct ETCP_INIT_RESPONSE_PKT {
uint8_t code; // 0: ETCP_INIT_RESPONSE (0x03) или ETCP_INIT_RESPONSE_NOINIT (0x05)
uint8_t node_id[8]; // 1: server node_id (big-endian)
@@ -440,6 +441,7 @@ void etcp_tcp_link_start_connect(struct ETCP_LINK *link, struct sockaddr_storage
void etcp_tcp_link_start_reconnect(struct ETCP_LINK *link);
/* Принять plaintext установленного линка: session/формат проверяются до соответствующей обработки RX.
* pkt_len включает timestamp/flag_up; длина тела после этих трёх байт записывается в pkt->data_len.
* 0 — pkt потреблён; ненулевой код — pkt остаётся вызывающему. RX/handshake callbacks могут запросить close;
* callbacks_running удерживает teardown до выхода, сброс сессии прекращает обработку старого потока. */
int etcp_packet_decrypted(struct ETCP_SOCKET* e_sock, struct ETCP_DGRAM* pkt,