mirror of https://github.com/oxen-io/lokinet
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
2.2 KiB
C++
101 lines
2.2 KiB
C++
5 years ago
|
#ifndef LLARP_LINK_MANAGER_HPP
|
||
|
#define LLARP_LINK_MANAGER_HPP
|
||
|
|
||
|
#include <link/i_link_manager.hpp>
|
||
|
|
||
|
#include <util/compare_ptr.hpp>
|
||
|
#include <util/threading.hpp>
|
||
|
#include <link/server.hpp>
|
||
|
|
||
|
#include <unordered_map>
|
||
|
#include <set>
|
||
|
#include <atomic>
|
||
|
|
||
|
namespace llarp
|
||
|
{
|
||
|
struct IRouterContactManager;
|
||
|
|
||
|
struct LinkManager final : public ILinkManager
|
||
|
{
|
||
|
public:
|
||
|
~LinkManager() = default;
|
||
|
|
||
|
LinkLayer_ptr
|
||
|
GetCompatibleLink(const RouterContact &rc) const override;
|
||
|
|
||
|
IOutboundSessionMaker *
|
||
|
GetSessionMaker() const override;
|
||
|
|
||
|
bool
|
||
|
SendTo(const RouterID &remote, const llarp_buffer_t &buf) 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;
|
||
|
|
||
|
virtual 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
|