lokinet/llarp/router.hpp

271 lines
6.2 KiB
C++
Raw Normal View History

2018-02-01 17:06:49 +00:00
#ifndef LLARP_ROUTER_HPP
#define LLARP_ROUTER_HPP
2018-06-01 14:08:54 +00:00
#include <llarp/dht.h>
2018-08-30 18:48:43 +00:00
#include <llarp/nodedb.hpp>
#include <llarp/router_contact.hpp>
2018-06-10 14:05:48 +00:00
#include <llarp/path.hpp>
#include <llarp/link_layer.hpp>
2018-06-01 14:08:54 +00:00
2018-02-01 17:06:49 +00:00
#include <functional>
#include <list>
2018-05-20 17:45:47 +00:00
#include <map>
#include <vector>
2018-05-30 20:56:47 +00:00
#include <unordered_map>
2018-02-01 17:06:49 +00:00
2018-06-01 14:08:54 +00:00
#include <llarp/dht.hpp>
2018-08-16 14:34:15 +00:00
#include <llarp/handlers/tun.hpp>
#include <llarp/link_message.hpp>
2018-06-26 16:23:43 +00:00
#include <llarp/routing/handler.hpp>
#include <llarp/service.hpp>
#include <llarp/establish_job.hpp>
#include <llarp/profiling.hpp>
#include "crypto.hpp"
2018-05-20 17:45:47 +00:00
#include "fs.hpp"
#include "mem.hpp"
2018-02-01 17:06:49 +00:00
2018-06-21 13:08:21 +00:00
bool
llarp_findOrCreateEncryption(llarp_crypto *crypto, const char *fpath,
2018-08-30 18:48:43 +00:00
llarp::SecretKey &encryption);
2018-06-21 13:08:21 +00:00
2018-09-06 11:46:19 +00:00
struct TryConnectJob;
struct llarp_router
{
2018-04-05 14:23:14 +00:00
bool ready;
2018-05-20 17:45:47 +00:00
// transient iwp encryption key
fs::path transport_keyfile = "transport.key";
// nodes to connect to on startup
std::map< std::string, fs::path > connect;
2018-05-20 17:45:47 +00:00
// long term identity key
fs::path ident_keyfile = "identity.key";
2018-06-10 14:05:48 +00:00
fs::path encryption_keyfile = "encryption.key";
2018-05-20 17:45:47 +00:00
// path to write our self signed rc to
fs::path our_rc_file = "rc.signed";
// our router contact
llarp::RouterContact _rc;
const llarp::RouterContact &
rc() const
{
return _rc;
}
2018-05-20 17:45:47 +00:00
// our ipv4 public setting
2018-06-28 11:59:50 +00:00
bool publicOverride = false;
struct sockaddr_in ip4addr;
2018-08-30 18:48:43 +00:00
llarp::AddressInfo addrInfo;
llarp_ev_loop *netloop;
2018-05-18 20:08:57 +00:00
llarp_threadpool *tp;
llarp_logic *logic;
2018-02-01 17:07:01 +00:00
llarp_crypto crypto;
llarp::path::PathContext paths;
llarp::SecretKey identity;
llarp::SecretKey encryption;
2018-05-30 20:56:47 +00:00
llarp_threadpool *disk;
2018-06-10 14:05:48 +00:00
llarp_dht_context *dht = nullptr;
2018-05-30 20:56:47 +00:00
llarp_nodedb *nodedb;
2018-02-01 17:06:49 +00:00
2018-06-01 14:08:54 +00:00
// buffer for serializing link messages
byte_t linkmsg_buffer[MAX_LINK_MSG_SIZE];
2018-09-13 12:04:36 +00:00
/// always maintain this many connections to other routers
size_t minConnectedRouters = 5;
/// hard upperbound limit on the number of router to router connections
size_t maxConnectedRouters = 2000;
int minRequiredRouters = 4;
2018-06-03 13:04:51 +00:00
// should we be sending padded messages every interval?
2018-06-14 20:34:35 +00:00
bool sendPadding = false;
2018-06-03 13:04:51 +00:00
uint32_t ticker_job_id = 0;
2018-06-26 16:23:43 +00:00
llarp::InboundMessageParser inbound_link_msg_parser;
llarp::routing::InboundMessageParser inbound_routing_msg_parser;
llarp::service::Context hiddenServiceContext;
std::unique_ptr< llarp::ILinkLayer > outboundLink;
2018-09-30 11:17:48 +00:00
std::vector< std::unique_ptr< llarp::ILinkLayer > > inboundLinks;
llarp::Profiling routerProfiling;
fs::path routerProfilesFile = "profiles.dat";
typedef std::queue< std::vector< byte_t > > MessageQueue;
2018-06-01 14:08:54 +00:00
/// outbound message queue
std::unordered_map< llarp::RouterID, MessageQueue, llarp::RouterID::Hash >
outboundMessageQueue;
2018-06-01 14:08:54 +00:00
/// loki verified routers
std::unordered_map< llarp::RouterID, llarp::RouterContact,
llarp::RouterID::Hash >
validRouters;
2018-05-30 20:56:47 +00:00
2018-08-14 21:17:18 +00:00
// pending establishing session with routers
2018-09-06 11:46:19 +00:00
std::unordered_map< llarp::RouterID, std::unique_ptr< TryConnectJob >,
llarp::RouterID::Hash >
pendingEstablishJobs;
2018-06-14 17:35:12 +00:00
2018-08-14 21:17:18 +00:00
// sessions to persist -> timestamp to end persist at
std::unordered_map< llarp::RouterID, llarp_time_t, llarp::RouterID::Hash >
m_PersistingSessions;
2018-08-14 21:17:18 +00:00
llarp_router();
2018-06-26 16:23:43 +00:00
virtual ~llarp_router();
2018-02-01 17:06:49 +00:00
2018-09-06 13:16:24 +00:00
void HandleLinkSessionEstablished(llarp::RouterContact);
2018-09-04 19:15:06 +00:00
bool
HandleRecvLinkMessageBuffer(llarp::ILinkSession *from, llarp_buffer_t msg);
void
AddInboundLink(std::unique_ptr< llarp::ILinkLayer > &link);
bool
InitOutboundLink();
2018-06-10 14:05:48 +00:00
/// initialize us as a service node
void
InitServiceNode();
void
Close();
2018-07-09 17:32:11 +00:00
bool
LoadHiddenServiceConfig(const char *fname);
bool
AddHiddenService(const llarp::service::Config::section_t &config);
bool
Ready();
void
Run();
2018-08-14 21:17:18 +00:00
void
PersistSessionUntil(const llarp::RouterID &remote, llarp_time_t until);
static void
ConnectAll(void *user, uint64_t orig, uint64_t left);
bool
EnsureIdentity();
2018-06-10 14:05:48 +00:00
bool
EnsureEncryptionKey();
bool
SaveRC();
2018-02-01 17:06:49 +00:00
2018-06-10 14:05:48 +00:00
const byte_t *
pubkey() const
{
2018-06-10 14:05:48 +00:00
return llarp::seckey_topublic(identity);
}
2018-02-01 17:06:49 +00:00
void
OnConnectTimeout(const llarp::RouterID &remote);
2018-06-14 17:35:12 +00:00
bool
HasPendingConnectJob(const llarp::RouterID &remote);
void
try_connect(fs::path rcfile);
2018-04-05 14:23:14 +00:00
2018-09-17 11:47:34 +00:00
bool
ReloadConfig(const llarp_config *conf);
2018-06-01 14:08:54 +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
2018-06-01 14:08:54 +00:00
bool
2018-06-22 00:25:30 +00:00
SendToOrQueue(const llarp::RouterID &remote, const llarp::ILinkMessage *msg);
2018-06-01 14:08:54 +00:00
2018-06-06 12:46:26 +00:00
/// sendto or drop
void
2018-09-06 13:16:24 +00:00
SendTo(llarp::RouterID remote, const llarp::ILinkMessage *msg,
llarp::ILinkLayer *chosen);
2018-06-06 12:46:26 +00:00
2018-06-01 14:08:54 +00:00
/// manually flush outbound message queue for just 1 router
void
FlushOutboundFor(const llarp::RouterID &remote,
llarp::ILinkLayer *chosen = nullptr);
2018-06-13 12:58:51 +00:00
/// manually discard all pending messages to remote router
void
DiscardOutboundFor(const llarp::RouterID &remote);
2018-08-14 21:17:18 +00:00
/// try establishing a session to a remote router
void
TryEstablishTo(const llarp::RouterID &remote);
2018-06-01 14:08:54 +00:00
/// flush outbound message queue
void
FlushOutbound();
/// called by link when a remote session is expunged
void
SessionClosed(const llarp::RouterID &remote);
2018-06-03 13:04:51 +00:00
/// call internal router ticker
void
Tick();
/// schedule ticker to call i ms from now
void
ScheduleTicker(uint64_t i = 1000);
llarp::ILinkLayer *
2018-07-03 13:33:37 +00:00
GetLinkWithSessionByPubkey(const llarp::RouterID &remote);
2018-09-13 12:04:36 +00:00
void
ConnectToRandomRouters(int N);
2018-09-13 12:04:36 +00:00
size_t
NumberOfConnectedRouters() const;
bool
2018-08-30 18:48:43 +00:00
GetRandomConnectedRouter(llarp::RouterContact &result) const;
2018-05-30 20:56:47 +00:00
void
2018-09-06 11:46:19 +00:00
async_verify_RC(const llarp::RouterContact &rc);
2018-05-30 20:56:47 +00:00
2018-08-30 18:48:43 +00:00
void
HandleDHTLookupForSendTo(llarp::RouterID remote,
const std::vector< llarp::RouterContact > &results);
2018-09-13 12:04:36 +00:00
bool
HasSessionTo(const llarp::RouterID &remote) const;
2018-08-30 18:48:43 +00:00
void
HandleDHTLookupForTryEstablishTo(
llarp::RouterID remote,
2018-08-30 18:48:43 +00:00
const std::vector< llarp::RouterContact > &results);
2018-05-30 20:56:47 +00:00
static void
on_verify_client_rc(llarp_async_verify_rc *context);
static void
on_verify_server_rc(llarp_async_verify_rc *context);
2018-06-03 13:04:51 +00:00
static void
handle_router_ticker(void *user, uint64_t orig, uint64_t left);
2018-06-13 12:58:51 +00:00
static void
HandleAsyncLoadRCForSendTo(llarp_async_load_rc *async);
2018-02-01 17:07:01 +00:00
};
2018-02-01 17:06:49 +00:00
#endif