correctly do latency test FEC

before this it would cause a posative feedback loop causing paths to fail for "no real reason"
pull/1663/head
Jeff Becker 3 years ago
parent 57186110f3
commit 486cdc0949
No known key found for this signature in database
GPG Key ID: F357B3B42F6F9B05

@ -405,6 +405,23 @@ namespace llarp
}
}
bool
Path::SendLatencyMessage(AbstractRouter* r)
{
const auto now = r->Now();
// send path latency test
routing::PathLatencyMessage latency{};
latency.T = randint();
latency.S = NextSeqNo();
m_LastLatencyTestID = latency.T;
m_LastLatencyTestTime = now;
LogDebug(Name(), " send latency test id=", latency.T);
if (not SendRoutingMessage(latency, r))
return false;
FlushUpstream(r);
return true;
}
void
Path::Tick(llarp_time_t now, AbstractRouter* r)
{
@ -439,15 +456,12 @@ namespace llarp
auto dlt = now - m_LastLatencyTestTime;
if (dlt > path::latency_interval && m_LastLatencyTestID == 0)
{
routing::PathLatencyMessage latency;
latency.T = randint();
m_LastLatencyTestID = latency.T;
m_LastLatencyTestTime = now;
SendRoutingMessage(latency, r);
FlushUpstream(r);
// reset ID so we don't mark ourself as dead if we drop a latency sample
r->loop()->call_later(
1s, [self = shared_from_this()]() { self->m_LastLatencyTestID = 0; });
SendLatencyMessage(r);
// latency test FEC
r->loop()->call_later(1s, [self = shared_from_this(), r]() {
if (self->m_LastLatencyTestID)
self->SendLatencyMessage(r);
});
return;
}
dlt = now - m_LastRecvMessage;
@ -684,16 +698,7 @@ namespace llarp
// persist session with upstream router until the path is done
r->PersistSessionUntil(Upstream(), intro.expiresAt);
MarkActive(now);
// send path latency test
routing::PathLatencyMessage latency;
latency.T = randint();
latency.S = NextSeqNo();
m_LastLatencyTestID = latency.T;
m_LastLatencyTestTime = now;
if (!SendRoutingMessage(latency, r))
return false;
FlushUpstream(r);
return true;
return SendLatencyMessage(r);
}
LogWarn("got unwarranted path confirm message on tx=", RXID(), " rx=", RXID());
return false;
@ -731,11 +736,11 @@ namespace llarp
constexpr auto MaxLatencySamples = 8;
bool
Path::HandlePathLatencyMessage(const routing::PathLatencyMessage& msg, AbstractRouter* r)
Path::HandlePathLatencyMessage(const routing::PathLatencyMessage&, AbstractRouter* r)
{
const auto now = r->Now();
MarkActive(now);
if (msg.L == m_LastLatencyTestID)
if (m_LastLatencyTestID)
{
m_LatencySamples.emplace_back(now - m_LastLatencyTestTime);

@ -400,6 +400,9 @@ namespace llarp
HandleAllDownstream(std::vector<RelayDownstreamMessage> msgs, AbstractRouter* r) override;
private:
bool
SendLatencyMessage(AbstractRouter* r);
/// call obtained exit hooks
bool
InformExitResult(llarp_time_t b);

Loading…
Cancel
Save