|
|
|
@ -1,10 +1,19 @@
|
|
|
|
|
#include <ev/ev_libuv.hpp>
|
|
|
|
|
#include <net/net_addr.hpp>
|
|
|
|
|
#include <util/thread/logic.hpp>
|
|
|
|
|
|
|
|
|
|
#include <cstring>
|
|
|
|
|
|
|
|
|
|
namespace libuv
|
|
|
|
|
{
|
|
|
|
|
/// call a function in logic thread via a handle
|
|
|
|
|
template < typename Handle, typename Func >
|
|
|
|
|
void
|
|
|
|
|
Call(Handle* h, Func&& f)
|
|
|
|
|
{
|
|
|
|
|
static_cast< Loop* >(h->loop->data)->Call(f);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct glue
|
|
|
|
|
{
|
|
|
|
|
virtual ~glue() = default;
|
|
|
|
@ -65,8 +74,9 @@ namespace libuv
|
|
|
|
|
static void
|
|
|
|
|
OnOutboundConnect(uv_connect_t* c, int status)
|
|
|
|
|
{
|
|
|
|
|
auto* self = static_cast< conn_glue* >(c->data);
|
|
|
|
|
self->HandleConnectResult(status);
|
|
|
|
|
conn_glue* self = static_cast< conn_glue* >(c->data);
|
|
|
|
|
Call(self->Stream(),
|
|
|
|
|
std::bind(&conn_glue::HandleConnectResult, self, status));
|
|
|
|
|
c->data = nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -165,13 +175,14 @@ namespace libuv
|
|
|
|
|
static void
|
|
|
|
|
OnWritten(uv_write_t* req, int status)
|
|
|
|
|
{
|
|
|
|
|
conn_glue* conn = static_cast< conn_glue* >(req->data);
|
|
|
|
|
if(status)
|
|
|
|
|
{
|
|
|
|
|
llarp::LogError("write failed on tcp: ", uv_strerror(status));
|
|
|
|
|
static_cast< conn_glue* >(req->data)->Close();
|
|
|
|
|
conn->Close();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
static_cast< conn_glue* >(req->data)->DrainOne();
|
|
|
|
|
Call(conn->Stream(), std::bind(&conn_glue::DrainOne, conn));
|
|
|
|
|
delete req;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -195,7 +206,8 @@ namespace libuv
|
|
|
|
|
static void
|
|
|
|
|
OnClosed(uv_handle_t* h)
|
|
|
|
|
{
|
|
|
|
|
static_cast< conn_glue* >(h->data)->HandleClosed();
|
|
|
|
|
conn_glue* conn = static_cast< conn_glue* >(h->data);
|
|
|
|
|
Call(h, std::bind(&conn_glue::HandleClosed, conn));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
@ -251,7 +263,8 @@ namespace libuv
|
|
|
|
|
{
|
|
|
|
|
if(status == 0)
|
|
|
|
|
{
|
|
|
|
|
static_cast< conn_glue* >(stream->data)->Accept();
|
|
|
|
|
conn_glue* conn = static_cast< conn_glue* >(stream->data);
|
|
|
|
|
Call(stream, std::bind(&conn_glue::Accept, conn));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
@ -262,8 +275,8 @@ namespace libuv
|
|
|
|
|
static void
|
|
|
|
|
OnTick(uv_check_t* t)
|
|
|
|
|
{
|
|
|
|
|
auto* conn = static_cast< conn_glue* >(t->data);
|
|
|
|
|
conn->Tick();
|
|
|
|
|
conn_glue* conn = static_cast< conn_glue* >(t->data);
|
|
|
|
|
Call(t, std::bind(&conn_glue::Tick, conn));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
@ -331,7 +344,8 @@ namespace libuv
|
|
|
|
|
static void
|
|
|
|
|
OnTick(uv_check_t* t)
|
|
|
|
|
{
|
|
|
|
|
static_cast< ticker_glue* >(t->data)->func();
|
|
|
|
|
ticker_glue* ticker = static_cast< ticker_glue* >(t->data);
|
|
|
|
|
Call(&ticker->m_Ticker, [ticker]() { ticker->func(); });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
@ -393,14 +407,14 @@ namespace libuv
|
|
|
|
|
const size_t pktsz = sz;
|
|
|
|
|
const llarp_buffer_t pkt{(const byte_t*)buf->base, pktsz};
|
|
|
|
|
m_UDP->recvfrom(m_UDP, fromaddr, ManagedBuffer{pkt});
|
|
|
|
|
gotpkts = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
OnTick(uv_check_t* t)
|
|
|
|
|
{
|
|
|
|
|
static_cast< udp_glue* >(t->data)->Tick();
|
|
|
|
|
udp_glue* udp = static_cast< udp_glue* >(t->data);
|
|
|
|
|
udp->Tick();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
@ -408,7 +422,6 @@ namespace libuv
|
|
|
|
|
{
|
|
|
|
|
if(m_UDP && m_UDP->tick)
|
|
|
|
|
m_UDP->tick(m_UDP);
|
|
|
|
|
gotpkts = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
@ -443,6 +456,7 @@ namespace libuv
|
|
|
|
|
if(uv_fileno((const uv_handle_t*)&m_Handle, &m_UDP->fd))
|
|
|
|
|
return false;
|
|
|
|
|
m_UDP->sendto = &SendTo;
|
|
|
|
|
m_UDP->impl = this;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -452,8 +466,7 @@ namespace libuv
|
|
|
|
|
auto* glue = static_cast< udp_glue* >(h->data);
|
|
|
|
|
if(glue)
|
|
|
|
|
{
|
|
|
|
|
h->data = nullptr;
|
|
|
|
|
glue->m_UDP->impl = nullptr;
|
|
|
|
|
h->data = nullptr;
|
|
|
|
|
delete glue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -461,6 +474,7 @@ namespace libuv
|
|
|
|
|
void
|
|
|
|
|
Close() override
|
|
|
|
|
{
|
|
|
|
|
m_UDP->impl = nullptr;
|
|
|
|
|
uv_check_stop(&m_Ticker);
|
|
|
|
|
uv_close((uv_handle_t*)&m_Handle, &OnClosed);
|
|
|
|
|
}
|
|
|
|
@ -481,7 +495,7 @@ namespace libuv
|
|
|
|
|
void
|
|
|
|
|
Tick()
|
|
|
|
|
{
|
|
|
|
|
m_Pipe->tick();
|
|
|
|
|
Call(&m_Handle, std::bind(&llarp_ev_pkt_pipe::tick, m_Pipe));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
@ -520,7 +534,8 @@ namespace libuv
|
|
|
|
|
static void
|
|
|
|
|
OnTick(uv_check_t* h)
|
|
|
|
|
{
|
|
|
|
|
static_cast< pipe_glue* >(h->data)->Tick();
|
|
|
|
|
pipe_glue* pipe = static_cast< pipe_glue* >(h->data);
|
|
|
|
|
Call(h, std::bind(&pipe_glue::Tick, pipe));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
@ -561,7 +576,8 @@ namespace libuv
|
|
|
|
|
static void
|
|
|
|
|
OnTick(uv_check_t* timer)
|
|
|
|
|
{
|
|
|
|
|
static_cast< tun_glue* >(timer->data)->Tick();
|
|
|
|
|
tun_glue* tun = static_cast< tun_glue* >(timer->data);
|
|
|
|
|
Call(timer, std::bind(&tun_glue::Tick, tun));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
@ -601,8 +617,7 @@ namespace libuv
|
|
|
|
|
auto* self = static_cast< tun_glue* >(h->data);
|
|
|
|
|
if(self)
|
|
|
|
|
{
|
|
|
|
|
self->m_Tun->impl = nullptr;
|
|
|
|
|
h->data = nullptr;
|
|
|
|
|
h->data = nullptr;
|
|
|
|
|
delete self;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -610,6 +625,7 @@ namespace libuv
|
|
|
|
|
void
|
|
|
|
|
Close() override
|
|
|
|
|
{
|
|
|
|
|
m_Tun->impl = nullptr;
|
|
|
|
|
uv_check_stop(&m_Ticker);
|
|
|
|
|
uv_close((uv_handle_t*)&m_Handle, &OnClosed);
|
|
|
|
|
}
|
|
|
|
@ -623,7 +639,8 @@ namespace libuv
|
|
|
|
|
static bool
|
|
|
|
|
WritePkt(llarp_tun_io* tun, const byte_t* pkt, size_t sz)
|
|
|
|
|
{
|
|
|
|
|
return static_cast< tun_glue* >(tun->impl)->Write(pkt, sz);
|
|
|
|
|
tun_glue* glue = static_cast< tun_glue* >(tun->impl);
|
|
|
|
|
return glue && glue->Write(pkt, sz);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
@ -670,6 +687,7 @@ namespace libuv
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
m_Tun->writepkt = &WritePkt;
|
|
|
|
|
m_Tun->impl = this;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
@ -680,6 +698,7 @@ namespace libuv
|
|
|
|
|
m_Impl.reset(uv_loop_new());
|
|
|
|
|
if(uv_loop_init(m_Impl.get()) == -1)
|
|
|
|
|
return false;
|
|
|
|
|
m_Impl->data = this;
|
|
|
|
|
uv_loop_configure(m_Impl.get(), UV_LOOP_BLOCK_SIGNAL, SIGPIPE);
|
|
|
|
|
m_TickTimer.data = this;
|
|
|
|
|
m_Run.store(true);
|
|
|
|
|