Browse Source

keepalive: TCP-линки без ретраев/ACK; не пинговать спящих пиров, bg-ping цикл ≤ 1/мин

proxy
evgeny 1 week ago
parent
commit
93becd36e6
  1. 3
      src/routing_layer/conn_mgr_monitor.c
  2. 2
      src/routing_layer/conn_mgr_priv.h
  3. 5
      src/routing_layer/route_connectivity.c
  4. 8
      src/transport_layer/etcp_keepalive.c

3
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

2
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

5
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);

8
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;

Loading…
Cancel
Save