From e7ff15c573064395578a5735efb69cf87b4f5f08 Mon Sep 17 00:00:00 2001 From: Vort Date: Sat, 16 Mar 2024 19:29:47 +0200 Subject: [PATCH] exclude resent stream packets from RTT calculations --- libi2pd/Streaming.cpp | 20 +++++++++++--------- libi2pd/Streaming.h | 3 ++- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/libi2pd/Streaming.cpp b/libi2pd/Streaming.cpp index f91bb552..aad39db8 100644 --- a/libi2pd/Streaming.cpp +++ b/libi2pd/Streaming.cpp @@ -427,17 +427,18 @@ namespace stream } } auto sentPacket = *it; - uint64_t rtt = ts - sentPacket->sendTime; - if(ts < sentPacket->sendTime) - { - LogPrint(eLogError, "Streaming: Packet ", seqn, "sent from the future, sendTime=", sentPacket->sendTime); - rtt = 1; - } - if (seqn) + int64_t rtt = (int64_t)ts - (int64_t)sentPacket->sendTime; + if (rtt < 0) + LogPrint (eLogError, "Streaming: Packet ", seqn, "sent from the future, sendTime=", sentPacket->sendTime); + bool rttUpdated = true; + if (!seqn) + m_RTT = rtt < 0 ? 1 : rtt; + else if (!sentPacket->resent && rtt >= 0) m_RTT = RTT_EWMA_ALPHA * rtt + (1.0 - RTT_EWMA_ALPHA) * m_RTT; else - m_RTT = rtt; - m_RTO = m_RTT*1.5; // TODO: implement it better + rttUpdated = false; + if (rttUpdated) + m_RTO = m_RTT * 1.5; // TODO: implement it better LogPrint (eLogDebug, "Streaming: Packet ", seqn, " acknowledged rtt=", rtt, " sentTime=", sentPacket->sendTime); m_SentPackets.erase (it++); m_LocalDestination.DeletePacket (sentPacket); @@ -989,6 +990,7 @@ namespace stream { if (ts >= it->sendTime + m_RTO) { + it->resent = true; it->sendTime = ts; packets.push_back (it); } diff --git a/libi2pd/Streaming.h b/libi2pd/Streaming.h index d67cf37a..9865ba95 100644 --- a/libi2pd/Streaming.h +++ b/libi2pd/Streaming.h @@ -71,8 +71,9 @@ namespace stream size_t len, offset; uint8_t buf[MAX_PACKET_SIZE]; uint64_t sendTime; + bool resent; - Packet (): len (0), offset (0), sendTime (0) {}; + Packet (): len (0), offset (0), sendTime (0), resent (false) {}; uint8_t * GetBuffer () { return buf + offset; }; size_t GetLength () const { return len - offset; };