mirror of https://github.com/oxen-io/lokinet
ipv4 fixes
This commit is contained in:
parent
9f2d7f717a
commit
31cbfd255e
|
@ -27,8 +27,8 @@
|
|||
|
||||
namespace iwp
|
||||
{
|
||||
// session activity timeout is 10s
|
||||
constexpr llarp_time_t SESSION_TIMEOUT = 10000;
|
||||
// session activity timeout is 5s
|
||||
constexpr llarp_time_t SESSION_TIMEOUT = 5000;
|
||||
|
||||
constexpr size_t MAX_PAD = 256;
|
||||
|
||||
|
@ -1016,7 +1016,11 @@ namespace iwp
|
|||
if(i->buf)
|
||||
{
|
||||
llarp::Debug(__FILE__, "send intro");
|
||||
llarp_ev_udp_sendto(link->udp, link->addr, i->buf, i->sz);
|
||||
if(llarp_ev_udp_sendto(link->udp, link->addr, i->buf, i->sz) == -1)
|
||||
{
|
||||
llarp::Warn(__FILE__, "send intro failed");
|
||||
return;
|
||||
}
|
||||
link->EnterState(eIntroSent);
|
||||
}
|
||||
else
|
||||
|
@ -1217,6 +1221,18 @@ namespace iwp
|
|||
{
|
||||
llarp_logic_remove_call(logic, s->keepalive_timer_id);
|
||||
}
|
||||
// cancel establish job
|
||||
if(s->establish_job_id)
|
||||
{
|
||||
llarp_logic_remove_call(logic, s->establish_job_id);
|
||||
}
|
||||
if(s->establish_job)
|
||||
{
|
||||
auto job = s->establish_job;
|
||||
job->link = s->link;
|
||||
job->session = nullptr;
|
||||
job->result(job);
|
||||
}
|
||||
delete s;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -27,6 +27,7 @@ namespace llarp
|
|||
Addr(const Addr& other)
|
||||
{
|
||||
memcpy(&_addr, &other._addr, sizeof(sockaddr_in6));
|
||||
memcpy(&_addr4, &other._addr4, sizeof(sockaddr_in));
|
||||
}
|
||||
|
||||
in6_addr*
|
||||
|
@ -59,10 +60,9 @@ namespace llarp
|
|||
_addr.sin6_port = htons(other.port);
|
||||
auto ptr = &_addr.sin6_addr.s6_addr[0];
|
||||
// TODO: detect SIIT better
|
||||
if(ptr[11] == 0xff && ptr[10] == 0xff && ptr[9] == 0 && ptr[9] == 0
|
||||
&& ptr[8] == 0 && ptr[7] == 0 && ptr[6] == 0 && ptr[5] == 0
|
||||
&& ptr[4] == 0 && ptr[3] == 0 && ptr[2] == 0 && ptr[1] == 0
|
||||
&& ptr[0] == 0)
|
||||
if(ptr[11] == 0xff && ptr[10] == 0xff && ptr[9] == 0 && ptr[8] == 0
|
||||
&& ptr[7] == 0 && ptr[6] == 0 && ptr[5] == 0 && ptr[4] == 0
|
||||
&& ptr[3] == 0 && ptr[2] == 0 && ptr[1] == 0 && ptr[0] == 0)
|
||||
{
|
||||
_addr4.sin_family = AF_INET;
|
||||
_addr4.sin_port = htons(other.port);
|
||||
|
|
|
@ -153,6 +153,16 @@ llarp_router::Close()
|
|||
links.clear();
|
||||
}
|
||||
|
||||
void
|
||||
llarp_router::connect_job_retry(void *user)
|
||||
{
|
||||
llarp_link_establish_job *job =
|
||||
static_cast< llarp_link_establish_job * >(user);
|
||||
|
||||
llarp::Info(__FILE__, "trying to establish session again");
|
||||
job->link->try_establish(job->link, job);
|
||||
}
|
||||
|
||||
void
|
||||
llarp_router::on_try_connect_result(llarp_link_establish_job *job)
|
||||
{
|
||||
|
@ -189,7 +199,7 @@ llarp_router::on_try_connect_result(llarp_link_establish_job *job)
|
|||
}
|
||||
}
|
||||
llarp::Info(__FILE__, "session not established");
|
||||
job->link->try_establish(job->link, job);
|
||||
llarp_logic_queue_job(router->logic, {job, &llarp_router::connect_job_retry});
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -255,12 +265,13 @@ llarp_router::iter_try_connect(llarp_router_link_iter *iter,
|
|||
return true;
|
||||
llarp_ai *ai = static_cast< llarp_ai * >(iter->user);
|
||||
llarp_ai_copy(&job->ai, ai);
|
||||
job->timeout = 1000;
|
||||
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;
|
||||
// break iteration
|
||||
return false;
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
|
@ -446,10 +457,10 @@ namespace llarp
|
|||
if(StrEq(val, "eth"))
|
||||
{
|
||||
#ifdef AF_LINK
|
||||
af = AF_LINK;
|
||||
af = AF_LINK;
|
||||
#endif
|
||||
#ifdef AF_PACKET
|
||||
af = AF_PACKET;
|
||||
af = AF_PACKET;
|
||||
#endif
|
||||
proto = LLARP_ETH_PROTO;
|
||||
}
|
||||
|
@ -476,7 +487,7 @@ namespace llarp
|
|||
iwp_link_init(link, args);
|
||||
if(llarp_link_initialized(link))
|
||||
{
|
||||
//printf("router -> link initialized\n");
|
||||
// printf("router -> link initialized\n");
|
||||
if(link->configure(link, self->netloop, key, af, proto))
|
||||
{
|
||||
llarp_ai ai;
|
||||
|
@ -485,11 +496,13 @@ namespace llarp
|
|||
self->AddLink(link);
|
||||
return;
|
||||
}
|
||||
if (af == AF_INET6) {
|
||||
if(af == AF_INET6)
|
||||
{
|
||||
// we failed to configure IPv6
|
||||
// try IPv4
|
||||
llarp::Info(__FILE__, "link ", key, " failed to configure IPv6, trying IPv4");
|
||||
af = AF_INET;
|
||||
llarp::Info(__FILE__, "link ", key,
|
||||
" failed to configure IPv6, trying IPv4");
|
||||
af = AF_INET;
|
||||
if(link->configure(link, self->netloop, key, af, proto))
|
||||
{
|
||||
llarp_ai ai;
|
||||
|
|
|
@ -103,6 +103,9 @@ struct llarp_router
|
|||
|
||||
static void
|
||||
on_try_connect_result(llarp_link_establish_job *job);
|
||||
|
||||
static void
|
||||
connect_job_retry(void *user);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -68,6 +68,7 @@ struct llarp_timer_context
|
|||
llarp_threadpool* threadpool;
|
||||
std::mutex timersMutex;
|
||||
std::map< uint32_t, llarp::timer > timers;
|
||||
std::mutex tickerMutex;
|
||||
std::condition_variable ticker;
|
||||
std::chrono::milliseconds nextTickLen = std::chrono::milliseconds(10);
|
||||
|
||||
|
@ -193,11 +194,15 @@ llarp_timer_run(struct llarp_timer_context* t, struct llarp_threadpool* pool)
|
|||
t->threadpool = pool;
|
||||
while(t->run())
|
||||
{
|
||||
// wait for timer mutex
|
||||
{
|
||||
std::unique_lock< std::mutex > lock(t->tickerMutex);
|
||||
t->ticker.wait_for(lock, t->nextTickLen);
|
||||
}
|
||||
|
||||
if(t->run())
|
||||
{
|
||||
std::unique_lock< std::mutex > lock(t->timersMutex);
|
||||
t->ticker.wait_for(lock, t->nextTickLen,
|
||||
[t]() -> bool { return t->timers.size() == 0; });
|
||||
|
||||
// we woke up
|
||||
auto now = llarp::timer::now();
|
||||
auto itr = t->timers.begin();
|
||||
|
|
Loading…
Reference in New Issue