From 90f70f2b72ebf60f3992f30fc29c2b7c015c8311 Mon Sep 17 00:00:00 2001 From: evgeny Date: Fri, 30 Oct 2026 22:38:52 +0100 Subject: [PATCH] Preserve per-link admission policy for shared ETCP connections --- src/transport_layer/etcp_connections.c | 10 ++++++---- src/transport_layer/etcp_connections.h | 4 +++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/transport_layer/etcp_connections.c b/src/transport_layer/etcp_connections.c index cc5ef91fe..226665dbf 100644 --- a/src/transport_layer/etcp_connections.c +++ b/src/transport_layer/etcp_connections.c @@ -142,7 +142,7 @@ void tcp_server_on_link(struct stcp_link *link, struct ETCP_SOCKET *tcp_sock) { conn ? "existing" : "NEW", (void*)conn, (unsigned long long)node_id, (unsigned long long)wire_read64(pubkey)); if (!conn) { - conn = etcp_connection_create(inst, NULL); + conn = etcp_connection_create(inst, NULL, 0); if (!conn) { DEBUG_ERROR(DEBUG_CATEGORY_ETCP, "tcp_server_on_link: etcp_connection_create failed/cancelled"); stcp_link_close(link); return; } conn->peer_node_id = node_id; if (sc_init_ctx(&conn->crypto_ctx, &inst->my_keys) != SC_OK) { @@ -1229,7 +1229,7 @@ static struct ETCP_LINK* link_create(struct ETCP_CONN* etcp, struct ETCP_SOCKET* return link; } -struct ETCP_LINK* etcp_link_add(struct ETCP_CONN* conn, const struct packet_link_driver* driver) { +struct ETCP_LINK* etcp_link_add(struct ETCP_CONN* conn, const struct packet_link_driver* driver, int require_known_node) { if (!conn || !driver || !driver->get_state || driver->ua != conn->instance->ua || !conn->crypto_ctx.session_ready || !conn->peer_node_id || conn->peer_node_id != sc_derive_node_id_from_pubkey(conn->crypto_ctx.peer_public_key)) { @@ -1239,7 +1239,9 @@ struct ETCP_LINK* etcp_link_add(struct ETCP_CONN* conn, const struct packet_link if (state.max_packet < SC_ENCRYPT_OVERHEAD + ETCP_PAYLOAD_HEADER_SIZE + ACK_REZERV + 3) { DEBUG_ERROR(DEBUG_CATEGORY_ETCP, "link_add: packet capacity too small: %zu", state.max_packet); return NULL; } - return link_create(conn, NULL, NULL, 0, driver); + struct ETCP_LINK* link = link_create(conn, NULL, NULL, 0, driver); + if (link) link->require_known_node = !!require_known_node; /* RX/state callbacks драйвера отложены. */ + return link; } struct ETCP_LINK* etcp_link_new(struct ETCP_CONN* conn, struct ETCP_SOCKET* socket, @@ -2670,7 +2672,7 @@ static void etcp_process_packet_direct(struct ETCP_SOCKET* e_sock, uint8_t* data int new_conn=0; if (!conn || conn->peer_node_id!=peer_id) {// создаём новое подключение [new etcp] new_conn=1; - conn=etcp_connection_create(e_sock->instance,""); + conn=etcp_connection_create(e_sock->instance,"",0); if (!conn) { errorcode=55; DEBUG_ERROR(DEBUG_CATEGORY_ETCP, "failed to create connection"); goto ec_fr; } memcpy(&conn->crypto_ctx, &sc, sizeof(sc)); DEBUG_DEBUG(DEBUG_CATEGORY_CRYPTO, "CRYPTO_CTX_INIT: peer=%016llx session_ready=%d", diff --git a/src/transport_layer/etcp_connections.h b/src/transport_layer/etcp_connections.h index 5bc82d803..feecf2246 100644 --- a/src/transport_layer/etcp_connections.h +++ b/src/transport_layer/etcp_connections.h @@ -240,6 +240,8 @@ struct ETCP_LINK { uint32_t recovery_interval; // recovery интервал (x0.1ms) uint8_t is_server; // инициирует подключение клиент uint8_t initialized; // Флаг инициализации (1=подтверждено или получен request) + uint8_t require_known_node; // Политика этого пути; OR с conn->require_known_node для общего ETCP_CONN. + uint8_t peer_admitted; // Положительный результат проверки после аутентифицированного handshake; сбрасывается при новом INIT. uint8_t closing; // Close начат: повторный вход из callback игнорируется до окончательного free uint32_t active_users; // Внутренние стеки конструктора/RX/событий; память закрытого линка живёт до выхода последнего uint8_t local_link_id; // id моего линка @@ -436,7 +438,7 @@ void tcp_server_on_link(struct stcp_link *link, struct ETCP_SOCKET *tcp_sock); * Успех копирует API и забирает ctx; отказ оставляет ctx непривязанным у вызывающего. * Начальный handshake/callbacks отложены. Все операции — conn->instance->ua. */ struct packet_link_driver; -struct ETCP_LINK* etcp_link_add(struct ETCP_CONN* conn, const struct packet_link_driver* driver); +struct ETCP_LINK* etcp_link_add(struct ETCP_CONN* conn, const struct packet_link_driver* driver, int require_known_node); struct ETCP_LINK* etcp_link_new(struct ETCP_CONN* etcp, struct ETCP_SOCKET* conn, const struct sockaddr_storage* remote_addr, uint8_t is_server);