|
|
@ -17,25 +17,17 @@ namespace llarp
|
|
|
|
// we receive queued data in the OVERLAPPED data field,
|
|
|
|
// we receive queued data in the OVERLAPPED data field,
|
|
|
|
// much like the pipefds in the UNIX kqueue and loonix
|
|
|
|
// much like the pipefds in the UNIX kqueue and loonix
|
|
|
|
// epoll handles
|
|
|
|
// epoll handles
|
|
|
|
WSAOVERLAPPED portfd;
|
|
|
|
WSAOVERLAPPED portfd[2];
|
|
|
|
size_t iosz;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
udp_listener(SOCKET fd, llarp_udp_io* u) : ev_io(fd), udp(u)
|
|
|
|
udp_listener(SOCKET fd, llarp_udp_io* u) : ev_io(fd), udp(u)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
memset((void*)&portfd, 0, sizeof(WSAOVERLAPPED));
|
|
|
|
memset((void*)&portfd[0], 0, sizeof(WSAOVERLAPPED)*2);
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
~udp_listener()
|
|
|
|
~udp_listener()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
|
|
|
getData(void* buf, size_t sz, size_t ret)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
iosz = ret;
|
|
|
|
|
|
|
|
return read(buf, sz);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
virtual int
|
|
|
|
virtual int
|
|
|
|
read(void* buf, size_t sz)
|
|
|
|
read(void* buf, size_t sz)
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -47,7 +39,7 @@ namespace llarp
|
|
|
|
// WSARecvFrom
|
|
|
|
// WSARecvFrom
|
|
|
|
llarp::LogDebug("read ", sz, " bytes into socket");
|
|
|
|
llarp::LogDebug("read ", sz, " bytes into socket");
|
|
|
|
int ret = ::WSARecvFrom(std::get< SOCKET >(fd), &wbuf, 1, nullptr, &flags,
|
|
|
|
int ret = ::WSARecvFrom(std::get< SOCKET >(fd), &wbuf, 1, nullptr, &flags,
|
|
|
|
addr, &slen, &portfd, nullptr);
|
|
|
|
addr, &slen, &portfd[0], nullptr);
|
|
|
|
// 997 is the error code for queued ops
|
|
|
|
// 997 is the error code for queued ops
|
|
|
|
int s_errno = ::WSAGetLastError();
|
|
|
|
int s_errno = ::WSAGetLastError();
|
|
|
|
if(ret && s_errno != 997)
|
|
|
|
if(ret && s_errno != 997)
|
|
|
@ -55,8 +47,10 @@ namespace llarp
|
|
|
|
llarp::LogWarn("recv socket error ", s_errno);
|
|
|
|
llarp::LogWarn("recv socket error ", s_errno);
|
|
|
|
return -1;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// get the _real_ payload size from tick()
|
|
|
|
/*if (sz > EV_READ_BUF_SZ)
|
|
|
|
udp->recvfrom(udp, addr, buf, iosz);
|
|
|
|
return -1;*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
udp->recvfrom(udp, addr, buf, sz);
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -79,7 +73,7 @@ namespace llarp
|
|
|
|
// WSASendTo
|
|
|
|
// WSASendTo
|
|
|
|
llarp::LogDebug("write ", sz, " bytes into socket");
|
|
|
|
llarp::LogDebug("write ", sz, " bytes into socket");
|
|
|
|
ssize_t sent = ::WSASendTo(std::get< SOCKET >(fd), &wbuf, 1, nullptr, 0,
|
|
|
|
ssize_t sent = ::WSASendTo(std::get< SOCKET >(fd), &wbuf, 1, nullptr, 0,
|
|
|
|
to, slen, &portfd, nullptr);
|
|
|
|
to, slen, &portfd[1], nullptr);
|
|
|
|
int s_errno = ::WSAGetLastError();
|
|
|
|
int s_errno = ::WSAGetLastError();
|
|
|
|
if(sent && s_errno != 997)
|
|
|
|
if(sent && s_errno != 997)
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -94,7 +88,7 @@ namespace llarp
|
|
|
|
{
|
|
|
|
{
|
|
|
|
llarp_tun_io* t;
|
|
|
|
llarp_tun_io* t;
|
|
|
|
device* tunif;
|
|
|
|
device* tunif;
|
|
|
|
OVERLAPPED* tun_async;
|
|
|
|
OVERLAPPED* tun_async[2];
|
|
|
|
tun(llarp_tun_io* tio)
|
|
|
|
tun(llarp_tun_io* tio)
|
|
|
|
: ev_io(INVALID_HANDLE_VALUE)
|
|
|
|
: ev_io(INVALID_HANDLE_VALUE)
|
|
|
|
, t(tio)
|
|
|
|
, t(tio)
|
|
|
@ -123,7 +117,7 @@ namespace llarp
|
|
|
|
bool
|
|
|
|
bool
|
|
|
|
do_write(void* data, size_t sz)
|
|
|
|
do_write(void* data, size_t sz)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return WriteFile(std::get< HANDLE >(fd), data, sz, nullptr, tun_async);
|
|
|
|
return WriteFile(std::get< HANDLE >(fd), data, sz, nullptr, tun_async[1]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
int
|
|
|
@ -159,7 +153,8 @@ namespace llarp
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fd = tunif->tun_fd;
|
|
|
|
fd = tunif->tun_fd;
|
|
|
|
tun_async = &tunif->ovl;
|
|
|
|
tun_async[0] = &tunif->ovl[0];
|
|
|
|
|
|
|
|
tun_async[1] = &tunif->ovl[1];
|
|
|
|
if(std::get< HANDLE >(fd) == INVALID_HANDLE_VALUE)
|
|
|
|
if(std::get< HANDLE >(fd) == INVALID_HANDLE_VALUE)
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
@ -222,7 +217,7 @@ struct llarp_win32_loop : public llarp_ev_loop
|
|
|
|
{
|
|
|
|
{
|
|
|
|
llarp::LogDebug("size: ", iolen, "\tev_id: ", ev_id,
|
|
|
|
llarp::LogDebug("size: ", iolen, "\tev_id: ", ev_id,
|
|
|
|
"\tqdata: ", qdata);
|
|
|
|
"\tqdata: ", qdata);
|
|
|
|
ev->getData(readbuf, sizeof(readbuf), iolen);
|
|
|
|
ev->read(readbuf, iolen);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
++idx;
|
|
|
|
++idx;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -262,7 +257,7 @@ struct llarp_win32_loop : public llarp_ev_loop
|
|
|
|
if(ev && !ev->fd.valueless_by_exception())
|
|
|
|
if(ev && !ev->fd.valueless_by_exception())
|
|
|
|
{
|
|
|
|
{
|
|
|
|
llarp::LogInfo("size: ", iolen, "\tev_id: ", ev_id, "\tqdata: ", qdata);
|
|
|
|
llarp::LogInfo("size: ", iolen, "\tev_id: ", ev_id, "\tqdata: ", qdata);
|
|
|
|
ev->getData(readbuf, sizeof(readbuf), iolen);
|
|
|
|
ev->read(readbuf, sizeof(readbuf));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
++idx;
|
|
|
|
++idx;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -381,7 +376,7 @@ struct llarp_win32_loop : public llarp_ev_loop
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
::ReadFile((HANDLE)std::get< 0 >(ev->fd), &buf, 1024, nullptr,
|
|
|
|
::ReadFile((HANDLE)std::get< 0 >(ev->fd), &buf, 1024, nullptr,
|
|
|
|
&udp->portfd);
|
|
|
|
&udp->portfd[0]);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
case 1:
|
|
|
|
t = dynamic_cast< llarp::tun* >(ev);
|
|
|
|
t = dynamic_cast< llarp::tun* >(ev);
|
|
|
@ -391,7 +386,7 @@ struct llarp_win32_loop : public llarp_ev_loop
|
|
|
|
delete ev;
|
|
|
|
delete ev;
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
::ReadFile(std::get< 1 >(ev->fd), &buf, 1024, nullptr, t->tun_async);
|
|
|
|
::ReadFile(std::get< 1 >(ev->fd), &buf, 1024, nullptr, t->tun_async[0]);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
default:
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|