From d296074330602b23c383537ce0aedd4cbb6db5a6 Mon Sep 17 00:00:00 2001 From: evgeny Date: Wed, 5 Aug 2026 17:41:44 +0300 Subject: [PATCH] etcp: show which specific link went DOWN + always use registry node_name MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. etcp_on_down: add down_link param — log the specific lost link + remaining Connection DOWN — link 192.168.40.247:2122 lost, remaining: [::1]:6669, [::2]:9970 Connection DOWN — closing, links: ... (for reinit/close) 2. etcp_on_link_down: pass the triggering link through to etcp_on_down 3. etcp_update_log_name: always check registry for node_name (n_5a1b... → SM-A525F when name is available in registry) --- src/transport_layer/etcp.c | 22 ++++++++++++++-------- src/transport_layer/etcp.h | 2 +- src/transport_layer/etcp_connections.c | 4 ++-- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/transport_layer/etcp.c b/src/transport_layer/etcp.c index 4029cd65..ff311fcc 100644 --- a/src/transport_layer/etcp.c +++ b/src/transport_layer/etcp.c @@ -336,13 +336,19 @@ static void etcp_on_up(struct ETCP_CONN* etcp) { etcp->crypto_ctx.peer_public_key[2], etcp->crypto_ctx.peer_public_key[3]); } -static void etcp_on_down(struct ETCP_CONN* etcp) { +static void etcp_on_down(struct ETCP_CONN* etcp, struct ETCP_LINK* down_link) { char links_str[256] = {0}; int pp = 0; for (struct ETCP_LINK* l = etcp->links; l; l = l->next) { + if (l == down_link) continue; if (pp) pp += snprintf(links_str + pp, sizeof(links_str) - pp, ", "); pp += snprintf(links_str + pp, sizeof(links_str) - pp, "%s", sockaddr_storage_to_str(&l->remote_addr).str); } - DEBUG_INFO(DEBUG_CATEGORY_CONNECTION, "[%s] Connection DOWN — links: %s", etcp->log_name, pp ? links_str : "(none)"); + if (down_link) + DEBUG_INFO(DEBUG_CATEGORY_CONNECTION, "[%s] Connection DOWN — link %s lost%s%s", + etcp->log_name, sockaddr_storage_to_str(&down_link->remote_addr).str, + pp > 0 ? ", remaining: " : "", links_str); + else + DEBUG_INFO(DEBUG_CATEGORY_CONNECTION, "[%s] Connection DOWN — closing, links: %s", etcp->log_name, pp ? links_str : "(none)"); etcp_cbk_fire(etcp, ETCP_CBK_EVENT_DOWN); etcp_fire_conn_status(etcp, ETCP_CONN_STATUS_DOWN); } @@ -398,7 +404,7 @@ void etcp_connection_close(struct ETCP_CONN* etcp) { // === PHASE 1: detach from external world === - if (etcp->links_up != 0) { etcp->links_up = 0; etcp_on_down(etcp); } + if (etcp->links_up != 0) { etcp->links_up = 0; etcp_on_down(etcp, NULL); } // Cancel active timers if (etcp->retrans_timer) { uasync_cancel_timeout(etcp->instance->ua, etcp->retrans_timer); etcp->retrans_timer = NULL; } @@ -561,7 +567,7 @@ void etcp_conn_reset(struct ETCP_CONN* etcp) { etcp_on_up(etcp); } else { DEBUG_TRACE(DEBUG_CATEGORY_ETCP, "reset conn: set link down/up"); - etcp_on_down(etcp); + etcp_on_down(etcp, NULL); etcp_on_up(etcp); } } else { @@ -569,7 +575,7 @@ void etcp_conn_reset(struct ETCP_CONN* etcp) { if (etcp->links_up) { etcp->links_up=0; etcp->setup_start_tb = get_time_tb(); - etcp_on_down(etcp); + etcp_on_down(etcp, NULL); } } @@ -690,7 +696,7 @@ void etcp_update_log_name(struct ETCP_CONN* etcp) { uint16_t local_id = etcp->instance->node_id; uint16_t peer_id = etcp->peer_node_id; const char* name = etcp->name ? etcp->name : EMPTY_NAME; - if (!name[0] && etcp->instance->topo_groups && peer_id) { + if (etcp->instance->topo_groups && peer_id) { struct TOPO_NODE* ni = topo_node_registry_find(etcp->instance->topo_groups, etcp->peer_node_id); if (ni && ni->node_name && ni->node_name[0]) name = ni->node_name; } @@ -982,7 +988,7 @@ static void send_ack_req_cb(struct ll_queue* q, void* arg) {// etcp->ack_q data if (etcp->tx_state==ETCP_TX_STATE_DATA_WAIT) queue_resume_callback(etcp->ack_q); } */ -void etcp_on_link_down(struct ETCP_CONN* etcp) { +void etcp_on_link_down(struct ETCP_CONN* etcp, struct ETCP_LINK* down_link) { DEBUG_TRACE(DEBUG_CATEGORY_ETCP, ""); int up=0; struct ETCP_LINK* link = etcp->links; @@ -994,7 +1000,7 @@ void etcp_on_link_down(struct ETCP_CONN* etcp) { etcp->links_up = up; if (up == 0 && was_up != 0) { DEBUG_INFO(DEBUG_CATEGORY_ETCP, "All links fall down"); - etcp_on_down(etcp); + etcp_on_down(etcp, down_link); } } diff --git a/src/transport_layer/etcp.h b/src/transport_layer/etcp.h index f6d64957..4df0e2a8 100644 --- a/src/transport_layer/etcp.h +++ b/src/transport_layer/etcp.h @@ -318,7 +318,7 @@ void etcp_update_log_name(struct ETCP_CONN* etcp); // Вызывается стеком etcp когда соединение установлено (можно передавать данные) void etcp_conn_ready(struct ETCP_CONN* conn); -void etcp_on_link_down(struct ETCP_CONN* etcp); +void etcp_on_link_down(struct ETCP_CONN* etcp, struct ETCP_LINK* down_link); void etcp_update_mtu(struct ETCP_CONN* etcp); diff --git a/src/transport_layer/etcp_connections.c b/src/transport_layer/etcp_connections.c index b6464fa8..444509e2 100644 --- a/src/transport_layer/etcp_connections.c +++ b/src/transport_layer/etcp_connections.c @@ -240,7 +240,7 @@ void etcp_link_enter_reinit(struct ETCP_LINK* link) { int old_state = link->link_state; link->link_state = 2; // reconnect etcp_fire_link_status_cbk(link, old_state, link->link_status); - etcp_on_link_down(link->etcp); + etcp_on_link_down(link->etcp, link); if (link->is_server != 0) return; etcp_conn_reinit(link->etcp, "link recovery"); etcp_link_send_init(link,1,0); @@ -344,7 +344,7 @@ static void keepalive_timer_cb(void* arg) { int old_link_status = link->link_status; link->link_status = 0; etcp_fire_link_status_cbk(link, link->link_state, old_link_status); - etcp_on_link_down(link->etcp); + etcp_on_link_down(link->etcp, link); if (old_link_status) { DEBUG_INFO(DEBUG_CATEGORY_CONNECTION, "[%s] Link %d down: addr=%s ka=%d remote_ka=%d state=%d init=%d tmo: %llu>%llu els=%llums", link->etcp->log_name, link->local_link_id, sockaddr_storage_to_str(&link->remote_addr).str, link->recv_keepalive, link->remote_keepalive, link->link_state, link->initialized, (unsigned long long)timeout_units, (unsigned long long)elapsed, (unsigned long long)(elapsed/10)); }