mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-01-25 23:44:18 +00:00
fix #846. ability to limit transit bandwidth
This commit is contained in:
parent
ac918e3618
commit
124e2e759c
@ -189,6 +189,9 @@ namespace i2p
|
|||||||
i2p::context.SetBandwidth (i2p::data::CAPS_FLAG_LOW_BANDWIDTH2);
|
i2p::context.SetBandwidth (i2p::data::CAPS_FLAG_LOW_BANDWIDTH2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int shareRatio; i2p::config::GetOption("share", shareRatio);
|
||||||
|
i2p::context.SetShareRatio (shareRatio);
|
||||||
|
|
||||||
std::string family; i2p::config::GetOption("family", family);
|
std::string family; i2p::config::GetOption("family", family);
|
||||||
i2p::context.SetFamily (family);
|
i2p::context.SetFamily (family);
|
||||||
if (family.length () > 0)
|
if (family.length () > 0)
|
||||||
|
@ -54,6 +54,7 @@ namespace config {
|
|||||||
("notransit", value<bool>()->zero_tokens()->default_value(false), "Router will not accept transit tunnels at startup")
|
("notransit", value<bool>()->zero_tokens()->default_value(false), "Router will not accept transit tunnels at startup")
|
||||||
("floodfill", value<bool>()->zero_tokens()->default_value(false), "Router will be floodfill")
|
("floodfill", value<bool>()->zero_tokens()->default_value(false), "Router will be floodfill")
|
||||||
("bandwidth", value<std::string>()->default_value(""), "Bandwidth limit: integer in KBps or letters: L (32), O (256), P (2048), X (>9000)")
|
("bandwidth", value<std::string>()->default_value(""), "Bandwidth limit: integer in KBps or letters: L (32), O (256), P (2048), X (>9000)")
|
||||||
|
("share", value<int>()->default_value(100), "Limit of transit traffic from max bandwidth in percents. (default: 100")
|
||||||
("ntcp", value<bool>()->zero_tokens()->default_value(true), "Enable NTCP transport")
|
("ntcp", value<bool>()->zero_tokens()->default_value(true), "Enable NTCP transport")
|
||||||
("ssu", value<bool>()->zero_tokens()->default_value(true), "Enable SSU transport")
|
("ssu", value<bool>()->zero_tokens()->default_value(true), "Enable SSU transport")
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
@ -332,7 +332,8 @@ namespace i2p
|
|||||||
// replace record to reply
|
// replace record to reply
|
||||||
if (i2p::context.AcceptsTunnels () &&
|
if (i2p::context.AcceptsTunnels () &&
|
||||||
i2p::tunnel::tunnels.GetTransitTunnels ().size () <= g_MaxNumTransitTunnels &&
|
i2p::tunnel::tunnels.GetTransitTunnels ().size () <= g_MaxNumTransitTunnels &&
|
||||||
!i2p::transport::transports.IsBandwidthExceeded ())
|
!i2p::transport::transports.IsBandwidthExceeded () &&
|
||||||
|
!i2p::transport::transports.IsTransitBandwidthExceeded ())
|
||||||
{
|
{
|
||||||
auto transitTunnel = i2p::tunnel::CreateTransitTunnel (
|
auto transitTunnel = i2p::tunnel::CreateTransitTunnel (
|
||||||
bufbe32toh (clearText + BUILD_REQUEST_RECORD_RECEIVE_TUNNEL_OFFSET),
|
bufbe32toh (clearText + BUILD_REQUEST_RECORD_RECEIVE_TUNNEL_OFFSET),
|
||||||
|
@ -17,8 +17,8 @@ namespace i2p
|
|||||||
|
|
||||||
RouterContext::RouterContext ():
|
RouterContext::RouterContext ():
|
||||||
m_LastUpdateTime (0), m_AcceptsTunnels (true), m_IsFloodfill (false),
|
m_LastUpdateTime (0), m_AcceptsTunnels (true), m_IsFloodfill (false),
|
||||||
m_StartupTime (0), m_Status (eRouterStatusOK), m_Error (eRouterErrorNone),
|
m_StartupTime (0), m_ShareRatio (100), m_Status (eRouterStatusOK),
|
||||||
m_NetID (I2PD_NET_ID)
|
m_Error (eRouterErrorNone), m_NetID (I2PD_NET_ID)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -246,6 +246,13 @@ namespace i2p
|
|||||||
else { SetBandwidth('K'); }
|
else { SetBandwidth('K'); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RouterContext::SetShareRatio (int percents)
|
||||||
|
{
|
||||||
|
if (percents < 0) percents = 0;
|
||||||
|
if (percents > 100) percents = 100;
|
||||||
|
m_ShareRatio = percents;
|
||||||
|
}
|
||||||
|
|
||||||
bool RouterContext::IsUnreachable () const
|
bool RouterContext::IsUnreachable () const
|
||||||
{
|
{
|
||||||
return m_RouterInfo.GetCaps () & i2p::data::RouterInfo::eUnreachable;
|
return m_RouterInfo.GetCaps () & i2p::data::RouterInfo::eUnreachable;
|
||||||
|
@ -54,6 +54,7 @@ namespace i2p
|
|||||||
uint32_t GetStartupTime () const { return m_StartupTime; };
|
uint32_t GetStartupTime () const { return m_StartupTime; };
|
||||||
uint64_t GetLastUpdateTime () const { return m_LastUpdateTime; };
|
uint64_t GetLastUpdateTime () const { return m_LastUpdateTime; };
|
||||||
uint64_t GetBandwidthLimit () const { return m_BandwidthLimit; };
|
uint64_t GetBandwidthLimit () const { return m_BandwidthLimit; };
|
||||||
|
uint64_t GetTransitBandwidthLimit () const { return (m_BandwidthLimit*m_ShareRatio)/100LL; };
|
||||||
RouterStatus GetStatus () const { return m_Status; };
|
RouterStatus GetStatus () const { return m_Status; };
|
||||||
void SetStatus (RouterStatus status);
|
void SetStatus (RouterStatus status);
|
||||||
RouterError GetError () const { return m_Error; };
|
RouterError GetError () const { return m_Error; };
|
||||||
@ -74,6 +75,7 @@ namespace i2p
|
|||||||
std::string GetFamily () const;
|
std::string GetFamily () const;
|
||||||
void SetBandwidth (int limit); /* in kilobytes */
|
void SetBandwidth (int limit); /* in kilobytes */
|
||||||
void SetBandwidth (char L); /* by letter */
|
void SetBandwidth (char L); /* by letter */
|
||||||
|
void SetShareRatio (int percents); // 0 - 100
|
||||||
bool AcceptsTunnels () const { return m_AcceptsTunnels; };
|
bool AcceptsTunnels () const { return m_AcceptsTunnels; };
|
||||||
void SetAcceptsTunnels (bool acceptsTunnels) { m_AcceptsTunnels = acceptsTunnels; };
|
void SetAcceptsTunnels (bool acceptsTunnels) { m_AcceptsTunnels = acceptsTunnels; };
|
||||||
bool SupportsV6 () const { return m_RouterInfo.IsV6 (); };
|
bool SupportsV6 () const { return m_RouterInfo.IsV6 (); };
|
||||||
@ -116,7 +118,8 @@ namespace i2p
|
|||||||
uint64_t m_LastUpdateTime;
|
uint64_t m_LastUpdateTime;
|
||||||
bool m_AcceptsTunnels, m_IsFloodfill;
|
bool m_AcceptsTunnels, m_IsFloodfill;
|
||||||
uint64_t m_StartupTime; // in seconds since epoch
|
uint64_t m_StartupTime; // in seconds since epoch
|
||||||
uint32_t m_BandwidthLimit; // allowed bandwidth
|
uint64_t m_BandwidthLimit; // allowed bandwidth
|
||||||
|
int m_ShareRatio;
|
||||||
RouterStatus m_Status;
|
RouterStatus m_Status;
|
||||||
RouterError m_Error;
|
RouterError m_Error;
|
||||||
int m_NetID;
|
int m_NetID;
|
||||||
|
@ -261,6 +261,12 @@ namespace transport
|
|||||||
return bw > limit;
|
return bw > limit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Transports::IsTransitBandwidthExceeded () const
|
||||||
|
{
|
||||||
|
auto limit = i2p::context.GetTransitBandwidthLimit() * 1024; // convert to bytes
|
||||||
|
return m_TransitBandwidth > limit;
|
||||||
|
}
|
||||||
|
|
||||||
void Transports::SendMessage (const i2p::data::IdentHash& ident, std::shared_ptr<i2p::I2NPMessage> msg)
|
void Transports::SendMessage (const i2p::data::IdentHash& ident, std::shared_ptr<i2p::I2NPMessage> msg)
|
||||||
{
|
{
|
||||||
SendMessages (ident, std::vector<std::shared_ptr<i2p::I2NPMessage> > {msg });
|
SendMessages (ident, std::vector<std::shared_ptr<i2p::I2NPMessage> > {msg });
|
||||||
|
@ -106,6 +106,7 @@ namespace transport
|
|||||||
uint32_t GetOutBandwidth () const { return m_OutBandwidth; };
|
uint32_t GetOutBandwidth () const { return m_OutBandwidth; };
|
||||||
uint32_t GetTransitBandwidth () const { return m_TransitBandwidth; };
|
uint32_t GetTransitBandwidth () const { return m_TransitBandwidth; };
|
||||||
bool IsBandwidthExceeded () const;
|
bool IsBandwidthExceeded () const;
|
||||||
|
bool IsTransitBandwidthExceeded () const;
|
||||||
size_t GetNumPeers () const { return m_Peers.size (); };
|
size_t GetNumPeers () const { return m_Peers.size (); };
|
||||||
std::shared_ptr<const i2p::data::RouterInfo> GetRandomPeer () const;
|
std::shared_ptr<const i2p::data::RouterInfo> GetRandomPeer () const;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user