etcp: reset_id эпоха ресета — фикс потери NODEINFO при флапе

Добавлен 64-битный reset_id (эпоха ресета) в INIT-фреймы и STCP-handshake:
- генерится один раз при создании conn, меняется только при фатальном ресете
  (normalizer desync / bad fragment size);
- при приёме чужого id slave принимает эпоху пира и ресетится, master держит свою;
- первый id принимается без ресета (свежие при init);
- «tcp peer clean» реинит гейтится по смене id — нет повторного сброса seq.

Это устраняет коллизию seq=1 (RX dup) из-за двойного реинита нескольких TCP-линков,
из-за которой NODEINFO пира терялся и member не возвращался online.

Также: chat member online теперь из topo_group (без БД/merkle), тест test_etcp_seq_collision.
This commit is contained in:
evgeny committed 2026-09-06 21:50:06 +03:00
1 parent f7c08f8f5e
commit 61c572cae4
29 files changed
+663 -385

No files matched your search

+2 -2
View File
@@ -82,7 +82,7 @@ static void onMemberListCallback(const uint8_t* data, int len) {
}
static void onMemberUpdatedCallback(const uint8_t* data, int len) {
if (len < 1 + 64 + 1 + 79) return;
if (len < 1) return;
uint8_t cl = data[0];
if (len < 1 + (int)cl + 1 + 79) return;
if (s_mainWindow)
@@ -90,7 +90,7 @@ static void onMemberUpdatedCallback(const uint8_t* data, int len) {
}
static void onMemberRemovedCallback(const uint8_t* data, int len) {
if (len < 1 + 64 + 8) return;
if (len < 1) return;
uint8_t cl = data[0];
if (len < 1 + (int)cl + 8) return;
uint64_t nid; memcpy(&nid, data + 1 + cl, 8);