Nuked superfluous interface classes

RIP:
- i_link_manager
- i_outbound_message_handler
- i_gossiper
- i_outbound_session_maker
- i_rc_lookup_handler
pull/2204/head
dr7ana 9 months ago
parent 821cbeaacf
commit 7f8207d5d3

@ -19,7 +19,7 @@
#include <llarp/routing/path_dht_message.hpp>
#include <llarp/nodedb.hpp>
#include <llarp/profiling.hpp>
#include <llarp/router/i_rc_lookup_handler.hpp>
#include <llarp/router/rc_lookup_handler.hpp>
#include <llarp/util/decaying_hashset.hpp>
#include <vector>

@ -4,7 +4,7 @@
#include <memory>
#include <llarp/path/path_context.hpp>
#include <llarp/router/abstractrouter.hpp>
#include <llarp/router/i_rc_lookup_handler.hpp>
#include <llarp/router/rc_lookup_handler.hpp>
#include <llarp/tooling/rc_event.hpp>
namespace llarp::dht

@ -5,63 +5,60 @@
#include <llarp/service/intro_set.hpp>
#include <utility>
namespace llarp
namespace llarp::dht
{
namespace dht
struct RCNode
{
struct RCNode
{
RouterContact rc;
Key_t ID;
RCNode()
{
ID.Zero();
}
RouterContact rc;
Key_t ID;
RCNode(const RouterContact& other) : rc(other), ID(other.pubkey)
{}
RCNode()
{
ID.Zero();
}
util::StatusObject
ExtractStatus() const
{
return rc.ExtractStatus();
}
RCNode(const RouterContact& other) : rc(other), ID(other.pubkey)
{}
bool
operator<(const RCNode& other) const
{
return rc.last_updated < other.rc.last_updated;
}
};
util::StatusObject
ExtractStatus() const
{
return rc.ExtractStatus();
}
struct ISNode
bool
operator<(const RCNode& other) const
{
service::EncryptedIntroSet introset;
return rc.last_updated < other.rc.last_updated;
}
};
struct ISNode
{
service::EncryptedIntroSet introset;
Key_t ID;
Key_t ID;
ISNode()
{
ID.Zero();
}
ISNode()
{
ID.Zero();
}
ISNode(service::EncryptedIntroSet other) : introset(std::move(other))
{
ID = Key_t(introset.derivedSigningKey.as_array());
}
ISNode(service::EncryptedIntroSet other) : introset(std::move(other))
{
ID = Key_t(introset.derivedSigningKey.as_array());
}
util::StatusObject
ExtractStatus() const
{
return introset.ExtractStatus();
}
util::StatusObject
ExtractStatus() const
{
return introset.ExtractStatus();
}
bool
operator<(const ISNode& other) const
{
return introset.signedAt < other.introset.signedAt;
}
};
} // namespace dht
} // namespace llarp
bool
operator<(const ISNode& other) const
{
return introset.signedAt < other.introset.signedAt;
}
};
} // namespace llarp::dht

@ -5,7 +5,7 @@
#include <llarp/dht/messages/gotrouter.hpp>
#include <llarp/router/abstractrouter.hpp>
#include <llarp/router/i_rc_lookup_handler.hpp>
#include <llarp/router/rc_lookup_handler.hpp>
#include <utility>

@ -8,7 +8,7 @@
#include <llarp/util/bits.hpp>
#include <llarp/quic/tunnel.hpp>
#include <llarp/router/i_rc_lookup_handler.hpp>
#include <llarp/router/rc_lookup_handler.hpp>
#include <cassert>
#include <llarp/service/protocol_type.hpp>

@ -1,109 +0,0 @@
#pragma once
#include "endpoint.hpp"
#include "server.hpp"
#include <llarp/util/types.hpp>
#include <llarp/peerstats/peer_db.hpp>
#include <functional>
#include <optional>
struct llarp_buffer_t;
namespace llarp
{
// TODO: do we still want this?
enum class SessionResult
{
Establish,
Timeout,
RouterNotFound,
InvalidRouter,
NoLink,
EstablishFail
};
constexpr std::string_view
ToString(SessionResult sr)
{
return sr == llarp::SessionResult::Establish ? "success"sv
: sr == llarp::SessionResult::Timeout ? "timeout"sv
: sr == llarp::SessionResult::NoLink ? "no link"sv
: sr == llarp::SessionResult::InvalidRouter ? "invalid router"sv
: sr == llarp::SessionResult::RouterNotFound ? "not found"sv
: sr == llarp::SessionResult::EstablishFail ? "establish failed"sv
: "???"sv;
}
template <>
constexpr inline bool IsToStringFormattable<SessionResult> = true;
struct RouterContact;
struct AbstractLinkSession;
struct IOutboundSessionMaker;
struct RouterID;
struct ILinkManager
{
virtual ~ILinkManager() = default;
virtual bool
SendTo(
const RouterID& remote,
const llarp_buffer_t& buf,
AbstractLinkSession::CompletionHandler completed,
uint16_t priority = 0) = 0;
virtual bool
HaveConnection(const RouterID& remote, bool client_only = false) const = 0;
/// return true if we have a connection to the remote and it is not a relay,
/// else return false
virtual bool
HaveClientConnection(const RouterID& remote) const = 0;
virtual void
Stop() = 0;
virtual void
PersistSessionUntil(const RouterID& remote, llarp_time_t until) = 0;
/// close all connections to this peer
/// remove all link layer commits
virtual void
DeregisterPeer(RouterID remote) = 0;
virtual size_t
NumberOfConnectedRouters(bool clients_only = false) const = 0;
virtual size_t
NumberOfConnectedClients() 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;
// Do an RC lookup for the given RouterID; the result will trigger
// Connect(RouterContact) on success (or if we already have it), and will
// trigger connection failure callback on lookup failure.
virtual void
Connect(RouterID router) = 0;
// Establish a connection to the remote `rc`.
//
// Connection established/failed callbacks should be invoked when either happens,
// but this function should do nothing if already connected.
virtual void
Connect(RouterContact rc) = 0;
};
} // namespace llarp

@ -1,6 +1,6 @@
#include "link_manager.hpp"
#include <llarp/router/i_rc_lookup_handler.hpp>
#include <llarp/router/rc_lookup_handler.hpp>
#include <llarp/nodedb.hpp>
#include <llarp/crypto/crypto.hpp>
@ -218,7 +218,7 @@ namespace llarp
}
void
LinkManager::Init(I_RCLookupHandler* rcLookup)
LinkManager::Init(RCLookupHandler* rcLookup)
{
stopping = false;
_rcLookup = rcLookup;

@ -1,7 +1,5 @@
#pragma once
#include "i_link_manager.hpp"
#include <llarp/util/compare_ptr.hpp>
#include "server.hpp"
#include "endpoint.hpp"
@ -14,9 +12,31 @@
namespace llarp
{
struct IRouterContactManager;
enum class SessionResult
{
Establish,
Timeout,
RouterNotFound,
InvalidRouter,
NoLink,
EstablishFail
};
struct LinkManager final : public ILinkManager
constexpr std::string_view
ToString(SessionResult sr)
{
return sr == llarp::SessionResult::Establish ? "success"sv
: sr == llarp::SessionResult::Timeout ? "timeout"sv
: sr == llarp::SessionResult::NoLink ? "no link"sv
: sr == llarp::SessionResult::InvalidRouter ? "invalid router"sv
: sr == llarp::SessionResult::RouterNotFound ? "not found"sv
: sr == llarp::SessionResult::EstablishFail ? "establish failed"sv
: "???"sv;
}
template <>
constexpr inline bool IsToStringFormattable<SessionResult> = true;
struct LinkManager
{
public:
explicit LinkManager(AbstractRouter* r) : router{r}
@ -27,52 +47,52 @@ namespace llarp
const RouterID& remote,
const llarp_buffer_t& buf,
AbstractLinkSession::CompletionHandler completed,
uint16_t priority) override;
uint16_t priority);
bool
HaveConnection(const RouterID& remote, bool client_only = false) const override;
HaveConnection(const RouterID& remote, bool client_only = false) const;
bool
HaveClientConnection(const RouterID& remote) const override;
HaveClientConnection(const RouterID& remote) const;
void
DeregisterPeer(RouterID remote) override;
DeregisterPeer(RouterID remote);
void
AddLink(const oxen::quic::opt::local_addr& bind, bool inbound = false);
void
Stop() override;
Stop();
void
PersistSessionUntil(const RouterID& remote, llarp_time_t until) override;
PersistSessionUntil(const RouterID& remote, llarp_time_t until);
size_t
NumberOfConnectedRouters(bool clients_only = false) const override;
NumberOfConnectedRouters(bool clients_only = false) const;
size_t
NumberOfConnectedClients() const override;
NumberOfConnectedClients() const;
bool
GetRandomConnectedRouter(RouterContact& router) const override;
GetRandomConnectedRouter(RouterContact& router) const;
void
CheckPersistingSessions(llarp_time_t now) override;
CheckPersistingSessions(llarp_time_t now);
void
updatePeerDb(std::shared_ptr<PeerDb> peerDb) override;
updatePeerDb(std::shared_ptr<PeerDb> peerDb);
util::StatusObject
ExtractStatus() const override;
ExtractStatus() const;
void
Init(I_RCLookupHandler* rcLookup);
Init(RCLookupHandler* rcLookup);
void
Connect(RouterID router) override;
Connect(RouterID router);
void
Connect(RouterContact rc) override;
Connect(RouterContact rc);
// Attempts to connect to a number of random routers.
//
@ -102,7 +122,7 @@ namespace llarp
util::DecayingHashSet<RouterID> m_Clients{path::default_lifetime};
I_RCLookupHandler* _rcLookup;
RCLookupHandler* _rcLookup;
std::shared_ptr<NodeDB> _nodedb;
AbstractRouter* router;

@ -6,7 +6,7 @@
#include <llarp/path/path_context.hpp>
#include <llarp/path/transit_hop.hpp>
#include <llarp/router/abstractrouter.hpp>
#include <llarp/router/i_outbound_message_handler.hpp>
#include <llarp/router/outbound_message_handler.hpp>
#include <llarp/routing/path_confirm_message.hpp>
#include <llarp/util/bencode.hpp>
#include <llarp/util/buffer.hpp>

@ -2,7 +2,7 @@
#include <llarp/dht/context.hpp>
#include <llarp/exit/exit_messages.hpp>
#include <llarp/link/i_link_manager.hpp>
#include <llarp/link/link_manager.hpp>
#include <llarp/messages/discard.hpp>
#include <llarp/messages/relay_commit.hpp>
#include <llarp/messages/relay_status.hpp>

@ -1,419 +1,417 @@
#include "path.hpp"
#include "path_context.hpp"
#include <llarp/router/outbound_message_handler.hpp>
#include <llarp/messages/relay_commit.hpp>
#include "path.hpp"
#include <llarp/router/abstractrouter.hpp>
#include <llarp/router/i_outbound_message_handler.hpp>
#include <llarp/router/outbound_message_handler.hpp>
namespace llarp
namespace llarp::path
{
namespace path
{
static constexpr auto DefaultPathBuildLimit = 500ms;
static constexpr auto DefaultPathBuildLimit = 500ms;
PathContext::PathContext(AbstractRouter* router)
: m_Router(router), m_AllowTransit(false), m_PathLimits(DefaultPathBuildLimit)
{}
PathContext::PathContext(AbstractRouter* router)
: m_Router(router), m_AllowTransit(false), m_PathLimits(DefaultPathBuildLimit)
{}
void
PathContext::AllowTransit()
{
m_AllowTransit = true;
}
void
PathContext::AllowTransit()
{
m_AllowTransit = true;
}
bool
PathContext::AllowingTransit() const
{
return m_AllowTransit;
}
bool
PathContext::AllowingTransit() const
{
return m_AllowTransit;
}
bool
PathContext::CheckPathLimitHitByIP(const IpAddress& ip)
{
bool
PathContext::CheckPathLimitHitByIP(const IpAddress& ip)
{
#ifdef TESTNET
return false;
return false;
#else
IpAddress remote = ip;
// null out the port -- we don't care about it for path limiting purposes
remote.setPort(0);
// try inserting remote address by ip into decaying hash set
// if it cannot insert it has hit a limit
return not m_PathLimits.Insert(remote);
IpAddress remote = ip;
// null out the port -- we don't care about it for path limiting purposes
remote.setPort(0);
// try inserting remote address by ip into decaying hash set
// if it cannot insert it has hit a limit
return not m_PathLimits.Insert(remote);
#endif
}
const EventLoop_ptr&
PathContext::loop()
{
return m_Router->loop();
}
}
const SecretKey&
PathContext::EncryptionSecretKey()
{
return m_Router->encryption();
}
const EventLoop_ptr&
PathContext::loop()
{
return m_Router->loop();
}
bool
PathContext::HopIsUs(const RouterID& k) const
{
return std::equal(m_Router->pubkey(), m_Router->pubkey() + PUBKEYSIZE, k.begin());
}
const SecretKey&
PathContext::EncryptionSecretKey()
{
return m_Router->encryption();
}
PathContext::EndpointPathPtrSet
PathContext::FindOwnedPathsWithEndpoint(const RouterID& r)
{
EndpointPathPtrSet found;
m_OurPaths.ForEach([&](const Path_ptr& p) {
if (p->Endpoint() == r && p->IsReady())
found.insert(p);
});
return found;
}
bool
PathContext::HopIsUs(const RouterID& k) const
{
return std::equal(m_Router->pubkey(), m_Router->pubkey() + PUBKEYSIZE, k.begin());
}
bool
PathContext::ForwardLRCM(
const RouterID& nextHop,
const std::array<EncryptedFrame, 8>& frames,
SendStatusHandler handler)
PathContext::EndpointPathPtrSet
PathContext::FindOwnedPathsWithEndpoint(const RouterID& r)
{
EndpointPathPtrSet found;
m_OurPaths.ForEach([&](const Path_ptr& p) {
if (p->Endpoint() == r && p->IsReady())
found.insert(p);
});
return found;
}
bool
PathContext::ForwardLRCM(
const RouterID& nextHop,
const std::array<EncryptedFrame, 8>& frames,
SendStatusHandler handler)
{
if (handler == nullptr)
{
if (handler == nullptr)
{
LogError("Calling ForwardLRCM without passing result handler");
return false;
}
const LR_CommitMessage msg{frames};
LogDebug("forwarding LRCM to ", nextHop);
return m_Router->SendToOrQueue(nextHop, msg, handler);
LogError("Calling ForwardLRCM without passing result handler");
return false;
}
template <
typename Lock_t,
typename Map_t,
typename Key_t,
typename CheckValue_t,
typename GetFunc_t,
typename Return_ptr = HopHandler_ptr>
Return_ptr
MapGet(Map_t& map, const Key_t& k, CheckValue_t check, GetFunc_t get)
{
Lock_t lock(map.first);
auto range = map.second.equal_range(k);
for (auto i = range.first; i != range.second; ++i)
{
if (check(i->second))
return get(i->second);
}
return nullptr;
}
const LR_CommitMessage msg{frames};
template <typename Lock_t, typename Map_t, typename Key_t, typename CheckValue_t>
bool
MapHas(Map_t& map, const Key_t& k, CheckValue_t check)
{
Lock_t lock(map.first);
auto range = map.second.equal_range(k);
for (auto i = range.first; i != range.second; ++i)
{
if (check(i->second))
return true;
}
return false;
}
LogDebug("forwarding LRCM to ", nextHop);
template <typename Lock_t, typename Map_t, typename Key_t, typename Value_t>
void
MapPut(Map_t& map, const Key_t& k, const Value_t& v)
{
Lock_t lock(map.first);
map.second.emplace(k, v);
}
return m_Router->SendToOrQueue(nextHop, msg, handler);
}
template <typename Lock_t, typename Map_t, typename Visit_t>
void
MapIter(Map_t& map, Visit_t v)
template <
typename Lock_t,
typename Map_t,
typename Key_t,
typename CheckValue_t,
typename GetFunc_t,
typename Return_ptr = HopHandler_ptr>
Return_ptr
MapGet(Map_t& map, const Key_t& k, CheckValue_t check, GetFunc_t get)
{
Lock_t lock(map.first);
auto range = map.second.equal_range(k);
for (auto i = range.first; i != range.second; ++i)
{
Lock_t lock(map.first);
for (const auto& item : map.second)
v(item);
if (check(i->second))
return get(i->second);
}
return nullptr;
}
template <typename Lock_t, typename Map_t, typename Key_t, typename Check_t>
void
MapDel(Map_t& map, const Key_t& k, Check_t check)
template <typename Lock_t, typename Map_t, typename Key_t, typename CheckValue_t>
bool
MapHas(Map_t& map, const Key_t& k, CheckValue_t check)
{
Lock_t lock(map.first);
auto range = map.second.equal_range(k);
for (auto i = range.first; i != range.second; ++i)
{
Lock_t lock(map.first);
auto range = map.second.equal_range(k);
for (auto i = range.first; i != range.second;)
{
if (check(i->second))
i = map.second.erase(i);
else
++i;
}
if (check(i->second))
return true;
}
return false;
}
void
PathContext::AddOwnPath(PathSet_ptr set, Path_ptr path)
{
set->AddPath(path);
MapPut<util::Lock>(m_OurPaths, path->TXID(), path);
MapPut<util::Lock>(m_OurPaths, path->RXID(), path);
}
template <typename Lock_t, typename Map_t, typename Key_t, typename Value_t>
void
MapPut(Map_t& map, const Key_t& k, const Value_t& v)
{
Lock_t lock(map.first);
map.second.emplace(k, v);
}
bool
PathContext::HasTransitHop(const TransitHopInfo& info)
template <typename Lock_t, typename Map_t, typename Visit_t>
void
MapIter(Map_t& map, Visit_t v)
{
Lock_t lock(map.first);
for (const auto& item : map.second)
v(item);
}
template <typename Lock_t, typename Map_t, typename Key_t, typename Check_t>
void
MapDel(Map_t& map, const Key_t& k, Check_t check)
{
Lock_t lock(map.first);
auto range = map.second.equal_range(k);
for (auto i = range.first; i != range.second;)
{
return MapHas<SyncTransitMap_t::Lock_t>(
m_TransitPaths, info.txID, [info](const std::shared_ptr<TransitHop>& hop) -> bool {
return info == hop->info;
});
if (check(i->second))
i = map.second.erase(i);
else
++i;
}
}
std::optional<std::weak_ptr<TransitHop>>
PathContext::TransitHopByInfo(const TransitHopInfo& info)
{
// this is ugly as sin
auto own = MapGet<
SyncTransitMap_t::Lock_t,
decltype(m_TransitPaths),
PathID_t,
std::function<bool(const std::shared_ptr<TransitHop>&)>,
std::function<TransitHop*(const std::shared_ptr<TransitHop>&)>,
TransitHop*>(
m_TransitPaths,
info.txID,
[info](const auto& hop) -> bool { return hop->info == info; },
[](const auto& hop) -> TransitHop* { return hop.get(); });
if (own)
return own->weak_from_this();
return std::nullopt;
}
void
PathContext::AddOwnPath(PathSet_ptr set, Path_ptr path)
{
set->AddPath(path);
MapPut<util::Lock>(m_OurPaths, path->TXID(), path);
MapPut<util::Lock>(m_OurPaths, path->RXID(), path);
}
std::optional<std::weak_ptr<TransitHop>>
PathContext::TransitHopByUpstream(const RouterID& upstream, const PathID_t& id)
{
// this is ugly as sin as well
auto own = MapGet<
SyncTransitMap_t::Lock_t,
decltype(m_TransitPaths),
PathID_t,
std::function<bool(const std::shared_ptr<TransitHop>&)>,
std::function<TransitHop*(const std::shared_ptr<TransitHop>&)>,
TransitHop*>(
m_TransitPaths,
id,
[upstream](const auto& hop) -> bool { return hop->info.upstream == upstream; },
[](const auto& hop) -> TransitHop* { return hop.get(); });
if (own)
return own->weak_from_this();
return std::nullopt;
}
bool
PathContext::HasTransitHop(const TransitHopInfo& info)
{
return MapHas<SyncTransitMap_t::Lock_t>(
m_TransitPaths, info.txID, [info](const std::shared_ptr<TransitHop>& hop) -> bool {
return info == hop->info;
});
}
std::optional<std::weak_ptr<TransitHop>>
PathContext::TransitHopByInfo(const TransitHopInfo& info)
{
// this is ugly as sin
auto own = MapGet<
SyncTransitMap_t::Lock_t,
decltype(m_TransitPaths),
PathID_t,
std::function<bool(const std::shared_ptr<TransitHop>&)>,
std::function<TransitHop*(const std::shared_ptr<TransitHop>&)>,
TransitHop*>(
m_TransitPaths,
info.txID,
[info](const auto& hop) -> bool { return hop->info == info; },
[](const auto& hop) -> TransitHop* { return hop.get(); });
if (own)
return own->weak_from_this();
return std::nullopt;
}
std::optional<std::weak_ptr<TransitHop>>
PathContext::TransitHopByUpstream(const RouterID& upstream, const PathID_t& id)
{
// this is ugly as sin as well
auto own = MapGet<
SyncTransitMap_t::Lock_t,
decltype(m_TransitPaths),
PathID_t,
std::function<bool(const std::shared_ptr<TransitHop>&)>,
std::function<TransitHop*(const std::shared_ptr<TransitHop>&)>,
TransitHop*>(
m_TransitPaths,
id,
[upstream](const auto& hop) -> bool { return hop->info.upstream == upstream; },
[](const auto& hop) -> TransitHop* { return hop.get(); });
if (own)
return own->weak_from_this();
return std::nullopt;
}
HopHandler_ptr
PathContext::GetByUpstream(const RouterID& remote, const PathID_t& id)
{
auto own = MapGet<util::Lock>(
m_OurPaths,
id,
[](const Path_ptr) -> bool {
// TODO: is this right?
return true;
},
[](Path_ptr p) -> HopHandler_ptr { return p; });
if (own)
return own;
return MapGet<SyncTransitMap_t::Lock_t>(
m_TransitPaths,
id,
[remote](const std::shared_ptr<TransitHop>& hop) -> bool {
return hop->info.upstream == remote;
},
[](const std::shared_ptr<TransitHop>& h) -> HopHandler_ptr { return h; });
}
bool
PathContext::TransitHopPreviousIsRouter(const PathID_t& path, const RouterID& otherRouter)
{
SyncTransitMap_t::Lock_t lock(m_TransitPaths.first);
auto itr = m_TransitPaths.second.find(path);
if (itr == m_TransitPaths.second.end())
return false;
return itr->second->info.downstream == otherRouter;
}
HopHandler_ptr
PathContext::GetByUpstream(const RouterID& remote, const PathID_t& id)
HopHandler_ptr
PathContext::GetByDownstream(const RouterID& remote, const PathID_t& id)
{
return MapGet<SyncTransitMap_t::Lock_t>(
m_TransitPaths,
id,
[remote](const std::shared_ptr<TransitHop>& hop) -> bool {
return hop->info.downstream == remote;
},
[](const std::shared_ptr<TransitHop>& h) -> HopHandler_ptr { return h; });
}
PathSet_ptr
PathContext::GetLocalPathSet(const PathID_t& id)
{
auto& map = m_OurPaths;
util::Lock lock(map.first);
auto itr = map.second.find(id);
if (itr != map.second.end())
{
auto own = MapGet<util::Lock>(
m_OurPaths,
id,
[](const Path_ptr) -> bool {
// TODO: is this right?
return true;
},
[](Path_ptr p) -> HopHandler_ptr { return p; });
if (own)
return own;
return MapGet<SyncTransitMap_t::Lock_t>(
m_TransitPaths,
id,
[remote](const std::shared_ptr<TransitHop>& hop) -> bool {
return hop->info.upstream == remote;
},
[](const std::shared_ptr<TransitHop>& h) -> HopHandler_ptr { return h; });
if (auto parent = itr->second->m_PathSet.lock())
return parent;
}
return nullptr;
}
bool
PathContext::TransitHopPreviousIsRouter(const PathID_t& path, const RouterID& otherRouter)
{
SyncTransitMap_t::Lock_t lock(m_TransitPaths.first);
auto itr = m_TransitPaths.second.find(path);
if (itr == m_TransitPaths.second.end())
return false;
return itr->second->info.downstream == otherRouter;
}
const byte_t*
PathContext::OurRouterID() const
{
return m_Router->pubkey();
}
HopHandler_ptr
PathContext::GetByDownstream(const RouterID& remote, const PathID_t& id)
{
return MapGet<SyncTransitMap_t::Lock_t>(
m_TransitPaths,
id,
[remote](const std::shared_ptr<TransitHop>& hop) -> bool {
return hop->info.downstream == remote;
},
[](const std::shared_ptr<TransitHop>& h) -> HopHandler_ptr { return h; });
}
AbstractRouter*
PathContext::Router()
{
return m_Router;
}
PathSet_ptr
PathContext::GetLocalPathSet(const PathID_t& id)
TransitHop_ptr
PathContext::GetPathForTransfer(const PathID_t& id)
{
const RouterID us(OurRouterID());
auto& map = m_TransitPaths;
{
auto& map = m_OurPaths;
util::Lock lock(map.first);
auto itr = map.second.find(id);
if (itr != map.second.end())
SyncTransitMap_t::Lock_t lock(map.first);
auto range = map.second.equal_range(id);
for (auto i = range.first; i != range.second; ++i)
{
if (auto parent = itr->second->m_PathSet.lock())
return parent;
if (i->second->info.upstream == us)
return i->second;
}
return nullptr;
}
return nullptr;
}
const byte_t*
PathContext::OurRouterID() const
{
return m_Router->pubkey();
}
void
PathContext::PumpUpstream()
{
m_TransitPaths.ForEach([&](auto& ptr) { ptr->FlushUpstream(m_Router); });
m_OurPaths.ForEach([&](auto& ptr) { ptr->FlushUpstream(m_Router); });
}
AbstractRouter*
PathContext::Router()
{
return m_Router;
}
void
PathContext::PumpDownstream()
{
m_TransitPaths.ForEach([&](auto& ptr) { ptr->FlushDownstream(m_Router); });
m_OurPaths.ForEach([&](auto& ptr) { ptr->FlushDownstream(m_Router); });
}
TransitHop_ptr
PathContext::GetPathForTransfer(const PathID_t& id)
{
const RouterID us(OurRouterID());
auto& map = m_TransitPaths;
{
SyncTransitMap_t::Lock_t lock(map.first);
auto range = map.second.equal_range(id);
for (auto i = range.first; i != range.second; ++i)
{
if (i->second->info.upstream == us)
return i->second;
}
}
return nullptr;
}
uint64_t
PathContext::CurrentTransitPaths()
{
SyncTransitMap_t::Lock_t lock(m_TransitPaths.first);
const auto& map = m_TransitPaths.second;
return map.size() / 2;
}
void
PathContext::PumpUpstream()
uint64_t
PathContext::CurrentOwnedPaths(path::PathStatus st)
{
uint64_t num{};
util::Lock lock{m_OurPaths.first};
auto& map = m_OurPaths.second;
for (auto itr = map.begin(); itr != map.end(); ++itr)
{
m_TransitPaths.ForEach([&](auto& ptr) { ptr->FlushUpstream(m_Router); });
m_OurPaths.ForEach([&](auto& ptr) { ptr->FlushUpstream(m_Router); });
if (itr->second->Status() == st)
num++;
}
return num / 2;
}
void
PathContext::PumpDownstream()
{
m_TransitPaths.ForEach([&](auto& ptr) { ptr->FlushDownstream(m_Router); });
m_OurPaths.ForEach([&](auto& ptr) { ptr->FlushDownstream(m_Router); });
}
void
PathContext::PutTransitHop(std::shared_ptr<TransitHop> hop)
{
MapPut<SyncTransitMap_t::Lock_t>(m_TransitPaths, hop->info.txID, hop);
MapPut<SyncTransitMap_t::Lock_t>(m_TransitPaths, hop->info.rxID, hop);
}
uint64_t
PathContext::CurrentTransitPaths()
{
SyncTransitMap_t::Lock_t lock(m_TransitPaths.first);
const auto& map = m_TransitPaths.second;
return map.size() / 2;
}
void
PathContext::ExpirePaths(llarp_time_t now)
{
// decay limits
m_PathLimits.Decay(now);
uint64_t
PathContext::CurrentOwnedPaths(path::PathStatus st)
{
uint64_t num{};
util::Lock lock{m_OurPaths.first};
auto& map = m_OurPaths.second;
for (auto itr = map.begin(); itr != map.end(); ++itr)
SyncTransitMap_t::Lock_t lock(m_TransitPaths.first);
auto& map = m_TransitPaths.second;
auto itr = map.begin();
while (itr != map.end())
{
if (itr->second->Status() == st)
num++;
if (itr->second->Expired(now))
{
m_Router->outboundMessageHandler().RemovePath(itr->first);
itr = map.erase(itr);
}
else
{
itr->second->DecayFilters(now);
++itr;
}
}
return num / 2;
}
void
PathContext::PutTransitHop(std::shared_ptr<TransitHop> hop)
{
MapPut<SyncTransitMap_t::Lock_t>(m_TransitPaths, hop->info.txID, hop);
MapPut<SyncTransitMap_t::Lock_t>(m_TransitPaths, hop->info.rxID, hop);
}
void
PathContext::ExpirePaths(llarp_time_t now)
{
// decay limits
m_PathLimits.Decay(now);
util::Lock lock(m_OurPaths.first);
auto& map = m_OurPaths.second;
auto itr = map.begin();
while (itr != map.end())
{
SyncTransitMap_t::Lock_t lock(m_TransitPaths.first);
auto& map = m_TransitPaths.second;
auto itr = map.begin();
while (itr != map.end())
if (itr->second->Expired(now))
{
if (itr->second->Expired(now))
{
m_Router->outboundMessageHandler().RemovePath(itr->first);
itr = map.erase(itr);
}
else
{
itr->second->DecayFilters(now);
++itr;
}
itr = map.erase(itr);
}
}
{
util::Lock lock(m_OurPaths.first);
auto& map = m_OurPaths.second;
auto itr = map.begin();
while (itr != map.end())
else
{
if (itr->second->Expired(now))
{
itr = map.erase(itr);
}
else
{
itr->second->DecayFilters(now);
++itr;
}
itr->second->DecayFilters(now);
++itr;
}
}
}
}
routing::MessageHandler_ptr
PathContext::GetHandler(const PathID_t& id)
routing::MessageHandler_ptr
PathContext::GetHandler(const PathID_t& id)
{
routing::MessageHandler_ptr h = nullptr;
auto pathset = GetLocalPathSet(id);
if (pathset)
{
routing::MessageHandler_ptr h = nullptr;
auto pathset = GetLocalPathSet(id);
if (pathset)
{
h = pathset->GetPathByID(id);
}
if (h)
return h;
const RouterID us(OurRouterID());
auto& map = m_TransitPaths;
h = pathset->GetPathByID(id);
}
if (h)
return h;
const RouterID us(OurRouterID());
auto& map = m_TransitPaths;
{
SyncTransitMap_t::Lock_t lock(map.first);
auto range = map.second.equal_range(id);
for (auto i = range.first; i != range.second; ++i)
{
SyncTransitMap_t::Lock_t lock(map.first);
auto range = map.second.equal_range(id);
for (auto i = range.first; i != range.second; ++i)
{
if (i->second->info.upstream == us)
return i->second;
}
if (i->second->info.upstream == us)
return i->second;
}
return nullptr;
}
return nullptr;
}
void
PathContext::RemovePathSet(PathSet_ptr)
{}
} // namespace path
} // namespace llarp
void
PathContext::RemovePathSet(PathSet_ptr)
{}
} // namespace llarp::path

@ -7,7 +7,7 @@
#include "pathset.hpp"
#include "transit_hop.hpp"
#include <llarp/routing/handler.hpp>
#include <llarp/router/i_outbound_message_handler.hpp>
#include <llarp/router/outbound_message_handler.hpp>
#include <llarp/util/compare_ptr.hpp>
#include <llarp/util/decaying_hashset.hpp>
#include <llarp/util/types.hpp>

@ -7,7 +7,7 @@
#include <llarp/util/logging.hpp>
#include <llarp/profiling.hpp>
#include <llarp/router/abstractrouter.hpp>
#include <llarp/router/i_rc_lookup_handler.hpp>
#include <llarp/router/rc_lookup_handler.hpp>
#include <llarp/util/buffer.hpp>
#include <llarp/tooling/path_event.hpp>
#include <llarp/link/link_manager.hpp>

@ -1,7 +1,8 @@
#include "path.hpp"
#include "pathset.hpp"
#include <llarp/router/outbound_message_handler.hpp>
#include <llarp/dht/messages/pubintro.hpp>
#include "path.hpp"
#include <llarp/routing/path_dht_message.hpp>
#include <llarp/router/abstractrouter.hpp>

@ -3,7 +3,7 @@
#include <llarp/dht/context.hpp>
#include <llarp/exit/context.hpp>
#include <llarp/exit/exit_messages.hpp>
#include <llarp/link/i_link_manager.hpp>
#include <llarp/link/link_manager.hpp>
#include <llarp/messages/discard.hpp>
#include <llarp/messages/relay_commit.hpp>
#include <llarp/messages/relay_status.hpp>

@ -5,7 +5,7 @@
#include <memory>
#include <llarp/util/types.hpp>
#include <llarp/util/status.hpp>
#include "i_outbound_message_handler.hpp"
#include "outbound_message_handler.hpp"
#include <vector>
#include <llarp/ev/ev.hpp>
#include <functional>
@ -39,9 +39,9 @@ namespace llarp
struct Profiling;
struct SecretKey;
struct Signature;
struct IOutboundMessageHandler;
struct ILinkManager;
struct I_RCLookupHandler;
struct OutboundMessageHandler;
struct LinkManager;
struct RCLookupHandler;
struct RoutePoker;
namespace dht
@ -176,16 +176,16 @@ namespace llarp
virtual const service::Context&
hiddenServiceContext() const = 0;
virtual IOutboundMessageHandler&
virtual OutboundMessageHandler&
outboundMessageHandler() = 0;
virtual ILinkManager&
virtual LinkManager&
linkManager() = 0;
virtual const std::shared_ptr<RoutePoker>&
routePoker() const = 0;
virtual I_RCLookupHandler&
virtual RCLookupHandler&
rcLookupHandler() = 0;
virtual std::shared_ptr<PeerDb>

@ -1,45 +0,0 @@
#pragma once
#include <llarp/router_contact.hpp>
#include <llarp/util/time.hpp>
#include <optional>
namespace llarp
{
/// The maximum number of peers we will flood a gossiped RC to when propagating an RC
constexpr size_t MaxGossipPeers = 20;
struct I_RCGossiper
{
virtual ~I_RCGossiper() = default;
/// try goissping RC
/// return false if we hit a cooldown for this rc
/// return true if we gossiped this rc to at least 1 peer
virtual bool
GossipRC(const RouterContact& rc) = 0;
using Time_t = Duration_t;
virtual void
Decay(Time_t now) = 0;
/// return true if we should gossip our RC now
virtual bool
ShouldGossipOurRC(Time_t now) const = 0;
/// return true if that rc is owned by us
virtual bool
IsOurRC(const RouterContact& rc) const = 0;
/// forget the replay filter entry given pubkey
virtual void
Forget(const RouterID& router) = 0;
/// returns the time point when we will send our next gossip at
virtual TimePoint_t
NextGossipAt() const = 0;
/// returns the time point when we sent our last gossip at or nullopt if we never did
virtual std::optional<TimePoint_t>
LastGossipAt() const = 0;
};
} // namespace llarp

@ -1,48 +0,0 @@
#pragma once
#include <llarp/util/status.hpp>
#include <cstdint>
#include <functional>
namespace llarp
{
enum class SendStatus
{
Success,
Timeout,
NoLink,
InvalidRouter,
RouterNotFound,
Congestion
};
struct AbstractLinkMessage;
struct RouterID;
struct PathID_t;
using SendStatusHandler = std::function<void(SendStatus)>;
static const size_t MAX_PATH_QUEUE_SIZE = 100;
static const size_t MAX_OUTBOUND_QUEUE_SIZE = 1000;
static const size_t MAX_OUTBOUND_MESSAGES_PER_TICK = 500;
struct IOutboundMessageHandler
{
virtual ~IOutboundMessageHandler() = default;
virtual bool
QueueMessage(
const RouterID& remote, const AbstractLinkMessage& msg, SendStatusHandler callback) = 0;
virtual void
Pump() = 0;
virtual void
RemovePath(const PathID_t& pathid) = 0;
virtual util::StatusObject
ExtractStatus() const = 0;
};
} // namespace llarp

@ -1,72 +0,0 @@
#pragma once
#include <llarp/util/status.hpp>
#include <llarp/util/types.hpp>
#include <llarp/util/formattable.hpp>
#include <fmt/format.h>
#include <functional>
namespace llarp
{
struct AbstractLinkSession;
struct RouterID;
struct RouterContact;
enum class SessionResult
{
Establish,
Timeout,
RouterNotFound,
InvalidRouter,
NoLink,
EstablishFail
};
constexpr std::string_view
ToString(SessionResult sr)
{
return sr == llarp::SessionResult::Establish ? "success"sv
: sr == llarp::SessionResult::Timeout ? "timeout"sv
: sr == llarp::SessionResult::NoLink ? "no link"sv
: sr == llarp::SessionResult::InvalidRouter ? "invalid router"sv
: sr == llarp::SessionResult::RouterNotFound ? "not found"sv
: sr == llarp::SessionResult::EstablishFail ? "establish failed"sv
: "???"sv;
}
template <>
constexpr inline bool IsToStringFormattable<SessionResult> = true;
using RouterCallback = std::function<void(const RouterID&, const SessionResult)>;
struct IOutboundSessionMaker
{
virtual ~IOutboundSessionMaker() = default;
virtual bool
OnSessionEstablished(AbstractLinkSession* session) = 0;
virtual void
OnConnectTimeout(AbstractLinkSession* session) = 0;
virtual void
CreateSessionTo(const RouterID& router, RouterCallback on_result) = 0;
virtual void
CreateSessionTo(const RouterContact& rc, RouterCallback on_result) = 0;
virtual bool
HavePendingSessionTo(const RouterID& router) const = 0;
virtual void
ConnectToRandomRouters(int numDesired) = 0;
virtual util::StatusObject
ExtractStatus() const = 0;
virtual bool
ShouldConnectTo(const RouterID& router) const = 0;
};
} // namespace llarp

@ -1,81 +0,0 @@
#pragma once
#include <llarp/util/types.hpp>
#include <llarp/router_id.hpp>
#include <memory>
#include <set>
#include <vector>
namespace llarp
{
struct RouterContact;
enum class RCRequestResult
{
Success,
InvalidRouter,
RouterNotFound,
BadRC
};
using RCRequestCallback =
std::function<void(const RouterID&, const RouterContact* const, const RCRequestResult)>;
struct I_RCLookupHandler
{
virtual ~I_RCLookupHandler() = default;
virtual void
AddValidRouter(const RouterID& router) = 0;
virtual void
RemoveValidRouter(const RouterID& router) = 0;
virtual void
SetRouterWhitelist(
const std::vector<RouterID>& whitelist,
const std::vector<RouterID>& greylist,
const std::vector<RouterID>& greenlist) = 0;
virtual void
GetRC(const RouterID& router, RCRequestCallback callback, bool forceLookup = false) = 0;
virtual bool
PathIsAllowed(const RouterID& remote) const = 0;
virtual bool
SessionIsAllowed(const RouterID& remote) const = 0;
virtual bool
IsGreylisted(const RouterID& remote) const = 0;
virtual bool
IsGreenlisted(const RouterID& remote) const = 0;
virtual bool
IsRegistered(const RouterID& remote) const = 0;
virtual bool
CheckRC(const RouterContact& rc) const = 0;
virtual bool
GetRandomWhitelistRouter(RouterID& router) const = 0;
virtual bool
CheckRenegotiateValid(RouterContact newrc, RouterContact oldrc) = 0;
virtual void
PeriodicUpdate(llarp_time_t now) = 0;
virtual void
ExploreNetwork() = 0;
virtual size_t
NumberOfStrictConnectRouters() const = 0;
virtual bool
HaveReceivedWhitelist() const = 0;
};
} // namespace llarp

@ -1,7 +1,5 @@
#pragma once
#include "i_outbound_message_handler.hpp"
#include <llarp/ev/ev.hpp>
#include <llarp/util/thread/queue.hpp>
#include <llarp/util/decaying_hashset.hpp>
@ -17,13 +15,32 @@ struct llarp_buffer_t;
namespace llarp
{
enum class SendStatus
{
Success,
Timeout,
NoLink,
InvalidRouter,
RouterNotFound,
Congestion
};
struct AbstractRouter;
enum class SessionResult;
struct AbstractLinkMessage;
struct RouterID;
struct PathID_t;
static const size_t MAX_PATH_QUEUE_SIZE = 100;
static const size_t MAX_OUTBOUND_QUEUE_SIZE = 1000;
static const size_t MAX_OUTBOUND_MESSAGES_PER_TICK = 500;
using SendStatusHandler = std::function<void(SendStatus)>;
struct OutboundMessageHandler final : public IOutboundMessageHandler
struct OutboundMessageHandler final
{
public:
~OutboundMessageHandler() override = default;
~OutboundMessageHandler() = default;
OutboundMessageHandler(size_t maxQueueSize = MAX_OUTBOUND_QUEUE_SIZE);
@ -45,7 +62,7 @@ namespace llarp
*/
bool
QueueMessage(const RouterID& remote, const AbstractLinkMessage& msg, SendStatusHandler callback)
override EXCLUDES(_mutex);
EXCLUDES(_mutex);
/* Called when pumping output queues, typically scheduled via a call to Router::TriggerPump().
*
@ -59,16 +76,16 @@ namespace llarp
* Sends messages from path queues until all are empty or a set cap has been reached.
*/
void
Pump() override;
Pump();
/* Called from outside this class to inform it that a path has died / expired
* and its queue should be discarded.
*/
void
RemovePath(const PathID_t& pathid) override;
RemovePath(const PathID_t& pathid);
util::StatusObject
ExtractStatus() const override;
ExtractStatus() const;
void
Init(AbstractRouter* router);

@ -1,10 +1,10 @@
#pragma once
#include "i_outbound_session_maker.hpp"
#include "rc_lookup_handler.hpp"
#include "i_rc_lookup_handler.hpp"
#include <llarp/util/thread/threading.hpp>
#include <llarp/util/types.hpp>
#include <llarp/util/formattable.hpp>
#include <llarp/profiling.hpp>
#include <unordered_map>
@ -18,7 +18,33 @@ namespace llarp
struct LinkManager;
struct I_RCLookupHandler;
struct OutboundSessionMaker final : public IOutboundSessionMaker
enum class SessionResult
{
Establish,
Timeout,
RouterNotFound,
InvalidRouter,
NoLink,
EstablishFail
};
constexpr std::string_view
ToString(SessionResult sr)
{
return sr == llarp::SessionResult::Establish ? "success"sv
: sr == llarp::SessionResult::Timeout ? "timeout"sv
: sr == llarp::SessionResult::NoLink ? "no link"sv
: sr == llarp::SessionResult::InvalidRouter ? "invalid router"sv
: sr == llarp::SessionResult::RouterNotFound ? "not found"sv
: sr == llarp::SessionResult::EstablishFail ? "establish failed"sv
: "???"sv;
}
template <>
constexpr inline bool IsToStringFormattable<SessionResult> = true;
using RouterCallback = std::function<void(const RouterID&, const SessionResult)>;
struct OutboundSessionMaker
{
using Work_t = std::function<void(void)>;
using WorkerFunc_t = std::function<void(Work_t)>;
@ -26,31 +52,31 @@ namespace llarp
using CallbacksQueue = std::list<RouterCallback>;
public:
~OutboundSessionMaker() override = default;
~OutboundSessionMaker() = default;
bool
OnSessionEstablished(AbstractLinkSession* session) override;
OnSessionEstablished(AbstractLinkSession* session);
void
OnConnectTimeout(AbstractLinkSession* session) override;
OnConnectTimeout(AbstractLinkSession* session);
void
CreateSessionTo(const RouterID& router, RouterCallback on_result) override EXCLUDES(_mutex);
CreateSessionTo(const RouterID& router, RouterCallback on_result) EXCLUDES(_mutex);
void
CreateSessionTo(const RouterContact& rc, RouterCallback on_result) override EXCLUDES(_mutex);
CreateSessionTo(const RouterContact& rc, RouterCallback on_result) EXCLUDES(_mutex);
bool
HavePendingSessionTo(const RouterID& router) const override EXCLUDES(_mutex);
HavePendingSessionTo(const RouterID& router) const EXCLUDES(_mutex);
void
ConnectToRandomRouters(int numDesired) override;
ConnectToRandomRouters(int numDesired);
util::StatusObject
ExtractStatus() const override;
ExtractStatus() const;
bool
ShouldConnectTo(const RouterID& router) const override EXCLUDES(_mutex);
ShouldConnectTo(const RouterID& router) const EXCLUDES(_mutex);
void
Init(

@ -13,11 +13,11 @@ namespace llarp
static constexpr auto GossipOurRCInterval = (RCGossipFilterDecayInterval * 2) - (5min);
RCGossiper::RCGossiper()
: I_RCGossiper(), m_Filter(std::chrono::duration_cast<Time_t>(RCGossipFilterDecayInterval))
: m_Filter(std::chrono::duration_cast<Time_t>(RCGossipFilterDecayInterval))
{}
void
RCGossiper::Init(ILinkManager* l, const RouterID& ourID, AbstractRouter* router)
RCGossiper::Init(LinkManager* l, const RouterID& ourID, AbstractRouter* router)
{
m_OurRouterID = ourID;
m_LinkManager = l;

@ -1,47 +1,51 @@
#pragma once
#include <llarp/util/decaying_hashset.hpp>
#include "i_gossiper.hpp"
#include "i_outbound_message_handler.hpp"
#include <llarp/link/i_link_manager.hpp>
#include "outbound_message_handler.hpp"
#include <llarp/link/link_manager.hpp>
#include "abstractrouter.hpp"
namespace llarp
{
struct RCGossiper : public I_RCGossiper
/// The maximum number of peers we will flood a gossiped RC to when propagating an RC
constexpr size_t MaxGossipPeers = 20;
struct RCGossiper
{
using Time_t = Duration_t;
RCGossiper();
~RCGossiper() override = default;
~RCGossiper() = default;
bool
GossipRC(const RouterContact& rc) override;
GossipRC(const RouterContact& rc);
void
Decay(Time_t now) override;
Decay(Time_t now);
bool
ShouldGossipOurRC(Time_t now) const override;
ShouldGossipOurRC(Time_t now) const;
bool
IsOurRC(const RouterContact& rc) const override;
IsOurRC(const RouterContact& rc) const;
void
Init(ILinkManager*, const RouterID&, AbstractRouter*);
Init(LinkManager*, const RouterID&, AbstractRouter*);
void
Forget(const RouterID& router) override;
Forget(const RouterID& router);
TimePoint_t
NextGossipAt() const override;
NextGossipAt() const;
std::optional<TimePoint_t>
LastGossipAt() const override;
LastGossipAt() const;
private:
RouterID m_OurRouterID;
Time_t m_LastGossipedOurRC = 0s;
ILinkManager* m_LinkManager = nullptr;
LinkManager* m_LinkManager = nullptr;
util::DecayingHashSet<RouterID> m_Filter;
AbstractRouter* m_router;

@ -1,7 +1,7 @@
#include <chrono>
#include "rc_lookup_handler.hpp"
#include <llarp/link/i_link_manager.hpp>
#include <llarp/link/link_manager.hpp>
#include <llarp/link/server.hpp>
#include <llarp/crypto/crypto.hpp>
#include <llarp/service/context.hpp>
@ -361,7 +361,7 @@ namespace llarp
std::shared_ptr<NodeDB> nodedb,
EventLoop_ptr loop,
WorkerFunc_t dowork,
ILinkManager* linkManager,
LinkManager* linkManager,
service::Context* hiddenServiceContext,
const std::unordered_set<RouterID>& strictConnectPubkeys,
const std::set<RouterContact>& bootstrapRCList,

@ -1,10 +1,10 @@
#pragma once
#include <chrono>
#include "i_rc_lookup_handler.hpp"
#include <llarp/router_id.hpp>
#include <llarp/util/thread/threading.hpp>
#include <chrono>
#include <unordered_map>
#include <set>
#include <unordered_set>
@ -28,22 +28,34 @@ namespace llarp
} // namespace service
struct ILinkManager;
struct LinkManager;
struct RouterContact;
enum class RCRequestResult
{
Success,
InvalidRouter,
RouterNotFound,
BadRC
};
using RCRequestCallback =
std::function<void(const RouterID&, const RouterContact* const, const RCRequestResult)>;
struct RCLookupHandler final : public I_RCLookupHandler
struct RCLookupHandler
{
public:
using Work_t = std::function<void(void)>;
using WorkerFunc_t = std::function<void(Work_t)>;
using CallbacksQueue = std::list<RCRequestCallback>;
~RCLookupHandler() override = default;
~RCLookupHandler() = default;
void
AddValidRouter(const RouterID& router) override EXCLUDES(_mutex);
AddValidRouter(const RouterID& router) EXCLUDES(_mutex);
void
RemoveValidRouter(const RouterID& router) override EXCLUDES(_mutex);
RemoveValidRouter(const RouterID& router) EXCLUDES(_mutex);
void
SetRouterWhitelist(
@ -51,51 +63,51 @@ namespace llarp
const std::vector<RouterID>& greylist,
const std::vector<RouterID>& greenlist
) override EXCLUDES(_mutex);
) EXCLUDES(_mutex);
bool
HaveReceivedWhitelist() const override;
HaveReceivedWhitelist() const;
void
GetRC(const RouterID& router, RCRequestCallback callback, bool forceLookup = false) override
GetRC(const RouterID& router, RCRequestCallback callback, bool forceLookup = false)
EXCLUDES(_mutex);
bool
PathIsAllowed(const RouterID& remote) const override EXCLUDES(_mutex);
PathIsAllowed(const RouterID& remote) const EXCLUDES(_mutex);
bool
SessionIsAllowed(const RouterID& remote) const override EXCLUDES(_mutex);
SessionIsAllowed(const RouterID& remote) const EXCLUDES(_mutex);
bool
IsGreylisted(const RouterID& remote) const override EXCLUDES(_mutex);
IsGreylisted(const RouterID& remote) const EXCLUDES(_mutex);
// "greenlist" = new routers (i.e. "green") that aren't fully funded yet
bool
IsGreenlisted(const RouterID& remote) const override EXCLUDES(_mutex);
IsGreenlisted(const RouterID& remote) const EXCLUDES(_mutex);
// registered just means that there is at least an operator stake, but doesn't require the node
// be fully funded, active, or not decommed. (In other words: it is any of the white, grey, or
// green list).
bool
IsRegistered(const RouterID& remote) const override EXCLUDES(_mutex);
IsRegistered(const RouterID& remote) const EXCLUDES(_mutex);
bool
CheckRC(const RouterContact& rc) const override;
CheckRC(const RouterContact& rc) const;
bool
GetRandomWhitelistRouter(RouterID& router) const override EXCLUDES(_mutex);
GetRandomWhitelistRouter(RouterID& router) const EXCLUDES(_mutex);
bool
CheckRenegotiateValid(RouterContact newrc, RouterContact oldrc) override;
CheckRenegotiateValid(RouterContact newrc, RouterContact oldrc);
void
PeriodicUpdate(llarp_time_t now) override;
PeriodicUpdate(llarp_time_t now);
void
ExploreNetwork() override;
ExploreNetwork();
size_t
NumberOfStrictConnectRouters() const override;
NumberOfStrictConnectRouters() const;
void
Init(
@ -103,7 +115,7 @@ namespace llarp
std::shared_ptr<NodeDB> nodedb,
std::shared_ptr<EventLoop> loop,
WorkerFunc_t dowork,
ILinkManager* linkManager,
LinkManager* linkManager,
service::Context* hiddenServiceContext,
const std::unordered_set<RouterID>& strictConnectPubkeys,
const std::set<RouterContact>& bootstrapRCList,
@ -138,7 +150,7 @@ namespace llarp
std::shared_ptr<EventLoop> _loop;
WorkerFunc_t _work = nullptr;
service::Context* _hiddenServiceContext = nullptr;
ILinkManager* _linkManager = nullptr;
LinkManager* _linkManager = nullptr;
/// explicit whitelist of routers we will connect to directly (not for
/// service nodes)

@ -323,19 +323,19 @@ namespace llarp
TimePoint_t m_NextExploreAt;
IOutboundMessageHandler&
OutboundMessageHandler&
outboundMessageHandler() override
{
return _outboundMessageHandler;
}
ILinkManager&
LinkManager&
linkManager() override
{
return _linkManager;
}
I_RCLookupHandler&
RCLookupHandler&
rcLookupHandler() override
{
return _rcLookupHandler;

Loading…
Cancel
Save