#ifndef LLARP_LINK_MANAGER_HPP
#define LLARP_LINK_MANAGER_HPP
#include
#include
#include
#include
#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;
void
PumpLinks() override;
void
AddLink(LinkLayer_ptr link, bool inbound = false) override;
bool
StartLinks(Logic_ptr logic) override;
void
Stop() override;
void
PersistSessionUntil(const RouterID &remote, llarp_time_t until) override;
void
ForEachPeer(std::function< void(const ILinkSession *, bool) > visit,
bool randomize = false) const override;
void
ForEachPeer(std::function< void(ILinkSession *) > visit) override;
void
ForEachInboundLink(
std::function< void(LinkLayer_ptr) > visit) const override;
size_t
NumberOfConnectedRouters() const override;
size_t
NumberOfConnectedClients() const override;
bool
GetRandomConnectedRouter(RouterContact &router) const override;
void
CheckPersistingSessions(llarp_time_t now) override;
util::StatusObject
ExtractStatus() const override;
void
Init(IOutboundSessionMaker *sessionMaker);
private:
LinkLayer_ptr
GetLinkWithSessionTo(const RouterID &remote) const;
std::atomic< bool > stopping;
mutable util::Mutex _mutex; // protects m_PersistingSessions
using LinkSet = std::set< LinkLayer_ptr, ComparePtr< LinkLayer_ptr > >;
LinkSet outboundLinks;
LinkSet inboundLinks;
// sessions to persist -> timestamp to end persist at
std::unordered_map< RouterID, llarp_time_t, RouterID::Hash >
m_PersistingSessions GUARDED_BY(_mutex);
IOutboundSessionMaker *_sessionMaker;
};
} // namespace llarp
#endif // LLARP_LINK_MANAGER_HPP