Preserve per-link admission policy for shared ETCP connections

This commit is contained in:
evgeny committed 2026-10-30 22:38:52 +01:00
1 parent afa834a02d
commit 90f70f2b72
2 files changed
+9 -5

No files matched your search

+6 -4
View File
@@ -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",
+3 -1
View File
@@ -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);