mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-01-22 21:37:17 +01:00
use rtt for ack timeout
This commit is contained in:
parent
21dead3125
commit
80f81685d1
|
@ -505,18 +505,24 @@ namespace client
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientDestination::CreateStream (StreamRequestComplete streamRequestComplete, const i2p::data::IdentHash& dest, int port) {
|
void ClientDestination::CreateStream (StreamRequestComplete streamRequestComplete, const i2p::data::IdentHash& dest, int port)
|
||||||
assert(streamRequestComplete);
|
{
|
||||||
|
if (!streamRequestComplete)
|
||||||
|
{
|
||||||
|
LogPrint (eLogError, "Destination: request callback is not specified in CreateStream");
|
||||||
|
return;
|
||||||
|
}
|
||||||
auto leaseSet = FindLeaseSet (dest);
|
auto leaseSet = FindLeaseSet (dest);
|
||||||
if (leaseSet)
|
if (leaseSet)
|
||||||
streamRequestComplete(CreateStream (leaseSet, port));
|
streamRequestComplete(CreateStream (leaseSet, port));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
auto s = shared_from_this ();
|
||||||
RequestDestination (dest,
|
RequestDestination (dest,
|
||||||
[this, streamRequestComplete, port](std::shared_ptr<i2p::data::LeaseSet> ls)
|
[s, streamRequestComplete, port](std::shared_ptr<i2p::data::LeaseSet> ls)
|
||||||
{
|
{
|
||||||
if (ls)
|
if (ls)
|
||||||
streamRequestComplete(CreateStream (ls, port));
|
streamRequestComplete(s->CreateStream (ls, port));
|
||||||
else
|
else
|
||||||
streamRequestComplete (nullptr);
|
streamRequestComplete (nullptr);
|
||||||
});
|
});
|
||||||
|
@ -597,7 +603,11 @@ namespace client
|
||||||
{
|
{
|
||||||
auto it = s->m_LeaseSetRequests.find (dest);
|
auto it = s->m_LeaseSetRequests.find (dest);
|
||||||
if (it != s->m_LeaseSetRequests.end ())
|
if (it != s->m_LeaseSetRequests.end ())
|
||||||
s->m_LeaseSetRequests.erase (it);
|
{
|
||||||
|
auto requestComplete = it->second->requestComplete;
|
||||||
|
s->m_LeaseSetRequests.erase (it);
|
||||||
|
if (requestComplete) requestComplete (nullptr);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -615,8 +625,8 @@ namespace client
|
||||||
if (!SendLeaseSetRequest (dest, floodfill, request))
|
if (!SendLeaseSetRequest (dest, floodfill, request))
|
||||||
{
|
{
|
||||||
// request failed
|
// request failed
|
||||||
if (request->requestComplete) request->requestComplete (nullptr);
|
|
||||||
m_LeaseSetRequests.erase (dest);
|
m_LeaseSetRequests.erase (dest);
|
||||||
|
if (request->requestComplete) request->requestComplete (nullptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else // duplicate
|
else // duplicate
|
||||||
|
@ -627,7 +637,10 @@ namespace client
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
LogPrint (eLogError, "Destination: Can't request LeaseSet, no floodfills found");
|
LogPrint (eLogError, "Destination: Can't request LeaseSet, no floodfills found");
|
||||||
|
if (requestComplete) requestComplete (nullptr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ClientDestination::SendLeaseSetRequest (const i2p::data::IdentHash& dest,
|
bool ClientDestination::SendLeaseSetRequest (const i2p::data::IdentHash& dest,
|
||||||
|
@ -695,8 +708,9 @@ namespace client
|
||||||
|
|
||||||
if (done)
|
if (done)
|
||||||
{
|
{
|
||||||
if (it->second->requestComplete) it->second->requestComplete (nullptr);
|
auto requestComplete = it->second->requestComplete;
|
||||||
m_LeaseSetRequests.erase (it);
|
m_LeaseSetRequests.erase (it);
|
||||||
|
if (requestComplete) requestComplete (nullptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,17 +47,22 @@ namespace garlic
|
||||||
{
|
{
|
||||||
if (!m_SharedRoutingPath) return nullptr;
|
if (!m_SharedRoutingPath) return nullptr;
|
||||||
uint32_t ts = i2p::util::GetSecondsSinceEpoch ();
|
uint32_t ts = i2p::util::GetSecondsSinceEpoch ();
|
||||||
if (!m_SharedRoutingPath->outboundTunnel->IsEstablished () ||
|
if (m_SharedRoutingPath->numTimesUsed >= ROUTING_PATH_MAX_NUM_TIMES_USED ||
|
||||||
|
!m_SharedRoutingPath->outboundTunnel->IsEstablished () ||
|
||||||
ts*1000LL > m_SharedRoutingPath->remoteLease->endDate ||
|
ts*1000LL > m_SharedRoutingPath->remoteLease->endDate ||
|
||||||
ts > m_SharedRoutingPath->updateTime + ROUTING_PATH_EXPIRATION_TIMEOUT)
|
ts > m_SharedRoutingPath->updateTime + ROUTING_PATH_EXPIRATION_TIMEOUT)
|
||||||
m_SharedRoutingPath = nullptr;
|
m_SharedRoutingPath = nullptr;
|
||||||
|
if (m_SharedRoutingPath) m_SharedRoutingPath->numTimesUsed++;
|
||||||
return m_SharedRoutingPath;
|
return m_SharedRoutingPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GarlicRoutingSession::SetSharedRoutingPath (std::shared_ptr<GarlicRoutingPath> path)
|
void GarlicRoutingSession::SetSharedRoutingPath (std::shared_ptr<GarlicRoutingPath> path)
|
||||||
{
|
{
|
||||||
if (path && path->outboundTunnel && path->remoteLease)
|
if (path && path->outboundTunnel && path->remoteLease)
|
||||||
|
{
|
||||||
path->updateTime = i2p::util::GetSecondsSinceEpoch ();
|
path->updateTime = i2p::util::GetSecondsSinceEpoch ();
|
||||||
|
path->numTimesUsed = 0;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
path = nullptr;
|
path = nullptr;
|
||||||
m_SharedRoutingPath = path;
|
m_SharedRoutingPath = path;
|
||||||
|
|
2
Garlic.h
2
Garlic.h
|
@ -44,6 +44,7 @@ namespace garlic
|
||||||
const int OUTGOING_TAGS_CONFIRMATION_TIMEOUT = 10; // 10 seconds
|
const int OUTGOING_TAGS_CONFIRMATION_TIMEOUT = 10; // 10 seconds
|
||||||
const int LEASET_CONFIRMATION_TIMEOUT = 4000; // in milliseconds
|
const int LEASET_CONFIRMATION_TIMEOUT = 4000; // in milliseconds
|
||||||
const int ROUTING_PATH_EXPIRATION_TIMEOUT = 30; // 30 seconds
|
const int ROUTING_PATH_EXPIRATION_TIMEOUT = 30; // 30 seconds
|
||||||
|
const int ROUTING_PATH_MAX_NUM_TIMES_USED = 10; // how many times might be used
|
||||||
|
|
||||||
struct SessionTag: public i2p::data::Tag<32>
|
struct SessionTag: public i2p::data::Tag<32>
|
||||||
{
|
{
|
||||||
|
@ -64,6 +65,7 @@ namespace garlic
|
||||||
std::shared_ptr<const i2p::data::Lease> remoteLease;
|
std::shared_ptr<const i2p::data::Lease> remoteLease;
|
||||||
int rtt; // RTT
|
int rtt; // RTT
|
||||||
uint32_t updateTime; // seconds since epoch
|
uint32_t updateTime; // seconds since epoch
|
||||||
|
int numTimesUsed;
|
||||||
};
|
};
|
||||||
|
|
||||||
class GarlicDestination;
|
class GarlicDestination;
|
||||||
|
|
|
@ -113,7 +113,7 @@ namespace stream
|
||||||
if (!m_IsAckSendScheduled)
|
if (!m_IsAckSendScheduled)
|
||||||
{
|
{
|
||||||
m_IsAckSendScheduled = true;
|
m_IsAckSendScheduled = true;
|
||||||
m_AckSendTimer.expires_from_now (boost::posix_time::milliseconds(ACK_SEND_TIMEOUT));
|
m_AckSendTimer.expires_from_now (boost::posix_time::milliseconds(m_RTT/10));
|
||||||
m_AckSendTimer.async_wait (std::bind (&Stream::HandleAckSendTimer,
|
m_AckSendTimer.async_wait (std::bind (&Stream::HandleAckSendTimer,
|
||||||
shared_from_this (), std::placeholders::_1));
|
shared_from_this (), std::placeholders::_1));
|
||||||
}
|
}
|
||||||
|
@ -274,7 +274,7 @@ namespace stream
|
||||||
if (!seqn && m_RoutingSession) // first message confirmed
|
if (!seqn && m_RoutingSession) // first message confirmed
|
||||||
m_RoutingSession->SetSharedRoutingPath (
|
m_RoutingSession->SetSharedRoutingPath (
|
||||||
std::make_shared<i2p::garlic::GarlicRoutingPath> (
|
std::make_shared<i2p::garlic::GarlicRoutingPath> (
|
||||||
i2p::garlic::GarlicRoutingPath{m_CurrentOutboundTunnel, m_CurrentRemoteLease, m_RTT, 0}));
|
i2p::garlic::GarlicRoutingPath{m_CurrentOutboundTunnel, m_CurrentRemoteLease, m_RTT, 0, 0}));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in a new issue