docs: AGENTS.md chat module descriptions, improved ETCP debug logging, android AGENTS update
This commit is contained in:
1 parent
6f502243db
commit
df13b16fad
6 files changed
+95
-36
No files matched your search
@@ -1,3 +1,27 @@
|
||||
/*
|
||||
* chat_sync.h — оркестратор синхронизации чата по ETCP
|
||||
*
|
||||
* При поднятии / разрыве ETCP-соединений:
|
||||
* - обновляет online-статус пиров в БД и GUI
|
||||
* - запускает member_sync (синхронизацию участников каналов) через merkle_sync
|
||||
* - управляет кешем каналов (периодический refresh из БД, 30s)
|
||||
*
|
||||
* Обслуживает протокол входа в канал между joiner и inviter:
|
||||
* CHANNEL_INFO_REQ → CHANNEL_INFO_RESP → CHANNEL_JOIN → WELCOME
|
||||
* Все сообщения с Ed25519-верификацией.
|
||||
*
|
||||
* Обрабатывает invite-ссылки (chat_sync_connect_from_invite):
|
||||
* - сохраняет pubkey и адреса invite-узла в БД (nodes, node_addresses)
|
||||
* - создаёт TOPO_GROUP, запускает conn_mgr для подключения
|
||||
* - после поднятия ETCP-соединения запускает join-протокол
|
||||
*
|
||||
* Использование:
|
||||
* 1. chat_sync_init(inst) — вызывается при старте, биндит ETCP_RT_ID_CHAT_SYNC (0x30)
|
||||
* 2. chat_sync_connect_from_invite(ch_id, node_id, pubkey, addrs, count) — вход по invite
|
||||
* 3. chat_sync_join_channel(inst, ch_id, target_node_id) — вход через уже подключённый узел
|
||||
* 4. chat_sync_destroy(inst) — вызывается при завершении
|
||||
*/
|
||||
|
||||
#ifndef CHAT_SYNC_H
|
||||
#define CHAT_SYNC_H
|
||||
|
||||
|
||||
@@ -993,10 +993,10 @@ static void etcp_link_ready_callback(struct ETCP_CONN* etcp) {
|
||||
}
|
||||
|
||||
if (etcp->links_up==0) {
|
||||
DEBUG_TRACE(DEBUG_CATEGORY_ETCP, "switch ETCP down -> up");
|
||||
DEBUG_INFO(DEBUG_CATEGORY_DEBUG, "[%s] etcp_link_ready_callback: links_up 0→1, calling etcp_on_up (initialized=%d tx_state=%d)", etcp->log_name, etcp->initialized, etcp->tx_state);
|
||||
etcp->links_up=1;
|
||||
etcp_on_up(etcp);
|
||||
} else DEBUG_TRACE(DEBUG_CATEGORY_ETCP, "skip on_up - ETCP already up");
|
||||
} else DEBUG_DEBUG(DEBUG_CATEGORY_DEBUG, "[%s] etcp_link_ready_callback: links_up=%d already up", etcp->log_name, etcp->links_up);
|
||||
|
||||
|
||||
if (etcp->tx_state!=ETCP_TX_STATE_LINK_WAIT) return;
|
||||
|
||||
@@ -195,10 +195,10 @@ static void etcp_link_init_timer_cbk(void* arg) {
|
||||
}
|
||||
link->init_timer = uasync_set_timeout(link->etcp->instance->ua, link->init_timeout, link, etcp_link_init_timer_cbk, "link_init");
|
||||
|
||||
if (link->link_state == 3 && link->initialized) return;
|
||||
if (link->etcp->links_up > 0) return; /* another link is already UP on this connection */
|
||||
if (link->link_state == 1) etcp_link_send_init(link,1,0);// init (with etcp reset)
|
||||
else etcp_link_send_init(link,0,0);// no etcp reset (reinit)
|
||||
if (link->link_state == 3 && link->initialized) { DEBUG_DEBUG(DEBUG_CATEGORY_DEBUG, "[%s] init_timer: SUPPRESSED state=%d init=%d link_status=%d recv_ka=%d remote_ka=%d links_up=%d", link->etcp->log_name, link->link_state, link->initialized, link->link_status, link->recv_keepalive, link->remote_keepalive, link->etcp->links_up); return; }
|
||||
if (link->etcp->links_up > 0) { DEBUG_DEBUG(DEBUG_CATEGORY_DEBUG, "[%s] init_timer: SUPPRESSED (links_up=%d > 0)", link->etcp->log_name, link->etcp->links_up); return; }
|
||||
if (link->etcp->got_initial_pkt == 0) etcp_link_send_init(link,1,0);
|
||||
else etcp_link_send_init(link,0,0);
|
||||
}
|
||||
|
||||
void etcp_link_restart_init_timer(struct ETCP_LINK* link) {
|
||||
@@ -223,7 +223,8 @@ void etcp_link_enter_reinit(struct ETCP_LINK* link) {
|
||||
link->link_state = 2; // reconnect
|
||||
etcp_on_link_down(link->etcp);
|
||||
if (link->is_server != 0) return;
|
||||
etcp_link_send_init(link,0,0);// init without reset
|
||||
etcp_conn_reinit(link->etcp);
|
||||
etcp_link_send_init(link,1,0);
|
||||
|
||||
if (link->keepalive_timer) {// keepalive заменяяется reinit запросами
|
||||
uasync_cancel_timeout(link->etcp->instance->ua, link->keepalive_timer);
|
||||
@@ -323,7 +324,7 @@ static void keepalive_timer_cb(void* arg) {
|
||||
link->recv_keepalive = 0;
|
||||
link->link_status = 0;
|
||||
etcp_on_link_down(link->etcp);
|
||||
DEBUG_INFO(DEBUG_CATEGORY_KEEPALIVE, "[%s] Conn:%s Link down: link_id=%d ka=%d remote_ka=%d tmo: %d>%d", link->etcp->log_name, link->conn?link->conn->name:"???", link->local_link_id, link->recv_keepalive, link->remote_keepalive, elapsed, timeout_units);
|
||||
DEBUG_INFO(DEBUG_CATEGORY_KEEPALIVE, "[%s] Conn:%s Link down: link_id=%d state=%d init=%d ka=%d remote_ka=%d tmo: %llu>%llu els=%llums", link->etcp->log_name, link->conn?link->conn->name:"???", link->local_link_id, link->link_state, link->initialized, link->recv_keepalive, link->remote_keepalive, (unsigned long long)timeout_units, (unsigned long long)elapsed, (unsigned long long)(elapsed/10));
|
||||
DEBUG_WARN(DEBUG_CATEGORY_KEEPALIVE, "[%s] Link %p (local_id=%d) recv status changed to DOWN - no packets for %llu ms", link->etcp->log_name, link, link->local_link_id, (unsigned long long)(elapsed/10));
|
||||
}
|
||||
}
|
||||
@@ -1535,7 +1536,11 @@ static int handle_init_response_client(struct ETCP_SOCKET* e_sock, struct ETCP_D
|
||||
link->init_timer = NULL;
|
||||
}
|
||||
|
||||
|
||||
if (pkt_code == ETCP_INIT_RESPONSE && link->etcp->got_initial_pkt) {
|
||||
DEBUG_INFO(DEBUG_CATEGORY_ETCP, "[%s] REINIT from client: INIT_RESPONSE(0x03) received, reinit conn=%p",
|
||||
link->etcp->log_name, (void*)link->etcp);
|
||||
etcp_conn_reinit(link->etcp);
|
||||
}
|
||||
|
||||
if (link->etcp->initialized == 0) {
|
||||
etcp_conn_ready(link->etcp);
|
||||
@@ -1908,13 +1913,13 @@ void etcp_connections_read_callback_socket(socket_t sock, void* arg) {
|
||||
if (ml->init_timer) { uasync_cancel_timeout(conn->instance->ua, ml->init_timer); ml->init_timer = NULL; }
|
||||
}
|
||||
|
||||
/* Sync session_id; reset only if new session (not when yielding to master) */
|
||||
/* Sync session_id; reset if remote is clean and we're dirty, or request reset if we're clean and remote is dirty */
|
||||
conn->session_id = session_id;
|
||||
if (!yielding && conn->got_initial_pkt) {
|
||||
send_reset = 1;
|
||||
DEBUG_INFO(DEBUG_CATEGORY_CONNECTION, "[%s] REINIT existing link: code=0x%02x sess=%08x→%08x got_init=%d initialized=%d links_up=%d",
|
||||
conn->log_name, code, conn->session_id, session_id, conn->got_initial_pkt, conn->initialized, conn->links_up);
|
||||
etcp_conn_reinit(conn);
|
||||
if (req->code == ETCP_INIT_REQUEST) {
|
||||
if (conn->got_initial_pkt) etcp_conn_reinit(conn);
|
||||
send_reset = 0;
|
||||
} else {
|
||||
if (conn->got_initial_pkt == 0) send_reset = 1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1994,14 +1999,16 @@ process_decrypted:
|
||||
/* restore recv_keepalive BEFORE computing link_status = remote && local */
|
||||
if (link->recv_keepalive != 1) {
|
||||
link->recv_keepalive = 1;
|
||||
DEBUG_DEBUG(DEBUG_CATEGORY_ETCP, "[%s] Link %d status changed to UP - packet received",
|
||||
link->etcp->log_name, link->local_link_id);
|
||||
DEBUG_DEBUG(DEBUG_CATEGORY_DEBUG, "[%s] Link %d recv_keepalive restored to 1 (was 0) link_status=%d remote_ka=%d state=%d init=%d links_up=%d",
|
||||
link->etcp->log_name, link->local_link_id, link->link_status, link->remote_keepalive, link->link_state, link->initialized, link->etcp->links_up);
|
||||
}
|
||||
|
||||
int was_up = link->link_status;
|
||||
link->link_status = link->remote_keepalive && link->recv_keepalive;
|
||||
if (link->link_status && !was_up && link->initialized)
|
||||
if (link->link_status && !was_up && link->initialized) {
|
||||
DEBUG_INFO(DEBUG_CATEGORY_DEBUG, "[%s] Link %d status popped UP: recv_ka=%d remote_ka=%d state=%d init=%d → calling loadbalancer_link_ready", link->etcp->log_name, link->local_link_id, link->recv_keepalive, link->remote_keepalive, link->link_state, link->initialized);
|
||||
loadbalancer_link_ready(link);
|
||||
}
|
||||
|
||||
link->last_recv_local_time=get_time_tb();
|
||||
link->last_recv_timestamp=pkt->timestamp;
|
||||
|
||||
@@ -194,7 +194,7 @@ void loadbalancer_link_ready(struct ETCP_LINK* link) {
|
||||
DEBUG_DEBUG(DEBUG_CATEGORY_ETCP, "link still blocked by shaper");
|
||||
return;
|
||||
}
|
||||
DEBUG_TRACE(DEBUG_CATEGORY_ETCP, "link=%p now ready, notifying ETCP_CONN", link);
|
||||
DEBUG_DEBUG(DEBUG_CATEGORY_DEBUG, "[%s] loadbalancer_link_ready: link=%p links_up=%d initialized=%d tx_state=%d", link->etcp->log_name, (void*)link, link->etcp->links_up, link->etcp->initialized, link->etcp->tx_state);
|
||||
if (link->etcp->link_ready_for_send_fn) {
|
||||
link->etcp->link_ready_for_send_fn(link->etcp);
|
||||
} else {
|
||||
|
||||
Reference in new issue
Block a user