1
1
Fork 0
mirror of https://github.com/oxen-io/lokinet synced 2023-12-14 06:53:00 +01:00
lokinet/llarp/router/router.hpp

566 lines
13 KiB
C++
Raw Normal View History

2018-02-01 18:06:49 +01:00
#ifndef LLARP_ROUTER_HPP
#define LLARP_ROUTER_HPP
#include <router/abstractrouter.hpp>
#include <constants/link_layer.hpp>
#include <crypto/types.hpp>
2019-01-11 02:19:36 +01:00
#include <ev/ev.h>
#include <exit/context.hpp>
2018-12-12 02:12:59 +01:00
#include <handlers/tun.hpp>
#include <messages/link_message_parser.hpp>
#include <nodedb.hpp>
2019-01-11 02:19:36 +01:00
#include <path/path.hpp>
#include <profiling.hpp>
2018-12-12 02:55:30 +01:00
#include <router_contact.hpp>
2018-12-12 03:04:32 +01:00
#include <routing/handler.hpp>
#include <routing/message_parser.hpp>
#include <rpc/rpc.hpp>
#include <service/context.hpp>
2019-02-03 00:12:42 +01:00
#include <util/buffer.hpp>
#include <util/fs.hpp>
2019-01-11 02:19:36 +01:00
#include <util/logic.hpp>
#include <util/mem.hpp>
2019-02-08 20:43:25 +01:00
#include <util/status.hpp>
#include <util/str.hpp>
#include <util/threadpool.hpp>
2018-06-01 16:08:54 +02:00
2018-02-01 18:06:49 +01:00
#include <functional>
#include <list>
2018-05-20 19:45:47 +02:00
#include <map>
#include <memory>
2019-01-05 14:45:05 +01:00
#include <set>
#include <unordered_map>
#include <vector>
2018-02-01 18:06:49 +01:00
namespace llarp
{
struct Config;
struct Crypto;
} // namespace llarp
2018-06-21 15:08:21 +02:00
bool
llarp_findOrCreateEncryption(llarp::Crypto *crypto, const fs::path &fpath,
2018-08-30 20:48:43 +02:00
llarp::SecretKey &encryption);
2018-06-21 15:08:21 +02:00
bool
llarp_findOrCreateIdentity(llarp::Crypto *crypto, const fs::path &path,
llarp::SecretKey &secretkey);
bool
llarp_loadServiceNodeIdentityKey(llarp::Crypto *crypto, const fs::path &fpath,
llarp::SecretKey &secretkey);
2018-09-06 13:46:19 +02:00
struct TryConnectJob;
namespace llarp
{
2019-01-05 14:45:05 +01:00
template < typename T >
struct CompareLinks
{
bool
operator()(const std::unique_ptr< T > &left,
const std::unique_ptr< T > &right) const
{
const std::string leftName = left->Name();
const std::string rightName = right->Name();
return left->Rank() < right->Rank() || leftName < rightName;
}
};
struct Router final : public AbstractRouter
{
bool ready;
// transient iwp encryption key
fs::path transport_keyfile = "transport.key";
2018-05-20 19:45:47 +02:00
// nodes to connect to on startup
// DEPRECATED
// std::map< std::string, fs::path > connect;
// long term identity key
fs::path ident_keyfile = "identity.key";
2018-05-30 22:56:47 +02:00
fs::path encryption_keyfile = "encryption.key";
2018-02-01 18:06:49 +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
// our router contact
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;
/// should we obey the service node whitelist?
bool whitelistRouters = false;
Logic *
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
Crypto *
crypto() const override
{
return _crypto.get();
}
llarp_nodedb *
nodedb() const override
{
return _nodedb;
}
const path::PathContext &
pathContext() const override
{
return paths;
}
path::PathContext &
pathContext() override
{
return paths;
}
const RouterContact &
rc() const override
{
return _rc;
}
2018-06-03 15:04:51 +02:00
void
2019-02-18 20:44:41 +01:00
SetRouterWhitelist(const std::vector< RouterID > &routers) override;
exit::Context &
exitContext() override
{
return _exitContext;
}
const SecretKey &
identity() const override
{
return _identity;
}
const SecretKey &
encryption() const override
{
return _encryption;
}
Profiling &
routerProfiling() override
{
return _routerProfiling;
}
llarp_ev_loop *
netloop() const override
{
return _netloop;
}
llarp_threadpool *
threadpool() override
{
return tp;
}
llarp_threadpool *
diskworker() override
{
return disk;
}
// our ipv4 public setting
bool publicOverride = false;
struct sockaddr_in ip4addr;
AddressInfo addrInfo;
2018-06-03 15:04:51 +02:00
llarp_ev_loop *_netloop;
llarp_threadpool *tp;
Logic *_logic;
std::unique_ptr< Crypto > _crypto;
path::PathContext paths;
exit::Context _exitContext;
SecretKey _identity;
SecretKey _encryption;
llarp_threadpool *disk;
llarp_dht_context *_dht = nullptr;
llarp_nodedb *_nodedb;
bool
Sign(Signature &sig, const llarp_buffer_t &buf) const override;
// buffer for serializing link messages
2019-02-03 00:12:42 +01:00
std::array< byte_t, MAX_LINK_MSG_SIZE > linkmsg_buffer;
uint16_t m_OutboundPort = 0;
/// always maintain this many connections to other routers
2019-03-31 17:09:59 +02:00
size_t minConnectedRouters = 2;
/// hard upperbound limit on the number of router to router connections
size_t maxConnectedRouters = 2000;
size_t minRequiredRouters = 4;
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;
// should we be sending padded messages every interval?
bool sendPadding = false;
uint32_t ticker_job_id = 0;
2018-11-14 20:34:17 +01:00
InboundMessageParser inbound_link_msg_parser;
routing::InboundMessageParser inbound_routing_msg_parser;
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
using NetConfig_t = std::unordered_multimap< std::string, std::string >;
2018-11-02 15:58:12 +01:00
/// default network config for default network interface
NetConfig_t netConfig;
/// identity keys whitelist of routers we will connect to directly (not for
/// service nodes)
std::set< RouterID > strictConnectPubkeys;
/// bootstrap RCs
std::list< RouterContact > bootstrapRCList;
bool
ExitEnabled() const
{
// TODO: use equal_range ?
auto itr = netConfig.find("exit");
if(itr == netConfig.end())
return false;
return IsTrueValue(itr->second.c_str());
}
2018-06-01 16:08:54 +02:00
bool
CreateDefaultHiddenService();
2018-05-30 22:56:47 +02:00
bool
ShouldCreateDefaultHiddenService();
const std::string DefaultRPCBindAddr = "127.0.0.1:1190";
bool enableRPCServer = true;
std::unique_ptr< rpc::Server > rpcServer;
std::string rpcBindAddr = DefaultRPCBindAddr;
2018-06-14 19:35:12 +02:00
/// lokid caller
const std::string DefaultLokidRPCAddr = "127.0.0.1:22023";
std::unique_ptr< rpc::Caller > rpcCaller;
std::string lokidRPCAddr = DefaultLokidRPCAddr;
std::string lokidRPCUser = "";
std::string lokidRPCPassword = "";
2018-11-22 16:02:51 +01:00
std::set< std::unique_ptr< ILinkLayer >, CompareLinks< ILinkLayer > >
2019-01-05 14:45:05 +01:00
outboundLinks;
std::set< std::unique_ptr< ILinkLayer >, CompareLinks< ILinkLayer > >
2019-01-05 14:45:05 +01:00
inboundLinks;
2018-08-14 23:17:18 +02:00
Profiling _routerProfiling;
std::string routerProfilesFile = "profiles.dat";
using MessageQueue = std::queue< std::vector< byte_t > >;
2018-02-01 18:06:49 +01:00
/// outbound message queue
std::unordered_map< RouterID, MessageQueue, RouterID::Hash >
outboundMessageQueue;
2018-09-04 21:15:06 +02:00
/// loki verified routers
std::unordered_map< RouterID, RouterContact, RouterID::Hash > validRouters;
// pending establishing session with routers
std::unordered_map< RouterID, std::unique_ptr< TryConnectJob >,
RouterID::Hash >
pendingEstablishJobs;
// pending RCs to be verified by pubkey
std::unordered_map< RouterID, llarp_async_verify_rc, RouterID::Hash >
pendingVerifyRC;
// sessions to persist -> timestamp to end persist at
std::unordered_map< RouterID, llarp_time_t, RouterID::Hash >
m_PersistingSessions;
2018-06-10 16:05:48 +02:00
2019-02-25 13:46:40 +01:00
// RCs of connected clients
2019-02-25 14:03:34 +01:00
std::set< RouterID > m_Clients;
2019-02-25 13:46:40 +01:00
// lokinet routers from lokid, maps pubkey to when we think it will expire,
// set to max value right now
std::unordered_map< RouterID, llarp_time_t, PubKey::Hash > lokinetRouters;
2018-11-21 15:10:02 +01:00
Router(struct llarp_threadpool *tp, struct llarp_ev_loop *__netloop,
Logic *logic);
~Router();
2018-07-09 19:32:11 +02:00
2019-02-27 13:55:26 +01:00
bool
OnSessionEstablished(ILinkSession *) override;
2018-07-09 19:32:11 +02:00
bool
HandleRecvLinkMessageBuffer(ILinkSession *from,
const llarp_buffer_t &msg) override;
void
AddInboundLink(std::unique_ptr< ILinkLayer > &link);
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
GetRandomGoodRouter(RouterID &r) override;
2018-12-13 01:03:19 +01:00
/// initialize us as a service node
/// return true on success
bool
InitServiceNode();
/// return true if we are running in service node mode
bool
IsServiceNode() const;
2018-06-10 16:05:48 +02:00
void
Close();
bool
LoadHiddenServiceConfig(const char *fname);
2018-02-01 18:06:49 +01:00
bool
AddHiddenService(const service::Config::section_t &config);
bool
2019-02-22 17:21:05 +01:00
Configure(Config *conf) override;
2018-06-14 19:35:12 +02:00
bool
Ready();
2018-04-05 16:23:14 +02:00
bool
2019-02-22 17:21:05 +01:00
Run(struct llarp_nodedb *nodedb) override;
2018-09-17 13:47:34 +02:00
/// stop running the router logic gracefully
void
2019-02-22 17:21:05 +01:00
Stop() override;
2018-06-01 16:08:54 +02:00
/// close all sessions and shutdown all links
void
StopLinks();
void
PersistSessionUntil(const RouterID &remote, llarp_time_t until) override;
2018-06-06 14:46:26 +02:00
bool
EnsureIdentity();
bool
EnsureEncryptionKey();
2018-06-13 14:58:51 +02:00
bool
ConnectionToRouterAllowed(const RouterID &router) const;
2018-08-14 23:17:18 +02:00
bool
SaveRC();
2018-11-28 16:18:18 +01:00
const byte_t *
pubkey() const override
{
return seckey_topublic(_identity);
}
void
OnConnectTimeout(ILinkSession *session) override;
bool
HasPendingConnectJob(const RouterID &remote);
void
try_connect(fs::path rcfile);
2018-06-03 15:04:51 +02:00
/// inject configuration and reconfigure router
bool
2019-02-22 17:21:05 +01:00
Reconfigure(Config *conf) override;
/// validate new configuration against old one
/// return true on 100% valid
/// return false if not 100% valid
bool
2019-02-22 17:21:05 +01:00
ValidateConfig(Config *conf) const override;
2018-10-29 17:48:36 +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
SendToOrQueue(const RouterID &remote, const ILinkMessage *msg) override;
2018-06-03 15:04:51 +02:00
/// sendto or drop
void
SendTo(RouterID remote, const ILinkMessage *msg, ILinkLayer *chosen);
2018-07-03 15:33:37 +02:00
/// manually flush outbound message queue for just 1 router
void
FlushOutboundFor(RouterID remote, ILinkLayer *chosen = nullptr);
2018-09-13 14:04:36 +02:00
2019-03-31 17:09:59 +02:00
void
LookupRouter(RouterID remote) override;
/// manually discard all pending messages to remote router
void
DiscardOutboundFor(const RouterID &remote);
/// try establishing a session to a remote router
void
TryEstablishTo(const RouterID &remote);
2018-12-19 18:48:29 +01:00
/// lookup a router by pubkey when it expires when we are a service node
void
ServiceNodeLookupRouterWhenExpired(RouterID remote);
2018-12-19 18:48:29 +01:00
void
HandleDHTLookupForExplore(
RouterID remote, const std::vector< RouterContact > &results) override;
2018-05-30 22:56:47 +02:00
void
2019-02-18 20:44:41 +01:00
ForEachPeer(
std::function< void(const ILinkSession *, bool) > visit, bool randomize=false) const override;
2018-08-30 20:48:43 +02:00
void
ForEachPeer(std::function< void(ILinkSession *) > visit);
bool
IsBootstrapNode(RouterID) const override;
/// 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
CheckRenegotiateValid(RouterContact newRc, RouterContact oldRC) override;
/// flush outbound message queue
void
FlushOutbound();
2018-09-13 14:04:36 +02:00
/// called by link when a remote session has no more sessions open
void
SessionClosed(RouterID remote) override;
2018-08-30 20:48:43 +02:00
/// call internal router ticker
void
Tick();
2018-05-30 22:56:47 +02:00
/// get time from event loop
llarp_time_t
Now() const override
{
return llarp_ev_loop_time_now_ms(_netloop);
}
2018-06-03 15:04:51 +02:00
/// schedule ticker to call i ms from now
void
ScheduleTicker(uint64_t i = 1000);
2018-06-03 15:04:51 +02:00
ILinkLayer *
GetLinkWithSessionByPubkey(const RouterID &remote);
2018-11-11 14:14:19 +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
bool
ParseRoutingMessageBuffer(const llarp_buffer_t &buf,
routing::IMessageHandler *h,
const PathID_t &rxid) override;
void
ConnectToRandomRouters(int N) override;
size_t
NumberOfConnectedRouters() const override;
2019-01-05 14:45:05 +01:00
bool
TryConnectAsync(RouterContact rc, uint16_t tries);
2019-01-05 14:45:05 +01:00
bool
GetRandomConnectedRouter(RouterContact &result) const override;
2019-02-27 13:55:26 +01:00
bool
async_verify_RC(const RouterContact &rc);
void
HandleDHTLookupForSendTo(RouterID remote,
const std::vector< RouterContact > &results);
bool
HasSessionTo(const RouterID &remote) const;
void
HandleDHTLookupForTryEstablishTo(
RouterID remote, const std::vector< RouterContact > &results);
static void
on_verify_client_rc(llarp_async_verify_rc *context);
static void
on_verify_server_rc(llarp_async_verify_rc *context);
static void
handle_router_ticker(void *user, uint64_t orig, uint64_t left);
static void
HandleAsyncLoadRCForSendTo(llarp_async_load_rc *async);
private:
std::atomic< bool > _stopping;
std::atomic< bool > _running;
bool
2019-01-29 13:56:02 +01:00
UpdateOurRC(bool rotateKeys = false);
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});
}
void
router_iter_config(const char *section, const char *key, const char *val);
};
} // namespace llarp
2018-02-01 18:06:49 +01:00
#endif