From 800f5001c200c15465027a0ed41d7b9604923082 Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Tue, 26 Mar 2019 09:51:57 -0400 Subject: [PATCH] allow up to 5 sessions per endpoint --- llarp/link/server.cpp | 4 ++-- llarp/link/server.hpp | 4 ++-- llarp/link/utp.cpp | 12 +++++++++--- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/llarp/link/server.cpp b/llarp/link/server.cpp index 2e5f901f6..93359a20f 100644 --- a/llarp/link/server.cpp +++ b/llarp/link/server.cpp @@ -382,10 +382,10 @@ namespace llarp bool ILinkLayer::PutSession(ILinkSession* s) { + static constexpr size_t MaxSessionsPerEndpoint = 5; Lock lock(&m_PendingMutex); llarp::Addr addr = s->GetRemoteEndpoint(); - auto itr = m_Pending.find(addr); - if(itr != m_Pending.end()) + if(m_Pending.count(addr) >= MaxSessionsPerEndpoint) return false; m_Pending.emplace(addr, std::unique_ptr< ILinkSession >(s)); return true; diff --git a/llarp/link/server.hpp b/llarp/link/server.hpp index b968e1e3a..134a2d6bc 100644 --- a/llarp/link/server.hpp +++ b/llarp/link/server.hpp @@ -240,8 +240,8 @@ namespace llarp m_AuthedLinks GUARDED_BY(m_AuthedLinksMutex); Mutex m_PendingMutex ACQUIRED_AFTER(m_AuthedLinksMutex); // protects m_Pending - std::unordered_map< llarp::Addr, std::unique_ptr< ILinkSession >, - llarp::Addr::Hash > + std::unordered_multimap< llarp::Addr, std::unique_ptr< ILinkSession >, + llarp::Addr::Hash > m_Pending GUARDED_BY(m_PendingMutex); }; } // namespace llarp diff --git a/llarp/link/utp.cpp b/llarp/link/utp.cpp index 3f42ba3a4..eb93743fb 100644 --- a/llarp/link/utp.cpp +++ b/llarp/link/utp.cpp @@ -228,6 +228,8 @@ namespace llarp bool Session::IsTimedOut(llarp_time_t now) const { + if(state == eInitial) + return false; if(sendq.size() >= MaxSendQueueSize) { return now - lastActive > 5000; @@ -344,13 +346,16 @@ namespace llarp LinkLayer* link = 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) { - link->HandleTimeout(session); - llarp::LogError(utp_error_code_names[arg->error_code], " via ", - session->remoteAddr); if(arg->error_code == UTP_ETIMEDOUT) + { + link->HandleTimeout(session); utp_close(arg->socket); + } else session->Close(); } @@ -577,6 +582,7 @@ namespace llarp /// base constructor Session::Session(LinkLayer* p) { + state = eInitial; m_NextTXMsgID = 0; m_NextRXMsgID = 0; parent = p;