Preserve per-link admission policy for shared ETCP connections
This commit is contained in:
1 parent
afa834a02d
commit
90f70f2b72
2 files changed
+9
-5
No files matched your search
@@ -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",
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in new issue
Block a user