mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-02-02 11:04:00 +01:00
allow 0ms latency for tunnel
This commit is contained in:
parent
821a76a7c5
commit
d6d440ba8a
|
@ -33,7 +33,7 @@ namespace tunnel
|
||||||
TunnelBase (config->GetTunnelID (), config->GetNextTunnelID (), config->GetNextIdentHash ()),
|
TunnelBase (config->GetTunnelID (), config->GetNextTunnelID (), config->GetNextIdentHash ()),
|
||||||
m_Config (config), m_IsShortBuildMessage (false), m_Pool (nullptr),
|
m_Config (config), m_IsShortBuildMessage (false), m_Pool (nullptr),
|
||||||
m_State (eTunnelStatePending), m_FarEndTransports (i2p::data::RouterInfo::eAllTransports),
|
m_State (eTunnelStatePending), m_FarEndTransports (i2p::data::RouterInfo::eAllTransports),
|
||||||
m_IsRecreated (false), m_Latency (0)
|
m_IsRecreated (false), m_Latency (UNKNOWN_LATENCY)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -198,10 +198,10 @@ namespace tunnel
|
||||||
return established;
|
return established;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Tunnel::LatencyFitsRange(uint64_t lower, uint64_t upper) const
|
bool Tunnel::LatencyFitsRange(int lowerbound, int upperbound) const
|
||||||
{
|
{
|
||||||
auto latency = GetMeanLatency();
|
auto latency = GetMeanLatency();
|
||||||
return latency >= lower && latency <= upper;
|
return latency >= lowerbound && latency <= upperbound;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Tunnel::EncryptTunnelMsg (std::shared_ptr<const I2NPMessage> in, std::shared_ptr<I2NPMessage> out)
|
void Tunnel::EncryptTunnelMsg (std::shared_ptr<const I2NPMessage> in, std::shared_ptr<I2NPMessage> out)
|
||||||
|
|
|
@ -39,6 +39,7 @@ namespace tunnel
|
||||||
const int TUNNEL_CREATION_TIMEOUT = 30; // 30 seconds
|
const int TUNNEL_CREATION_TIMEOUT = 30; // 30 seconds
|
||||||
const int STANDARD_NUM_RECORDS = 4; // in VariableTunnelBuild message
|
const int STANDARD_NUM_RECORDS = 4; // in VariableTunnelBuild message
|
||||||
const int MAX_NUM_RECORDS = 8;
|
const int MAX_NUM_RECORDS = 8;
|
||||||
|
const int UNKNOWN_LATENCY = -1;
|
||||||
const int HIGH_LATENCY_PER_HOP = 250; // in milliseconds
|
const int HIGH_LATENCY_PER_HOP = 250; // in milliseconds
|
||||||
const int MAX_TUNNEL_MSGS_BATCH_SIZE = 100; // handle messages without interrupt
|
const int MAX_TUNNEL_MSGS_BATCH_SIZE = 100; // handle messages without interrupt
|
||||||
const uint16_t DEFAULT_MAX_NUM_TRANSIT_TUNNELS = 5000;
|
const uint16_t DEFAULT_MAX_NUM_TRANSIT_TUNNELS = 5000;
|
||||||
|
@ -108,14 +109,14 @@ namespace tunnel
|
||||||
void EncryptTunnelMsg (std::shared_ptr<const I2NPMessage> in, std::shared_ptr<I2NPMessage> out) override;
|
void EncryptTunnelMsg (std::shared_ptr<const I2NPMessage> in, std::shared_ptr<I2NPMessage> out) override;
|
||||||
|
|
||||||
/** @brief add latency sample */
|
/** @brief add latency sample */
|
||||||
void AddLatencySample(const uint64_t ms) { m_Latency = (m_Latency + ms) >> 1; }
|
void AddLatencySample(const int ms) { m_Latency = LatencyIsKnown() ? (m_Latency + ms) >> 1 : ms; }
|
||||||
/** @brief get this tunnel's estimated latency */
|
/** @brief get this tunnel's estimated latency */
|
||||||
uint64_t GetMeanLatency() const { return m_Latency; }
|
int GetMeanLatency() const { return m_Latency; }
|
||||||
/** @brief return true if this tunnel's latency fits in range [lowerbound, upperbound] */
|
/** @brief return true if this tunnel's latency fits in range [lowerbound, upperbound] */
|
||||||
bool LatencyFitsRange(uint64_t lowerbound, uint64_t upperbound) const;
|
bool LatencyFitsRange(int lowerbound, int upperbound) const;
|
||||||
|
|
||||||
bool LatencyIsKnown() const { return m_Latency > 0; }
|
bool LatencyIsKnown() const { return m_Latency != UNKNOWN_LATENCY; }
|
||||||
bool IsSlow () const { return LatencyIsKnown() && (int)m_Latency > HIGH_LATENCY_PER_HOP*GetNumHops (); }
|
bool IsSlow () const { return LatencyIsKnown() && m_Latency > HIGH_LATENCY_PER_HOP*GetNumHops (); }
|
||||||
|
|
||||||
/** visit all hops we currently store */
|
/** visit all hops we currently store */
|
||||||
void VisitTunnelHops(TunnelHopVisitor v);
|
void VisitTunnelHops(TunnelHopVisitor v);
|
||||||
|
@ -129,7 +130,7 @@ namespace tunnel
|
||||||
TunnelState m_State;
|
TunnelState m_State;
|
||||||
i2p::data::RouterInfo::CompatibleTransports m_FarEndTransports;
|
i2p::data::RouterInfo::CompatibleTransports m_FarEndTransports;
|
||||||
bool m_IsRecreated; // if tunnel is replaced by new, or new tunnel requested to replace
|
bool m_IsRecreated; // if tunnel is replaced by new, or new tunnel requested to replace
|
||||||
uint64_t m_Latency; // in milliseconds
|
int m_Latency; // in milliseconds
|
||||||
};
|
};
|
||||||
|
|
||||||
class OutboundTunnel: public Tunnel
|
class OutboundTunnel: public Tunnel
|
||||||
|
|
|
@ -477,8 +477,10 @@ namespace tunnel
|
||||||
}
|
}
|
||||||
if (found)
|
if (found)
|
||||||
{
|
{
|
||||||
uint64_t dlt = i2p::util::GetMillisecondsSinceEpoch () - timestamp;
|
int dlt = (int)((int64_t)i2p::util::GetMillisecondsSinceEpoch () - (int64_t)timestamp);
|
||||||
LogPrint (eLogDebug, "Tunnels: Test of ", msgID, " successful. ", dlt, " milliseconds");
|
LogPrint (eLogDebug, "Tunnels: Test of ", msgID, " successful. ", dlt, " milliseconds");
|
||||||
|
if (dlt < 0)
|
||||||
|
dlt = 0;
|
||||||
int numHops = 0;
|
int numHops = 0;
|
||||||
if (test.first) numHops += test.first->GetNumHops ();
|
if (test.first) numHops += test.first->GetNumHops ();
|
||||||
if (test.second) numHops += test.second->GetNumHops ();
|
if (test.second) numHops += test.second->GetNumHops ();
|
||||||
|
@ -488,7 +490,7 @@ namespace tunnel
|
||||||
if (test.first->GetState () != eTunnelStateExpiring)
|
if (test.first->GetState () != eTunnelStateExpiring)
|
||||||
test.first->SetState (eTunnelStateEstablished);
|
test.first->SetState (eTunnelStateEstablished);
|
||||||
// update latency
|
// update latency
|
||||||
uint64_t latency = 0;
|
int latency = 0;
|
||||||
if (numHops) latency = dlt*test.first->GetNumHops ()/numHops;
|
if (numHops) latency = dlt*test.first->GetNumHops ()/numHops;
|
||||||
if (!latency) latency = dlt/2;
|
if (!latency) latency = dlt/2;
|
||||||
test.first->AddLatencySample(latency);
|
test.first->AddLatencySample(latency);
|
||||||
|
@ -498,7 +500,7 @@ namespace tunnel
|
||||||
if (test.second->GetState () != eTunnelStateExpiring)
|
if (test.second->GetState () != eTunnelStateExpiring)
|
||||||
test.second->SetState (eTunnelStateEstablished);
|
test.second->SetState (eTunnelStateEstablished);
|
||||||
// update latency
|
// update latency
|
||||||
uint64_t latency = 0;
|
int latency = 0;
|
||||||
if (numHops) latency = dlt*test.second->GetNumHops ()/numHops;
|
if (numHops) latency = dlt*test.second->GetNumHops ()/numHops;
|
||||||
if (!latency) latency = dlt/2;
|
if (!latency) latency = dlt/2;
|
||||||
test.second->AddLatencySample(latency);
|
test.second->AddLatencySample(latency);
|
||||||
|
|
|
@ -105,7 +105,7 @@ namespace tunnel
|
||||||
bool HasCustomPeerSelector();
|
bool HasCustomPeerSelector();
|
||||||
|
|
||||||
/** @brief make this tunnel pool yield tunnels that fit latency range [min, max] */
|
/** @brief make this tunnel pool yield tunnels that fit latency range [min, max] */
|
||||||
void RequireLatency(uint64_t min, uint64_t max) { m_MinLatency = min; m_MaxLatency = max; }
|
void RequireLatency(int min, int max) { m_MinLatency = min; m_MaxLatency = max; }
|
||||||
|
|
||||||
/** @brief return true if this tunnel pool has a latency requirement */
|
/** @brief return true if this tunnel pool has a latency requirement */
|
||||||
bool HasLatencyRequirement() const { return m_MinLatency > 0 && m_MaxLatency > 0; }
|
bool HasLatencyRequirement() const { return m_MinLatency > 0 && m_MaxLatency > 0; }
|
||||||
|
@ -150,8 +150,8 @@ namespace tunnel
|
||||||
std::mutex m_CustomPeerSelectorMutex;
|
std::mutex m_CustomPeerSelectorMutex;
|
||||||
ITunnelPeerSelector * m_CustomPeerSelector;
|
ITunnelPeerSelector * m_CustomPeerSelector;
|
||||||
|
|
||||||
uint64_t m_MinLatency = 0; // if > 0 this tunnel pool will try building tunnels with minimum latency by ms
|
int m_MinLatency = 0; // if > 0 this tunnel pool will try building tunnels with minimum latency by ms
|
||||||
uint64_t m_MaxLatency = 0; // if > 0 this tunnel pool will try building tunnels with maximum latency by ms
|
int m_MaxLatency = 0; // if > 0 this tunnel pool will try building tunnels with maximum latency by ms
|
||||||
|
|
||||||
std::random_device m_Rd;
|
std::random_device m_Rd;
|
||||||
std::mt19937 m_Rng;
|
std::mt19937 m_Rng;
|
||||||
|
|
Loading…
Reference in a new issue