separate read and write event ports to avoid overwriting queue events

pull/33/head
despair86 6 years ago
parent d4a7dfd08d
commit 9d546cbac4

@ -145,7 +145,7 @@ extern "C"
int mode;
#endif
#if defined(Windows)
OVERLAPPED ovl;
OVERLAPPED ovl[2];
#endif
};

@ -17,11 +17,11 @@ namespace llarp
// we receive queued data in the OVERLAPPED data field,
// much like the pipefds in the UNIX kqueue and loonix
// epoll handles
WSAOVERLAPPED portfd;
WSAOVERLAPPED portfd[2];
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()
@ -39,7 +39,7 @@ namespace llarp
// WSARecvFrom
llarp::LogDebug("read ", sz, " bytes into socket");
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
int s_errno = ::WSAGetLastError();
if(ret && s_errno != 997)
@ -73,7 +73,7 @@ namespace llarp
// WSASendTo
llarp::LogDebug("write ", sz, " bytes into socket");
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();
if(sent && s_errno != 997)
{
@ -88,7 +88,7 @@ namespace llarp
{
llarp_tun_io* t;
device* tunif;
OVERLAPPED* tun_async;
OVERLAPPED* tun_async[2];
tun(llarp_tun_io* tio)
: ev_io(INVALID_HANDLE_VALUE)
, t(tio)
@ -117,7 +117,7 @@ namespace llarp
bool
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
@ -153,7 +153,8 @@ namespace llarp
}
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)
return false;
@ -375,7 +376,7 @@ struct llarp_win32_loop : public llarp_ev_loop
return false;
}
::ReadFile((HANDLE)std::get< 0 >(ev->fd), &buf, 1024, nullptr,
&udp->portfd);
&udp->portfd[0]);
break;
case 1:
t = dynamic_cast< llarp::tun* >(ev);
@ -385,7 +386,7 @@ struct llarp_win32_loop : public llarp_ev_loop
delete ev;
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;
default:
return false;

@ -394,7 +394,7 @@ tuntap_read(struct device *dev, void *buf, size_t size)
{
DWORD len;
if(ReadFile(dev->tun_fd, buf, (DWORD)size, &len, &dev->ovl) == 0)
if(ReadFile(dev->tun_fd, buf, (DWORD)size, &len, &dev->ovl[0]) == 0)
{
int errcode = GetLastError();
@ -415,7 +415,7 @@ tuntap_write(struct device *dev, void *buf, size_t size)
{
DWORD len;
if(WriteFile(dev->tun_fd, buf, (DWORD)size, &len, &dev->ovl) == 0)
if(WriteFile(dev->tun_fd, buf, (DWORD)size, &len, &dev->ovl[1]) == 0)
{
int errcode = GetLastError();

@ -69,7 +69,7 @@ extern "C"
dev->ctrl_sock = -1;
dev->flags = 0;
#if defined(Windows)
memset(&dev->ovl, 0, sizeof(OVERLAPPED));
memset(&dev->ovl[0], 0, sizeof(OVERLAPPED)*2);
#endif
__tuntap_log = &tuntap_log_default;

Loading…
Cancel
Save