|
|
|
@ -30,8 +30,8 @@
|
|
|
|
|
|
|
|
|
|
namespace iwp
|
|
|
|
|
{
|
|
|
|
|
// session activity timeout is 5s
|
|
|
|
|
constexpr llarp_time_t SESSION_TIMEOUT = 5000;
|
|
|
|
|
// session activity timeout is 10s
|
|
|
|
|
constexpr llarp_time_t SESSION_TIMEOUT = 10000;
|
|
|
|
|
|
|
|
|
|
constexpr size_t MAX_PAD = 128;
|
|
|
|
|
|
|
|
|
@ -678,7 +678,7 @@ namespace iwp
|
|
|
|
|
|
|
|
|
|
uint32_t establish_job_id = 0;
|
|
|
|
|
uint32_t frames = 0;
|
|
|
|
|
|
|
|
|
|
bool working = false;
|
|
|
|
|
llarp::Addr addr;
|
|
|
|
|
iwp_async_intro intro;
|
|
|
|
|
iwp_async_introack introack;
|
|
|
|
@ -853,7 +853,7 @@ namespace iwp
|
|
|
|
|
// when we are done doing stuff with all of our frames from the crypto
|
|
|
|
|
// workers we are done
|
|
|
|
|
llarp::Debug(addr, " timed out with ", frames, " frames left");
|
|
|
|
|
return frames == 0;
|
|
|
|
|
return frames == 0 && !working;
|
|
|
|
|
}
|
|
|
|
|
if(is_invalidated())
|
|
|
|
|
{
|
|
|
|
@ -862,7 +862,7 @@ namespace iwp
|
|
|
|
|
// are done
|
|
|
|
|
llarp::Debug(addr, " invaldiated session with ", frames,
|
|
|
|
|
" frames left");
|
|
|
|
|
return frames == 0;
|
|
|
|
|
return frames == 0 && !working;
|
|
|
|
|
}
|
|
|
|
|
// send keepalive if we are established or a session is made
|
|
|
|
|
if(state == eEstablished || state == eLIMSent)
|
|
|
|
@ -905,6 +905,7 @@ namespace iwp
|
|
|
|
|
start.sessionkey = sessionkey;
|
|
|
|
|
start.user = this;
|
|
|
|
|
start.hook = &handle_verify_session_start;
|
|
|
|
|
working = true;
|
|
|
|
|
iwp_call_async_verify_session_start(iwp, &start);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -954,6 +955,7 @@ namespace iwp
|
|
|
|
|
handle_generated_session_start(iwp_async_session_start *start)
|
|
|
|
|
{
|
|
|
|
|
session *link = static_cast< session * >(start->user);
|
|
|
|
|
link->working = false;
|
|
|
|
|
if(llarp_ev_udp_sendto(link->udp, link->addr, start->buf, start->sz)
|
|
|
|
|
== -1)
|
|
|
|
|
llarp::Error("sendto failed");
|
|
|
|
@ -983,6 +985,7 @@ namespace iwp
|
|
|
|
|
start.sessionkey = sessionkey;
|
|
|
|
|
start.user = this;
|
|
|
|
|
start.hook = &handle_generated_session_start;
|
|
|
|
|
working = true;
|
|
|
|
|
iwp_call_async_gen_session_start(iwp, &start);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1090,6 +1093,7 @@ namespace iwp
|
|
|
|
|
// call
|
|
|
|
|
introack.user = this;
|
|
|
|
|
introack.hook = &handle_introack_generated;
|
|
|
|
|
working = true;
|
|
|
|
|
iwp_call_async_gen_introack(iwp, &introack);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1119,6 +1123,7 @@ namespace iwp
|
|
|
|
|
|
|
|
|
|
// call
|
|
|
|
|
EnterState(eIntroRecv);
|
|
|
|
|
working = true;
|
|
|
|
|
iwp_call_async_verify_intro(iwp, &intro);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1144,6 +1149,7 @@ namespace iwp
|
|
|
|
|
introack.user = this;
|
|
|
|
|
introack.hook = &handle_verify_introack;
|
|
|
|
|
// async verify
|
|
|
|
|
working = true;
|
|
|
|
|
iwp_call_async_verify_introack(iwp, &introack);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1154,6 +1160,7 @@ namespace iwp
|
|
|
|
|
handle_generated_intro(iwp_async_intro *i)
|
|
|
|
|
{
|
|
|
|
|
session *link = static_cast< session * >(i->user);
|
|
|
|
|
link->working = false;
|
|
|
|
|
if(i->buf)
|
|
|
|
|
{
|
|
|
|
|
llarp::Debug("send intro");
|
|
|
|
@ -1195,6 +1202,7 @@ namespace iwp
|
|
|
|
|
// async generate intro packet
|
|
|
|
|
intro.user = this;
|
|
|
|
|
intro.hook = &handle_generated_intro;
|
|
|
|
|
working = true;
|
|
|
|
|
iwp_call_async_gen_intro(iwp, &intro);
|
|
|
|
|
// start introduce timer
|
|
|
|
|
establish_job_id = llarp_logic_call_later(
|
|
|
|
@ -1403,6 +1411,7 @@ namespace iwp
|
|
|
|
|
{
|
|
|
|
|
llarp::Debug("removing session ", addr);
|
|
|
|
|
session *s = static_cast< session * >(itr->second.impl);
|
|
|
|
|
s->done();
|
|
|
|
|
if(s->frames)
|
|
|
|
|
{
|
|
|
|
|
llarp::Warn("session has ", s->frames,
|
|
|
|
@ -1531,6 +1540,7 @@ namespace iwp
|
|
|
|
|
if(!impl->IsEstablished())
|
|
|
|
|
{
|
|
|
|
|
impl->send_LIM();
|
|
|
|
|
impl->session_established();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
@ -1552,12 +1562,13 @@ namespace iwp
|
|
|
|
|
delete rxmsg;
|
|
|
|
|
rx.erase(id);
|
|
|
|
|
return success;
|
|
|
|
|
}
|
|
|
|
|
} // namespace iwp
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
session::handle_verify_intro(iwp_async_intro *intro)
|
|
|
|
|
{
|
|
|
|
|
session *self = static_cast< session * >(intro->user);
|
|
|
|
|
self->working = false;
|
|
|
|
|
if(!intro->buf)
|
|
|
|
|
{
|
|
|
|
|
llarp::Error("intro verify failed from ", self->addr, " via ",
|
|
|
|
@ -1570,6 +1581,8 @@ namespace iwp
|
|
|
|
|
void
|
|
|
|
|
session::session_established()
|
|
|
|
|
{
|
|
|
|
|
llarp::RouterID remote = remote_router.pubkey;
|
|
|
|
|
llarp::Info("session to ", remote, " established");
|
|
|
|
|
EnterState(eEstablished);
|
|
|
|
|
serv->MapAddr(addr, remote_router.pubkey);
|
|
|
|
|
llarp_logic_cancel_call(logic, establish_job_id);
|
|
|
|
@ -1636,11 +1649,6 @@ namespace iwp
|
|
|
|
|
{
|
|
|
|
|
llarp::Debug("message transmitted msgid=", msgid);
|
|
|
|
|
session *impl = static_cast< session * >(parent->impl);
|
|
|
|
|
if(msgid == 0)
|
|
|
|
|
{
|
|
|
|
|
// first message acked means we are established
|
|
|
|
|
impl->session_established();
|
|
|
|
|
}
|
|
|
|
|
tx.erase(msgid);
|
|
|
|
|
delete msg;
|
|
|
|
|
}
|
|
|
|
@ -1664,6 +1672,7 @@ namespace iwp
|
|
|
|
|
session::handle_verify_introack(iwp_async_introack *introack)
|
|
|
|
|
{
|
|
|
|
|
session *link = static_cast< session * >(introack->user);
|
|
|
|
|
link->working = false;
|
|
|
|
|
if(introack->buf == nullptr)
|
|
|
|
|
{
|
|
|
|
|
// invalid signature
|
|
|
|
@ -1678,6 +1687,7 @@ namespace iwp
|
|
|
|
|
session::handle_verify_session_start(iwp_async_session_start *s)
|
|
|
|
|
{
|
|
|
|
|
session *self = static_cast< session * >(s->user);
|
|
|
|
|
self->working = false;
|
|
|
|
|
if(!s->buf)
|
|
|
|
|
{
|
|
|
|
|
// verify fail
|
|
|
|
@ -1878,7 +1888,7 @@ namespace iwp
|
|
|
|
|
self->establish_job->link = self->serv->parent;
|
|
|
|
|
if(left)
|
|
|
|
|
{
|
|
|
|
|
// timer cancelled
|
|
|
|
|
// timer cancelled which means we were established
|
|
|
|
|
self->establish_job->session = self->parent;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|