diff --git a/I2NPProtocol.cpp b/I2NPProtocol.cpp index 3aa012ce..42c66f9a 100644 --- a/I2NPProtocol.cpp +++ b/I2NPProtocol.cpp @@ -281,7 +281,8 @@ namespace i2p i2p::crypto::ElGamalDecrypt (i2p::context.GetEncryptionPrivateKey (), record + BUILD_REQUEST_RECORD_ENCRYPTED_OFFSET, clearText); // replace record to reply if (i2p::context.AcceptsTunnels () && - i2p::tunnel::tunnels.GetTransitTunnels ().size () <= MAX_NUM_TRANSIT_TUNNELS) + i2p::tunnel::tunnels.GetTransitTunnels ().size () <= MAX_NUM_TRANSIT_TUNNELS && + !i2p::transport::transports.IsBandwidthExceeded ()) { i2p::tunnel::TransitTunnel * transitTunnel = i2p::tunnel::CreateTransitTunnel ( diff --git a/NetDb.cpp b/NetDb.cpp index 061fe1e2..147d0217 100644 --- a/NetDb.cpp +++ b/NetDb.cpp @@ -917,7 +917,7 @@ namespace data [compatibleWith](std::shared_ptr router)->bool { return !router->IsHidden () && router != compatibleWith && - router->IsCompatible (*compatibleWith) && (router->GetCaps () & RouterInfo::eHighBandwidth); + router->IsCompatible (*compatibleWith) && router->IsHighBandwidth (); }); } diff --git a/RouterInfo.h b/RouterInfo.h index 1211a257..007c1383 100644 --- a/RouterInfo.h +++ b/RouterInfo.h @@ -118,6 +118,7 @@ namespace data bool IsIntroducer () const { return m_Caps & eSSUIntroducer; }; bool IsPeerTesting () const { return m_Caps & eSSUTesting; }; bool IsHidden () const { return m_Caps & eHidden; }; + bool IsHighBandwidth () const { return m_Caps & RouterInfo::eHighBandwidth; }; uint8_t GetCaps () const { return m_Caps; }; void SetCaps (uint8_t caps); diff --git a/Transports.cpp b/Transports.cpp index c8d413e7..058acd27 100644 --- a/Transports.cpp +++ b/Transports.cpp @@ -199,6 +199,11 @@ namespace transport m_LastOutBandwidthUpdateBytes = m_TotalSentBytes; } + bool Transports::IsBandwidthExceeded () const + { + if (i2p::context.GetRouterInfo ().IsHighBandwidth ()) return false; + return std::max (m_InBandwidth, m_OutBandwidth) > LOW_BANDWIDTH_LIMIT; + } void Transports::SendMessage (const i2p::data::IdentHash& ident, i2p::I2NPMessage * msg) { diff --git a/Transports.h b/Transports.h index bcec3daa..64760dde 100644 --- a/Transports.h +++ b/Transports.h @@ -68,6 +68,7 @@ namespace transport }; const size_t SESSION_CREATION_TIMEOUT = 10; // in seconds + const uint32_t LOW_BANDWIDTH_LIMIT = 32*1024; // 32KBs class Transports { public: @@ -96,6 +97,7 @@ namespace transport uint64_t GetTotalReceivedBytes () const { return m_TotalReceivedBytes; }; uint32_t GetInBandwidth () const { return m_InBandwidth; }; // bytes per second uint32_t GetOutBandwidth () const { return m_OutBandwidth; }; // bytes per second + bool IsBandwidthExceeded () const; private: