From ef2670dfb479e3a2c73b9c03b19656c5024d2600 Mon Sep 17 00:00:00 2001 From: Stephen Shelton Date: Tue, 19 Nov 2019 09:24:29 -0700 Subject: [PATCH] Drop new inbound IWP sessions when the first packet can't be handled --- llarp/iwp/linklayer.cpp | 12 ++++++++++-- llarp/iwp/session.cpp | 8 +++++++- llarp/iwp/session.hpp | 2 +- llarp/link/session.hpp | 3 ++- 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/llarp/iwp/linklayer.cpp b/llarp/iwp/linklayer.cpp index 30eee514b..907259b6b 100644 --- a/llarp/iwp/linklayer.cpp +++ b/llarp/iwp/linklayer.cpp @@ -78,7 +78,8 @@ namespace llarp LinkLayer::RecvFrom(const Addr& from, ILinkSession::Packet_t pkt) { std::shared_ptr< ILinkSession > session; - auto itr = m_AuthedAddrs.find(from); + auto itr = m_AuthedAddrs.find(from); + bool isNewSession = false; if(itr == m_AuthedAddrs.end()) { ACQUIRE_LOCK(Lock_t lock, m_PendingMutex); @@ -86,6 +87,7 @@ namespace llarp { if(not permitInbound) return; + isNewSession = true; m_Pending.insert({from, std::make_shared< Session >(this, from)}); } session = m_Pending.find(from)->second; @@ -98,7 +100,13 @@ namespace llarp } if(session) { - session->Recv_LL(std::move(pkt)); + bool success = session->Recv_LL(std::move(pkt)); + if(!success and isNewSession) + { + LogWarn( + "Brand new session failed; removing from pending sessions list"); + m_Pending.erase(m_Pending.find(from)); + } } } diff --git a/llarp/iwp/session.cpp b/llarp/iwp/session.cpp index 7a7ccabef..7aafab65b 100644 --- a/llarp/iwp/session.cpp +++ b/llarp/iwp/session.cpp @@ -805,7 +805,7 @@ namespace llarp return m_State == State::Ready; } - void + bool Session::Recv_LL(ILinkSession::Packet_t data) { switch(m_State) @@ -816,9 +816,14 @@ namespace llarp // initial data // enter introduction phase if(DecryptMessageInPlace(data)) + { HandleGotIntro(std::move(data)); + } else + { LogError("bad intro from ", m_RemoteAddr); + return false; + } } else { @@ -844,6 +849,7 @@ namespace llarp HandleSessionData(std::move(data)); break; } + return true; } } // namespace iwp } // namespace llarp diff --git a/llarp/iwp/session.hpp b/llarp/iwp/session.hpp index 657b153b9..7e19d43d5 100644 --- a/llarp/iwp/session.hpp +++ b/llarp/iwp/session.hpp @@ -72,7 +72,7 @@ namespace llarp void Close() override; - void Recv_LL(ILinkSession::Packet_t) override; + bool Recv_LL(ILinkSession::Packet_t) override; bool SendKeepAlive() override; diff --git a/llarp/link/session.hpp b/llarp/link/session.hpp index 572ac9b0b..8c81a5a1f 100644 --- a/llarp/link/session.hpp +++ b/llarp/link/session.hpp @@ -61,8 +61,9 @@ namespace llarp /// recv packet on low layer /// not used by utp - virtual void Recv_LL(Packet_t) + virtual bool Recv_LL(Packet_t) { + return true; } /// send a keepalive to the remote endpoint