From d58d4d39c442ba66106d7752a1eeaec1c64a07d7 Mon Sep 17 00:00:00 2001 From: evgeny Date: Mon, 14 Sep 2026 22:46:41 +0300 Subject: [PATCH] =?UTF-8?q?chat=20join:=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81?= =?UTF-8?q?=D0=BA=20JOIN=5FINFO=5FREQ=20=D0=BF=D1=80=D0=B8=20=D1=83=D0=B6?= =?UTF-8?q?=D0=B5=20=D0=BF=D0=BE=D0=B4=D0=BD=D1=8F=D1=82=D0=BE=D0=BC=20?= =?UTF-8?q?=D1=81=D0=BE=D0=B5=D0=B4=D0=B8=D0=BD=D0=B5=D0=BD=D0=B8=D0=B8=20?= =?UTF-8?q?+=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=B4=D0=B6=D0=BE=D0=B9=D0=BD=D0=B5=D1=80=D0=B0=20?= =?UTF-8?q?=D0=B2=20=D0=B3=D1=80=D1=83=D0=BF=D0=BF=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - cm_invite_trampoline: если уже подключены к connection-узлу — cs_on_conn_up повторно не сработает, запускаем join-хендшейк напрямую (cs_start_channel_join) - chat_join_process_request: после верификации ключа сразу добавляем джойнера в CHAT-группу (topo_group_new_conn), чтобы BGP подключился --- src/chat/chat_join.c | 15 ++++++++++++++- src/chat/chat_sync.c | 10 ++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/chat/chat_join.c b/src/chat/chat_join.c index be09d92a..ac5623b6 100644 --- a/src/chat/chat_join.c +++ b/src/chat/chat_join.c @@ -10,6 +10,7 @@ #include "../utun_instance.h" #include "../routing_layer/topo_node_sqlite.h" +#include "../routing_layer/topo_group.h" #include "../routing_layer/etcp_router.h" #include "../routing_layer/route_crypto.h" #include "../transport_layer/etcp_api.h" @@ -184,8 +185,20 @@ void chat_join_process_request(struct UTUN_INSTANCE* inst, uint64_t group_id, CJ_ID, ch_id, (unsigned long long)m.node_id, rc); return; } - if (rc & MS_APPLY_CHANGED) + if (rc & MS_APPLY_CHANGED) { member_sync_broadcast_one(inst, ch_id, m.node_id); + /* джойнер авторизован — добавляем в CHAT-группу сразу, чтобы BGP подключился */ + uint64_t gid = strtoull(ch_id, NULL, 10); + struct TOPO_GROUP* g = topo_groups_find(inst->topo_groups, gid); + if (g && g->group_type == TOPO_GROUP_TYPE_CHAT) { + struct ETCP_CONN* jc = instance_find_conn(inst, m.node_id); + if (jc) { + topo_group_new_conn(g, jc); + DEBUG_INFO(DEBUG_CATEGORY_CHAT_SYNC, "%s: joiner 0x%016llx added to group ch=%s for BGP", + CJ_ID, (unsigned long long)m.node_id, ch_id); + } + } + } DEBUG_INFO(DEBUG_CATEGORY_CHAT_SYNC, "%s: process_request accepted joiner=0x%016llx ch=%s via=0x%016llx key=%016llx — signed by me", CJ_ID, (unsigned long long)m.node_id, ch_id, (unsigned long long)from_node, (unsigned long long)join_key); diff --git a/src/chat/chat_sync.c b/src/chat/chat_sync.c index 78b80cfb..8411e537 100644 --- a/src/chat/chat_sync.c +++ b/src/chat/chat_sync.c @@ -788,6 +788,16 @@ static void cm_invite_trampoline(void* arg) { int r = topo_group_invite_to_channel(inst, channel_id, ni, node_id); if (r < 0) { DEBUG_ERROR(DEBUG_CATEGORY_GENERAL, "channel invite: FAILED — topo_group_invite_to_channel error=%d", r); + } else { + /* если уже подключены к connection-узлу — cs_on_conn_up отработал до установки + pending_invite_ch_id и повторно не сработает, поэтому запускаем join-хендшейк напрямую */ + struct ETCP_CONN* conn = instance_find_conn(inst, node_id); + if (conn && conn->links_up && conn->initialized) { + g_cs->pending_invite_node_id = node_id; + DEBUG_INFO(DEBUG_CATEGORY_MEMBER_SYNC, "%s: already connected to 0x%016llx — starting join handshake directly", + CS_ID, (unsigned long long)node_id); + cs_start_channel_join(g_cs, node_id); + } } /* free caller-owned ni */