|
|
|
@ -52,8 +52,13 @@ llarp_router::SendToOrQueue(const llarp::RouterID &remote,
|
|
|
|
|
std::vector< llarp::ILinkMessage * > msgs)
|
|
|
|
|
{
|
|
|
|
|
bool has = false;
|
|
|
|
|
for(auto &link : links)
|
|
|
|
|
for(auto &item : links)
|
|
|
|
|
{
|
|
|
|
|
if(!item.second)
|
|
|
|
|
continue;
|
|
|
|
|
auto link = item.first;
|
|
|
|
|
has |= link->has_session_to(link, remote);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(!has)
|
|
|
|
|
{
|
|
|
|
@ -147,9 +152,9 @@ llarp_router::EnsureIdentity()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
llarp_router::AddLink(struct llarp_link *link)
|
|
|
|
|
llarp_router::AddLink(struct llarp_link *link, bool isOutbound)
|
|
|
|
|
{
|
|
|
|
|
links.push_back(link);
|
|
|
|
|
links.push_back({link, isOutbound});
|
|
|
|
|
ready = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -189,8 +194,9 @@ llarp_router::SaveRC()
|
|
|
|
|
void
|
|
|
|
|
llarp_router::Close()
|
|
|
|
|
{
|
|
|
|
|
for(auto &link : links)
|
|
|
|
|
for(auto &pair : links)
|
|
|
|
|
{
|
|
|
|
|
auto link = pair.first;
|
|
|
|
|
link->stop_link(link);
|
|
|
|
|
link->free_impl(link);
|
|
|
|
|
delete link;
|
|
|
|
@ -204,7 +210,8 @@ llarp_router::connect_job_retry(void *user)
|
|
|
|
|
llarp_link_establish_job *job =
|
|
|
|
|
static_cast< llarp_link_establish_job * >(user);
|
|
|
|
|
|
|
|
|
|
llarp::Info("trying to establish session again");
|
|
|
|
|
llarp::Addr remote = job->ai;
|
|
|
|
|
llarp::Info("trying to establish session again with ", remote);
|
|
|
|
|
job->link->try_establish(job->link, job);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -286,8 +293,11 @@ llarp_router::Tick()
|
|
|
|
|
iter.visit = &send_padded_message;
|
|
|
|
|
if(sendPadding)
|
|
|
|
|
{
|
|
|
|
|
for(auto link : links)
|
|
|
|
|
for(auto &item : links)
|
|
|
|
|
{
|
|
|
|
|
if(!item.second)
|
|
|
|
|
continue;
|
|
|
|
|
auto link = item.first;
|
|
|
|
|
link->iter_sessions(link, iter);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -325,11 +335,14 @@ llarp_router::SendTo(llarp::RouterID remote, llarp::ILinkMessage *msg)
|
|
|
|
|
buf.cur = buf.base;
|
|
|
|
|
|
|
|
|
|
bool sent = false;
|
|
|
|
|
for(auto link : links)
|
|
|
|
|
for(auto &item : links)
|
|
|
|
|
{
|
|
|
|
|
if(!item.second)
|
|
|
|
|
continue;
|
|
|
|
|
if(!sent)
|
|
|
|
|
{
|
|
|
|
|
sent = link->sendto(link, remote, buf);
|
|
|
|
|
auto link = item.first;
|
|
|
|
|
sent = link->sendto(link, remote, buf);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -380,11 +393,15 @@ llarp_router::FlushOutboundFor(const llarp::RouterID &remote)
|
|
|
|
|
|
|
|
|
|
llarp::RouterID peer = remote;
|
|
|
|
|
bool sent = false;
|
|
|
|
|
for(auto &link : links)
|
|
|
|
|
for(auto &item : links)
|
|
|
|
|
{
|
|
|
|
|
if(!sent)
|
|
|
|
|
if(item.second)
|
|
|
|
|
{
|
|
|
|
|
sent = link->sendto(link, peer, buf);
|
|
|
|
|
if(!sent)
|
|
|
|
|
{
|
|
|
|
|
auto link = item.first;
|
|
|
|
|
sent = link->sendto(link, peer, buf);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if(!sent)
|
|
|
|
@ -439,8 +456,11 @@ llarp_router::Run()
|
|
|
|
|
llarp::Zero(&rc, sizeof(llarp_rc));
|
|
|
|
|
// fill our address list
|
|
|
|
|
rc.addrs = llarp_ai_list_new();
|
|
|
|
|
for(auto link : links)
|
|
|
|
|
for(auto &item : links)
|
|
|
|
|
{
|
|
|
|
|
if(item.second)
|
|
|
|
|
continue;
|
|
|
|
|
auto link = item.first;
|
|
|
|
|
llarp_ai addr;
|
|
|
|
|
link->get_our_address(link, &addr);
|
|
|
|
|
llarp_ai_list_pushback(rc.addrs, &addr);
|
|
|
|
@ -461,8 +481,9 @@ llarp_router::Run()
|
|
|
|
|
llarp_dht_context_start(dht, ourPubkey);
|
|
|
|
|
|
|
|
|
|
// start links
|
|
|
|
|
for(auto link : links)
|
|
|
|
|
for(auto &item : links)
|
|
|
|
|
{
|
|
|
|
|
auto link = item.first;
|
|
|
|
|
int result = link->start_link(link, logic);
|
|
|
|
|
if(result == -1)
|
|
|
|
|
llarp::Warn("Link ", link->name(), " failed to start");
|
|
|
|
@ -517,7 +538,7 @@ llarp_init_router(struct llarp_threadpool *tp, struct llarp_ev_loop *netloop,
|
|
|
|
|
#ifdef TESTNET
|
|
|
|
|
router->disk = tp;
|
|
|
|
|
#else
|
|
|
|
|
router->disk = llarp_init_threadpool("llarp-diskio", 1);
|
|
|
|
|
router->disk = llarp_init_threadpool(1, "llarp-diskio");
|
|
|
|
|
#endif
|
|
|
|
|
llarp_crypto_libsodium_init(&router->crypto);
|
|
|
|
|
}
|
|
|
|
@ -552,11 +573,22 @@ llarp_router_try_connect(struct llarp_router *router, struct llarp_rc *remote)
|
|
|
|
|
llarp_ai addr;
|
|
|
|
|
if(llarp_ai_list_index(remote->addrs, 0, &addr))
|
|
|
|
|
{
|
|
|
|
|
llarp_router_iterate_links(router,
|
|
|
|
|
{&addr, &llarp_router::iter_try_connect});
|
|
|
|
|
return true;
|
|
|
|
|
for(auto &item : router->links)
|
|
|
|
|
{
|
|
|
|
|
if(!item.second)
|
|
|
|
|
continue;
|
|
|
|
|
auto link = item.first;
|
|
|
|
|
llarp_link_establish_job *job = new llarp_link_establish_job;
|
|
|
|
|
|
|
|
|
|
llarp_ai_copy(&job->ai, &addr);
|
|
|
|
|
job->timeout = 10000;
|
|
|
|
|
job->result = &llarp_router::on_try_connect_result;
|
|
|
|
|
// give router as user pointer
|
|
|
|
|
job->user = router;
|
|
|
|
|
link->try_establish(link, job);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -666,9 +698,10 @@ void
|
|
|
|
|
llarp_router_iterate_links(struct llarp_router *router,
|
|
|
|
|
struct llarp_router_link_iter i)
|
|
|
|
|
{
|
|
|
|
|
for(auto link : router->links)
|
|
|
|
|
if(!i.visit(&i, router, link))
|
|
|
|
|
return;
|
|
|
|
|
for(auto item : router->links)
|
|
|
|
|
if(item.second)
|
|
|
|
|
if(!i.visit(&i, router, item.first))
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
@ -724,13 +757,10 @@ namespace llarp
|
|
|
|
|
iwp_link_init(link, args);
|
|
|
|
|
if(llarp_link_initialized(link))
|
|
|
|
|
{
|
|
|
|
|
llarp::Debug("link ", key, " initialized");
|
|
|
|
|
llarp::Info("link ", key, " initialized");
|
|
|
|
|
if(link->configure(link, self->netloop, key, af, proto))
|
|
|
|
|
{
|
|
|
|
|
llarp_ai ai;
|
|
|
|
|
link->get_our_address(link, &ai);
|
|
|
|
|
llarp::Addr addr = ai;
|
|
|
|
|
self->AddLink(link);
|
|
|
|
|
self->AddLink(link, llarp::StrEq(key, "*"));
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if(af == AF_INET6)
|
|
|
|
@ -744,7 +774,7 @@ namespace llarp
|
|
|
|
|
llarp_ai ai;
|
|
|
|
|
link->get_our_address(link, &ai);
|
|
|
|
|
llarp::Addr addr = ai;
|
|
|
|
|
self->AddLink(link);
|
|
|
|
|
self->AddLink(link, llarp::StrEq(key, "*"));
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|