diff --git a/libi2pd/Datagram.h b/libi2pd/Datagram.h index a90edeb8..144bb61d 100644 --- a/libi2pd/Datagram.h +++ b/libi2pd/Datagram.h @@ -82,6 +82,8 @@ namespace datagram DatagramVersion GetVersion () const { return m_Version; } void SetVersion (DatagramVersion version) { m_Version = version; } + + void DropSharedRoutingPath () { if (m_RoutingSession) m_RoutingSession->SetSharedRoutingPath (nullptr); } struct Info { diff --git a/libi2pd_client/UDPTunnel.cpp b/libi2pd_client/UDPTunnel.cpp index edbb116b..2abb0c5a 100644 --- a/libi2pd_client/UDPTunnel.cpp +++ b/libi2pd_client/UDPTunnel.cpp @@ -378,11 +378,17 @@ namespace client LogPrint (eLogDebug, "UDP Client: Send ", transferred, " to ", m_RemoteAddr->identHash.ToBase32 (), ":", RemotePort); auto session = GetDatagramSession (); uint64_t repliableDatagramInterval = I2P_UDP_REPLIABLE_DATAGRAM_INTERVAL; - if (m_RTT && m_RTT < I2P_UDP_REPLIABLE_DATAGRAM_INTERVAL*10) repliableDatagramInterval = m_RTT/10; - if (ts > m_LastSession->second + repliableDatagramInterval ) + if (m_RTT >= 10) repliableDatagramInterval = m_RTT/10; // 1 ms min + if (ts > m_LastSession->second + repliableDatagramInterval) { if (m_DatagramVersion == i2p::datagram::eDatagramV3) { + if (!m_UnackedDatagrams.empty () && (ts > m_UnackedDatagrams.front ().second + I2P_UDP_MAX_UNACKED_DATAGRAM_TIME || + m_NextSendPacketNum > m_UnackedDatagrams.front ().first + I2P_UDP_MAX_NUM_UNACKED_DATAGRAMS)) + { + m_UnackedDatagrams.clear (); + session->DropSharedRoutingPath (); + } m_UnackedDatagrams.push_back ({ m_NextSendPacketNum, ts }); i2p::util::Mapping options; options.Put (UDP_SESSION_SEQN, m_NextSendPacketNum); diff --git a/libi2pd_client/UDPTunnel.h b/libi2pd_client/UDPTunnel.h index 6a8d3c9f..c04ef135 100644 --- a/libi2pd_client/UDPTunnel.h +++ b/libi2pd_client/UDPTunnel.h @@ -30,7 +30,9 @@ namespace client /** 2 minute timeout for udp sessions */ const uint64_t I2P_UDP_SESSION_TIMEOUT = 1000 * 60 * 2; const uint64_t I2P_UDP_REPLIABLE_DATAGRAM_INTERVAL = 100; // in milliseconds - + const uint64_t I2P_UDP_MAX_UNACKED_DATAGRAM_TIME = 8000; // in milliseconds + const size_t I2P_UDP_MAX_NUM_UNACKED_DATAGRAMS = 500; + /** max size for i2p udp */ const size_t I2P_UDP_MAX_MTU = 64*1024;