diff --git a/llarp/iwp_link.cpp b/llarp/iwp_link.cpp index 9a8b4bec1..2071955cb 100644 --- a/llarp/iwp_link.cpp +++ b/llarp/iwp_link.cpp @@ -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; } } diff --git a/llarp/net.hpp b/llarp/net.hpp index d92093216..14da9ef07 100644 --- a/llarp/net.hpp +++ b/llarp/net.hpp @@ -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); diff --git a/llarp/router.cpp b/llarp/router.cpp index bcefea113..db440ab23 100644 --- a/llarp/router.cpp +++ b/llarp/router.cpp @@ -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; diff --git a/llarp/router.hpp b/llarp/router.hpp index b31df8a64..fb1a17b0d 100644 --- a/llarp/router.hpp +++ b/llarp/router.hpp @@ -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 diff --git a/llarp/timer.cpp b/llarp/timer.cpp index 284ded8e4..fa961bdeb 100644 --- a/llarp/timer.cpp +++ b/llarp/timer.cpp @@ -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();