diff --git a/Daemon.cpp b/Daemon.cpp index eef58c78..ad61a130 100644 --- a/Daemon.cpp +++ b/Daemon.cpp @@ -78,16 +78,20 @@ namespace i2p i2p::context.UpdateAddress (boost::asio::ip::address::from_string (host)); i2p::context.SetSupportsV6 (i2p::util::config::GetArg("-v6", 0)); - i2p::context.SetFloodfill (i2p::util::config::GetArg("-floodfill", 0)); + bool isFloodfill = i2p::util::config::GetArg("-floodfill", 0); + i2p::context.SetFloodfill (isFloodfill); auto bandwidth = i2p::util::config::GetArg("-bandwidth", ""); if (bandwidth.length () > 0) { - if (bandwidth[0] > 'L') + if (bandwidth[0] > 'O') + i2p::context.SetExtraBandwidth (); + else if (bandwidth[0] > 'L') i2p::context.SetHighBandwidth (); else i2p::context.SetLowBandwidth (); } - + else if (isFloodfill) + i2p::context.SetExtraBandwidth (); LogPrint(eLogDebug, "Daemon: CMD parameters:"); for (int i = 0; i < argc; ++i) LogPrint(eLogDebug, i, ": ", argv[i]); diff --git a/RouterContext.cpp b/RouterContext.cpp index 31038820..715d2ecc 100644 --- a/RouterContext.cpp +++ b/RouterContext.cpp @@ -149,7 +149,7 @@ namespace i2p { if (!m_RouterInfo.IsHighBandwidth ()) { - m_RouterInfo.SetCaps (m_RouterInfo.GetCaps () | i2p::data::RouterInfo::eHighBandwidth); + m_RouterInfo.SetCaps ((m_RouterInfo.GetCaps () | i2p::data::RouterInfo::eHighBandwidth) & ~i2p::data::RouterInfo::eExtraBandwidth); UpdateRouterInfo (); } } @@ -158,11 +158,20 @@ namespace i2p { if (m_RouterInfo.IsHighBandwidth ()) { - m_RouterInfo.SetCaps (m_RouterInfo.GetCaps () & ~i2p::data::RouterInfo::eHighBandwidth); + m_RouterInfo.SetCaps (m_RouterInfo.GetCaps () & ~i2p::data::RouterInfo::eHighBandwidth & ~i2p::data::RouterInfo::eExtraBandwidth); UpdateRouterInfo (); } } + void RouterContext::SetExtraBandwidth () + { + if (!m_RouterInfo.IsExtraBandwidth ()) + { + m_RouterInfo.SetCaps (m_RouterInfo.GetCaps () | i2p::data::RouterInfo::eExtraBandwidth | i2p::data::RouterInfo::eHighBandwidth); + UpdateRouterInfo (); + } + } + bool RouterContext::IsUnreachable () const { return m_RouterInfo.GetCaps () & i2p::data::RouterInfo::eUnreachable; diff --git a/RouterContext.h b/RouterContext.h index 13027b44..8c07b17f 100644 --- a/RouterContext.h +++ b/RouterContext.h @@ -62,6 +62,7 @@ namespace i2p void SetFloodfill (bool floodfill); void SetHighBandwidth (); void SetLowBandwidth (); + void SetExtraBandwidth (); bool AcceptsTunnels () const { return m_AcceptsTunnels; }; void SetAcceptsTunnels (bool acceptsTunnels) { m_AcceptsTunnels = acceptsTunnels; }; bool SupportsV6 () const { return m_RouterInfo.IsV6 (); }; diff --git a/RouterInfo.cpp b/RouterInfo.cpp index e071320c..a0aad8d9 100644 --- a/RouterInfo.cpp +++ b/RouterInfo.cpp @@ -265,6 +265,10 @@ namespace data case CAPS_FLAG_HIGH_BANDWIDTH3: m_Caps |= Caps::eHighBandwidth; break; + case CAPS_FLAG_EXTRA_BANDWIDTH1: + case CAPS_FLAG_EXTRA_BANDWIDTH2: + m_Caps |= Caps::eExtraBandwidth; + break; case CAPS_FLAG_HIDDEN: m_Caps |= Caps::eHidden; break; @@ -291,11 +295,15 @@ namespace data std::string caps; if (m_Caps & eFloodfill) { - caps += CAPS_FLAG_HIGH_BANDWIDTH3; // highest bandwidth + if (m_Caps & eExtraBandwidth) caps += CAPS_FLAG_EXTRA_BANDWIDTH1; // 'P' + caps += CAPS_FLAG_HIGH_BANDWIDTH3; // 'O' caps += CAPS_FLAG_FLOODFILL; // floodfill } else - caps += (m_Caps & eHighBandwidth) ? CAPS_FLAG_HIGH_BANDWIDTH3 : CAPS_FLAG_LOW_BANDWIDTH2; // bandwidth + { + if (m_Caps & eExtraBandwidth) caps += CAPS_FLAG_EXTRA_BANDWIDTH1; + caps += (m_Caps & eHighBandwidth) ? CAPS_FLAG_HIGH_BANDWIDTH3 : CAPS_FLAG_LOW_BANDWIDTH2; // bandwidth + } if (m_Caps & eHidden) caps += CAPS_FLAG_HIDDEN; // hidden if (m_Caps & eReachable) caps += CAPS_FLAG_REACHABLE; // reachable if (m_Caps & eUnreachable) caps += CAPS_FLAG_UNREACHABLE; // unreachable diff --git a/RouterInfo.h b/RouterInfo.h index a7ab2102..a750cfea 100644 --- a/RouterInfo.h +++ b/RouterInfo.h @@ -23,7 +23,9 @@ namespace data const char CAPS_FLAG_HIGH_BANDWIDTH1 = 'M'; const char CAPS_FLAG_HIGH_BANDWIDTH2 = 'N'; const char CAPS_FLAG_HIGH_BANDWIDTH3 = 'O'; - + const char CAPS_FLAG_EXTRA_BANDWIDTH1 = 'P'; + const char CAPS_FLAG_EXTRA_BANDWIDTH2 = 'X'; + const char CAPS_FLAG_SSU_TESTING = 'B'; const char CAPS_FLAG_SSU_INTRODUCER = 'C'; @@ -44,11 +46,12 @@ namespace data { eFloodfill = 0x01, eHighBandwidth = 0x02, - eReachable = 0x04, - eSSUTesting = 0x08, - eSSUIntroducer = 0x10, - eHidden = 0x20, - eUnreachable = 0x40 + eExtraBandwidth = 0x04, + eReachable = 0x08, + eSSUTesting = 0x10, + eSSUIntroducer = 0x20, + eHidden = 0x40, + eUnreachable = 0x80 }; enum TransportStyle @@ -131,7 +134,8 @@ namespace data bool IsPeerTesting () const { return m_Caps & eSSUTesting; }; bool IsHidden () const { return m_Caps & eHidden; }; bool IsHighBandwidth () const { return m_Caps & RouterInfo::eHighBandwidth; }; - + bool IsExtraBandwidth () const { return m_Caps & RouterInfo::eExtraBandwidth; }; + uint8_t GetCaps () const { return m_Caps; }; void SetCaps (uint8_t caps); void SetCaps (const char * caps); diff --git a/Transports.cpp b/Transports.cpp index ab59f04d..e66ad864 100644 --- a/Transports.cpp +++ b/Transports.cpp @@ -200,8 +200,9 @@ namespace transport bool Transports::IsBandwidthExceeded () const { - if (i2p::context.GetRouterInfo ().IsHighBandwidth ()) return false; - return std::max (m_InBandwidth, m_OutBandwidth) > LOW_BANDWIDTH_LIMIT; + if (i2p::context.GetRouterInfo ().IsExtraBandwidth ()) return false; + auto bw = std::max (m_InBandwidth, m_OutBandwidth); + return bw > (i2p::context.GetRouterInfo ().IsHighBandwidth () ? HIGH_BANDWIDTH_LIMIT : LOW_BANDWIDTH_LIMIT); } void Transports::SendMessage (const i2p::data::IdentHash& ident, std::shared_ptr msg) diff --git a/Transports.h b/Transports.h index cedbc1d3..98e32679 100644 --- a/Transports.h +++ b/Transports.h @@ -67,6 +67,7 @@ namespace transport const size_t SESSION_CREATION_TIMEOUT = 10; // in seconds const uint32_t LOW_BANDWIDTH_LIMIT = 32*1024; // 32KBs + const uint32_t HIGH_BANDWIDTH_LIMIT = 256*1024; // 256KBs class Transports { public: