lokinet/llarp/link/i_link_manager.hpp
Jason Rhinelander ccc7b5c9e9 Merge Logic functions into EventLoop
loop->call(...) is similar to the old logic->Call(...), but is smart
about the current thread: if called from within the event loop it simply
runs the argument directly, otherwise it queues it.

Similarly most of the other event loop calls are also now thread-aware:
for example, `call_later(...)` can queue the job directly when called if
in the event loop rather than having to double-queue through the even
loop (once to call, then inside the call to initiate the time).
2021-03-04 16:51:18 -04:00

103 lines
2.4 KiB
C++

#ifndef LLARP_I_LINK_MANAGER_HPP
#define LLARP_I_LINK_MANAGER_HPP
#include <link/server.hpp>
#include <util/types.hpp>
#include <peerstats/peer_db.hpp>
#include <functional>
#include <optional>
struct llarp_buffer_t;
namespace llarp
{
struct RouterContact;
struct ILinkSession;
struct IOutboundSessionMaker;
struct RouterID;
struct ILinkManager
{
virtual ~ILinkManager() = default;
virtual LinkLayer_ptr
GetCompatibleLink(const RouterContact& rc) const = 0;
virtual IOutboundSessionMaker*
GetSessionMaker() const = 0;
virtual bool
SendTo(
const RouterID& remote,
const llarp_buffer_t& buf,
ILinkSession::CompletionHandler completed) = 0;
virtual bool
HasSessionTo(const RouterID& remote) const = 0;
/// return true if the session with this pubkey is a client
/// return false if the session with this pubkey is a router
/// return std::nullopt we have no session with this pubkey
virtual std::optional<bool>
SessionIsClient(RouterID remote) const = 0;
virtual void
PumpLinks() = 0;
virtual void
AddLink(LinkLayer_ptr link, bool inbound = false) = 0;
virtual bool
StartLinks(const EventLoop_ptr& loop) = 0;
virtual void
Stop() = 0;
virtual void
PersistSessionUntil(const RouterID& remote, llarp_time_t until) = 0;
virtual void
ForEachPeer(
std::function<void(const ILinkSession*, bool)> visit, bool randomize = false) const = 0;
virtual void
ForEachPeer(std::function<void(ILinkSession*)> visit) = 0;
virtual void
ForEachInboundLink(std::function<void(LinkLayer_ptr)> visit) const = 0;
virtual void
ForEachOutboundLink(std::function<void(LinkLayer_ptr)> visit) const = 0;
/// close all connections to this peer
/// remove all link layer commits
virtual void
DeregisterPeer(RouterID remote) = 0;
virtual size_t
NumberOfConnectedRouters() const = 0;
virtual size_t
NumberOfConnectedClients() const = 0;
virtual size_t
NumberOfPendingConnections() const = 0;
virtual bool
GetRandomConnectedRouter(RouterContact& router) const = 0;
virtual void
CheckPersistingSessions(llarp_time_t now) = 0;
virtual void
updatePeerDb(std::shared_ptr<PeerDb> peerDb) = 0;
virtual util::StatusObject
ExtractStatus() const = 0;
};
} // namespace llarp
#endif // LLARP_I_LINK_MANAGER_HPP