|
|
|
@ -1,4 +1,3 @@
|
|
|
|
|
#include "router.hpp"
|
|
|
|
|
#include <llarp/proto.hpp>
|
|
|
|
|
#include <llarp/iwp.hpp>
|
|
|
|
|
#include <llarp/link_message.hpp>
|
|
|
|
@ -9,6 +8,7 @@
|
|
|
|
|
#include "encode.hpp"
|
|
|
|
|
#include "llarp/net.hpp"
|
|
|
|
|
#include "logger.hpp"
|
|
|
|
|
#include "router.hpp"
|
|
|
|
|
#include "str.hpp"
|
|
|
|
|
|
|
|
|
|
#include <fstream>
|
|
|
|
@ -25,7 +25,7 @@ namespace llarp
|
|
|
|
|
|
|
|
|
|
struct async_verify_context
|
|
|
|
|
{
|
|
|
|
|
llarp_router *router;
|
|
|
|
|
Router *router;
|
|
|
|
|
TryConnectJob *establish_job;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
@ -35,10 +35,10 @@ struct TryConnectJob
|
|
|
|
|
{
|
|
|
|
|
llarp::RouterContact rc;
|
|
|
|
|
llarp::ILinkLayer *link;
|
|
|
|
|
llarp_router *router;
|
|
|
|
|
llarp::Router *router;
|
|
|
|
|
uint16_t triesLeft;
|
|
|
|
|
TryConnectJob(const llarp::RouterContact &remote, llarp::ILinkLayer *l,
|
|
|
|
|
uint16_t tries, llarp_router *r)
|
|
|
|
|
uint16_t tries, llarp::Router *r)
|
|
|
|
|
: rc(remote), link(l), router(r), triesLeft(tries)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
@ -98,7 +98,7 @@ on_try_connecting(void *u)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
llarp_router_try_connect(struct llarp_router *router,
|
|
|
|
|
llarp_router_try_connect(llarp::Router *router,
|
|
|
|
|
const llarp::RouterContact &remote,
|
|
|
|
|
uint16_t numretries)
|
|
|
|
|
{
|
|
|
|
@ -119,15 +119,77 @@ llarp_router_try_connect(struct llarp_router *router,
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
llarp_findOrCreateIdentity(llarp_crypto *crypto, const char *fpath,
|
|
|
|
|
byte_t *secretkey)
|
|
|
|
|
{
|
|
|
|
|
llarp::LogDebug("find or create ", fpath);
|
|
|
|
|
fs::path path(fpath);
|
|
|
|
|
std::error_code ec;
|
|
|
|
|
if(!fs::exists(path, ec))
|
|
|
|
|
{
|
|
|
|
|
llarp::LogInfo("generating new identity key");
|
|
|
|
|
crypto->identity_keygen(secretkey);
|
|
|
|
|
std::ofstream f(path.string(), std::ios::binary);
|
|
|
|
|
if(f.is_open())
|
|
|
|
|
{
|
|
|
|
|
f.write((char *)secretkey, SECKEYSIZE);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
std::ifstream f(path.string(), std::ios::binary);
|
|
|
|
|
if(f.is_open())
|
|
|
|
|
{
|
|
|
|
|
f.read((char *)secretkey, SECKEYSIZE);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
llarp::LogInfo("failed to get identity key");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// C++ ...
|
|
|
|
|
bool
|
|
|
|
|
llarp_findOrCreateEncryption(llarp_crypto *crypto, const char *fpath,
|
|
|
|
|
llarp::SecretKey &encryption)
|
|
|
|
|
{
|
|
|
|
|
llarp::LogDebug("find or create ", fpath);
|
|
|
|
|
fs::path path(fpath);
|
|
|
|
|
std::error_code ec;
|
|
|
|
|
if(!fs::exists(path, ec))
|
|
|
|
|
{
|
|
|
|
|
llarp::LogInfo("generating new encryption key");
|
|
|
|
|
crypto->encryption_keygen(encryption);
|
|
|
|
|
std::ofstream f(path.string(), std::ios::binary);
|
|
|
|
|
if(f.is_open())
|
|
|
|
|
{
|
|
|
|
|
f.write((char *)encryption.data(), SECKEYSIZE);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::ifstream f(path.string(), std::ios::binary);
|
|
|
|
|
if(f.is_open())
|
|
|
|
|
{
|
|
|
|
|
f.read((char *)encryption.data(), SECKEYSIZE);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
llarp::LogInfo("failed to get encryption key");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
namespace llarp
|
|
|
|
|
{
|
|
|
|
|
void
|
|
|
|
|
llarp_router::HandleLinkSessionEstablished(llarp::RouterContact rc,
|
|
|
|
|
Router::HandleLinkSessionEstablished(llarp::RouterContact rc,
|
|
|
|
|
llarp::ILinkLayer *link)
|
|
|
|
|
{
|
|
|
|
|
async_verify_RC(rc, link);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
llarp_router::llarp_router()
|
|
|
|
|
Router::Router(struct llarp_threadpool *_tp, struct llarp_ev_loop *_netloop,
|
|
|
|
|
llarp::Logic *_logic)
|
|
|
|
|
: ready(false)
|
|
|
|
|
, netloop(_netloop)
|
|
|
|
|
, tp(_tp)
|
|
|
|
|
, logic(_logic)
|
|
|
|
|
, paths(this)
|
|
|
|
|
, exitContext(this)
|
|
|
|
|
, dht(llarp_dht_context_new(this))
|
|
|
|
@ -138,15 +200,22 @@ llarp_router::llarp_router()
|
|
|
|
|
// set rational defaults
|
|
|
|
|
this->ip4addr.sin_family = AF_INET;
|
|
|
|
|
this->ip4addr.sin_port = htons(1090);
|
|
|
|
|
|
|
|
|
|
#ifdef TESTNET
|
|
|
|
|
disk = tp;
|
|
|
|
|
#else
|
|
|
|
|
disk = llarp_init_threadpool(1, "llarp-diskio");
|
|
|
|
|
#endif
|
|
|
|
|
llarp_crypto_init(&crypto);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
llarp_router::~llarp_router()
|
|
|
|
|
Router::~Router()
|
|
|
|
|
{
|
|
|
|
|
llarp_dht_context_free(dht);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
llarp_router::HandleRecvLinkMessageBuffer(llarp::ILinkSession *session,
|
|
|
|
|
Router::HandleRecvLinkMessageBuffer(llarp::ILinkSession *session,
|
|
|
|
|
llarp_buffer_t buf)
|
|
|
|
|
{
|
|
|
|
|
if(!session)
|
|
|
|
@ -158,17 +227,17 @@ llarp_router::HandleRecvLinkMessageBuffer(llarp::ILinkSession *session,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
llarp_router::PersistSessionUntil(const llarp::RouterID &remote,
|
|
|
|
|
llarp_time_t until)
|
|
|
|
|
Router::PersistSessionUntil(const llarp::RouterID &remote, llarp_time_t until)
|
|
|
|
|
{
|
|
|
|
|
llarp::LogDebug("persist session to ", remote, " until ", until);
|
|
|
|
|
m_PersistingSessions[remote] = std::max(until, m_PersistingSessions[remote]);
|
|
|
|
|
m_PersistingSessions[remote] =
|
|
|
|
|
std::max(until, m_PersistingSessions[remote]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
constexpr size_t MaxPendingSendQueueSize = 8;
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
llarp_router::SendToOrQueue(const llarp::RouterID &remote,
|
|
|
|
|
Router::SendToOrQueue(const llarp::RouterID &remote,
|
|
|
|
|
const llarp::ILinkMessage *msg)
|
|
|
|
|
{
|
|
|
|
|
for(const auto &link : inboundLinks)
|
|
|
|
@ -223,18 +292,20 @@ llarp_router::SendToOrQueue(const llarp::RouterID &remote,
|
|
|
|
|
|
|
|
|
|
// we don't have the RC locally so do a dht lookup
|
|
|
|
|
dht->impl.LookupRouter(remote,
|
|
|
|
|
std::bind(&llarp_router::HandleDHTLookupForSendTo,
|
|
|
|
|
this, remote, std::placeholders::_1));
|
|
|
|
|
std::bind(&Router::HandleDHTLookupForSendTo, this,
|
|
|
|
|
remote, std::placeholders::_1));
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
llarp_router::HandleDHTLookupForSendTo(
|
|
|
|
|
llarp::RouterID remote, const std::vector< llarp::RouterContact > &results)
|
|
|
|
|
Router::HandleDHTLookupForSendTo(
|
|
|
|
|
llarp::RouterID remote,
|
|
|
|
|
const std::vector< llarp::RouterContact > &results)
|
|
|
|
|
{
|
|
|
|
|
if(results.size())
|
|
|
|
|
{
|
|
|
|
|
if(whitelistRouters && lokinetRouters.find(remote) == lokinetRouters.end())
|
|
|
|
|
if(whitelistRouters
|
|
|
|
|
&& lokinetRouters.find(remote) == lokinetRouters.end())
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
@ -251,7 +322,7 @@ llarp_router::HandleDHTLookupForSendTo(
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
llarp_router::ForEachPeer(
|
|
|
|
|
Router::ForEachPeer(
|
|
|
|
|
std::function< void(const llarp::ILinkSession *, bool) > visit) const
|
|
|
|
|
{
|
|
|
|
|
outboundLink->ForEachSession(
|
|
|
|
@ -264,7 +335,7 @@ llarp_router::ForEachPeer(
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
llarp_router::try_connect(fs::path rcfile)
|
|
|
|
|
Router::try_connect(fs::path rcfile)
|
|
|
|
|
{
|
|
|
|
|
llarp::RouterContact remote;
|
|
|
|
|
if(!remote.Read(rcfile.string().c_str()))
|
|
|
|
@ -291,7 +362,7 @@ llarp_router::try_connect(fs::path rcfile)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
llarp_router::EnsureIdentity()
|
|
|
|
|
Router::EnsureIdentity()
|
|
|
|
|
{
|
|
|
|
|
if(!EnsureEncryptionKey())
|
|
|
|
|
return false;
|
|
|
|
@ -300,26 +371,42 @@ llarp_router::EnsureIdentity()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
llarp_router::EnsureEncryptionKey()
|
|
|
|
|
Router::EnsureEncryptionKey()
|
|
|
|
|
{
|
|
|
|
|
return llarp_findOrCreateEncryption(
|
|
|
|
|
&crypto, encryption_keyfile.string().c_str(), encryption);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
llarp_router::AddInboundLink(std::unique_ptr< llarp::ILinkLayer > &link)
|
|
|
|
|
Router::AddInboundLink(std::unique_ptr< llarp::ILinkLayer > &link)
|
|
|
|
|
{
|
|
|
|
|
inboundLinks.push_back(std::move(link));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
llarp_router::Ready()
|
|
|
|
|
Router::Configure(struct llarp_config *conf)
|
|
|
|
|
{
|
|
|
|
|
llarp_config_iterator iter;
|
|
|
|
|
iter.user = this;
|
|
|
|
|
iter.visit = llarp::router_iter_config;
|
|
|
|
|
llarp_config_iter(conf, &iter);
|
|
|
|
|
if(!InitOutboundLink())
|
|
|
|
|
return false;
|
|
|
|
|
if(!Ready())
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
return EnsureIdentity();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
Router::Ready()
|
|
|
|
|
{
|
|
|
|
|
return outboundLink != nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
llarp_router::SaveRC()
|
|
|
|
|
Router::SaveRC()
|
|
|
|
|
{
|
|
|
|
|
llarp::LogDebug("verify RC signature");
|
|
|
|
|
if(!rc().Verify(&crypto))
|
|
|
|
@ -332,13 +419,13 @@ llarp_router::SaveRC()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
llarp_router::IsServiceNode() const
|
|
|
|
|
Router::IsServiceNode() const
|
|
|
|
|
{
|
|
|
|
|
return inboundLinks.size() > 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
llarp_router::Close()
|
|
|
|
|
Router::Close()
|
|
|
|
|
{
|
|
|
|
|
for(const auto &link : inboundLinks)
|
|
|
|
|
{
|
|
|
|
@ -353,7 +440,7 @@ llarp_router::Close()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
llarp_router::on_verify_client_rc(llarp_async_verify_rc *job)
|
|
|
|
|
Router::on_verify_client_rc(llarp_async_verify_rc *job)
|
|
|
|
|
{
|
|
|
|
|
llarp::async_verify_context *ctx =
|
|
|
|
|
static_cast< llarp::async_verify_context * >(job->user);
|
|
|
|
@ -366,7 +453,7 @@ llarp_router::on_verify_client_rc(llarp_async_verify_rc *job)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
llarp_router::on_verify_server_rc(llarp_async_verify_rc *job)
|
|
|
|
|
Router::on_verify_server_rc(llarp_async_verify_rc *job)
|
|
|
|
|
{
|
|
|
|
|
llarp::async_verify_context *ctx =
|
|
|
|
|
static_cast< llarp::async_verify_context * >(job->user);
|
|
|
|
@ -416,18 +503,18 @@ llarp_router::on_verify_server_rc(llarp_async_verify_rc *job)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
llarp_router::handle_router_ticker(void *user, uint64_t orig, uint64_t left)
|
|
|
|
|
Router::handle_router_ticker(void *user, uint64_t orig, uint64_t left)
|
|
|
|
|
{
|
|
|
|
|
if(left)
|
|
|
|
|
return;
|
|
|
|
|
llarp_router *self = static_cast< llarp_router * >(user);
|
|
|
|
|
Router *self = static_cast< Router * >(user);
|
|
|
|
|
self->ticker_job_id = 0;
|
|
|
|
|
self->Tick();
|
|
|
|
|
self->ScheduleTicker(orig);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
llarp_router::ConnectionToRouterAllowed(const llarp::RouterID &router) const
|
|
|
|
|
Router::ConnectionToRouterAllowed(const llarp::RouterID &router) const
|
|
|
|
|
{
|
|
|
|
|
if(strictConnectPubkeys.size() && strictConnectPubkeys.count(router) == 0)
|
|
|
|
|
return false;
|
|
|
|
@ -438,8 +525,9 @@ llarp_router::ConnectionToRouterAllowed(const llarp::RouterID &router) const
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
llarp_router::HandleDHTLookupForExplore(
|
|
|
|
|
llarp::RouterID remote, const std::vector< llarp::RouterContact > &results)
|
|
|
|
|
Router::HandleDHTLookupForExplore(
|
|
|
|
|
llarp::RouterID remote,
|
|
|
|
|
const std::vector< llarp::RouterContact > &results)
|
|
|
|
|
{
|
|
|
|
|
if(results.size() == 0)
|
|
|
|
|
return;
|
|
|
|
@ -457,7 +545,7 @@ llarp_router::HandleDHTLookupForExplore(
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
llarp_router::TryEstablishTo(const llarp::RouterID &remote)
|
|
|
|
|
Router::TryEstablishTo(const llarp::RouterID &remote)
|
|
|
|
|
{
|
|
|
|
|
if(!ConnectionToRouterAllowed(remote))
|
|
|
|
|
{
|
|
|
|
@ -480,7 +568,7 @@ llarp_router::TryEstablishTo(const llarp::RouterID &remote)
|
|
|
|
|
// dht lookup as we don't know it
|
|
|
|
|
dht->impl.LookupRouter(
|
|
|
|
|
remote,
|
|
|
|
|
std::bind(&llarp_router::HandleDHTLookupForTryEstablishTo, this, remote,
|
|
|
|
|
std::bind(&Router::HandleDHTLookupForTryEstablishTo, this, remote,
|
|
|
|
|
std::placeholders::_1));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
@ -490,7 +578,7 @@ llarp_router::TryEstablishTo(const llarp::RouterID &remote)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
llarp_router::OnConnectTimeout(const llarp::RouterID &remote)
|
|
|
|
|
Router::OnConnectTimeout(const llarp::RouterID &remote)
|
|
|
|
|
{
|
|
|
|
|
auto itr = pendingEstablishJobs.find(remote);
|
|
|
|
|
if(itr != pendingEstablishJobs.end())
|
|
|
|
@ -500,8 +588,9 @@ llarp_router::OnConnectTimeout(const llarp::RouterID &remote)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
llarp_router::HandleDHTLookupForTryEstablishTo(
|
|
|
|
|
llarp::RouterID remote, const std::vector< llarp::RouterContact > &results)
|
|
|
|
|
Router::HandleDHTLookupForTryEstablishTo(
|
|
|
|
|
llarp::RouterID remote,
|
|
|
|
|
const std::vector< llarp::RouterContact > &results)
|
|
|
|
|
{
|
|
|
|
|
if(results.size() == 0)
|
|
|
|
|
{
|
|
|
|
@ -519,13 +608,13 @@ llarp_router::HandleDHTLookupForTryEstablishTo(
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
size_t
|
|
|
|
|
llarp_router::NumberOfConnectedRouters() const
|
|
|
|
|
Router::NumberOfConnectedRouters() const
|
|
|
|
|
{
|
|
|
|
|
return validRouters.size();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
llarp_router::Tick()
|
|
|
|
|
Router::Tick()
|
|
|
|
|
{
|
|
|
|
|
// llarp::LogDebug("tick router");
|
|
|
|
|
auto now = llarp_ev_loop_time_now_ms(netloop);
|
|
|
|
@ -590,7 +679,7 @@ llarp_router::Tick()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
llarp_router::SendTo(llarp::RouterID remote, const llarp::ILinkMessage *msg,
|
|
|
|
|
Router::SendTo(llarp::RouterID remote, const llarp::ILinkMessage *msg,
|
|
|
|
|
llarp::ILinkLayer *selected)
|
|
|
|
|
{
|
|
|
|
|
llarp_buffer_t buf =
|
|
|
|
@ -627,13 +716,13 @@ llarp_router::SendTo(llarp::RouterID remote, const llarp::ILinkMessage *msg,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
llarp_router::ScheduleTicker(uint64_t ms)
|
|
|
|
|
Router::ScheduleTicker(uint64_t ms)
|
|
|
|
|
{
|
|
|
|
|
ticker_job_id = logic->call_later({ms, this, &handle_router_ticker});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
llarp_router::SessionClosed(const llarp::RouterID &remote)
|
|
|
|
|
Router::SessionClosed(const llarp::RouterID &remote)
|
|
|
|
|
{
|
|
|
|
|
__llarp_dht_remove_peer(dht, remote);
|
|
|
|
|
// remove from valid routers if it's a valid router
|
|
|
|
@ -642,7 +731,7 @@ llarp_router::SessionClosed(const llarp::RouterID &remote)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
llarp::ILinkLayer *
|
|
|
|
|
llarp_router::GetLinkWithSessionByPubkey(const llarp::RouterID &pubkey)
|
|
|
|
|
Router::GetLinkWithSessionByPubkey(const llarp::RouterID &pubkey)
|
|
|
|
|
{
|
|
|
|
|
if(outboundLink->HasSessionTo(pubkey))
|
|
|
|
|
return outboundLink.get();
|
|
|
|
@ -655,8 +744,7 @@ llarp_router::GetLinkWithSessionByPubkey(const llarp::RouterID &pubkey)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
llarp_router::FlushOutboundFor(llarp::RouterID remote,
|
|
|
|
|
llarp::ILinkLayer *chosen)
|
|
|
|
|
Router::FlushOutboundFor(llarp::RouterID remote, llarp::ILinkLayer *chosen)
|
|
|
|
|
{
|
|
|
|
|
llarp::LogDebug("Flush outbound for ", remote);
|
|
|
|
|
|
|
|
|
@ -685,13 +773,13 @@ llarp_router::FlushOutboundFor(llarp::RouterID remote,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
llarp_router::DiscardOutboundFor(const llarp::RouterID &remote)
|
|
|
|
|
Router::DiscardOutboundFor(const llarp::RouterID &remote)
|
|
|
|
|
{
|
|
|
|
|
outboundMessageQueue.erase(remote);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
llarp_router::GetRandomConnectedRouter(llarp::RouterContact &result) const
|
|
|
|
|
Router::GetRandomConnectedRouter(llarp::RouterContact &result) const
|
|
|
|
|
{
|
|
|
|
|
auto sz = validRouters.size();
|
|
|
|
|
if(sz)
|
|
|
|
@ -706,7 +794,7 @@ llarp_router::GetRandomConnectedRouter(llarp::RouterContact &result) const
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
llarp_router::async_verify_RC(const llarp::RouterContact &rc,
|
|
|
|
|
Router::async_verify_RC(const llarp::RouterContact &rc,
|
|
|
|
|
llarp::ILinkLayer *link)
|
|
|
|
|
{
|
|
|
|
|
if(pendingVerifyRC.count(rc.pubkey))
|
|
|
|
@ -740,16 +828,18 @@ llarp_router::async_verify_RC(const llarp::RouterContact &rc,
|
|
|
|
|
job->cryptoworker = tp;
|
|
|
|
|
job->diskworker = disk;
|
|
|
|
|
if(rc.IsPublicRouter())
|
|
|
|
|
job->hook = &llarp_router::on_verify_server_rc;
|
|
|
|
|
job->hook = &Router::on_verify_server_rc;
|
|
|
|
|
else
|
|
|
|
|
job->hook = &llarp_router::on_verify_client_rc;
|
|
|
|
|
job->hook = &Router::on_verify_client_rc;
|
|
|
|
|
|
|
|
|
|
llarp_nodedb_async_verify(job);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
llarp_router::Run()
|
|
|
|
|
Router::Run(struct llarp_nodedb *nodedb)
|
|
|
|
|
{
|
|
|
|
|
this->nodedb = nodedb;
|
|
|
|
|
|
|
|
|
|
if(enableRPCServer)
|
|
|
|
|
{
|
|
|
|
|
if(rpcBindAddr.empty())
|
|
|
|
@ -925,26 +1015,24 @@ llarp_router::Run()
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
llarp_router::InitServiceNode()
|
|
|
|
|
void
|
|
|
|
|
Router::Stop()
|
|
|
|
|
{
|
|
|
|
|
llarp::LogInfo("accepting transit traffic");
|
|
|
|
|
paths.AllowTransit();
|
|
|
|
|
llarp_dht_allow_transit(dht);
|
|
|
|
|
return exitContext.AddExitEndpoint("default-connectivity", netConfig);
|
|
|
|
|
this->Close();
|
|
|
|
|
this->routerProfiling.Save(this->routerProfilesFile.c_str());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
llarp_router::HasSessionTo(const llarp::RouterID &remote) const
|
|
|
|
|
Router::HasSessionTo(const llarp::RouterID &remote) const
|
|
|
|
|
{
|
|
|
|
|
return validRouters.find(remote) != validRouters.end();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
llarp_router::ConnectToRandomRouters(int want)
|
|
|
|
|
Router::ConnectToRandomRouters(int want)
|
|
|
|
|
{
|
|
|
|
|
int wanted = want;
|
|
|
|
|
llarp_router *self = this;
|
|
|
|
|
Router *self = this;
|
|
|
|
|
llarp_nodedb_visit_loaded(
|
|
|
|
|
self->nodedb, [self, &want](const llarp::RouterContact &other) -> bool {
|
|
|
|
|
// check if we really want to
|
|
|
|
@ -965,14 +1053,23 @@ llarp_router::ConnectToRandomRouters(int want)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
llarp_router::ReloadConfig(__attribute__((unused)) const llarp_config *conf)
|
|
|
|
|
Router::InitServiceNode()
|
|
|
|
|
{
|
|
|
|
|
llarp::LogInfo("accepting transit traffic");
|
|
|
|
|
paths.AllowTransit();
|
|
|
|
|
llarp_dht_allow_transit(dht);
|
|
|
|
|
return exitContext.AddExitEndpoint("default-connectivity", netConfig);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
Router::ReloadConfig(__attribute__((unused)) const llarp_config *conf)
|
|
|
|
|
{
|
|
|
|
|
// TODO: implement me
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
llarp_router::InitOutboundLink()
|
|
|
|
|
Router::InitOutboundLink()
|
|
|
|
|
{
|
|
|
|
|
if(outboundLink)
|
|
|
|
|
return true;
|
|
|
|
@ -1000,7 +1097,7 @@ llarp_router::InitOutboundLink()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
llarp_router::CreateDefaultHiddenService()
|
|
|
|
|
Router::CreateDefaultHiddenService()
|
|
|
|
|
{
|
|
|
|
|
// fallback defaults
|
|
|
|
|
static const std::unordered_map< std::string,
|
|
|
|
@ -1025,133 +1122,13 @@ llarp_router::CreateDefaultHiddenService()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
llarp_router::HasPendingConnectJob(const llarp::RouterID &remote)
|
|
|
|
|
Router::HasPendingConnectJob(const llarp::RouterID &remote)
|
|
|
|
|
{
|
|
|
|
|
return pendingEstablishJobs.find(remote) != pendingEstablishJobs.end();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct llarp_router *
|
|
|
|
|
llarp_init_router(struct llarp_threadpool *tp, struct llarp_ev_loop *netloop,
|
|
|
|
|
llarp::Logic *logic)
|
|
|
|
|
{
|
|
|
|
|
llarp_router *router = new llarp_router();
|
|
|
|
|
if(router)
|
|
|
|
|
{
|
|
|
|
|
router->netloop = netloop;
|
|
|
|
|
router->tp = tp;
|
|
|
|
|
router->logic = logic;
|
|
|
|
|
// TODO: make disk io threadpool count configurable (?)
|
|
|
|
|
#ifdef TESTNET
|
|
|
|
|
router->disk = tp;
|
|
|
|
|
#else
|
|
|
|
|
router->disk = llarp_init_threadpool(1, "llarp-diskio");
|
|
|
|
|
#endif
|
|
|
|
|
llarp_crypto_init(&router->crypto);
|
|
|
|
|
}
|
|
|
|
|
return router;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
llarp_configure_router(struct llarp_router *router, struct llarp_config *conf)
|
|
|
|
|
{
|
|
|
|
|
llarp_config_iterator iter;
|
|
|
|
|
iter.user = router;
|
|
|
|
|
iter.visit = llarp::router_iter_config;
|
|
|
|
|
llarp_config_iter(conf, &iter);
|
|
|
|
|
if(!router->InitOutboundLink())
|
|
|
|
|
return false;
|
|
|
|
|
if(!router->Ready())
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
return router->EnsureIdentity();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
llarp_run_router(struct llarp_router *router, struct llarp_nodedb *nodedb)
|
|
|
|
|
{
|
|
|
|
|
router->nodedb = nodedb;
|
|
|
|
|
return router->Run();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
llarp_stop_router(struct llarp_router *router)
|
|
|
|
|
{
|
|
|
|
|
if(router)
|
|
|
|
|
{
|
|
|
|
|
router->Close();
|
|
|
|
|
router->routerProfiling.Save(router->routerProfilesFile.c_str());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
llarp_free_router(struct llarp_router **router)
|
|
|
|
|
{
|
|
|
|
|
if(*router)
|
|
|
|
|
{
|
|
|
|
|
delete *router;
|
|
|
|
|
}
|
|
|
|
|
*router = nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
llarp_findOrCreateIdentity(llarp_crypto *crypto, const char *fpath,
|
|
|
|
|
byte_t *secretkey)
|
|
|
|
|
{
|
|
|
|
|
llarp::LogDebug("find or create ", fpath);
|
|
|
|
|
fs::path path(fpath);
|
|
|
|
|
std::error_code ec;
|
|
|
|
|
if(!fs::exists(path, ec))
|
|
|
|
|
{
|
|
|
|
|
llarp::LogInfo("generating new identity key");
|
|
|
|
|
crypto->identity_keygen(secretkey);
|
|
|
|
|
std::ofstream f(path.string(), std::ios::binary);
|
|
|
|
|
if(f.is_open())
|
|
|
|
|
{
|
|
|
|
|
f.write((char *)secretkey, SECKEYSIZE);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
std::ifstream f(path.string(), std::ios::binary);
|
|
|
|
|
if(f.is_open())
|
|
|
|
|
{
|
|
|
|
|
f.read((char *)secretkey, SECKEYSIZE);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
llarp::LogInfo("failed to get identity key");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// C++ ...
|
|
|
|
|
bool
|
|
|
|
|
llarp_findOrCreateEncryption(llarp_crypto *crypto, const char *fpath,
|
|
|
|
|
llarp::SecretKey &encryption)
|
|
|
|
|
{
|
|
|
|
|
llarp::LogDebug("find or create ", fpath);
|
|
|
|
|
fs::path path(fpath);
|
|
|
|
|
std::error_code ec;
|
|
|
|
|
if(!fs::exists(path, ec))
|
|
|
|
|
{
|
|
|
|
|
llarp::LogInfo("generating new encryption key");
|
|
|
|
|
crypto->encryption_keygen(encryption);
|
|
|
|
|
std::ofstream f(path.string(), std::ios::binary);
|
|
|
|
|
if(f.is_open())
|
|
|
|
|
{
|
|
|
|
|
f.write((char *)encryption.data(), SECKEYSIZE);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::ifstream f(path.string(), std::ios::binary);
|
|
|
|
|
if(f.is_open())
|
|
|
|
|
{
|
|
|
|
|
f.read((char *)encryption.data(), SECKEYSIZE);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
llarp::LogInfo("failed to get encryption key");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
llarp_router::LoadHiddenServiceConfig(const char *fname)
|
|
|
|
|
Router::LoadHiddenServiceConfig(const char *fname)
|
|
|
|
|
{
|
|
|
|
|
llarp::LogDebug("opening hidden service config ", fname);
|
|
|
|
|
llarp::service::Config conf;
|
|
|
|
@ -1168,14 +1145,12 @@ llarp_router::LoadHiddenServiceConfig(const char *fname)
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
namespace llarp
|
|
|
|
|
{
|
|
|
|
|
void
|
|
|
|
|
router_iter_config(llarp_config_iterator *iter, const char *section,
|
|
|
|
|
const char *key, const char *val)
|
|
|
|
|
{
|
|
|
|
|
llarp::LogDebug(section, " ", key, "=", val);
|
|
|
|
|
llarp_router *self = static_cast< llarp_router * >(iter->user);
|
|
|
|
|
Router *self = static_cast< Router * >(iter->user);
|
|
|
|
|
|
|
|
|
|
int af;
|
|
|
|
|
uint16_t proto;
|
|
|
|
|