lokinet/llarp/router/abstractrouter.hpp

331 lines
7.3 KiB
C++
Raw Normal View History

#ifndef LLARP_ABSTRACT_ROUTER_HPP
#define LLARP_ABSTRACT_ROUTER_HPP
2020-08-27 12:43:53 +00:00
#include <config/config.hpp>
#include <config/key_manager.hpp>
#include <memory>
#include <util/types.hpp>
#include <util/status.hpp>
#include <router/i_outbound_message_handler.hpp>
#include <vector>
2019-04-08 12:01:52 +00:00
#include <ev/ev.h>
2019-05-03 13:15:03 +00:00
#include <functional>
#include <router_contact.hpp>
2020-02-27 20:32:50 +00:00
#include <tooling/router_event.hpp>
2020-05-27 01:57:27 +00:00
#include <peerstats/peer_db.hpp>
#ifdef LOKINET_HIVE
#include "tooling/router_event.hpp"
#endif
struct llarp_buffer_t;
struct llarp_dht_context;
namespace oxenmq
2020-05-19 18:53:03 +00:00
{
class OxenMQ;
2020-05-19 18:53:03 +00:00
}
namespace llarp
{
class NodeDB;
class Logic;
2019-02-22 16:21:05 +00:00
struct Config;
struct RouterID;
struct ILinkMessage;
struct ILinkSession;
struct PathID_t;
struct Profiling;
struct SecretKey;
struct Signature;
struct IOutboundMessageHandler;
struct IOutboundSessionMaker;
struct ILinkManager;
struct I_RCLookupHandler;
struct RoutePoker;
namespace exit
{
struct Context;
}
2020-05-20 11:41:42 +00:00
namespace rpc
{
struct LokidRpcClient;
}
namespace path
{
struct PathContext;
}
namespace routing
{
struct IMessageHandler;
}
2019-02-22 17:18:54 +00:00
namespace service
{
2019-02-22 16:21:05 +00:00
struct Context;
}
namespace thread
{
class ThreadPool;
}
namespace vpn
{
class Platform;
}
using LMQ_ptr = std::shared_ptr<oxenmq::OxenMQ>;
2020-05-19 18:53:03 +00:00
2019-04-19 15:10:26 +00:00
struct AbstractRouter
{
#ifdef LOKINET_HIVE
tooling::RouterHive* hive = nullptr;
#endif
virtual ~AbstractRouter() = default;
virtual bool
HandleRecvLinkMessageBuffer(ILinkSession* from, const llarp_buffer_t& msg) = 0;
2020-05-19 18:53:03 +00:00
virtual LMQ_ptr
lmq() const = 0;
virtual vpn::Platform*
GetVPNPlatform() const = 0;
2020-05-20 11:41:42 +00:00
virtual std::shared_ptr<rpc::LokidRpcClient>
RpcClient() const = 0;
virtual std::shared_ptr<Logic>
logic() const = 0;
virtual llarp_dht_context*
dht() const = 0;
virtual std::shared_ptr<NodeDB>
nodedb() const = 0;
virtual const path::PathContext&
pathContext() const = 0;
virtual path::PathContext&
pathContext() = 0;
virtual const RouterContact&
rc() const = 0;
virtual exit::Context&
exitContext() = 0;
virtual std::shared_ptr<KeyManager>
keyManager() const = 0;
virtual const SecretKey&
identity() const = 0;
virtual const SecretKey&
encryption() const = 0;
virtual Profiling&
routerProfiling() = 0;
2019-04-08 12:01:52 +00:00
virtual llarp_ev_loop_ptr
netloop() const = 0;
/// call function in crypto worker
2020-06-11 11:48:40 +00:00
virtual void QueueWork(std::function<void(void)>) = 0;
/// call function in disk io thread
2020-06-11 11:48:40 +00:00
virtual void QueueDiskIO(std::function<void(void)>) = 0;
2020-08-27 12:43:53 +00:00
virtual std::shared_ptr<Config>
GetConfig() const
{
return nullptr;
}
virtual service::Context&
2019-02-22 16:21:05 +00:00
hiddenServiceContext() = 0;
virtual const service::Context&
2019-02-22 16:21:05 +00:00
hiddenServiceContext() const = 0;
virtual IOutboundMessageHandler&
outboundMessageHandler() = 0;
virtual IOutboundSessionMaker&
outboundSessionMaker() = 0;
virtual ILinkManager&
linkManager() = 0;
virtual RoutePoker&
routePoker() = 0;
virtual I_RCLookupHandler&
rcLookupHandler() = 0;
2020-05-27 01:57:27 +00:00
virtual std::shared_ptr<PeerDb>
peerDb() = 0;
virtual bool
Sign(Signature& sig, const llarp_buffer_t& buf) const = 0;
2019-02-22 16:21:05 +00:00
virtual bool
Configure(std::shared_ptr<Config> conf, bool isRouter, std::shared_ptr<NodeDB> nodedb) = 0;
2019-02-22 16:21:05 +00:00
2020-01-06 23:13:23 +00:00
virtual bool
IsServiceNode() const = 0;
2019-02-22 16:21:05 +00:00
virtual bool
2020-05-20 11:41:42 +00:00
StartRpcServer() = 0;
virtual bool
Run() = 0;
2019-02-22 16:21:05 +00:00
virtual bool
IsRunning() const = 0;
virtual bool
LooksAlive() const = 0;
2019-02-22 16:21:05 +00:00
/// stop running the router logic gracefully
virtual void
Stop() = 0;
/// thaw from long sleep or network changed event
virtual void
Thaw() = 0;
/// non gracefully stop the router
virtual void
Die() = 0;
2019-04-30 16:07:17 +00:00
/// pump low level links
virtual void
PumpLL() = 0;
virtual bool
IsBootstrapNode(RouterID r) const = 0;
2019-04-08 12:01:52 +00:00
virtual const byte_t*
pubkey() const = 0;
/// connect to N random routers
virtual void
ConnectToRandomRouters(int N) = 0;
2019-02-22 16:21:05 +00:00
2019-05-03 13:15:03 +00:00
virtual bool
TryConnectAsync(RouterContact rc, uint16_t tries) = 0;
/// called by link when a remote session has no more sessions open
virtual void
SessionClosed(RouterID remote) = 0;
/// returns system clock milliseconds since epoch
virtual llarp_time_t
Now() const = 0;
/// returns milliseconds since started
virtual llarp_time_t
Uptime() const = 0;
virtual bool
GetRandomGoodRouter(RouterID& r) = 0;
virtual bool
SendToOrQueue(
const RouterID& remote, const ILinkMessage* msg, SendStatusHandler handler = nullptr) = 0;
virtual void
PersistSessionUntil(const RouterID& remote, llarp_time_t until) = 0;
virtual bool
ParseRoutingMessageBuffer(
const llarp_buffer_t& buf, routing::IMessageHandler* h, const PathID_t& rxid) = 0;
2019-05-09 15:36:39 +00:00
/// count the number of service nodes we are connected to
virtual size_t
NumberOfConnectedRouters() const = 0;
2019-05-09 15:36:39 +00:00
/// count the number of clients that are connected to us
virtual size_t
NumberOfConnectedClients() const = 0;
virtual bool
GetRandomConnectedRouter(RouterContact& result) const = 0;
virtual void
HandleDHTLookupForExplore(RouterID remote, const std::vector<RouterContact>& results) = 0;
2020-08-21 19:09:13 +00:00
virtual void SetDownHook(std::function<void(void)>){};
2019-03-31 15:09:59 +00:00
/// lookup router by pubkey
/// if we are a service node this is done direct otherwise it's done via
/// path
virtual void
2019-05-03 13:15:03 +00:00
LookupRouter(RouterID remote, RouterLookupHandler resultHandler) = 0;
2019-03-31 15:09:59 +00:00
/// check if newRc matches oldRC and update local rc for this remote contact
/// if valid
/// returns true on valid and updated
/// returns false otherwise
virtual bool
CheckRenegotiateValid(RouterContact newRc, RouterContact oldRC) = 0;
/// set router's service node whitelist
2019-02-18 19:44:41 +00:00
virtual void
2020-05-19 18:53:03 +00:00
SetRouterWhitelist(const std::vector<RouterID> routers) = 0;
2019-02-18 19:44:41 +00:00
/// visit each connected link session
virtual void
ForEachPeer(std::function<void(const ILinkSession*, bool)> visit, bool randomize) const = 0;
virtual bool
ConnectionToRouterAllowed(const RouterID& router) const = 0;
2019-04-19 15:10:26 +00:00
/// return true if we have at least 1 session to this router in either
/// direction
virtual bool
HasSessionTo(const RouterID& router) const = 0;
virtual uint32_t
NextPathBuildNumber() = 0;
virtual std::string
ShortName() const = 0;
2019-04-19 15:10:26 +00:00
virtual util::StatusObject
ExtractStatus() const = 0;
2020-01-30 17:23:16 +00:00
/// gossip an rc if required
virtual void
GossipRCIfNeeded(const RouterContact rc) = 0;
/// Templated convenience function to generate a RouterHive event and
/// delegate to non-templated (and overridable) function for handling.
template <class EventType, class... Params>
void
NotifyRouterEvent([[maybe_unused]] Params&&... args) const
{
// TODO: no-op when appropriate
auto event = std::make_unique<EventType>(args...);
HandleRouterEvent(std::move(event));
}
protected:
/// Virtual function to handle RouterEvent. HiveRouter overrides this in
/// order to inject the event. The default implementation in Router simply
/// logs it.
virtual void
HandleRouterEvent(tooling::RouterEventPtr event) const = 0;
};
} // namespace llarp
#endif