topo_group: асимметричный старт BGP (JOIN_GROUP) + вынос group_id/flags из TOPO_NODE
- UTUN: BGP инициирует только сторона-клиент ([client]) и явные etcp_connect; сервер добавляет пира по JOIN_GROUP (фикс обратного маршрута: сервер не создавал узел клиента из-за дедупа senders_list) - topo_group_new_conn: conn_add_path до дедупа; handle_request_table без add_to_senders - TOPO_NODE: убраны group_id/flags (shared-реестр), передаются в topo_node_serialize - routing/control_server: явный TOPO_GROUP_UTUN - CHAT: гейт по peers_* (get_member_channels) + пассивное add/remove в member_sync - tests: тесты адаптированы (route_ping ждёт registry+v4_addrs) - chatgui-android: voice_recorder_init в utun_bridge_voice_start (idempotent)
This commit is contained in:
1 parent
7b73d99b5b
commit
656da48e35
20 files changed
+236
-46
No files matched your search
@@ -9,6 +9,7 @@
|
||||
#include "../lib/json_flat.h"
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define PEERS_JOIN_SIG_SIZE 64
|
||||
#define PEERS_JOIN_TS_SIZE 8
|
||||
@@ -168,6 +169,46 @@ int topo_node_sqlite_member_exists(sqlite3* db, uint64_t node_id) {
|
||||
return found;
|
||||
}
|
||||
|
||||
int topo_node_sqlite_get_member_channels(sqlite3* db, uint64_t node_id,
|
||||
uint64_t** out_ch_ids, int* out_count) {
|
||||
if (!db || !out_ch_ids || !out_count) return -1;
|
||||
*out_ch_ids = NULL; *out_count = 0;
|
||||
|
||||
sqlite3_stmt* s = NULL;
|
||||
if (sqlite3_prepare_v2(db,
|
||||
"SELECT name FROM sqlite_master WHERE type='table' AND name LIKE 'peers\\_%' ESCAPE '\\'",
|
||||
-1, &s, NULL) != SQLITE_OK) return -1;
|
||||
|
||||
uint64_t* ids = NULL; int count = 0, cap = 0;
|
||||
char sql[256];
|
||||
while (sqlite3_step(s) == SQLITE_ROW) {
|
||||
const char* tbl = (const char*)sqlite3_column_text(s, 0);
|
||||
if (!tbl || strncmp(tbl, "peers_", 6) != 0) continue;
|
||||
snprintf(sql, sizeof(sql), "SELECT 1 FROM \"%s\" WHERE node_id=?", tbl);
|
||||
sqlite3_stmt* m = NULL;
|
||||
if (sqlite3_prepare_v2(db, sql, -1, &m, NULL) == SQLITE_OK) {
|
||||
sqlite3_bind_int64(m, 1, (sqlite3_int64)node_id);
|
||||
int is_member = (sqlite3_step(m) == SQLITE_ROW);
|
||||
sqlite3_finalize(m);
|
||||
if (is_member) {
|
||||
uint64_t ch = strtoull(tbl + 6, NULL, 10);
|
||||
if (ch != 0) {
|
||||
if (count == cap) {
|
||||
cap = cap ? cap * 2 : 8;
|
||||
uint64_t* tmp = u_realloc(ids, (size_t)cap * sizeof(uint64_t));
|
||||
if (!tmp) { u_free(ids); sqlite3_finalize(s); return -1; }
|
||||
ids = tmp;
|
||||
}
|
||||
ids[count++] = ch;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
sqlite3_finalize(s);
|
||||
*out_ch_ids = ids; *out_count = count;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int topo_node_sqlite_init(sqlite3* db) {
|
||||
if (!db) return -1;
|
||||
|
||||
|
||||
Reference in new issue
Block a user