#pragma once #include "i_link_manager.hpp" #include #include "server.hpp" #include #include #include namespace llarp { struct IRouterContactManager; struct LinkManager final : public ILinkManager { public: ~LinkManager() override = default; LinkLayer_ptr GetCompatibleLink(const RouterContact& rc) const override; IOutboundSessionMaker* GetSessionMaker() const override; bool SendTo( const RouterID& remote, const llarp_buffer_t& buf, ILinkSession::CompletionHandler completed) override; bool HasSessionTo(const RouterID& remote) const override; std::optional SessionIsClient(RouterID remote) const override; void DeregisterPeer(RouterID remote) override; void PumpLinks() override; void AddLink(LinkLayer_ptr link, bool inbound = false) override; bool StartLinks() override; void Stop() override; void PersistSessionUntil(const RouterID& remote, llarp_time_t until) override; void ForEachPeer(std::function visit, bool randomize = false) const override; void ForEachPeer(std::function visit) override; void ForEachInboundLink(std::function visit) const override; void ForEachOutboundLink(std::function visit) const override; size_t NumberOfConnectedRouters() const override; size_t NumberOfConnectedClients() const override; size_t NumberOfPendingConnections() const override; bool GetRandomConnectedRouter(RouterContact& router) const override; void CheckPersistingSessions(llarp_time_t now) override; void updatePeerDb(std::shared_ptr peerDb) override; util::StatusObject ExtractStatus() const override; void Init(IOutboundSessionMaker* sessionMaker); private: LinkLayer_ptr GetLinkWithSessionTo(const RouterID& remote) const; std::atomic stopping; mutable util::Mutex _mutex; // protects m_PersistingSessions using LinkSet = std::set>; LinkSet outboundLinks; LinkSet inboundLinks; // sessions to persist -> timestamp to end persist at std::unordered_map m_PersistingSessions GUARDED_BY(_mutex); std::unordered_map m_lastRouterStats; IOutboundSessionMaker* _sessionMaker; }; } // namespace llarp