allow up to 5 sessions per endpoint

pull/448/head
Jeff Becker 5 years ago
parent 1f65fcf8f5
commit 800f5001c2
No known key found for this signature in database
GPG Key ID: F357B3B42F6F9B05

@ -382,10 +382,10 @@ namespace llarp
bool bool
ILinkLayer::PutSession(ILinkSession* s) ILinkLayer::PutSession(ILinkSession* s)
{ {
static constexpr size_t MaxSessionsPerEndpoint = 5;
Lock lock(&m_PendingMutex); Lock lock(&m_PendingMutex);
llarp::Addr addr = s->GetRemoteEndpoint(); llarp::Addr addr = s->GetRemoteEndpoint();
auto itr = m_Pending.find(addr); if(m_Pending.count(addr) >= MaxSessionsPerEndpoint)
if(itr != m_Pending.end())
return false; return false;
m_Pending.emplace(addr, std::unique_ptr< ILinkSession >(s)); m_Pending.emplace(addr, std::unique_ptr< ILinkSession >(s));
return true; return true;

@ -240,8 +240,8 @@ namespace llarp
m_AuthedLinks GUARDED_BY(m_AuthedLinksMutex); m_AuthedLinks GUARDED_BY(m_AuthedLinksMutex);
Mutex m_PendingMutex Mutex m_PendingMutex
ACQUIRED_AFTER(m_AuthedLinksMutex); // protects m_Pending ACQUIRED_AFTER(m_AuthedLinksMutex); // protects m_Pending
std::unordered_map< llarp::Addr, std::unique_ptr< ILinkSession >, std::unordered_multimap< llarp::Addr, std::unique_ptr< ILinkSession >,
llarp::Addr::Hash > llarp::Addr::Hash >
m_Pending GUARDED_BY(m_PendingMutex); m_Pending GUARDED_BY(m_PendingMutex);
}; };
} // namespace llarp } // namespace llarp

@ -228,6 +228,8 @@ namespace llarp
bool bool
Session::IsTimedOut(llarp_time_t now) const Session::IsTimedOut(llarp_time_t now) const
{ {
if(state == eInitial)
return false;
if(sendq.size() >= MaxSendQueueSize) if(sendq.size() >= MaxSendQueueSize)
{ {
return now - lastActive > 5000; return now - lastActive > 5000;
@ -344,13 +346,16 @@ namespace llarp
LinkLayer* link = LinkLayer* link =
static_cast< LinkLayer* >(utp_context_get_userdata(arg->context)); static_cast< LinkLayer* >(utp_context_get_userdata(arg->context));
const llarp::Addr remoteAddr(*arg->address);
llarp::LogError(utp_error_code_names[arg->error_code], " via ",
remoteAddr);
if(session && link) if(session && link)
{ {
link->HandleTimeout(session);
llarp::LogError(utp_error_code_names[arg->error_code], " via ",
session->remoteAddr);
if(arg->error_code == UTP_ETIMEDOUT) if(arg->error_code == UTP_ETIMEDOUT)
{
link->HandleTimeout(session);
utp_close(arg->socket); utp_close(arg->socket);
}
else else
session->Close(); session->Close();
} }
@ -577,6 +582,7 @@ namespace llarp
/// base constructor /// base constructor
Session::Session(LinkLayer* p) Session::Session(LinkLayer* p)
{ {
state = eInitial;
m_NextTXMsgID = 0; m_NextTXMsgID = 0;
m_NextRXMsgID = 0; m_NextRXMsgID = 0;
parent = p; parent = p;

Loading…
Cancel
Save