mirror of
https://github.com/PurpleI2P/i2pd
synced 2024-11-12 17:10:20 +03:00
use min hole punch interval for connection attempts
This commit is contained in:
parent
26901e2945
commit
500afe745f
@ -216,16 +216,16 @@ namespace transport
|
|||||||
return ep.port ();
|
return ep.port ();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SSU2Server::IsConnectedRecently (const boost::asio::ip::udp::endpoint& ep)
|
bool SSU2Server::IsConnectedRecently (const boost::asio::ip::udp::endpoint& ep, bool max)
|
||||||
{
|
{
|
||||||
if (!ep.port () || ep.address ().is_unspecified ()) return false;
|
if (!ep.port () || ep.address ().is_unspecified ()) return false;
|
||||||
std::lock_guard<std::mutex> l(m_ConnectedRecentlyMutex);
|
std::lock_guard<std::mutex> l(m_ConnectedRecentlyMutex);
|
||||||
auto it = m_ConnectedRecently.find (ep);
|
auto it = m_ConnectedRecently.find (ep);
|
||||||
if (it != m_ConnectedRecently.end ())
|
if (it != m_ConnectedRecently.end ())
|
||||||
{
|
{
|
||||||
if (i2p::util::GetSecondsSinceEpoch () <= it->second + SSU2_HOLE_PUNCH_EXPIRATION)
|
if (i2p::util::GetSecondsSinceEpoch () <= it->second + (max ? SSU2_MAX_HOLE_PUNCH_EXPIRATION : SSU2_MIN_HOLE_PUNCH_EXPIRATION))
|
||||||
return true;
|
return true;
|
||||||
else
|
else if (max)
|
||||||
m_ConnectedRecently.erase (it);
|
m_ConnectedRecently.erase (it);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@ -234,7 +234,7 @@ namespace transport
|
|||||||
void SSU2Server::AddConnectedRecently (const boost::asio::ip::udp::endpoint& ep, uint64_t ts)
|
void SSU2Server::AddConnectedRecently (const boost::asio::ip::udp::endpoint& ep, uint64_t ts)
|
||||||
{
|
{
|
||||||
if (!ep.port () || ep.address ().is_unspecified () ||
|
if (!ep.port () || ep.address ().is_unspecified () ||
|
||||||
i2p::util::GetSecondsSinceEpoch () > ts + SSU2_HOLE_PUNCH_EXPIRATION) return;
|
i2p::util::GetSecondsSinceEpoch () > ts + SSU2_MAX_HOLE_PUNCH_EXPIRATION) return;
|
||||||
std::lock_guard<std::mutex> l(m_ConnectedRecentlyMutex);
|
std::lock_guard<std::mutex> l(m_ConnectedRecentlyMutex);
|
||||||
auto [it, added] = m_ConnectedRecently.try_emplace (ep, ts);
|
auto [it, added] = m_ConnectedRecently.try_emplace (ep, ts);
|
||||||
if (!added && ts > it->second)
|
if (!added && ts > it->second)
|
||||||
@ -885,7 +885,7 @@ namespace transport
|
|||||||
{
|
{
|
||||||
// router doesn't publish endpoint, but we connected before and hole punch might be alive
|
// router doesn't publish endpoint, but we connected before and hole punch might be alive
|
||||||
auto ep = router->GetProfile ()->GetLastEndpoint ();
|
auto ep = router->GetProfile ()->GetLastEndpoint ();
|
||||||
if (IsConnectedRecently (ep))
|
if (IsConnectedRecently (ep, false))
|
||||||
{
|
{
|
||||||
if (CheckPendingOutgoingSession (ep, peerTest)) return false;
|
if (CheckPendingOutgoingSession (ep, peerTest)) return false;
|
||||||
session->SetRemoteEndpoint (ep);
|
session->SetRemoteEndpoint (ep);
|
||||||
@ -1148,7 +1148,7 @@ namespace transport
|
|||||||
|
|
||||||
for (auto it = m_ConnectedRecently.begin (); it != m_ConnectedRecently.end (); )
|
for (auto it = m_ConnectedRecently.begin (); it != m_ConnectedRecently.end (); )
|
||||||
{
|
{
|
||||||
if (ts > it->second + SSU2_HOLE_PUNCH_EXPIRATION)
|
if (ts > it->second + SSU2_MAX_HOLE_PUNCH_EXPIRATION)
|
||||||
it = m_ConnectedRecently.erase (it);
|
it = m_ConnectedRecently.erase (it);
|
||||||
else
|
else
|
||||||
it++;
|
it++;
|
||||||
|
@ -42,7 +42,8 @@ namespace transport
|
|||||||
const int SSU2_KEEP_ALIVE_INTERVAL = 15; // in seconds
|
const int SSU2_KEEP_ALIVE_INTERVAL = 15; // in seconds
|
||||||
const int SSU2_KEEP_ALIVE_INTERVAL_VARIANCE = 4; // in seconds
|
const int SSU2_KEEP_ALIVE_INTERVAL_VARIANCE = 4; // in seconds
|
||||||
const int SSU2_PROXY_CONNECT_RETRY_TIMEOUT = 30; // in seconds
|
const int SSU2_PROXY_CONNECT_RETRY_TIMEOUT = 30; // in seconds
|
||||||
const int SSU2_HOLE_PUNCH_EXPIRATION = 150; // in seconds
|
const int SSU2_MIN_HOLE_PUNCH_EXPIRATION = 45; // in seconds
|
||||||
|
const int SSU2_MAX_HOLE_PUNCH_EXPIRATION = 181; // in seconds
|
||||||
const size_t SSU2_MAX_NUM_PACKETS_PER_BATCH = 64;
|
const size_t SSU2_MAX_NUM_PACKETS_PER_BATCH = 64;
|
||||||
|
|
||||||
class SSU2Server: private i2p::util::RunnableServiceWithWork
|
class SSU2Server: private i2p::util::RunnableServiceWithWork
|
||||||
@ -77,7 +78,7 @@ namespace transport
|
|||||||
bool UsesProxy () const { return m_IsThroughProxy; };
|
bool UsesProxy () const { return m_IsThroughProxy; };
|
||||||
bool IsSupported (const boost::asio::ip::address& addr) const;
|
bool IsSupported (const boost::asio::ip::address& addr) const;
|
||||||
uint16_t GetPort (bool v4) const;
|
uint16_t GetPort (bool v4) const;
|
||||||
bool IsConnectedRecently (const boost::asio::ip::udp::endpoint& ep);
|
bool IsConnectedRecently (const boost::asio::ip::udp::endpoint& ep, bool max = true);
|
||||||
void AddConnectedRecently (const boost::asio::ip::udp::endpoint& ep, uint64_t ts);
|
void AddConnectedRecently (const boost::asio::ip::udp::endpoint& ep, uint64_t ts);
|
||||||
std::mt19937& GetRng () { return m_Rng; }
|
std::mt19937& GetRng () { return m_Rng; }
|
||||||
bool IsMaxNumIntroducers (bool v4) const { return (v4 ? m_Introducers.size () : m_IntroducersV6.size ()) >= SSU2_MAX_NUM_INTRODUCERS; }
|
bool IsMaxNumIntroducers (bool v4) const { return (v4 ? m_Introducers.size () : m_IntroducersV6.size ()) >= SSU2_MAX_NUM_INTRODUCERS; }
|
||||||
|
@ -685,7 +685,7 @@ namespace transport
|
|||||||
if (ep.address ().is_v4 ())
|
if (ep.address ().is_v4 ())
|
||||||
{
|
{
|
||||||
if ((supportedTransports & i2p::data::RouterInfo::eSSU2V4) &&
|
if ((supportedTransports & i2p::data::RouterInfo::eSSU2V4) &&
|
||||||
m_SSU2Server->IsConnectedRecently (ep))
|
m_SSU2Server->IsConnectedRecently (ep, false))
|
||||||
peer->priority.push_back (i2p::data::RouterInfo::eSSU2V4);
|
peer->priority.push_back (i2p::data::RouterInfo::eSSU2V4);
|
||||||
}
|
}
|
||||||
else if (ep.address ().is_v6 ())
|
else if (ep.address ().is_v6 ())
|
||||||
|
Loading…
Reference in New Issue
Block a user