diff --git a/libknet/threads_heartbeat.c b/libknet/threads_heartbeat.c index 8f8a7ecb3..fa1f30c48 100644 --- a/libknet/threads_heartbeat.c +++ b/libknet/threads_heartbeat.c @@ -177,7 +177,7 @@ static void _adjust_pong_timeouts(knet_handle_t knet_h) dst_link->pong_timeout_backoff--; } - dst_link->pong_timeout_adj = (dst_link->pong_timeout * dst_link->pong_timeout_backoff) + (dst_link->status.stats.latency_max * KNET_LINK_PONG_TIMEOUT_LAT_MUL); + dst_link->pong_timeout_adj = (dst_link->pong_timeout * dst_link->pong_timeout_backoff) + (dst_link->status.latency * KNET_LINK_PONG_TIMEOUT_LAT_MUL); } } diff --git a/libknet/threads_rx.c b/libknet/threads_rx.c index 4b0b76568..e8fe264ad 100644 --- a/libknet/threads_rx.c +++ b/libknet/threads_rx.c @@ -615,37 +615,42 @@ static void _parse_recv_from_links(knet_handle_t knet_h, int sockfd, const struc timespec_diff(recvtime, src_link->status.pong_last, &latency_last); - src_link->status.latency = - ((src_link->status.latency * src_link->latency_exp) + - ((latency_last / 1000llu) * - (src_link->latency_fix - src_link->latency_exp))) / - src_link->latency_fix; - - if (src_link->status.latency < src_link->pong_timeout_adj) { - if (!src_link->status.connected) { - if (src_link->received_pong >= src_link->pong_count) { - log_info(knet_h, KNET_SUB_RX, "host: %u link: %u is up", - src_host->host_id, src_link->link_id); - _link_updown(knet_h, src_host->host_id, src_link->link_id, src_link->status.enabled, 1); - } else { - src_link->received_pong++; - log_debug(knet_h, KNET_SUB_RX, "host: %u link: %u received pong: %u", - src_host->host_id, src_link->link_id, src_link->received_pong); + if ((latency_last / 1000llu) > src_link->pong_timeout) { + log_debug(knet_h, KNET_SUB_RX, + "Incoming pong packet from host: %u link: %u has higher latency than pong_timeout. Discarding", + src_host->host_id, src_link->link_id); + } else { + src_link->status.latency = + ((src_link->status.latency * src_link->latency_exp) + + ((latency_last / 1000llu) * + (src_link->latency_fix - src_link->latency_exp))) / + src_link->latency_fix; + + if (src_link->status.latency < src_link->pong_timeout_adj) { + if (!src_link->status.connected) { + if (src_link->received_pong >= src_link->pong_count) { + log_info(knet_h, KNET_SUB_RX, "host: %u link: %u is up", + src_host->host_id, src_link->link_id); + _link_updown(knet_h, src_host->host_id, src_link->link_id, src_link->status.enabled, 1); + } else { + src_link->received_pong++; + log_debug(knet_h, KNET_SUB_RX, "host: %u link: %u received pong: %u", + src_host->host_id, src_link->link_id, src_link->received_pong); + } } } + /* Calculate latency stats */ + if (src_link->status.latency > src_link->status.stats.latency_max) { + src_link->status.stats.latency_max = src_link->status.latency; + } + if (src_link->status.latency < src_link->status.stats.latency_min) { + src_link->status.stats.latency_min = src_link->status.latency; + } + src_link->status.stats.latency_ave = + (src_link->status.stats.latency_ave * src_link->status.stats.latency_samples + + src_link->status.latency) / (src_link->status.stats.latency_samples+1); + src_link->status.stats.latency_samples++; } - /* Calculate latency stats */ - if (src_link->status.latency > src_link->status.stats.latency_max) { - src_link->status.stats.latency_max = src_link->status.latency; - } - if (src_link->status.latency < src_link->status.stats.latency_min) { - src_link->status.stats.latency_min = src_link->status.latency; - } - src_link->status.stats.latency_ave = - (src_link->status.stats.latency_ave * src_link->status.stats.latency_samples + - src_link->status.latency) / (src_link->status.stats.latency_samples+1); - src_link->status.stats.latency_samples++; - break; case KNET_HEADER_TYPE_PMTUD: src_link->status.stats.rx_pmtu_packets++;