chat join: запуск JOIN_INFO_REQ при уже поднятом соединении + добавление джойнера в группу
- cm_invite_trampoline: если уже подключены к connection-узлу — cs_on_conn_up повторно не сработает, запускаем join-хендшейк напрямую (cs_start_channel_join) - chat_join_process_request: после верификации ключа сразу добавляем джойнера в CHAT-группу (topo_group_new_conn), чтобы BGP подключился
This commit is contained in:
1 parent
910cfeac20
commit
d58d4d39c4
2 files changed
+24
-1
No files matched your search
+14
-1
@@ -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);
|
||||
|
||||
@@ -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 */
|
||||
|
||||
Reference in new issue
Block a user