From 6cfd88afcf1791b53211dca669185735a0bb3ddc Mon Sep 17 00:00:00 2001 From: evgeny Date: Sat, 24 Oct 2026 16:25:27 +0200 Subject: [PATCH] Reject zero CM request ids before creating peer state --- src/routing_layer/conn_mgr_doc.md | 3 ++- tests/test_topo_node_wire.c | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/routing_layer/conn_mgr_doc.md b/src/routing_layer/conn_mgr_doc.md index a8bc3536..c61ba63b 100644 --- a/src/routing_layer/conn_mgr_doc.md +++ b/src/routing_layer/conn_mgr_doc.md @@ -129,7 +129,8 @@ BG ping проверяет по одному узлу каждые 100 мс; п первый подходящий UDP endpoint IPv4/IPv6. Candidate ping работает каждые 2 секунды: обновляет до трёх кандидатов, пингует активные UDP/STCP-линки и запускает пробы route_connectivity для неактивных. Без активного линка устаревший замер удаляет -кандидата через 30 секунд; проверка свежести RTT для согласования использует 20 секунд. +кандидата через 30 секунд. Если у READY-транспорта нет текущего RTT, результат +route_connectivity используется только в пределах 20 секунд после пробы. NAT-детектор откладывает эти пробы, standby переносит их в активную фазу. Кандидаты упорядочены по RTT, затем node_id. При заполнении кеша кандидат с diff --git a/tests/test_topo_node_wire.c b/tests/test_topo_node_wire.c index 4a6d6d3e..98c3dce1 100644 --- a/tests/test_topo_node_wire.c +++ b/tests/test_topo_node_wire.c @@ -438,6 +438,14 @@ static void test_local_allocation_failures(struct wire_fixture *f) { assert(!topo_node_find_by_id(created, bootstrap.node_id) && !topo_node_registry_find(&f->groups, bootstrap.node_id)); assert(live_allocations() == before); } + struct TOPO_NODE* known = topo_node_sqlite_node_load(f->inst.topo_sqlite_db, &f->groups, bootstrap.node_id); + assert(known && topo_node_registry_store(&f->groups, known)); + struct CM_DIRECT_REQ invalid_direct = {ETCP_RT_ID_CONN_MGR, CM_SUBCMD_DIRECT_REQ, 0}; + cm_handle_direct_req(bootstrap.node_id, created->conn_mgr, (const uint8_t*)&invalid_direct, sizeof(invalid_direct)); + struct CM_EXCHANGE_REQ invalid_exchange = {.cmd = ETCP_RT_ID_CONN_MGR, .subcmd = CM_SUBCMD_INTERM_EXCHANGE_REQ}; + cm_handle_interm_exchange_req(bootstrap.node_id, created->conn_mgr, &invalid_exchange); + assert(!created->conn_mgr->entries->head); + topo_node_registry_unref(&f->groups, bootstrap.node_id); assert(sqlite3_close(f->inst.topo_sqlite_db) == SQLITE_OK); f->inst.topo_sqlite_db = NULL; topo_groups_remove_group(&f->groups, 43); uasync_poll(f->inst.ua, 0); queue_free(f->groups.group_list); f->groups.group_list = NULL;