Align REALITY round-trip fixture with NODEINFO ownership

This commit is contained in:
evgeny committed 2026-10-24 13:09:16 +02:00
1 parent acd9dcd1a8
commit 99dd48480f
2 files changed
+25 -6

No files matched your search

+16 -5
View File
@@ -40,8 +40,9 @@ uint8_t buf[4096];
int len = topo_node_serialize(ni, nq, group_id, flags, buf, sizeof(buf), cumulative_rtt);
```
Запаковывает `TOPO_NODE` + per-group данные (`TOPO_GROUP_NODE`) в буфер: заголовок
`TOPOMSG_NODE`, затем имя узла, v4/v6 sock_meta, v4/v6 адреса, подсети (если
`TOPO_FLAG_SEND_SUBNETS`) и hop-лист (через `topo_node_best_hop_list`).
`TOPOMSG_NODE`, затем имя, SOCKMETA4, ADDR4, SOCKMETA6, ADDR6, REALITY-сокеты,
подсети (если `TOPO_FLAG_SEND_SUBNETS`) и hop-лист (через `topo_node_best_hop_list`).
Без флага подсети не записываются, а оба их счётчика в заголовке равны нулю.
**Десериализация при получении NODEINFO:**
```c
@@ -51,9 +52,17 @@ uint64_t* hop_list = NULL; uint8_t hop_count = 0;
uint16_t cumulative_rtt = 0;
topo_node_deserialize(group, data, data_len, &ni, &subnets, &hop_list, &hop_count, &cumulative_rtt);
```
Восстанавливает `TOPO_NODE` (через `u_calloc`), подсети и hop-лист. Освобождение:
При успехе (0) восстанавливает `TOPO_NODE` (через `u_calloc`) и запрошенные подсети/hop-лист.
`out_ni` обязателен; остальные выходы независимы и могут быть NULL. Все присутствующие
секции проходят проверку и занимают своё место в пакете, даже если их выход не запрошен.
Проверяются точная длина, согласованность флага/счётчиков подсетей, профили и длины префиксов.
Подпись и допустимость BGP-пути проверяются отдельно. При ошибке (-1) выходы обнулены,
частичные объекты освобождены. Освобождение успешного результата:
- `topo_node_destroy(groups, ni)` — освободить `TOPO_NODE` (списки адресов + имя).
- `topo_nodeq_free_group_fields(groups, nq)` — освободить per-group поля (`subnets`, `paths`-элементы).
- Подсети передаются в `TOPO_GROUP_NODE`; `topo_nodeq_free_group_fields` освобождает их и снимает registry ref.
Контейнер/записи путей освобождает отдельный `topo_nodeq_clear_paths`. Для целого узла используют `topo_nodeq_remove_node`.
- `u_free(hop_list)` — освободить отдельно выделенный массив переходов.
**Поиск узла по ID:**
```c
@@ -82,8 +91,10 @@ topo_node_format_all(group, buf, size); // в строку
- **TOPO_CONNECTIVITY** — локальное состояние связности (не передаётся по BGP): probe_status
(NONE/IN_PROGRESS/DONE/DEFERRED), RTT и статусы interface/nat/real, `probe_deferred_wait`.
- **TOPO_FLAG_SEND_SUBNETS** — если установлен, подсети сериализуются; для chat-групп сброшен.
Ненулевые счётчики подсетей без флага недопустимы, в том числе при `out_subnets=NULL`.
- **Wire-протокол**: заголовок `TOPOMSG_NODE` (packed) + динамика: `node_name`, `SOCKMETA4*N`,
`ADDR4*N`, `SOCKMETA6*N`, `ADDR6*N`, опционально подсети, hop-лист. Размер динамики — `topo_node_dyn_size()`.
`ADDR4*N`, `SOCKMETA6*N`, `ADDR6*N`, REALITY-сокеты, опционально подсети, hop-лист.
`topo_node_dyn_size()` возвращает размер динамики либо -1 при некорректном сочетании флага/счётчиков.
## 3. API
+9 -1
View File
@@ -8,7 +8,9 @@
#include "topo_node.h"
#include "topo_group.h"
#include "etcp_connections.h"
#include "utun_instance.h"
#include "../lib/debug_config.h"
#include "../lib/mem.h"
#include <stdio.h>
#include <string.h>
@@ -67,7 +69,10 @@ int main(void) {
uint8_t buf[2048];
int len = topo_node_serialize(&ni, &nq, 0x1234, 0, buf, sizeof(buf), 0);
CHECK(len > 0, "serialize ok");
struct TOPO_GROUP g; memset(&g, 0, sizeof(g));
struct UTUN_INSTANCE instance = {0};
struct TOPO_GROUPS groups = {.instance = &instance};
instance.topo_groups = &groups;
struct TOPO_GROUP g = {.instance = &instance};
struct TOPO_NODE* out_ni = NULL;
struct TOPO_NODESUBNETS* out_sub = NULL;
uint64_t* hop = NULL; uint8_t hopc = 0; uint16_t rtt = 0;
@@ -87,6 +92,9 @@ int main(void) {
CHECK(rr1 != NULL && !strcmp(rr1->server_name, long_sni), "round-trip: full server_name");
CHECK(rr1 != NULL && rr1->version[0] == 1 && rr1->version[1] == 2 && rr1->version[2] == 3, "round-trip: version");
}
CHECK(!out_sub && !hop && !hopc && !rtt, "round-trip: empty optional sections");
topo_node_destroy(&groups, out_ni);
u_free(hop);
if (test_failed) {
DEBUG_ERROR(DEBUG_CATEGORY_BGP, "=== Reality BGP Test: FAILED ===");