2019-01-19 00:41:50 +00:00
|
|
|
#ifndef EV_WIN32_H
|
|
|
|
#define EV_WIN32_H
|
2019-07-06 17:03:40 +00:00
|
|
|
#ifdef _WIN32
|
2019-01-11 01:19:36 +00:00
|
|
|
#include <ev/ev.hpp>
|
2019-01-11 01:42:02 +00:00
|
|
|
#include <net/net.h>
|
|
|
|
#include <net/net.hpp>
|
2019-02-02 23:12:42 +00:00
|
|
|
#include <util/buffer.hpp>
|
2019-10-02 13:06:14 +00:00
|
|
|
#include <util/thread/logic.hpp>
|
2019-01-13 22:39:10 +00:00
|
|
|
|
2018-07-30 04:38:14 +00:00
|
|
|
#include <windows.h>
|
2018-12-14 12:04:14 +00:00
|
|
|
#include <process.h>
|
2018-12-12 02:52:51 +00:00
|
|
|
|
2018-07-30 04:38:14 +00:00
|
|
|
#include <cstdio>
|
|
|
|
|
2018-12-14 12:04:14 +00:00
|
|
|
// io packet for TUN read/write
|
|
|
|
struct asio_evt_pkt
|
|
|
|
{
|
2020-04-07 18:38:56 +00:00
|
|
|
OVERLAPPED pkt = {0, 0, 0, 0, nullptr}; // must be first, since this is part of the IO call
|
|
|
|
bool write = false; // true, or false if read pkt
|
|
|
|
size_t sz; // should match the queued data size, if not try again?
|
2018-12-14 12:04:14 +00:00
|
|
|
void* buf; // must remain valid until we get notification; this is _supposed_
|
|
|
|
// to be zero-copy
|
|
|
|
};
|
|
|
|
|
|
|
|
extern "C" DWORD FAR PASCAL
|
2019-03-11 18:41:05 +00:00
|
|
|
tun_ev_loop(void* unused);
|
2019-01-04 03:00:07 +00:00
|
|
|
|
2019-01-19 00:41:50 +00:00
|
|
|
void
|
|
|
|
exit_tun_loop();
|
2018-12-14 12:04:14 +00:00
|
|
|
|
2019-03-11 18:41:05 +00:00
|
|
|
void
|
|
|
|
begin_tun_loop(int nThreads);
|
|
|
|
|
2019-01-19 00:41:50 +00:00
|
|
|
namespace llarp
|
2018-12-14 12:04:14 +00:00
|
|
|
{
|
2019-01-19 00:41:50 +00:00
|
|
|
struct udp_listener : public ev_io
|
2018-12-14 12:04:14 +00:00
|
|
|
{
|
2019-01-19 00:41:50 +00:00
|
|
|
llarp_udp_io* udp;
|
2019-10-02 13:06:14 +00:00
|
|
|
llarp_pkt_list m_RecvPackets;
|
2019-01-19 00:41:50 +00:00
|
|
|
|
|
|
|
udp_listener(int fd, llarp_udp_io* u) : ev_io(fd), udp(u){};
|
|
|
|
|
|
|
|
~udp_listener()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2019-10-02 13:06:14 +00:00
|
|
|
bool
|
|
|
|
RecvMany(llarp_pkt_list*);
|
|
|
|
|
2019-01-19 00:41:50 +00:00
|
|
|
bool
|
|
|
|
tick();
|
|
|
|
|
|
|
|
int
|
|
|
|
read(byte_t* buf, size_t sz);
|
|
|
|
|
|
|
|
int
|
|
|
|
sendto(const sockaddr* to, const void* data, size_t sz);
|
|
|
|
};
|
|
|
|
} // namespace llarp
|
2018-12-14 12:04:14 +00:00
|
|
|
|
|
|
|
// A different kind of event loop,
|
|
|
|
// more suited for the native Windows NT
|
|
|
|
// event model
|
|
|
|
struct win32_tun_io
|
|
|
|
{
|
|
|
|
llarp_tun_io* t;
|
|
|
|
device* tunif;
|
|
|
|
|
2019-03-11 18:41:05 +00:00
|
|
|
win32_tun_io(llarp_tun_io* tio) : t(tio), tunif(tuntap_init()){};
|
2018-12-14 12:04:14 +00:00
|
|
|
|
|
|
|
bool
|
2019-01-19 00:41:50 +00:00
|
|
|
queue_write(const byte_t* buf, size_t sz);
|
2018-12-14 12:04:14 +00:00
|
|
|
|
|
|
|
bool
|
2019-01-19 00:41:50 +00:00
|
|
|
setup();
|
2018-12-14 12:04:14 +00:00
|
|
|
|
|
|
|
// first TUN device gets to set up the event port
|
|
|
|
bool
|
2019-12-11 21:18:47 +00:00
|
|
|
add_ev(llarp_ev_loop* l);
|
2018-12-14 12:04:14 +00:00
|
|
|
|
|
|
|
// places data in event queue for kernel to process
|
2020-04-16 09:25:20 +00:00
|
|
|
bool
|
2019-01-19 00:41:50 +00:00
|
|
|
do_write(void* data, size_t sz);
|
2018-12-14 12:04:14 +00:00
|
|
|
|
|
|
|
// we call this one when we get a packet in the event port
|
|
|
|
// which then kicks off another write
|
|
|
|
void
|
2019-01-19 00:41:50 +00:00
|
|
|
flush_write();
|
2018-12-14 12:04:14 +00:00
|
|
|
|
2020-04-16 09:27:27 +00:00
|
|
|
void
|
2019-01-19 00:41:50 +00:00
|
|
|
read(byte_t* buf, size_t sz);
|
2018-12-14 12:04:14 +00:00
|
|
|
|
|
|
|
~win32_tun_io()
|
|
|
|
{
|
|
|
|
CancelIo(tunif->tun_fd);
|
2020-04-07 18:38:56 +00:00
|
|
|
if (tunif->tun_fd)
|
2018-12-14 12:04:14 +00:00
|
|
|
tuntap_destroy(tunif);
|
|
|
|
}
|
|
|
|
};
|
2020-01-31 21:51:43 +00:00
|
|
|
|
2020-01-31 19:47:16 +00:00
|
|
|
#endif
|
2019-07-06 17:03:40 +00:00
|
|
|
#endif
|