diff --git a/llarp/iwp/linklayer.cpp b/llarp/iwp/linklayer.cpp index 527510d8e..6eae44bcc 100644 --- a/llarp/iwp/linklayer.cpp +++ b/llarp/iwp/linklayer.cpp @@ -24,7 +24,7 @@ namespace llarp::iwp keyManager, getrc, h, sign, before, est, reneg, timeout, closed, pumpDone, worker) , m_Wakeup{ev->make_waker([this]() { HandleWakeupPlaintext(); })} , m_PlaintextRecv{1024} - , permitInbound{allowInbound} + , m_Inbound{allowInbound} {} @@ -48,10 +48,10 @@ namespace llarp::iwp bool isNewSession = false; if (itr == m_AuthedAddrs.end()) { - Lock_t lock(m_PendingMutex); + Lock_t lock{m_PendingMutex}; if (m_Pending.count(from) == 0) { - if (not permitInbound) + if (not m_Inbound) return; isNewSession = true; m_Pending.insert({from, std::make_shared(this, from)}); @@ -60,14 +60,13 @@ namespace llarp::iwp } else { - Lock_t lock(m_AuthedLinksMutex); - auto range = m_AuthedLinks.equal_range(itr->second); - session = range.first->second; + if(auto s_itr = m_AuthedLinks.find(itr->second); s_itr != m_AuthedLinks.end()) + session = s_itr->second; } if (session) { bool success = session->Recv_LL(std::move(pkt)); - if (!success and isNewSession) + if (not success and isNewSession) { LogWarn("Brand new session failed; removing from pending sessions list"); m_Pending.erase(m_Pending.find(from)); @@ -78,7 +77,7 @@ namespace llarp::iwp bool LinkLayer::MapAddr(const RouterID& r, ILinkSession* s) { - if (!ILinkLayer::MapAddr(r, s)) + if (not ILinkLayer::MapAddr(r, s)) return false; m_AuthedAddrs.emplace(s->GetRemoteEndpoint(), r); return true; @@ -93,6 +92,8 @@ namespace llarp::iwp std::shared_ptr LinkLayer::NewOutboundSession(const RouterContact& rc, const AddressInfo& ai) { + if(m_Inbound) + throw std::logic_error{"inbound link cannot make outbound sessions"}; return std::make_shared(this, rc, ai); } diff --git a/llarp/iwp/linklayer.hpp b/llarp/iwp/linklayer.hpp index 52d81ee2e..12fa07ab5 100644 --- a/llarp/iwp/linklayer.hpp +++ b/llarp/iwp/linklayer.hpp @@ -63,7 +63,7 @@ namespace llarp::iwp const std::shared_ptr m_Wakeup; std::unordered_map> m_PlaintextRecv; std::unordered_map m_AuthedAddrs; - const bool permitInbound; + const bool m_Inbound; }; using LinkLayer_ptr = std::shared_ptr; diff --git a/llarp/link/server.cpp b/llarp/link/server.cpp index b8c9f748f..23658dfe1 100644 --- a/llarp/link/server.cpp +++ b/llarp/link/server.cpp @@ -12,8 +12,6 @@ static constexpr auto LINK_LAYER_TICK_INTERVAL = 100ms; namespace llarp { - static constexpr size_t MaxSessionsPerKey = 16; - ILinkLayer::ILinkLayer( std::shared_ptr keyManager, GetRCFunc getrc, @@ -241,7 +239,7 @@ namespace llarp auto itr = m_Pending.find(addr); if (itr != m_Pending.end()) { - if (m_AuthedLinks.count(pk) > MaxSessionsPerKey) + if (m_AuthedLinks.count(pk)) { LogWarn("too many session for ", pk); s->Close(); @@ -303,21 +301,24 @@ namespace llarp { { Lock_t l(m_AuthedLinksMutex); - if (m_AuthedLinks.count(rc.pubkey) >= MaxSessionsPerKey) + if (m_AuthedLinks.count(rc.pubkey)) { - LogDebug("Too many links to ", RouterID{rc.pubkey}, ", not establishing another one"); + LogWarn("Too many links to ", RouterID{rc.pubkey}, ", not establishing another one"); return false; } } llarp::AddressInfo to; - if (!PickAddress(rc, to)) + if (not PickAddress(rc, to)) + { + LogWarn("router ", RouterID{rc.pubkey}, " has no acceptable inbound addresses"); return false; + } const SockAddr address{to}; { Lock_t l(m_PendingMutex); - if (m_Pending.count(address) >= MaxSessionsPerKey) + if (m_Pending.count(address)) { - LogDebug( + LogWarn( "Too many pending connections to ", address, " while establishing to ", @@ -331,12 +332,12 @@ namespace llarp { BeforeConnect(std::move(rc)); } - if (PutSession(s)) + if (not PutSession(s)) { - s->Start(); - return true; + return false; } - return false; + s->Start(); + return true; } bool