diff --git a/src/routing_layer/conn_mgr_monitor.c b/src/routing_layer/conn_mgr_monitor.c index d554d14e..32398ab3 100644 --- a/src/routing_layer/conn_mgr_monitor.c +++ b/src/routing_layer/conn_mgr_monitor.c @@ -177,7 +177,8 @@ void cm_candidate_ping_timer_cb(void* arg) { if (cm_has_active_conn(mgr->group, nid)) { struct ETCP_CONN* dc = topo_group_find_conn_for_node(mgr->group, nid); struct TOPO_NODE* ni = topo_node_registry_find(mgr->instance->topo_groups, nq->node_id); - if (ni && dc && dc->links) { + /* пир в SLEEP-фазе — прямое соединение живо, пинг будит его: пропускаем */ + if (ni && dc && dc->links && !dc->peer_sleep_phase) { if (dc->links->is_tcp) etcp_send_tcp_ping(mgr->instance, ni->public_key, &dc->links->remote_addr, CONN_PROBE_TIMEOUT_MS, cm_bg_ping_noop_cb, NULL); else diff --git a/src/routing_layer/conn_mgr_priv.h b/src/routing_layer/conn_mgr_priv.h index b4a9c95d..44bc47f3 100644 --- a/src/routing_layer/conn_mgr_priv.h +++ b/src/routing_layer/conn_mgr_priv.h @@ -24,7 +24,7 @@ struct stcp_link; #define CONN_MGR_CANDIDATE_STALE_TB 300000 #define CONN_MGR_CANDIDATE_PING_TB 20000 #define CONN_MGR_BG_PING_INTERVAL_TB 1000 -#define CONN_MGR_BG_PING_CYCLE_MIN_TB 100000 +#define CONN_MGR_BG_PING_CYCLE_MIN_TB 600000 #define CONN_MGR_LOCAL_SCAN_ATTEMPTS 3 #define CONN_MGR_LOCAL_SCAN_TIMEOUT_MS 100 #define CONN_MGR_CONNECT_DIRECT_TIMEOUT_MS 2000 diff --git a/src/routing_layer/route_connectivity.c b/src/routing_layer/route_connectivity.c index fb6da9eb..58346fc2 100644 --- a/src/routing_layer/route_connectivity.c +++ b/src/routing_layer/route_connectivity.c @@ -273,6 +273,11 @@ void route_connectivity_probe_node(struct UTUN_INSTANCE* instance, struct TOPO_G struct TOPO_NODE* ni = topo_node_registry_find(instance->topo_groups, nq->node_id); if (!ni) return; if (nq->node_id == instance->node_id) return; // не пингуем себя + /* Пир в SLEEP-фазе: прямое соединение живо, probe будит пира — пропускаем. */ + { + struct ETCP_CONN* c = instance_find_conn(instance, nq->node_id); + if (c && c->peer_sleep_phase) return; + } #ifdef UTUN_HAVE_STANDBY if (nq->connectivity.probe_status == PROBE_STATUS_DEFERRED) { DEBUG_INFO(DEBUG_CATEGORY_BGP, "probe already deferred for node %016llx", (unsigned long long)nq->node_id); diff --git a/src/transport_layer/etcp_keepalive.c b/src/transport_layer/etcp_keepalive.c index b37a86bc..1288d0d1 100644 --- a/src/transport_layer/etcp_keepalive.c +++ b/src/transport_layer/etcp_keepalive.c @@ -340,9 +340,14 @@ static void ka_announce_retry_cb(void* arg) { } // Анонс-серия (ACTIVE-окно): анонс + ретраи до ACK, лимит попыток на окно. +// TCP доставляет надёжно — без ретраев и ACK, только один анонс. static void ka_announce_burst(struct ETCP_LINK* link) { link->ka_announce_attempts = 0; link->ka_sleep_acked = 0; + if (link->is_tcp) { + ka_send_sleep_keepalive(link); + return; + } link->ka_announce_max_attempts = ka_announce_max_calc(link); ka_send_sleep_keepalive(link); // попытка 1 ka_arm_announce_retry(link); @@ -507,7 +512,8 @@ int etcp_keepalive_on_recv(struct ETCP_SOCKET* e_sock, struct ETCP_DGRAM* pkt, link->etcp->log_name, peer_period, (int)(active_remaining / 10), (int)(active_remaining % 10), (int)(sleep_duration / 10), (int)(sleep_duration % 10)); - ka_send_sleep_ack(link); + if (!link->is_tcp) + ka_send_sleep_ack(link); /* TCP доставляет надёжно — ACK не нужен */ } else if (link->ka_peer_sleeping) { /* Обычный keepalive (без флагов): пир проснулся — вернуться в normal-режим. */ link->ka_peer_sleeping = 0;