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

182 lines
3.7 KiB
C++
Raw Normal View History

2018-02-01 18:06:49 +01:00
#ifndef LLARP_ROUTER_HPP
#define LLARP_ROUTER_HPP
2018-06-01 16:08:54 +02:00
#include <llarp/dht.h>
2018-02-01 18:06:49 +01:00
#include <llarp/link.h>
2018-05-30 22:56:47 +02:00
#include <llarp/nodedb.h>
#include <llarp/path.h>
2018-02-01 18:07:01 +01:00
#include <llarp/router.h>
2018-05-20 19:45:47 +02:00
#include <llarp/router_contact.h>
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>
2018-05-30 22:56:47 +02:00
#include <unordered_map>
2018-02-01 18:06:49 +01:00
2018-06-01 16:08:54 +02:00
#include <llarp/dht.hpp>
#include <llarp/link_message.hpp>
#include "crypto.hpp"
2018-05-20 19:45:47 +02:00
#include "fs.hpp"
#include "mem.hpp"
2018-02-01 18:06:49 +01:00
namespace llarp
{
struct try_connect_ctx
{
llarp_router *router = nullptr;
llarp_ai addr;
};
2018-02-01 18:06:49 +01:00
2018-02-01 18:07:01 +01:00
} // namespace llarp
2018-02-01 18:06:49 +01:00
struct llarp_router
{
2018-04-05 16:23:14 +02:00
bool ready;
2018-05-20 19:45:47 +02: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 19:45:47 +02:00
// long term identity key
fs::path ident_keyfile = "identity.key";
2018-05-20 19:45:47 +02:00
// path to write our self signed rc to
fs::path our_rc_file = "rc.signed";
// our router contact
2018-05-20 19:45:47 +02:00
llarp_rc rc;
llarp_ev_loop *netloop;
2018-05-18 22:08:57 +02:00
llarp_threadpool *tp;
llarp_logic *logic;
2018-02-01 18:07:01 +01:00
llarp_crypto crypto;
llarp_path_context *paths;
2018-05-20 19:45:47 +02:00
llarp_seckey_t identity;
2018-05-30 22:56:47 +02:00
llarp_threadpool *disk;
2018-06-01 16:08:54 +02:00
llarp_dht_context *dht;
2018-05-30 22:56:47 +02:00
llarp_nodedb *nodedb;
2018-02-01 18:06:49 +01:00
2018-06-01 16:08:54 +02:00
// buffer for serializing link messages
byte_t linkmsg_buffer[MAX_LINK_MSG_SIZE];
2018-06-03 15:04:51 +02:00
// should we be sending padded messages every interval?
bool sendPadding = false;
uint32_t ticker_job_id = 0;
2018-06-01 16:08:54 +02:00
llarp::InboundMessageParser inbound_msg_parser;
llarp_link *outboundLink = nullptr;
std::list< llarp_link * > inboundLinks;
2018-06-01 16:08:54 +02:00
typedef std::queue< llarp::ILinkMessage * > MessageQueue;
2018-06-01 16:08:54 +02:00
/// outbound message queue
std::unordered_map< llarp::pubkey, MessageQueue, llarp::pubkeyhash >
outboundMesssageQueue;
/// loki verified routers
2018-05-30 22:56:47 +02:00
std::unordered_map< llarp::pubkey, llarp_rc, llarp::pubkeyhash > validRouters;
llarp_router();
2018-02-01 18:07:01 +01:00
~llarp_router();
2018-02-01 18:06:49 +01:00
bool
HandleRecvLinkMessage(struct llarp_link_session *from, llarp_buffer_t msg);
void
AddInboundLink(struct llarp_link *link);
bool
InitOutboundLink();
void
Close();
bool
Ready();
void
Run();
static void
ConnectAll(void *user, uint64_t orig, uint64_t left);
bool
EnsureIdentity();
bool
SaveRC();
2018-02-01 18:06:49 +01:00
uint8_t *
pubkey()
{
return llarp_seckey_topublic(identity);
}
2018-02-01 18:06:49 +01:00
void
try_connect(fs::path rcfile);
2018-04-05 16:23:14 +02:00
2018-06-01 16:08:54 +02:00
/// send to remote router or queue for sending
/// returns false on overflow
/// returns true on successful queue
bool
SendToOrQueue(const llarp::RouterID &remote,
std::vector< llarp::ILinkMessage * > msgs);
2018-06-06 14:46:26 +02:00
/// sendto or drop
void
SendTo(llarp::RouterID remote, llarp::ILinkMessage *msg);
2018-06-01 16:08:54 +02:00
/// manually flush outbound message queue for just 1 router
void
FlushOutboundFor(const llarp::RouterID &remote, llarp_link *chosen);
2018-06-01 16:08:54 +02: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 15:04:51 +02:00
/// call internal router ticker
void
Tick();
/// schedule ticker to call i ms from now
void
ScheduleTicker(uint64_t i = 1000);
2018-05-30 22:56:47 +02:00
void
async_verify_RC(llarp_link_session *session, bool isExpectingClient,
llarp_link_establish_job *job = nullptr);
static bool
iter_try_connect(llarp_router_link_iter *i, llarp_router *router,
llarp_link *l);
2018-05-20 19:45:47 +02:00
static void
on_try_connect_result(llarp_link_establish_job *job);
2018-05-29 15:40:26 +02:00
static void
connect_job_retry(void *user);
2018-05-30 22:56:47 +02: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 15:04:51 +02:00
static void
handle_router_ticker(void *user, uint64_t orig, uint64_t left);
static bool
send_padded_message(struct llarp_link_session_iter *itr,
struct llarp_link_session *peer);
2018-02-01 18:07:01 +01:00
};
2018-02-01 18:06:49 +01:00
#endif