Fix peer standby cancellation on normal keepalive from a new link

This commit is contained in:
evgeny committed 2026-10-16 12:46:27 +02:00
1 parent 700034eec8
commit 919c3d76fe
3 files changed
+116 -15

No files matched your search

+22 -14
View File
@@ -561,21 +561,29 @@ int etcp_keepalive_on_recv(struct ETCP_DGRAM* pkt) {
(int)(sleep_duration / 10), (int)(sleep_duration % 10));
if (!link->is_tcp)
ka_send_sleep_ack(link); /* TCP доставляет надёжно — ACK не нужен */
} else if (link->ka_peer_sleeping) {
/* Обычный keepalive (без флагов): пир проснулся — вернуться в normal-режим. */
link->ka_peer_sleeping = 0;
link->ka_period_ms = (uint16_t)link->keepalive_interval;
link->keepalive_timeout = (uint32_t)link->keepalive_interval * KA_TIMEOUT_MULT;
if (link->etcp) {
if (link->etcp->peer_phase_timer) {
uasync_cancel_timeout(link->etcp->instance->ua, link->etcp->peer_phase_timer);
link->etcp->peer_phase_timer = NULL;
}
ka_peer_set_phase(link->etcp, 0);
} else {
/* Обычный keepalive снимает сон соединения даже по новому линку без ka_peer_sleeping. */
struct ETCP_CONN* conn = link->etcp;
int link_was_sleeping = link->ka_peer_sleeping;
if (link_was_sleeping || conn->peer_sleep_phase || conn->peer_phase_timer) {
DEBUG_INFO(DEBUG_CATEGORY_KEEPALIVE,
"[%s] peer normal link=%u tcp=%u link_sleep=%u phase=%u phase_timer=%u: cancel standby",
conn->log_name, link->local_link_id, link->is_tcp, link->ka_peer_sleeping,
conn->peer_sleep_phase, conn->peer_phase_timer != NULL);
}
DEBUG_INFO(DEBUG_CATEGORY_KEEPALIVE, "[%s] peer woke up, back to normal (interval=%dms)",
link->etcp->log_name, link->keepalive_interval);
if (!link->ka_my_sleeping)
if (link_was_sleeping) {
link->ka_peer_sleeping = 0;
link->ka_period_ms = (uint16_t)link->keepalive_interval;
link->keepalive_timeout = (uint32_t)link->keepalive_interval * KA_TIMEOUT_MULT;
}
if (conn->peer_phase_timer) {
uasync_cancel_timeout(instance->ua, conn->peer_phase_timer);
conn->peer_phase_timer = NULL;
}
conn->peer_active_remaining = conn->peer_sleep_duration = 0;
ka_peer_set_phase(conn, 0);
/* Повторный normal RX не должен отодвигать очередную отправку keepalive. */
if (link_was_sleeping && !link->ka_my_sleeping)
restart_keepalive_timer_ms(link, link->ka_period_ms);
}