2021-03-09 22:24:35 +00:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "abstractrouter.hpp"
|
|
|
|
|
|
|
|
#include <llarp/bootstrap.hpp>
|
|
|
|
#include <llarp/config/config.hpp>
|
|
|
|
#include <llarp/config/key_manager.hpp>
|
|
|
|
#include <llarp/constants/link_layer.hpp>
|
|
|
|
#include <llarp/crypto/types.hpp>
|
|
|
|
#include <llarp/ev/ev.hpp>
|
|
|
|
#include <llarp/exit/context.hpp>
|
|
|
|
#include <llarp/handlers/tun.hpp>
|
|
|
|
#include <llarp/link/link_manager.hpp>
|
|
|
|
#include <llarp/link/server.hpp>
|
|
|
|
#include <llarp/messages/link_message_parser.hpp>
|
|
|
|
#include <llarp/nodedb.hpp>
|
|
|
|
#include <llarp/path/path_context.hpp>
|
|
|
|
#include <llarp/peerstats/peer_db.hpp>
|
|
|
|
#include <llarp/profiling.hpp>
|
|
|
|
#include <llarp/router_contact.hpp>
|
|
|
|
#include "outbound_message_handler.hpp"
|
|
|
|
#include "outbound_session_maker.hpp"
|
|
|
|
#include "rc_gossiper.hpp"
|
|
|
|
#include "rc_lookup_handler.hpp"
|
|
|
|
#include "route_poker.hpp"
|
|
|
|
#include <llarp/routing/handler.hpp>
|
|
|
|
#include <llarp/routing/message_parser.hpp>
|
|
|
|
#include <llarp/rpc/lokid_rpc_client.hpp>
|
|
|
|
#include <llarp/rpc/rpc_server.hpp>
|
|
|
|
#include <llarp/service/context.hpp>
|
2020-04-27 15:24:05 +00:00
|
|
|
#include <stdexcept>
|
2021-03-09 22:24:35 +00:00
|
|
|
#include <llarp/util/buffer.hpp>
|
|
|
|
#include <llarp/util/fs.hpp>
|
|
|
|
#include <llarp/util/mem.hpp>
|
|
|
|
#include <llarp/util/status.hpp>
|
|
|
|
#include <llarp/util/str.hpp>
|
|
|
|
#include <llarp/util/time.hpp>
|
2022-10-27 17:51:45 +00:00
|
|
|
#include <llarp/util/service_manager.hpp>
|
2018-06-01 14:08:54 +00:00
|
|
|
|
2018-02-01 17:06:49 +00:00
|
|
|
#include <functional>
|
2018-05-22 15:54:19 +00:00
|
|
|
#include <list>
|
2018-05-20 17:45:47 +00:00
|
|
|
#include <map>
|
2019-01-26 15:40:58 +00:00
|
|
|
#include <memory>
|
2019-01-05 13:45:05 +00:00
|
|
|
#include <set>
|
2019-01-26 15:40:58 +00:00
|
|
|
#include <unordered_map>
|
|
|
|
#include <vector>
|
2018-02-01 17:06:49 +00:00
|
|
|
|
2021-02-02 14:35:40 +00:00
|
|
|
#include <oxenmq/address.h>
|
2020-06-11 18:26:02 +00:00
|
|
|
|
2018-12-10 16:26:46 +00:00
|
|
|
namespace llarp
|
2018-05-22 15:54:19 +00:00
|
|
|
{
|
2020-06-29 15:44:13 +00:00
|
|
|
struct Router : public AbstractRouter
|
2018-09-09 11:23:21 +00:00
|
|
|
{
|
2020-02-24 19:40:45 +00:00
|
|
|
llarp_time_t _lastPump = 0s;
|
2018-12-10 16:26:46 +00:00
|
|
|
bool ready;
|
|
|
|
// transient iwp encryption key
|
2020-04-02 15:48:20 +00:00
|
|
|
fs::path transport_keyfile;
|
2018-06-28 11:29:10 +00:00
|
|
|
|
2018-12-10 16:26:46 +00:00
|
|
|
// long term identity key
|
2020-04-02 15:48:20 +00:00
|
|
|
fs::path ident_keyfile;
|
2018-05-30 20:56:47 +00:00
|
|
|
|
2020-04-02 15:48:20 +00:00
|
|
|
fs::path encryption_keyfile;
|
2018-02-01 17:06:49 +00:00
|
|
|
|
2018-12-10 16:26:46 +00:00
|
|
|
// path to write our self signed rc to
|
2020-04-02 15:48:20 +00:00
|
|
|
fs::path our_rc_file;
|
2018-06-01 14:08:54 +00:00
|
|
|
|
2019-04-16 13:20:48 +00:00
|
|
|
// use file based logging?
|
|
|
|
bool m_UseFileLogging = false;
|
|
|
|
|
2018-12-10 16:26:46 +00:00
|
|
|
// our router contact
|
2019-02-11 19:45:42 +00:00
|
|
|
RouterContact _rc;
|
2018-09-13 12:04:36 +00:00
|
|
|
|
2018-12-10 16:26:46 +00:00
|
|
|
/// should we obey the service node whitelist?
|
|
|
|
bool whitelistRouters = false;
|
2018-09-15 11:37:46 +00:00
|
|
|
|
2020-05-19 18:53:03 +00:00
|
|
|
LMQ_ptr m_lmq;
|
|
|
|
|
2021-05-05 12:21:39 +00:00
|
|
|
path::BuildLimiter m_PathBuildLimiter;
|
|
|
|
|
2021-11-09 16:20:53 +00:00
|
|
|
std::shared_ptr<EventLoopWakeup> m_Pump;
|
|
|
|
|
2021-05-05 12:21:39 +00:00
|
|
|
path::BuildLimiter&
|
|
|
|
pathBuildLimiter() override
|
|
|
|
{
|
|
|
|
return m_PathBuildLimiter;
|
|
|
|
}
|
|
|
|
|
2022-07-09 15:05:52 +00:00
|
|
|
const llarp::net::Platform&
|
|
|
|
Net() const override;
|
|
|
|
|
2021-03-02 02:06:20 +00:00
|
|
|
const LMQ_ptr&
|
2020-05-19 18:53:03 +00:00
|
|
|
lmq() const override
|
|
|
|
{
|
|
|
|
return m_lmq;
|
|
|
|
}
|
|
|
|
|
2021-03-02 02:06:20 +00:00
|
|
|
const std::shared_ptr<rpc::LokidRpcClient>&
|
2020-05-20 11:41:42 +00:00
|
|
|
RpcClient() const override
|
|
|
|
{
|
|
|
|
return m_lokidRpcClient;
|
|
|
|
}
|
|
|
|
|
2020-04-07 18:38:56 +00:00
|
|
|
llarp_dht_context*
|
2019-01-29 02:16:31 +00:00
|
|
|
dht() const override
|
|
|
|
{
|
|
|
|
return _dht;
|
|
|
|
}
|
|
|
|
|
2022-05-20 17:10:04 +00:00
|
|
|
std::optional<std::variant<nuint32_t, nuint128_t>>
|
|
|
|
OurPublicIP() const override;
|
|
|
|
|
2019-02-11 17:14:43 +00:00
|
|
|
util::StatusObject
|
|
|
|
ExtractStatus() const override;
|
2019-02-08 19:43:25 +00:00
|
|
|
|
2021-10-13 11:20:36 +00:00
|
|
|
util::StatusObject
|
|
|
|
ExtractSummaryStatus() const override;
|
|
|
|
|
2021-03-02 02:06:20 +00:00
|
|
|
const std::shared_ptr<NodeDB>&
|
2019-01-29 02:16:31 +00:00
|
|
|
nodedb() const override
|
|
|
|
{
|
|
|
|
return _nodedb;
|
|
|
|
}
|
|
|
|
|
2020-04-07 18:38:56 +00:00
|
|
|
const path::PathContext&
|
2019-01-29 02:16:31 +00:00
|
|
|
pathContext() const override
|
|
|
|
{
|
|
|
|
return paths;
|
|
|
|
}
|
|
|
|
|
2020-04-07 18:38:56 +00:00
|
|
|
path::PathContext&
|
2019-01-29 02:16:31 +00:00
|
|
|
pathContext() override
|
|
|
|
{
|
|
|
|
return paths;
|
|
|
|
}
|
|
|
|
|
2020-04-07 18:38:56 +00:00
|
|
|
const RouterContact&
|
2019-01-29 02:16:31 +00:00
|
|
|
rc() const override
|
2018-12-10 16:26:46 +00:00
|
|
|
{
|
|
|
|
return _rc;
|
|
|
|
}
|
2018-06-03 13:04:51 +00:00
|
|
|
|
2021-04-06 12:25:46 +00:00
|
|
|
void
|
|
|
|
ModifyOurRC(std::function<std::optional<RouterContact>(RouterContact)> modify) override;
|
|
|
|
|
2019-02-15 22:19:19 +00:00
|
|
|
void
|
2021-06-07 14:57:33 +00:00
|
|
|
SetRouterWhitelist(
|
2022-10-14 23:55:21 +00:00
|
|
|
const std::vector<RouterID>& whitelist,
|
|
|
|
const std::vector<RouterID>& greylist,
|
|
|
|
const std::vector<RouterID>& unfunded) override;
|
2019-02-15 22:19:19 +00:00
|
|
|
|
2021-06-06 12:32:23 +00:00
|
|
|
std::unordered_set<RouterID>
|
|
|
|
GetRouterWhitelist() const override
|
|
|
|
{
|
|
|
|
return _rcLookupHandler.Whitelist();
|
|
|
|
}
|
|
|
|
|
2020-04-07 18:38:56 +00:00
|
|
|
exit::Context&
|
2019-02-11 19:45:42 +00:00
|
|
|
exitContext() override
|
|
|
|
{
|
|
|
|
return _exitContext;
|
|
|
|
}
|
|
|
|
|
2021-03-02 02:06:20 +00:00
|
|
|
const std::shared_ptr<KeyManager>&
|
2019-12-10 14:14:16 +00:00
|
|
|
keyManager() const override
|
2019-12-06 18:21:14 +00:00
|
|
|
{
|
|
|
|
return m_keyManager;
|
|
|
|
}
|
|
|
|
|
2020-04-07 18:38:56 +00:00
|
|
|
const SecretKey&
|
2019-02-11 19:45:42 +00:00
|
|
|
identity() const override
|
|
|
|
{
|
|
|
|
return _identity;
|
|
|
|
}
|
|
|
|
|
2020-04-07 18:38:56 +00:00
|
|
|
const SecretKey&
|
2019-02-11 19:45:42 +00:00
|
|
|
encryption() const override
|
|
|
|
{
|
|
|
|
return _encryption;
|
|
|
|
}
|
|
|
|
|
2020-04-07 18:38:56 +00:00
|
|
|
Profiling&
|
2019-02-11 19:45:42 +00:00
|
|
|
routerProfiling() override
|
|
|
|
{
|
|
|
|
return _routerProfiling;
|
|
|
|
}
|
|
|
|
|
2021-03-02 02:06:20 +00:00
|
|
|
const EventLoop_ptr&
|
2021-03-02 07:02:59 +00:00
|
|
|
loop() const override
|
2019-02-11 19:45:42 +00:00
|
|
|
{
|
2021-03-02 07:02:59 +00:00
|
|
|
return _loop;
|
2019-02-11 19:45:42 +00:00
|
|
|
}
|
|
|
|
|
2021-01-11 23:13:22 +00:00
|
|
|
vpn::Platform*
|
|
|
|
GetVPNPlatform() const override
|
|
|
|
{
|
|
|
|
return _vpnPlatform.get();
|
|
|
|
}
|
|
|
|
|
2020-06-11 11:44:02 +00:00
|
|
|
void
|
2020-10-06 13:44:51 +00:00
|
|
|
QueueWork(std::function<void(void)> func) override;
|
2019-02-11 19:45:42 +00:00
|
|
|
|
2020-06-11 11:44:02 +00:00
|
|
|
void
|
2020-10-06 13:44:51 +00:00
|
|
|
QueueDiskIO(std::function<void(void)> func) override;
|
2019-02-11 19:45:42 +00:00
|
|
|
|
2021-06-07 20:35:06 +00:00
|
|
|
/// return true if we look like we are a decommissioned service node
|
2021-05-11 13:10:16 +00:00
|
|
|
bool
|
2021-06-07 20:35:06 +00:00
|
|
|
LooksDecommissioned() const;
|
2021-05-11 13:10:16 +00:00
|
|
|
|
2022-10-14 23:55:21 +00:00
|
|
|
/// return true if we look like we are a registered, fully-staked service node (either active or
|
|
|
|
/// decommissioned). This condition determines when we are allowed to (and attempt to) connect
|
|
|
|
/// to other peers when running as a service node.
|
2022-05-03 17:37:57 +00:00
|
|
|
bool
|
2022-10-14 23:55:21 +00:00
|
|
|
LooksFunded() const;
|
|
|
|
|
|
|
|
/// return true if we a registered service node; not that this only requires a partial stake,
|
|
|
|
/// and does not imply that this service node is *active* or fully funded.
|
|
|
|
bool
|
|
|
|
LooksRegistered() const;
|
2022-05-03 17:37:57 +00:00
|
|
|
|
|
|
|
/// return true if we look like we are allowed and able to test other routers
|
|
|
|
bool
|
|
|
|
ShouldTestOtherRouters() const;
|
|
|
|
|
2021-02-22 15:01:05 +00:00
|
|
|
std::optional<SockAddr> _ourAddress;
|
2018-06-03 13:04:51 +00:00
|
|
|
|
2021-03-02 07:02:59 +00:00
|
|
|
EventLoop_ptr _loop;
|
2021-02-02 14:35:40 +00:00
|
|
|
std::shared_ptr<vpn::Platform> _vpnPlatform;
|
2019-01-29 02:16:31 +00:00
|
|
|
path::PathContext paths;
|
2019-02-11 19:45:42 +00:00
|
|
|
exit::Context _exitContext;
|
|
|
|
SecretKey _identity;
|
|
|
|
SecretKey _encryption;
|
2020-04-07 18:38:56 +00:00
|
|
|
llarp_dht_context* _dht = nullptr;
|
2021-02-02 14:35:40 +00:00
|
|
|
std::shared_ptr<NodeDB> _nodedb;
|
2019-04-22 12:25:25 +00:00
|
|
|
llarp_time_t _startedAt;
|
2021-02-03 18:12:21 +00:00
|
|
|
const oxenmq::TaggedThreadID m_DiskThread;
|
2019-04-22 12:25:25 +00:00
|
|
|
|
|
|
|
llarp_time_t
|
|
|
|
Uptime() const override;
|
2018-05-25 17:52:10 +00:00
|
|
|
|
2018-12-17 20:46:08 +00:00
|
|
|
bool
|
2020-04-07 18:38:56 +00:00
|
|
|
Sign(Signature& sig, const llarp_buffer_t& buf) const override;
|
2018-12-17 20:46:08 +00:00
|
|
|
|
2019-03-31 15:09:59 +00:00
|
|
|
/// how often do we resign our RC? milliseconds.
|
|
|
|
// TODO: make configurable
|
2020-02-24 19:40:45 +00:00
|
|
|
llarp_time_t rcRegenInterval = 1h;
|
2018-11-28 14:58:38 +00:00
|
|
|
|
2018-12-10 16:26:46 +00:00
|
|
|
// should we be sending padded messages every interval?
|
|
|
|
bool sendPadding = false;
|
2018-11-28 14:58:38 +00:00
|
|
|
|
2019-06-19 20:48:25 +00:00
|
|
|
LinkMessageParser inbound_link_msg_parser;
|
2019-02-11 19:45:42 +00:00
|
|
|
routing::InboundMessageParser inbound_routing_msg_parser;
|
2018-10-03 11:01:42 +00:00
|
|
|
|
2019-02-22 16:21:05 +00:00
|
|
|
service::Context _hiddenServiceContext;
|
|
|
|
|
2020-04-07 18:38:56 +00:00
|
|
|
service::Context&
|
2019-02-22 16:21:05 +00:00
|
|
|
hiddenServiceContext() override
|
|
|
|
{
|
|
|
|
return _hiddenServiceContext;
|
|
|
|
}
|
|
|
|
|
2020-04-07 18:38:56 +00:00
|
|
|
const service::Context&
|
2019-02-22 16:21:05 +00:00
|
|
|
hiddenServiceContext() const override
|
|
|
|
{
|
|
|
|
return _hiddenServiceContext;
|
|
|
|
}
|
2018-10-09 12:06:30 +00:00
|
|
|
|
2020-02-24 19:40:45 +00:00
|
|
|
llarp_time_t _lastTick = 0s;
|
2019-12-07 19:58:19 +00:00
|
|
|
|
2020-08-21 19:09:13 +00:00
|
|
|
std::function<void(void)> _onDown;
|
|
|
|
|
|
|
|
void
|
|
|
|
SetDownHook(std::function<void(void)> hook) override
|
|
|
|
{
|
|
|
|
_onDown = hook;
|
|
|
|
}
|
|
|
|
|
2019-12-07 19:58:19 +00:00
|
|
|
bool
|
|
|
|
LooksAlive() const override
|
|
|
|
{
|
|
|
|
const llarp_time_t now = Now();
|
|
|
|
return now <= _lastTick || (now - _lastTick) <= llarp_time_t{30000};
|
|
|
|
}
|
|
|
|
|
2018-12-10 16:26:46 +00:00
|
|
|
/// bootstrap RCs
|
2019-12-06 17:32:46 +00:00
|
|
|
BootstrapList bootstrapRCList;
|
2018-05-26 18:31:45 +00:00
|
|
|
|
2022-07-28 16:07:38 +00:00
|
|
|
const std::shared_ptr<RoutePoker>&
|
|
|
|
routePoker() const override
|
2020-09-24 00:28:38 +00:00
|
|
|
{
|
|
|
|
return m_RoutePoker;
|
|
|
|
}
|
2020-09-01 21:22:22 +00:00
|
|
|
|
2022-07-28 16:07:38 +00:00
|
|
|
std::shared_ptr<RoutePoker> m_RoutePoker;
|
2020-09-01 21:22:22 +00:00
|
|
|
|
2019-04-30 16:07:17 +00:00
|
|
|
void
|
2021-11-12 13:51:39 +00:00
|
|
|
TriggerPump() override;
|
2019-04-30 16:07:17 +00:00
|
|
|
|
2021-11-09 17:44:35 +00:00
|
|
|
void
|
2021-11-12 13:51:39 +00:00
|
|
|
PumpLL();
|
2021-11-09 17:44:35 +00:00
|
|
|
|
2021-02-03 18:12:21 +00:00
|
|
|
const oxenmq::address DefaultRPCBindAddr = oxenmq::address::tcp("127.0.0.1", 1190);
|
2020-04-07 18:38:56 +00:00
|
|
|
bool enableRPCServer = false;
|
2021-02-03 18:12:21 +00:00
|
|
|
oxenmq::address rpcBindAddr = DefaultRPCBindAddr;
|
2020-05-21 14:09:45 +00:00
|
|
|
std::unique_ptr<rpc::RpcServer> m_RPCServer;
|
|
|
|
|
2020-02-25 17:05:13 +00:00
|
|
|
const llarp_time_t _randomStartDelay;
|
2018-06-14 17:35:12 +00:00
|
|
|
|
2020-05-20 11:41:42 +00:00
|
|
|
std::shared_ptr<rpc::LokidRpcClient> m_lokidRpcClient;
|
2020-05-19 18:53:03 +00:00
|
|
|
|
2021-02-03 18:12:21 +00:00
|
|
|
oxenmq::address lokidRPCAddr;
|
2019-02-11 19:45:42 +00:00
|
|
|
Profiling _routerProfiling;
|
2020-11-03 15:54:55 +00:00
|
|
|
fs::path _profilesFile;
|
2019-06-26 21:39:29 +00:00
|
|
|
OutboundMessageHandler _outboundMessageHandler;
|
|
|
|
OutboundSessionMaker _outboundSessionMaker;
|
|
|
|
LinkManager _linkManager;
|
|
|
|
RCLookupHandler _rcLookupHandler;
|
2020-01-30 17:23:16 +00:00
|
|
|
RCGossiper _rcGossiper;
|
2018-02-01 17:06:49 +00:00
|
|
|
|
2022-10-27 17:51:45 +00:00
|
|
|
std::string
|
|
|
|
status_line() override;
|
|
|
|
|
2020-04-07 18:38:56 +00:00
|
|
|
using Clock_t = std::chrono::steady_clock;
|
2020-01-18 20:46:22 +00:00
|
|
|
using TimePoint_t = Clock_t::time_point;
|
|
|
|
|
|
|
|
TimePoint_t m_NextExploreAt;
|
|
|
|
|
2020-04-07 18:38:56 +00:00
|
|
|
IOutboundMessageHandler&
|
2019-06-26 21:39:29 +00:00
|
|
|
outboundMessageHandler() override
|
|
|
|
{
|
|
|
|
return _outboundMessageHandler;
|
|
|
|
}
|
2018-06-07 16:22:49 +00:00
|
|
|
|
2020-04-07 18:38:56 +00:00
|
|
|
IOutboundSessionMaker&
|
2019-06-26 21:39:29 +00:00
|
|
|
outboundSessionMaker() override
|
|
|
|
{
|
|
|
|
return _outboundSessionMaker;
|
|
|
|
}
|
2018-05-22 15:54:19 +00:00
|
|
|
|
2020-04-07 18:38:56 +00:00
|
|
|
ILinkManager&
|
2019-06-26 21:39:29 +00:00
|
|
|
linkManager() override
|
|
|
|
{
|
|
|
|
return _linkManager;
|
|
|
|
}
|
2018-06-10 14:05:48 +00:00
|
|
|
|
2020-04-07 18:38:56 +00:00
|
|
|
I_RCLookupHandler&
|
2019-06-26 21:39:29 +00:00
|
|
|
rcLookupHandler() override
|
|
|
|
{
|
|
|
|
return _rcLookupHandler;
|
|
|
|
}
|
2018-11-21 14:10:02 +00:00
|
|
|
|
2020-05-27 01:57:27 +00:00
|
|
|
std::shared_ptr<PeerDb>
|
|
|
|
peerDb() override
|
|
|
|
{
|
|
|
|
return m_peerDb;
|
|
|
|
}
|
|
|
|
|
2022-06-22 16:14:33 +00:00
|
|
|
inline int
|
|
|
|
OutboundUDPSocket() const override
|
|
|
|
{
|
|
|
|
return m_OutboundUDPSocket;
|
|
|
|
}
|
|
|
|
|
2020-01-30 17:23:16 +00:00
|
|
|
void
|
|
|
|
GossipRCIfNeeded(const RouterContact rc) override;
|
|
|
|
|
2021-03-02 15:23:38 +00:00
|
|
|
explicit Router(EventLoop_ptr loop, std::shared_ptr<vpn::Platform> vpnPlatform);
|
2018-05-22 15:54:19 +00:00
|
|
|
|
2021-03-02 02:06:20 +00:00
|
|
|
~Router() override;
|
2018-07-09 17:32:11 +00:00
|
|
|
|
2018-12-10 16:26:46 +00:00
|
|
|
bool
|
2020-04-07 18:38:56 +00:00
|
|
|
HandleRecvLinkMessageBuffer(ILinkSession* from, const llarp_buffer_t& msg) override;
|
2018-05-22 15:54:19 +00:00
|
|
|
|
2022-07-09 15:05:52 +00:00
|
|
|
void
|
|
|
|
InitInboundLinks();
|
|
|
|
|
|
|
|
void
|
2019-01-05 13:45:05 +00:00
|
|
|
InitOutboundLinks();
|
2018-08-14 21:17:18 +00:00
|
|
|
|
2018-12-13 00:03:19 +00:00
|
|
|
bool
|
2020-04-07 18:38:56 +00:00
|
|
|
GetRandomGoodRouter(RouterID& r) override;
|
2018-12-13 00:03:19 +00:00
|
|
|
|
2018-12-10 16:26:46 +00:00
|
|
|
/// initialize us as a service node
|
|
|
|
/// return true on success
|
|
|
|
bool
|
|
|
|
InitServiceNode();
|
2018-05-22 15:54:19 +00:00
|
|
|
|
2019-10-09 13:08:38 +00:00
|
|
|
bool
|
|
|
|
IsRunning() const override;
|
|
|
|
|
2018-12-10 16:26:46 +00:00
|
|
|
/// return true if we are running in service node mode
|
|
|
|
bool
|
2020-01-06 23:13:23 +00:00
|
|
|
IsServiceNode() const override;
|
2018-06-10 14:05:48 +00:00
|
|
|
|
2022-10-14 23:55:21 +00:00
|
|
|
std::optional<std::string>
|
|
|
|
OxendErrorState() const override;
|
2022-09-28 14:15:45 +00:00
|
|
|
|
2018-12-10 16:26:46 +00:00
|
|
|
void
|
|
|
|
Close();
|
2018-11-28 14:58:38 +00:00
|
|
|
|
2018-12-10 16:26:46 +00:00
|
|
|
bool
|
2021-03-23 19:00:46 +00:00
|
|
|
Configure(std::shared_ptr<Config> conf, bool isSNode, std::shared_ptr<NodeDB> nodedb) override;
|
2018-04-05 14:23:14 +00:00
|
|
|
|
2018-12-10 16:26:46 +00:00
|
|
|
bool
|
2020-05-20 11:41:42 +00:00
|
|
|
StartRpcServer() override;
|
2019-10-04 09:10:55 +00:00
|
|
|
|
2022-07-28 16:07:38 +00:00
|
|
|
void
|
|
|
|
Freeze() override;
|
|
|
|
|
2021-02-05 21:48:57 +00:00
|
|
|
void
|
|
|
|
Thaw() override;
|
|
|
|
|
2019-10-04 09:10:55 +00:00
|
|
|
bool
|
|
|
|
Run() override;
|
2018-09-17 11:47:34 +00:00
|
|
|
|
2018-12-24 16:09:05 +00:00
|
|
|
/// stop running the router logic gracefully
|
2018-12-10 16:26:46 +00:00
|
|
|
void
|
2019-02-22 16:21:05 +00:00
|
|
|
Stop() override;
|
2018-06-01 14:08:54 +00:00
|
|
|
|
2020-06-16 11:28:20 +00:00
|
|
|
/// non graceful stop router
|
|
|
|
void
|
|
|
|
Die() override;
|
|
|
|
|
2018-12-24 16:09:05 +00:00
|
|
|
/// close all sessions and shutdown all links
|
|
|
|
void
|
|
|
|
StopLinks();
|
|
|
|
|
2018-12-10 16:26:46 +00:00
|
|
|
void
|
2020-04-07 18:38:56 +00:00
|
|
|
PersistSessionUntil(const RouterID& remote, llarp_time_t until) override;
|
2018-06-06 12:46:26 +00:00
|
|
|
|
2018-12-10 16:26:46 +00:00
|
|
|
bool
|
|
|
|
EnsureIdentity();
|
2018-05-26 18:31:45 +00:00
|
|
|
|
2018-12-10 16:26:46 +00:00
|
|
|
bool
|
|
|
|
EnsureEncryptionKey();
|
2018-06-13 12:58:51 +00:00
|
|
|
|
2018-12-10 16:26:46 +00:00
|
|
|
bool
|
2021-06-07 14:57:33 +00:00
|
|
|
SessionToRouterAllowed(const RouterID& router) const override;
|
|
|
|
bool
|
|
|
|
PathToRouterAllowed(const RouterID& router) const override;
|
2018-08-14 21:17:18 +00:00
|
|
|
|
2019-05-18 18:46:49 +00:00
|
|
|
void
|
|
|
|
HandleSaveRC() const;
|
|
|
|
|
2018-12-10 16:26:46 +00:00
|
|
|
bool
|
|
|
|
SaveRC();
|
2018-11-28 15:18:18 +00:00
|
|
|
|
2020-09-24 00:28:38 +00:00
|
|
|
/// return true if we are a client with an exit configured
|
|
|
|
bool
|
2021-05-13 11:30:53 +00:00
|
|
|
HasClientExit() const override;
|
2020-09-24 00:28:38 +00:00
|
|
|
|
2020-04-07 18:38:56 +00:00
|
|
|
const byte_t*
|
2019-01-29 02:16:31 +00:00
|
|
|
pubkey() const override
|
2018-12-10 16:26:46 +00:00
|
|
|
{
|
2019-02-11 19:45:42 +00:00
|
|
|
return seckey_topublic(_identity);
|
2018-12-10 16:26:46 +00:00
|
|
|
}
|
2018-10-25 18:18:12 +00:00
|
|
|
|
2018-12-10 16:26:46 +00:00
|
|
|
void
|
|
|
|
try_connect(fs::path rcfile);
|
2018-06-03 13:04:51 +00:00
|
|
|
|
2019-06-26 21:39:29 +00:00
|
|
|
bool
|
|
|
|
TryConnectAsync(RouterContact rc, uint16_t tries) override;
|
|
|
|
|
2018-12-10 16:26:46 +00:00
|
|
|
/// send to remote router or queue for sending
|
|
|
|
/// returns false on overflow
|
|
|
|
/// returns true on successful queue
|
|
|
|
/// NOT threadsafe
|
|
|
|
/// MUST be called in the logic thread
|
|
|
|
bool
|
2020-04-07 18:38:56 +00:00
|
|
|
SendToOrQueue(
|
2021-04-12 11:39:07 +00:00
|
|
|
const RouterID& remote, const ILinkMessage& msg, SendStatusHandler handler) override;
|
2018-06-03 13:04:51 +00:00
|
|
|
|
2018-12-10 16:26:46 +00:00
|
|
|
void
|
2020-04-07 18:38:56 +00:00
|
|
|
ForEachPeer(std::function<void(const ILinkSession*, bool)> visit, bool randomize = false)
|
|
|
|
const override;
|
2018-08-30 18:48:43 +00:00
|
|
|
|
2018-12-19 16:17:41 +00:00
|
|
|
void
|
2020-04-07 18:38:56 +00:00
|
|
|
ForEachPeer(std::function<void(ILinkSession*)> visit);
|
2018-12-19 16:17:41 +00:00
|
|
|
|
2019-04-08 12:01:52 +00:00
|
|
|
bool IsBootstrapNode(RouterID) const override;
|
|
|
|
|
2018-12-19 16:17:41 +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
|
|
|
|
bool
|
2019-02-11 19:45:42 +00:00
|
|
|
CheckRenegotiateValid(RouterContact newRc, RouterContact oldRC) override;
|
2018-12-19 16:17:41 +00:00
|
|
|
|
2018-12-17 20:46:08 +00:00
|
|
|
/// called by link when a remote session has no more sessions open
|
2018-12-10 16:26:46 +00:00
|
|
|
void
|
2019-02-11 19:45:42 +00:00
|
|
|
SessionClosed(RouterID remote) override;
|
2018-08-30 18:48:43 +00:00
|
|
|
|
2020-06-08 20:03:03 +00:00
|
|
|
/// called by link when an unestablished connection times out
|
|
|
|
void
|
|
|
|
ConnectionTimedOut(ILinkSession* session);
|
|
|
|
|
|
|
|
/// called by link when session is fully established
|
|
|
|
bool
|
2020-06-11 19:02:34 +00:00
|
|
|
ConnectionEstablished(ILinkSession* session, bool inbound);
|
2020-06-08 20:03:03 +00:00
|
|
|
|
2018-12-10 16:26:46 +00:00
|
|
|
/// call internal router ticker
|
|
|
|
void
|
|
|
|
Tick();
|
2018-05-30 20:56:47 +00:00
|
|
|
|
2018-12-10 16:26:46 +00:00
|
|
|
llarp_time_t
|
2019-01-29 02:16:31 +00:00
|
|
|
Now() const override
|
2018-12-10 16:26:46 +00:00
|
|
|
{
|
2019-11-05 17:10:14 +00:00
|
|
|
return llarp::time_now_ms();
|
2018-12-10 16:26:46 +00:00
|
|
|
}
|
2018-06-03 13:04:51 +00:00
|
|
|
|
2019-01-02 01:04:03 +00:00
|
|
|
/// parse a routing message in a buffer and handle it with a handler if
|
|
|
|
/// successful parsing return true on parse and handle success otherwise
|
|
|
|
/// return false
|
2018-12-27 14:32:37 +00:00
|
|
|
bool
|
2020-04-07 18:38:56 +00:00
|
|
|
ParseRoutingMessageBuffer(
|
|
|
|
const llarp_buffer_t& buf, routing::IMessageHandler* h, const PathID_t& rxid) override;
|
2018-12-27 14:32:37 +00:00
|
|
|
|
2018-12-10 16:26:46 +00:00
|
|
|
void
|
2019-02-20 12:09:18 +00:00
|
|
|
ConnectToRandomRouters(int N) override;
|
2018-12-10 16:26:46 +00:00
|
|
|
|
2019-05-09 15:36:39 +00:00
|
|
|
/// count the number of unique service nodes connected via pubkey
|
2018-12-10 16:26:46 +00:00
|
|
|
size_t
|
2019-02-11 19:45:42 +00:00
|
|
|
NumberOfConnectedRouters() const override;
|
2018-12-10 16:26:46 +00:00
|
|
|
|
2019-05-09 15:36:39 +00:00
|
|
|
/// count the number of unique clients connected by pubkey
|
|
|
|
size_t
|
|
|
|
NumberOfConnectedClients() const override;
|
|
|
|
|
2018-12-10 16:26:46 +00:00
|
|
|
bool
|
2020-04-07 18:38:56 +00:00
|
|
|
GetRandomConnectedRouter(RouterContact& result) const override;
|
2018-12-10 16:26:46 +00:00
|
|
|
|
2019-06-26 21:39:29 +00:00
|
|
|
void
|
2020-04-07 18:38:56 +00:00
|
|
|
HandleDHTLookupForExplore(RouterID remote, const std::vector<RouterContact>& results) override;
|
2018-12-10 16:26:46 +00:00
|
|
|
|
|
|
|
void
|
2019-06-26 21:39:29 +00:00
|
|
|
LookupRouter(RouterID remote, RouterLookupHandler resultHandler) override;
|
2018-12-10 16:26:46 +00:00
|
|
|
|
|
|
|
bool
|
2020-04-07 18:38:56 +00:00
|
|
|
HasSessionTo(const RouterID& remote) const override;
|
2019-05-27 19:01:09 +00:00
|
|
|
|
2020-02-20 21:37:39 +00:00
|
|
|
std::string
|
2020-04-10 17:26:50 +00:00
|
|
|
ShortName() const override;
|
2020-02-20 21:37:39 +00:00
|
|
|
|
|
|
|
uint32_t
|
2020-04-10 17:26:50 +00:00
|
|
|
NextPathBuildNumber() override;
|
2020-02-20 21:37:39 +00:00
|
|
|
|
2019-11-23 04:47:08 +00:00
|
|
|
void
|
|
|
|
AfterStopLinks();
|
|
|
|
|
|
|
|
void
|
|
|
|
AfterStopIssued();
|
2018-12-10 16:26:46 +00:00
|
|
|
|
2020-08-27 12:43:53 +00:00
|
|
|
std::shared_ptr<Config> m_Config;
|
|
|
|
|
|
|
|
std::shared_ptr<Config>
|
|
|
|
GetConfig() const override
|
|
|
|
{
|
|
|
|
return m_Config;
|
|
|
|
}
|
|
|
|
|
2021-03-02 18:18:22 +00:00
|
|
|
int m_OutboundUDPSocket = -1;
|
|
|
|
|
2018-12-10 16:26:46 +00:00
|
|
|
private:
|
2020-04-07 18:38:56 +00:00
|
|
|
std::atomic<bool> _stopping;
|
|
|
|
std::atomic<bool> _running;
|
2018-12-24 16:09:05 +00:00
|
|
|
|
2019-06-26 21:39:29 +00:00
|
|
|
bool m_isServiceNode = false;
|
|
|
|
|
2022-10-14 23:55:21 +00:00
|
|
|
// Delay warning about being decommed/dereged until we've had enough time to sync up with oxend
|
|
|
|
static constexpr auto DECOMM_WARNING_STARTUP_DELAY = 15s;
|
|
|
|
|
2020-02-24 19:40:45 +00:00
|
|
|
llarp_time_t m_LastStatsReport = 0s;
|
2022-10-14 23:55:21 +00:00
|
|
|
llarp_time_t m_NextDecommissionWarn = time_now_ms() + DECOMM_WARNING_STARTUP_DELAY;
|
2020-04-07 18:38:56 +00:00
|
|
|
std::shared_ptr<llarp::KeyManager> m_keyManager;
|
2020-05-27 01:57:27 +00:00
|
|
|
std::shared_ptr<PeerDb> m_peerDb;
|
2019-11-26 19:42:41 +00:00
|
|
|
|
2020-02-20 21:37:39 +00:00
|
|
|
uint32_t path_build_count = 0;
|
|
|
|
|
2021-06-06 12:32:23 +00:00
|
|
|
consensus::reachability_testing m_routerTesting;
|
|
|
|
|
2019-07-15 16:56:09 +00:00
|
|
|
bool
|
|
|
|
ShouldReportStats(llarp_time_t now) const;
|
|
|
|
|
|
|
|
void
|
|
|
|
ReportStats();
|
|
|
|
|
2018-12-24 16:09:05 +00:00
|
|
|
bool
|
2019-01-29 12:56:02 +00:00
|
|
|
UpdateOurRC(bool rotateKeys = false);
|
2018-12-24 16:09:05 +00:00
|
|
|
|
2019-07-12 17:21:29 +00:00
|
|
|
bool
|
2020-07-06 19:13:01 +00:00
|
|
|
FromConfig(const Config& conf);
|
2019-06-26 21:39:29 +00:00
|
|
|
|
|
|
|
void
|
2020-04-07 18:38:56 +00:00
|
|
|
MessageSent(const RouterID& remote, SendStatus status);
|
2020-06-25 17:46:31 +00:00
|
|
|
|
2022-09-28 14:15:45 +00:00
|
|
|
bool
|
|
|
|
TooFewPeers() const;
|
|
|
|
|
2020-06-25 17:46:31 +00:00
|
|
|
protected:
|
2020-07-01 19:46:52 +00:00
|
|
|
virtual void
|
|
|
|
HandleRouterEvent(tooling::RouterEventPtr event) const override;
|
|
|
|
|
2020-06-25 17:46:31 +00:00
|
|
|
virtual bool
|
|
|
|
disableGossipingRC_TestingOnly()
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
};
|
2018-12-10 16:26:46 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace llarp
|