diff --git a/src/routing_layer/conn_mgr.c b/src/routing_layer/conn_mgr.c index 2e8002ac..800ec3ca 100644 --- a/src/routing_layer/conn_mgr.c +++ b/src/routing_layer/conn_mgr.c @@ -557,6 +557,7 @@ static void cm_start_phase_direct(struct CONN_MGR_ENTRY* entry) { etcp_conn_add_init_cbk(conn, cm_direct_init_cb, entry); sc_init_ctx(&conn->crypto_ctx, &entry->mgr->instance->my_keys); sc_set_peer_public_key(&conn->crypto_ctx, target->node->public_key, 0); + etcp_conn_set_peer_node_id(conn, entry->node_id); if (etcp_link_new(conn, s, &sa, 0)) { entry->main.timer = uasync_set_timeout(entry->mgr->instance->ua, (int)(entry->mgr->direct_timeout_ms * 10), entry, cm_direct_timeout_cb, "conn_mgr_db_direct"); return; @@ -589,6 +590,7 @@ static void cm_start_phase_direct(struct CONN_MGR_ENTRY* entry) { etcp_conn_add_init_cbk(conn, cm_direct_init_cb, entry); sc_init_ctx(&conn->crypto_ctx, &entry->mgr->instance->my_keys); sc_set_peer_public_key(&conn->crypto_ctx, target->node->public_key, 0); + etcp_conn_set_peer_node_id(conn, entry->node_id); if (etcp_link_new(conn, s, &sa, 0)) { entry->main.timer = uasync_set_timeout(entry->mgr->instance->ua, (int)(entry->mgr->direct_timeout_ms * 10), entry, cm_direct_timeout_cb, "conn_mgr_direct"); return; diff --git a/src/transport_layer/etcp.c b/src/transport_layer/etcp.c index 9fd05d8d..7416e46f 100644 --- a/src/transport_layer/etcp.c +++ b/src/transport_layer/etcp.c @@ -661,7 +661,23 @@ void etcp_conn_set_peer_node_id(struct ETCP_CONN* conn, uint64_t peer_node_id) { if (conn->peer_node_id == peer_node_id) return; - if (conn->state == 1 && conn->peer_node_id != 0) { + if (conn->state == 0 && conn->peer_node_id == 0 && peer_node_id != 0) { + /* первый раз ставим реальный peer_id: переиндексировать из key=0 в key=peer_node_id */ + DEBUG_DEBUG(DEBUG_CATEGORY_ETCP, "[%s] peer_node_id 0 -> 0x%llx, reindexing pending conn", + conn->log_name, (unsigned long long)peer_node_id); + if (conn->conn_queue && conn->conn_queue_entry) { + queue_remove_data(conn->conn_queue, conn->conn_queue_entry); + queue_entry_free(conn->conn_queue_entry); + } + struct ll_entry* qe = queue_entry_new(sizeof(struct conn_queue_entry)); + if (!qe) { DEBUG_ERROR(DEBUG_CATEGORY_ETCP, "[%s] reindex alloc failed", conn->log_name); return; } + struct conn_queue_entry* ce = (struct conn_queue_entry*)qe->data; + ce->peer_node_id = peer_node_id; + ce->conn = conn; + conn->conn_queue_entry = qe; + conn->conn_queue = conn->instance->connections; + queue_data_put_with_index(conn->instance->connections, qe); + } else if (conn->state == 1 && conn->peer_node_id != 0) { // Already in indexed queue with old ID — reindex DEBUG_WARN(DEBUG_CATEGORY_ETCP, "[%s] peer_node_id changed 0x%llx -> 0x%llx, reindexing", conn->log_name, (unsigned long long)conn->peer_node_id, (unsigned long long)peer_node_id);