diff --git a/llarp/iwp/session.cpp b/llarp/iwp/session.cpp index e3284a223..54eb5d5dc 100644 --- a/llarp/iwp/session.cpp +++ b/llarp/iwp/session.cpp @@ -170,10 +170,10 @@ namespace llarp if(m_State == State::Closed) return; auto close_msg = CreatePacket(Command::eCLOS, 0, 16, 16); - EncryptAndSend(std::move(close_msg)); if(m_State == State::Ready) m_Parent->UnmapAddr(m_RemoteAddr); m_State = State::Closed; + EncryptAndSend(std::move(close_msg)); LogInfo("closing connection to ", m_RemoteAddr); } diff --git a/llarp/link/link_manager.cpp b/llarp/link/link_manager.cpp index 6d0062df5..1acd2fd90 100644 --- a/llarp/link/link_manager.cpp +++ b/llarp/link/link_manager.cpp @@ -302,9 +302,9 @@ namespace llarp auto itr = m_PersistingSessions.begin(); while(itr != m_PersistingSessions.end()) { - auto link = GetLinkWithSessionTo(itr->first); if(now < itr->second) { + auto link = GetLinkWithSessionTo(itr->first); if(link) { LogDebug("keepalive to ", itr->first); @@ -321,6 +321,10 @@ namespace llarp const RouterID r(itr->first); LogInfo("commit to ", r, " expired"); itr = m_PersistingSessions.erase(itr); + for(const auto &link : outboundLinks) + { + link->CloseSessionTo(r); + } } } } diff --git a/llarp/link/server.cpp b/llarp/link/server.cpp index 7ade923ae..30c2c6305 100644 --- a/llarp/link/server.cpp +++ b/llarp/link/server.cpp @@ -11,8 +11,9 @@ namespace llarp { static constexpr size_t MaxSessionsPerKey = 16; - ILinkLayer::ILinkLayer(std::shared_ptr keyManager, GetRCFunc getrc, - LinkMessageHandler handler, SignBufferFunc signbuf, + ILinkLayer::ILinkLayer(std::shared_ptr< KeyManager > keyManager, + GetRCFunc getrc, LinkMessageHandler handler, + SignBufferFunc signbuf, SessionEstablishedHandler establishedSession, SessionRenegotiateHandler reneg, TimeoutHandler timeout, SessionClosedHandler closed, @@ -286,7 +287,6 @@ namespace llarp ILinkLayer::Start(std::shared_ptr< Logic > l, std::shared_ptr< thread::ThreadPool > worker) { - m_Recv = std::make_shared< TrafficQueue_t >(); m_Worker = worker; m_Logic = l; ScheduleTick(100); @@ -315,6 +315,17 @@ namespace llarp ++itr; } } + { + // decay recently closed list + auto itr = m_RecentlyClosed.begin(); + while(itr != m_RecentlyClosed.end()) + { + if(itr->second >= now) + itr = m_RecentlyClosed.erase(itr); + else + ++itr; + } + } } void @@ -340,12 +351,13 @@ namespace llarp ++itr; } } - m_Recv.reset(); } void ILinkLayer::CloseSessionTo(const RouterID& remote) { + static constexpr llarp_time_t CloseGraceWindow = 500; + const auto now = Now(); ACQUIRE_LOCK(Lock_t l, m_AuthedLinksMutex); RouterID r = remote; llarp::LogInfo("Closing all to ", r); @@ -354,6 +366,8 @@ namespace llarp while(itr != range.second) { itr->second->Close(); + m_RecentlyClosed.emplace(itr->second->GetRemoteEndpoint(), + now + CloseGraceWindow); itr = m_AuthedLinks.erase(itr); } } @@ -462,7 +476,11 @@ namespace llarp auto itr = pkts->begin(); while(itr != pkts->end()) { - link->RecvFrom(itr->remote, std::move(itr->pkt)); + if(link->m_RecentlyClosed.find(itr->remote) + == link->m_RecentlyClosed.end()) + { + link->RecvFrom(itr->remote, std::move(itr->pkt)); + } ++itr; } link->Pump(); diff --git a/llarp/link/server.hpp b/llarp/link/server.hpp index 41acb9592..f8bd0ab87 100644 --- a/llarp/link/server.hpp +++ b/llarp/link/server.hpp @@ -52,7 +52,7 @@ namespace llarp struct ILinkLayer { - ILinkLayer(std::shared_ptr keyManager, GetRCFunc getrc, + ILinkLayer(std::shared_ptr< KeyManager > keyManager, GetRCFunc getrc, LinkMessageHandler handler, SignBufferFunc signFunc, SessionEstablishedHandler sessionEstablish, SessionRenegotiateHandler renegotiate, TimeoutHandler timeout, @@ -179,7 +179,7 @@ namespace llarp SessionClosedHandler SessionClosed; SessionRenegotiateHandler SessionRenegotiate; PumpDoneHandler PumpDone; - std::shared_ptr keyManager; + std::shared_ptr< KeyManager > keyManager; std::shared_ptr< Logic > logic() @@ -256,10 +256,8 @@ namespace llarp ACQUIRED_AFTER(m_AuthedLinksMutex)); Pending m_Pending GUARDED_BY(m_PendingMutex); - using TrafficEvent_t = std::pair< Addr, ILinkSession::Packet_t >; - using TrafficQueue_t = std::vector< TrafficEvent_t >; - - std::shared_ptr< TrafficQueue_t > m_Recv; + std::unordered_map< llarp::Addr, llarp_time_t, llarp::Addr::Hash > + m_RecentlyClosed; }; using LinkLayer_ptr = std::shared_ptr< ILinkLayer >;