Fix peer standby cancellation on normal keepalive from a new link
This commit is contained in:
1 parent
700034eec8
commit
919c3d76fe
3 files changed
+116
-15
No files matched your search
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user