|
|
|
@ -66,8 +66,11 @@ struct TryConnectJob
|
|
|
|
|
Attempt();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if(router->routerProfiling.IsBad(rc.pubkey))
|
|
|
|
|
llarp_nodedb_del_rc(router->nodedb, rc.pubkey);
|
|
|
|
|
if(!router->IsServiceNode())
|
|
|
|
|
{
|
|
|
|
|
if(router->routerProfiling.IsBad(rc.pubkey))
|
|
|
|
|
llarp_nodedb_del_rc(router->nodedb, rc.pubkey);
|
|
|
|
|
}
|
|
|
|
|
// delete this
|
|
|
|
|
router->pendingEstablishJobs.erase(rc.pubkey);
|
|
|
|
|
}
|
|
|
|
@ -76,7 +79,9 @@ struct TryConnectJob
|
|
|
|
|
Attempt()
|
|
|
|
|
{
|
|
|
|
|
--triesLeft;
|
|
|
|
|
link->TryEstablishTo(rc);
|
|
|
|
|
if(!link->TryEstablishTo(rc))
|
|
|
|
|
llarp::LogError("did not attempt connection to ", rc.pubkey,
|
|
|
|
|
" and it has ", rc.addrs.size(), " advertised addresses");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
@ -116,9 +121,10 @@ llarp_router_try_connect(struct llarp_router *router,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
llarp_router::HandleLinkSessionEstablished(llarp::RouterContact rc)
|
|
|
|
|
llarp_router::HandleLinkSessionEstablished(llarp::RouterContact rc,
|
|
|
|
|
llarp::ILinkLayer *link)
|
|
|
|
|
{
|
|
|
|
|
async_verify_RC(rc);
|
|
|
|
|
async_verify_RC(rc, link);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
llarp_router::llarp_router()
|
|
|
|
@ -235,9 +241,15 @@ llarp_router::HandleDHTLookupForSendTo(
|
|
|
|
|
{
|
|
|
|
|
if(results.size())
|
|
|
|
|
{
|
|
|
|
|
llarp_nodedb_put_rc(nodedb, results[0]);
|
|
|
|
|
llarp_router_try_connect(this, results[0], 10);
|
|
|
|
|
async_verify_RC(results[0]);
|
|
|
|
|
if(whitelistRouters && lokinetRouters.find(remote) == lokinetRouters.end())
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if(results[0].Verify(&crypto))
|
|
|
|
|
{
|
|
|
|
|
llarp_nodedb_put_rc(nodedb, results[0]);
|
|
|
|
|
llarp_router_try_connect(this, results[0], 10);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
@ -326,6 +338,12 @@ llarp_router::SaveRC()
|
|
|
|
|
return rc().Write(our_rc_file.string().c_str());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
llarp_router::IsServiceNode() const
|
|
|
|
|
{
|
|
|
|
|
return inboundLinks.size() > 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
llarp_router::Close()
|
|
|
|
|
{
|
|
|
|
@ -363,7 +381,6 @@ llarp_router::on_verify_server_rc(llarp_async_verify_rc *job)
|
|
|
|
|
llarp::PubKey pk(job->rc.pubkey);
|
|
|
|
|
if(!job->valid)
|
|
|
|
|
{
|
|
|
|
|
llarp::LogWarn("invalid server RC");
|
|
|
|
|
if(ctx->establish_job)
|
|
|
|
|
{
|
|
|
|
|
// was an outbound attempt
|
|
|
|
@ -424,7 +441,7 @@ llarp_router::TryEstablishTo(const llarp::RouterID &remote)
|
|
|
|
|
// try connecting async
|
|
|
|
|
llarp_router_try_connect(this, rc, 5);
|
|
|
|
|
}
|
|
|
|
|
else if(!routerProfiling.IsBad(remote))
|
|
|
|
|
else if(IsServiceNode() || !routerProfiling.IsBad(remote))
|
|
|
|
|
{
|
|
|
|
|
if(dht->impl.HasRouterLookup(remote))
|
|
|
|
|
return;
|
|
|
|
@ -457,13 +474,16 @@ llarp_router::HandleDHTLookupForTryEstablishTo(
|
|
|
|
|
{
|
|
|
|
|
if(results.size() == 0)
|
|
|
|
|
{
|
|
|
|
|
routerProfiling.MarkTimeout(remote);
|
|
|
|
|
if(!IsServiceNode())
|
|
|
|
|
routerProfiling.MarkTimeout(remote);
|
|
|
|
|
}
|
|
|
|
|
for(const auto &result : results)
|
|
|
|
|
{
|
|
|
|
|
if(whitelistRouters
|
|
|
|
|
&& lokinetRouters.find(result.pubkey) == lokinetRouters.end())
|
|
|
|
|
continue;
|
|
|
|
|
llarp_nodedb_put_rc(nodedb, result);
|
|
|
|
|
llarp_router_try_connect(this, result, 10);
|
|
|
|
|
async_verify_RC(result);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -525,6 +545,8 @@ llarp_router::Tick()
|
|
|
|
|
}
|
|
|
|
|
paths.TickPaths(now);
|
|
|
|
|
exitContext.Tick(now);
|
|
|
|
|
if(rpcCaller)
|
|
|
|
|
rpcCaller->Tick(now);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
@ -642,7 +664,8 @@ llarp_router::GetRandomConnectedRouter(llarp::RouterContact &result) const
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
llarp_router::async_verify_RC(const llarp::RouterContact &rc)
|
|
|
|
|
llarp_router::async_verify_RC(const llarp::RouterContact &rc,
|
|
|
|
|
llarp::ILinkLayer *link)
|
|
|
|
|
{
|
|
|
|
|
llarp_async_verify_rc *job = new llarp_async_verify_rc();
|
|
|
|
|
llarp::async_verify_context *ctx = new llarp::async_verify_context();
|
|
|
|
@ -667,25 +690,18 @@ llarp_router::async_verify_RC(const llarp::RouterContact &rc)
|
|
|
|
|
job->hook = &llarp_router::on_verify_server_rc;
|
|
|
|
|
else
|
|
|
|
|
job->hook = &llarp_router::on_verify_client_rc;
|
|
|
|
|
if(rpcCaller && rc.IsPublicRouter())
|
|
|
|
|
{
|
|
|
|
|
rpcCaller->VerifyRouter(rc.pubkey, [job](llarp::PubKey pk, bool valid) {
|
|
|
|
|
if(valid)
|
|
|
|
|
{
|
|
|
|
|
llarp::LogDebug("lokid says ", pk, " is valid");
|
|
|
|
|
llarp_nodedb_async_verify(job);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
llarp::LogDebug("lokid says ", pk, " is NOT valid");
|
|
|
|
|
job->hook(job);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
if(rc.IsPublicRouter() && whitelistRouters)
|
|
|
|
|
{
|
|
|
|
|
llarp_nodedb_async_verify(job);
|
|
|
|
|
if(lokinetRouters.find(rc.pubkey) == lokinetRouters.end())
|
|
|
|
|
{
|
|
|
|
|
llarp::LogInfo(rc.pubkey, " is NOT a valid service node, rejecting");
|
|
|
|
|
link->CloseSessionTo(rc.pubkey);
|
|
|
|
|
job->valid = false;
|
|
|
|
|
job->hook(job);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
llarp_nodedb_async_verify(job);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
@ -1271,6 +1287,17 @@ namespace llarp
|
|
|
|
|
llarp::LogWarn("failed to load hidden service config for ", key);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if(StrEq(section, "lokid"))
|
|
|
|
|
{
|
|
|
|
|
if(StrEq(key, "enabled"))
|
|
|
|
|
{
|
|
|
|
|
self->whitelistRouters = IsTrueValue(val);
|
|
|
|
|
}
|
|
|
|
|
if(StrEq(key, "jsonrpc"))
|
|
|
|
|
{
|
|
|
|
|
self->lokidRPCAddr = val;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if(StrEq(section, "dns"))
|
|
|
|
|
{
|
|
|
|
|
if(StrEq(key, "upstream"))
|
|
|
|
|