2018-02-01 18:06:49 +01:00
|
|
|
#ifndef LLARP_ROUTER_HPP
|
|
|
|
#define LLARP_ROUTER_HPP
|
2018-12-10 17:26:46 +01:00
|
|
|
|
2019-02-11 20:45:42 +01:00
|
|
|
#include <router/abstractrouter.hpp>
|
|
|
|
|
2019-12-06 18:32:46 +01:00
|
|
|
#include <bootstrap.hpp>
|
2019-11-26 20:42:41 +01:00
|
|
|
#include <config/key_manager.hpp>
|
2019-01-13 23:39:10 +01:00
|
|
|
#include <constants/link_layer.hpp>
|
2019-01-13 17:30:07 +01:00
|
|
|
#include <crypto/types.hpp>
|
2019-01-11 02:19:36 +01:00
|
|
|
#include <ev/ev.h>
|
2019-01-11 01:12:43 +01:00
|
|
|
#include <exit/context.hpp>
|
2018-12-12 02:12:59 +01:00
|
|
|
#include <handlers/tun.hpp>
|
2019-09-01 15:26:16 +02:00
|
|
|
#include <link/factory.hpp>
|
|
|
|
#include <link/link_manager.hpp>
|
2019-05-15 17:56:50 +02:00
|
|
|
#include <link/server.hpp>
|
2019-01-14 22:46:07 +01:00
|
|
|
#include <messages/link_message_parser.hpp>
|
2018-12-12 03:52:51 +01:00
|
|
|
#include <nodedb.hpp>
|
2019-06-18 01:19:39 +02:00
|
|
|
#include <path/path_context.hpp>
|
2018-12-12 03:52:51 +01:00
|
|
|
#include <profiling.hpp>
|
2018-12-12 02:55:30 +01:00
|
|
|
#include <router_contact.hpp>
|
2019-09-01 15:26:16 +02:00
|
|
|
#include <router/outbound_message_handler.hpp>
|
|
|
|
#include <router/outbound_session_maker.hpp>
|
2020-01-30 18:23:16 +01:00
|
|
|
#include <router/rc_gossiper.hpp>
|
2019-09-01 15:26:16 +02:00
|
|
|
#include <router/rc_lookup_handler.hpp>
|
2018-12-12 03:04:32 +01:00
|
|
|
#include <routing/handler.hpp>
|
2019-01-10 20:41:51 +01:00
|
|
|
#include <routing/message_parser.hpp>
|
2019-01-14 22:46:07 +01:00
|
|
|
#include <rpc/rpc.hpp>
|
2019-01-11 01:12:43 +01:00
|
|
|
#include <service/context.hpp>
|
2019-02-03 00:12:42 +01:00
|
|
|
#include <util/buffer.hpp>
|
2019-01-10 20:41:51 +01:00
|
|
|
#include <util/fs.hpp>
|
|
|
|
#include <util/mem.hpp>
|
2019-02-08 20:43:25 +01:00
|
|
|
#include <util/status.hpp>
|
2019-01-10 20:41:51 +01:00
|
|
|
#include <util/str.hpp>
|
2019-09-01 15:26:16 +02:00
|
|
|
#include <util/thread/logic.hpp>
|
|
|
|
#include <util/thread/threadpool.h>
|
2019-11-05 18:10:14 +01:00
|
|
|
#include <util/time.hpp>
|
2018-06-01 16:08:54 +02:00
|
|
|
|
2018-02-01 18:06:49 +01:00
|
|
|
#include <functional>
|
2018-05-22 17:54:19 +02:00
|
|
|
#include <list>
|
2018-05-20 19:45:47 +02:00
|
|
|
#include <map>
|
2019-01-26 16:40:58 +01:00
|
|
|
#include <memory>
|
2019-01-05 14:45:05 +01:00
|
|
|
#include <set>
|
2019-01-26 16:40:58 +01:00
|
|
|
#include <unordered_map>
|
|
|
|
#include <vector>
|
2018-02-01 18:06:49 +01:00
|
|
|
|
2019-01-13 23:39:10 +01:00
|
|
|
namespace llarp
|
|
|
|
{
|
2019-02-11 15:43:48 +01:00
|
|
|
struct Config;
|
|
|
|
} // namespace llarp
|
2019-01-13 17:30:07 +01:00
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
namespace llarp
|
2018-05-22 17:54:19 +02:00
|
|
|
{
|
2019-02-15 23:19:19 +01:00
|
|
|
struct Router final : public AbstractRouter
|
2018-09-09 13:23:21 +02:00
|
|
|
{
|
2019-11-29 19:46:58 +01:00
|
|
|
llarp_time_t _lastPump = 0;
|
2018-12-10 17:26:46 +01:00
|
|
|
bool ready;
|
|
|
|
// transient iwp encryption key
|
|
|
|
fs::path transport_keyfile = "transport.key";
|
2018-05-20 19:45:47 +02:00
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
// nodes to connect to on startup
|
|
|
|
// DEPRECATED
|
|
|
|
// std::map< std::string, fs::path > connect;
|
2018-06-28 13:29:10 +02:00
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
// long term identity key
|
|
|
|
fs::path ident_keyfile = "identity.key";
|
2018-05-30 22:56:47 +02:00
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
fs::path encryption_keyfile = "encryption.key";
|
2018-02-01 18:06:49 +01:00
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
// path to write our self signed rc to
|
|
|
|
fs::path our_rc_file = "rc.signed";
|
2018-06-01 16:08:54 +02:00
|
|
|
|
2019-04-16 15:20:48 +02:00
|
|
|
// use file based logging?
|
|
|
|
bool m_UseFileLogging = false;
|
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
// our router contact
|
2019-02-11 20:45:42 +01:00
|
|
|
RouterContact _rc;
|
2018-09-13 14:04:36 +02:00
|
|
|
|
2019-01-21 18:06:31 +01:00
|
|
|
/// are we using the lokid service node seed ?
|
|
|
|
bool usingSNSeed = false;
|
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
/// should we obey the service node whitelist?
|
|
|
|
bool whitelistRouters = false;
|
2018-09-15 13:37:46 +02:00
|
|
|
|
2019-05-22 18:20:50 +02:00
|
|
|
std::shared_ptr< Logic >
|
2019-01-29 03:16:31 +01:00
|
|
|
logic() const override
|
|
|
|
{
|
|
|
|
return _logic;
|
|
|
|
}
|
|
|
|
|
|
|
|
llarp_dht_context *
|
|
|
|
dht() const override
|
|
|
|
{
|
|
|
|
return _dht;
|
|
|
|
}
|
|
|
|
|
2019-02-11 18:14:43 +01:00
|
|
|
util::StatusObject
|
|
|
|
ExtractStatus() const override;
|
2019-02-08 20:43:25 +01:00
|
|
|
|
2019-01-29 03:16:31 +01:00
|
|
|
llarp_nodedb *
|
|
|
|
nodedb() const override
|
|
|
|
{
|
|
|
|
return _nodedb;
|
|
|
|
}
|
|
|
|
|
|
|
|
const path::PathContext &
|
|
|
|
pathContext() const override
|
|
|
|
{
|
|
|
|
return paths;
|
|
|
|
}
|
|
|
|
|
|
|
|
path::PathContext &
|
|
|
|
pathContext() override
|
|
|
|
{
|
|
|
|
return paths;
|
|
|
|
}
|
|
|
|
|
2019-02-11 20:45:42 +01:00
|
|
|
const RouterContact &
|
2019-01-29 03:16:31 +01:00
|
|
|
rc() const override
|
2018-12-10 17:26:46 +01:00
|
|
|
{
|
|
|
|
return _rc;
|
|
|
|
}
|
2018-06-03 15:04:51 +02:00
|
|
|
|
2019-02-15 23:19:19 +01:00
|
|
|
void
|
2019-02-18 20:44:41 +01:00
|
|
|
SetRouterWhitelist(const std::vector< RouterID > &routers) override;
|
2019-02-15 23:19:19 +01:00
|
|
|
|
2019-02-11 20:45:42 +01:00
|
|
|
exit::Context &
|
|
|
|
exitContext() override
|
|
|
|
{
|
|
|
|
return _exitContext;
|
|
|
|
}
|
|
|
|
|
2019-12-06 19:21:14 +01:00
|
|
|
std::shared_ptr< KeyManager >
|
2019-12-10 15:14:16 +01:00
|
|
|
keyManager() const override
|
2019-12-06 19:21:14 +01:00
|
|
|
{
|
|
|
|
return m_keyManager;
|
|
|
|
}
|
|
|
|
|
2019-02-11 20:45:42 +01:00
|
|
|
const SecretKey &
|
|
|
|
identity() const override
|
|
|
|
{
|
|
|
|
return _identity;
|
|
|
|
}
|
|
|
|
|
|
|
|
const SecretKey &
|
|
|
|
encryption() const override
|
|
|
|
{
|
|
|
|
return _encryption;
|
|
|
|
}
|
|
|
|
|
|
|
|
Profiling &
|
|
|
|
routerProfiling() override
|
|
|
|
{
|
|
|
|
return _routerProfiling;
|
|
|
|
}
|
|
|
|
|
2019-04-08 14:01:52 +02:00
|
|
|
llarp_ev_loop_ptr
|
2019-02-11 20:45:42 +01:00
|
|
|
netloop() const override
|
|
|
|
{
|
|
|
|
return _netloop;
|
|
|
|
}
|
|
|
|
|
2019-07-09 15:47:24 +02:00
|
|
|
std::shared_ptr< llarp::thread::ThreadPool >
|
2019-02-11 20:45:42 +01:00
|
|
|
threadpool() override
|
|
|
|
{
|
2019-07-09 15:47:24 +02:00
|
|
|
return cryptoworker;
|
2019-02-11 20:45:42 +01:00
|
|
|
}
|
|
|
|
|
2019-07-09 15:47:24 +02:00
|
|
|
std::shared_ptr< llarp::thread::ThreadPool >
|
2019-02-11 20:45:42 +01:00
|
|
|
diskworker() override
|
|
|
|
{
|
2019-07-09 15:47:24 +02:00
|
|
|
return disk;
|
2019-02-11 20:45:42 +01:00
|
|
|
}
|
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
// our ipv4 public setting
|
|
|
|
bool publicOverride = false;
|
|
|
|
struct sockaddr_in ip4addr;
|
2019-02-11 20:45:42 +01:00
|
|
|
AddressInfo addrInfo;
|
2018-06-03 15:04:51 +02:00
|
|
|
|
2019-08-07 18:33:29 +02:00
|
|
|
LinkFactory::LinkType _defaultLinkType;
|
|
|
|
|
2019-04-08 14:01:52 +02:00
|
|
|
llarp_ev_loop_ptr _netloop;
|
2019-07-09 15:47:24 +02:00
|
|
|
std::shared_ptr< llarp::thread::ThreadPool > cryptoworker;
|
2019-05-22 18:20:50 +02:00
|
|
|
std::shared_ptr< Logic > _logic;
|
2019-01-29 03:16:31 +01:00
|
|
|
path::PathContext paths;
|
2019-02-11 20:45:42 +01:00
|
|
|
exit::Context _exitContext;
|
|
|
|
SecretKey _identity;
|
|
|
|
SecretKey _encryption;
|
2019-07-09 15:47:24 +02:00
|
|
|
std::shared_ptr< thread::ThreadPool > disk;
|
2019-01-29 03:16:31 +01:00
|
|
|
llarp_dht_context *_dht = nullptr;
|
|
|
|
llarp_nodedb *_nodedb;
|
2019-04-22 14:25:25 +02:00
|
|
|
llarp_time_t _startedAt;
|
|
|
|
|
|
|
|
llarp_time_t
|
|
|
|
Uptime() const override;
|
2018-05-25 19:52:10 +02:00
|
|
|
|
2018-12-17 21:46:08 +01:00
|
|
|
bool
|
2019-02-11 20:45:42 +01:00
|
|
|
Sign(Signature &sig, const llarp_buffer_t &buf) const override;
|
2018-12-17 21:46:08 +01:00
|
|
|
|
2019-02-11 19:40:20 +01:00
|
|
|
uint16_t m_OutboundPort = 0;
|
2019-03-31 17:09:59 +02:00
|
|
|
/// how often do we resign our RC? milliseconds.
|
|
|
|
// TODO: make configurable
|
|
|
|
llarp_time_t rcRegenInterval = 60 * 60 * 1000;
|
2018-11-28 15:58:38 +01:00
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
// should we be sending padded messages every interval?
|
|
|
|
bool sendPadding = false;
|
2018-11-28 15:58:38 +01:00
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
uint32_t ticker_job_id = 0;
|
2018-11-14 20:34:17 +01:00
|
|
|
|
2019-06-19 22:48:25 +02:00
|
|
|
LinkMessageParser inbound_link_msg_parser;
|
2019-02-11 20:45:42 +01:00
|
|
|
routing::InboundMessageParser inbound_routing_msg_parser;
|
2018-10-03 13:01:42 +02:00
|
|
|
|
2019-02-22 17:21:05 +01:00
|
|
|
service::Context _hiddenServiceContext;
|
|
|
|
|
|
|
|
service::Context &
|
|
|
|
hiddenServiceContext() override
|
|
|
|
{
|
|
|
|
return _hiddenServiceContext;
|
|
|
|
}
|
|
|
|
|
|
|
|
const service::Context &
|
|
|
|
hiddenServiceContext() const override
|
|
|
|
{
|
|
|
|
return _hiddenServiceContext;
|
|
|
|
}
|
2018-10-09 14:06:30 +02:00
|
|
|
|
2019-12-07 20:58:19 +01:00
|
|
|
llarp_time_t _lastTick = 0;
|
|
|
|
|
|
|
|
bool
|
|
|
|
LooksAlive() const override
|
|
|
|
{
|
|
|
|
const llarp_time_t now = Now();
|
|
|
|
return now <= _lastTick || (now - _lastTick) <= llarp_time_t{30000};
|
|
|
|
}
|
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
using NetConfig_t = std::unordered_multimap< std::string, std::string >;
|
2018-11-02 15:58:12 +01:00
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
/// default network config for default network interface
|
|
|
|
NetConfig_t netConfig;
|
2018-05-22 17:54:19 +02:00
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
/// bootstrap RCs
|
2019-12-06 18:32:46 +01:00
|
|
|
BootstrapList bootstrapRCList;
|
2018-05-26 20:31:45 +02:00
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
bool
|
|
|
|
ExitEnabled() const
|
|
|
|
{
|
|
|
|
// TODO: use equal_range ?
|
|
|
|
auto itr = netConfig.find("exit");
|
|
|
|
if(itr == netConfig.end())
|
|
|
|
return false;
|
2019-02-11 20:45:42 +01:00
|
|
|
return IsTrueValue(itr->second.c_str());
|
2018-12-10 17:26:46 +01:00
|
|
|
}
|
2018-06-01 16:08:54 +02:00
|
|
|
|
2019-04-30 18:07:17 +02:00
|
|
|
void
|
|
|
|
PumpLL() override;
|
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
bool
|
|
|
|
CreateDefaultHiddenService();
|
2018-05-30 22:56:47 +02:00
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
const std::string DefaultRPCBindAddr = "127.0.0.1:1190";
|
2019-07-02 23:28:28 +02:00
|
|
|
bool enableRPCServer = false;
|
2019-02-11 20:45:42 +01:00
|
|
|
std::unique_ptr< rpc::Server > rpcServer;
|
2018-12-10 17:26:46 +01:00
|
|
|
std::string rpcBindAddr = DefaultRPCBindAddr;
|
2020-02-05 17:16:46 +01:00
|
|
|
const Time_t _randomStartDelay;
|
2018-06-14 19:35:12 +02:00
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
/// lokid caller
|
2019-02-11 20:45:42 +01:00
|
|
|
std::unique_ptr< rpc::Caller > rpcCaller;
|
2019-07-02 23:28:28 +02:00
|
|
|
std::string lokidRPCAddr = "127.0.0.1:22023";
|
|
|
|
std::string lokidRPCUser;
|
|
|
|
std::string lokidRPCPassword;
|
2018-11-22 16:02:51 +01:00
|
|
|
|
2019-02-11 20:45:42 +01:00
|
|
|
Profiling _routerProfiling;
|
2018-12-10 17:26:46 +01:00
|
|
|
std::string routerProfilesFile = "profiles.dat";
|
2018-11-20 16:22:59 +01:00
|
|
|
|
2019-06-26 23:39:29 +02:00
|
|
|
OutboundMessageHandler _outboundMessageHandler;
|
|
|
|
OutboundSessionMaker _outboundSessionMaker;
|
|
|
|
LinkManager _linkManager;
|
|
|
|
RCLookupHandler _rcLookupHandler;
|
2020-01-30 18:23:16 +01:00
|
|
|
RCGossiper _rcGossiper;
|
2018-02-01 18:06:49 +01:00
|
|
|
|
2020-01-18 21:46:22 +01:00
|
|
|
using Clock_t = std::chrono::steady_clock;
|
|
|
|
using TimePoint_t = Clock_t::time_point;
|
|
|
|
|
|
|
|
TimePoint_t m_NextExploreAt;
|
|
|
|
|
2019-06-26 23:39:29 +02:00
|
|
|
IOutboundMessageHandler &
|
|
|
|
outboundMessageHandler() override
|
|
|
|
{
|
|
|
|
return _outboundMessageHandler;
|
|
|
|
}
|
2018-06-07 18:22:49 +02:00
|
|
|
|
2019-06-26 23:39:29 +02:00
|
|
|
IOutboundSessionMaker &
|
|
|
|
outboundSessionMaker() override
|
|
|
|
{
|
|
|
|
return _outboundSessionMaker;
|
|
|
|
}
|
2018-05-22 17:54:19 +02:00
|
|
|
|
2019-06-26 23:39:29 +02:00
|
|
|
ILinkManager &
|
|
|
|
linkManager() override
|
|
|
|
{
|
|
|
|
return _linkManager;
|
|
|
|
}
|
2018-06-10 16:05:48 +02:00
|
|
|
|
2019-06-26 23:39:29 +02:00
|
|
|
I_RCLookupHandler &
|
|
|
|
rcLookupHandler() override
|
|
|
|
{
|
|
|
|
return _rcLookupHandler;
|
|
|
|
}
|
2018-11-21 15:10:02 +01:00
|
|
|
|
2020-01-30 18:23:16 +01:00
|
|
|
void
|
|
|
|
GossipRCIfNeeded(const RouterContact rc) override;
|
|
|
|
|
2019-07-09 15:47:24 +02:00
|
|
|
Router(std::shared_ptr< llarp::thread::ThreadPool > worker,
|
|
|
|
llarp_ev_loop_ptr __netloop, std::shared_ptr< Logic > logic);
|
2018-05-22 17:54:19 +02:00
|
|
|
|
2019-07-31 01:42:13 +02:00
|
|
|
~Router() override;
|
2018-07-09 19:32:11 +02:00
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
bool
|
2019-02-11 20:45:42 +01:00
|
|
|
HandleRecvLinkMessageBuffer(ILinkSession *from,
|
|
|
|
const llarp_buffer_t &msg) override;
|
2018-05-22 17:54:19 +02:00
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
bool
|
2019-01-05 14:45:05 +01:00
|
|
|
InitOutboundLinks();
|
2018-08-14 23:17:18 +02:00
|
|
|
|
2018-12-13 01:03:19 +01:00
|
|
|
bool
|
2019-02-11 20:45:42 +01:00
|
|
|
GetRandomGoodRouter(RouterID &r) override;
|
2018-12-13 01:03:19 +01:00
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
/// initialize us as a service node
|
|
|
|
/// return true on success
|
|
|
|
bool
|
|
|
|
InitServiceNode();
|
2018-05-22 17:54:19 +02:00
|
|
|
|
2019-10-09 15:08:38 +02:00
|
|
|
bool
|
|
|
|
IsRunning() const override;
|
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
/// return true if we are running in service node mode
|
|
|
|
bool
|
2020-01-07 00:13:23 +01:00
|
|
|
IsServiceNode() const override;
|
2018-06-10 16:05:48 +02:00
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
void
|
|
|
|
Close();
|
2018-11-28 15:58:38 +01:00
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
bool
|
2019-07-02 23:28:28 +02:00
|
|
|
LoadHiddenServiceConfig(string_view fname);
|
2018-02-01 18:06:49 +01:00
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
bool
|
2019-02-11 20:45:42 +01:00
|
|
|
AddHiddenService(const service::Config::section_t &config);
|
2018-09-13 18:41:53 +02:00
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
bool
|
2019-06-26 23:39:29 +02:00
|
|
|
Configure(Config *conf, llarp_nodedb *nodedb = nullptr) override;
|
2018-04-05 16:23:14 +02:00
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
bool
|
2019-10-04 11:10:55 +02:00
|
|
|
StartJsonRpc() override;
|
|
|
|
|
|
|
|
bool
|
|
|
|
Run() override;
|
2018-09-17 13:47:34 +02:00
|
|
|
|
2018-12-24 17:09:05 +01:00
|
|
|
/// stop running the router logic gracefully
|
2018-12-10 17:26:46 +01:00
|
|
|
void
|
2019-02-22 17:21:05 +01:00
|
|
|
Stop() override;
|
2018-06-01 16:08:54 +02:00
|
|
|
|
2018-12-24 17:09:05 +01:00
|
|
|
/// close all sessions and shutdown all links
|
|
|
|
void
|
|
|
|
StopLinks();
|
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
void
|
2019-02-11 20:45:42 +01:00
|
|
|
PersistSessionUntil(const RouterID &remote, llarp_time_t until) override;
|
2018-06-06 14:46:26 +02:00
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
bool
|
|
|
|
EnsureIdentity();
|
2018-05-26 20:31:45 +02:00
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
bool
|
|
|
|
EnsureEncryptionKey();
|
2018-06-13 14:58:51 +02:00
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
bool
|
2019-04-18 13:49:54 +02:00
|
|
|
ConnectionToRouterAllowed(const RouterID &router) const override;
|
2018-08-14 23:17:18 +02:00
|
|
|
|
2019-05-18 20:46:49 +02:00
|
|
|
void
|
|
|
|
HandleSaveRC() const;
|
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
bool
|
|
|
|
SaveRC();
|
2018-11-28 16:18:18 +01:00
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
const byte_t *
|
2019-01-29 03:16:31 +01:00
|
|
|
pubkey() const override
|
2018-12-10 17:26:46 +01:00
|
|
|
{
|
2019-02-11 20:45:42 +01:00
|
|
|
return seckey_topublic(_identity);
|
2018-12-10 17:26:46 +01:00
|
|
|
}
|
2018-10-25 20:18:12 +02:00
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
void
|
|
|
|
try_connect(fs::path rcfile);
|
2018-06-03 15:04:51 +02:00
|
|
|
|
2018-12-24 17:09:05 +01:00
|
|
|
/// inject configuration and reconfigure router
|
|
|
|
bool
|
2019-02-22 17:21:05 +01:00
|
|
|
Reconfigure(Config *conf) override;
|
2018-12-24 17:09:05 +01:00
|
|
|
|
2019-06-26 23:39:29 +02:00
|
|
|
bool
|
|
|
|
TryConnectAsync(RouterContact rc, uint16_t tries) override;
|
|
|
|
|
2018-12-24 17:09:05 +01:00
|
|
|
/// validate new configuration against old one
|
|
|
|
/// return true on 100% valid
|
|
|
|
/// return false if not 100% valid
|
2018-12-10 17:26:46 +01:00
|
|
|
bool
|
2019-02-22 17:21:05 +01:00
|
|
|
ValidateConfig(Config *conf) const override;
|
2018-10-29 17:48:36 +01:00
|
|
|
|
2018-12-10 17:26:46 +01: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
|
2019-06-04 20:31:17 +02:00
|
|
|
SendToOrQueue(const RouterID &remote, const ILinkMessage *msg,
|
|
|
|
SendStatusHandler handler) override;
|
2018-06-03 15:04:51 +02:00
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
void
|
2019-04-08 14:01:52 +02:00
|
|
|
ForEachPeer(std::function< void(const ILinkSession *, bool) > visit,
|
|
|
|
bool randomize = false) const override;
|
2018-08-30 20:48:43 +02:00
|
|
|
|
2018-12-19 17:17:41 +01:00
|
|
|
void
|
2019-02-11 20:45:42 +01:00
|
|
|
ForEachPeer(std::function< void(ILinkSession *) > visit);
|
2018-12-19 17:17:41 +01:00
|
|
|
|
2019-04-08 14:01:52 +02:00
|
|
|
bool IsBootstrapNode(RouterID) const override;
|
|
|
|
|
2018-12-19 17:17:41 +01: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 20:45:42 +01:00
|
|
|
CheckRenegotiateValid(RouterContact newRc, RouterContact oldRC) override;
|
2018-12-19 17:17:41 +01:00
|
|
|
|
2018-12-17 21:46:08 +01:00
|
|
|
/// called by link when a remote session has no more sessions open
|
2018-12-10 17:26:46 +01:00
|
|
|
void
|
2019-02-11 20:45:42 +01:00
|
|
|
SessionClosed(RouterID remote) override;
|
2018-08-30 20:48:43 +02:00
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
/// call internal router ticker
|
|
|
|
void
|
|
|
|
Tick();
|
2018-05-30 22:56:47 +02:00
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
llarp_time_t
|
2019-01-29 03:16:31 +01:00
|
|
|
Now() const override
|
2018-12-10 17:26:46 +01:00
|
|
|
{
|
2019-11-05 18:10:14 +01:00
|
|
|
return llarp::time_now_ms();
|
2018-12-10 17:26:46 +01:00
|
|
|
}
|
2018-06-03 15:04:51 +02:00
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
/// schedule ticker to call i ms from now
|
|
|
|
void
|
|
|
|
ScheduleTicker(uint64_t i = 1000);
|
2018-06-03 15:04:51 +02:00
|
|
|
|
2019-01-02 02:04:03 +01: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 15:32:37 +01:00
|
|
|
bool
|
2019-02-01 02:58:06 +01:00
|
|
|
ParseRoutingMessageBuffer(const llarp_buffer_t &buf,
|
2019-01-29 03:16:31 +01:00
|
|
|
routing::IMessageHandler *h,
|
2019-02-11 20:45:42 +01:00
|
|
|
const PathID_t &rxid) override;
|
2018-12-27 15:32:37 +01:00
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
void
|
2019-02-20 13:09:18 +01:00
|
|
|
ConnectToRandomRouters(int N) override;
|
2018-12-10 17:26:46 +01:00
|
|
|
|
2019-05-09 17:36:39 +02:00
|
|
|
/// count the number of unique service nodes connected via pubkey
|
2018-12-10 17:26:46 +01:00
|
|
|
size_t
|
2019-02-11 20:45:42 +01:00
|
|
|
NumberOfConnectedRouters() const override;
|
2018-12-10 17:26:46 +01:00
|
|
|
|
2019-05-09 17:36:39 +02:00
|
|
|
/// count the number of unique clients connected by pubkey
|
|
|
|
size_t
|
|
|
|
NumberOfConnectedClients() const override;
|
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
bool
|
2019-02-11 20:45:42 +01:00
|
|
|
GetRandomConnectedRouter(RouterContact &result) const override;
|
2018-12-10 17:26:46 +01:00
|
|
|
|
2019-06-26 23:39:29 +02:00
|
|
|
void
|
|
|
|
HandleDHTLookupForExplore(
|
|
|
|
RouterID remote, const std::vector< RouterContact > &results) override;
|
2018-12-10 17:26:46 +01:00
|
|
|
|
|
|
|
void
|
2019-06-26 23:39:29 +02:00
|
|
|
LookupRouter(RouterID remote, RouterLookupHandler resultHandler) override;
|
2018-12-10 17:26:46 +01:00
|
|
|
|
|
|
|
bool
|
2019-05-27 21:01:09 +02:00
|
|
|
HasSessionTo(const RouterID &remote) const override;
|
|
|
|
|
2019-11-23 05:47:08 +01:00
|
|
|
void
|
|
|
|
handle_router_ticker();
|
|
|
|
|
|
|
|
void
|
|
|
|
AfterStopLinks();
|
|
|
|
|
|
|
|
void
|
|
|
|
AfterStopIssued();
|
2018-12-10 17:26:46 +01:00
|
|
|
|
|
|
|
private:
|
2018-12-24 17:09:05 +01:00
|
|
|
std::atomic< bool > _stopping;
|
|
|
|
std::atomic< bool > _running;
|
|
|
|
|
2019-06-26 23:39:29 +02:00
|
|
|
bool m_isServiceNode = false;
|
|
|
|
|
2019-07-15 18:56:09 +02:00
|
|
|
llarp_time_t m_LastStatsReport = 0;
|
|
|
|
|
2019-12-06 18:32:46 +01:00
|
|
|
std::shared_ptr< llarp::KeyManager > m_keyManager;
|
2019-11-26 20:42:41 +01:00
|
|
|
|
2019-07-15 18:56:09 +02:00
|
|
|
bool
|
|
|
|
ShouldReportStats(llarp_time_t now) const;
|
|
|
|
|
|
|
|
void
|
|
|
|
ReportStats();
|
|
|
|
|
2018-12-24 17:09:05 +01:00
|
|
|
bool
|
2019-01-29 13:56:02 +01:00
|
|
|
UpdateOurRC(bool rotateKeys = false);
|
2018-12-24 17:09:05 +01:00
|
|
|
|
2018-12-10 17:26:46 +01:00
|
|
|
template < typename Config >
|
|
|
|
void
|
|
|
|
mergeHiddenServiceConfig(const Config &in, Config &out)
|
|
|
|
{
|
|
|
|
for(const auto &item : netConfig)
|
|
|
|
out.push_back({item.first, item.second});
|
|
|
|
for(const auto &item : in)
|
|
|
|
out.push_back({item.first, item.second});
|
|
|
|
}
|
2019-02-11 15:43:48 +01:00
|
|
|
|
2019-07-12 19:21:29 +02:00
|
|
|
bool
|
2019-07-12 19:23:38 +02:00
|
|
|
FromConfig(Config *conf);
|
2019-06-26 23:39:29 +02:00
|
|
|
|
|
|
|
void
|
|
|
|
MessageSent(const RouterID &remote, SendStatus status);
|
2018-12-10 17:26:46 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace llarp
|
2018-02-01 18:06:49 +01:00
|
|
|
|
|
|
|
#endif
|