ipv4 fixes

pull/1/head
Jeff Becker 6 years ago
parent 9f2d7f717a
commit 31cbfd255e
No known key found for this signature in database
GPG Key ID: F357B3B42F6F9B05

@ -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->timersMutex);
t->ticker.wait_for(lock, t->nextTickLen,
[t]() -> bool { return t->timers.size() == 0; });
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);
// we woke up
auto now = llarp::timer::now();
auto itr = t->timers.begin();

Loading…
Cancel
Save