From f6c812a642fe92b8b0d5995a717a088a41b2ca89 Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Sun, 30 Sep 2018 09:23:37 -0400 Subject: [PATCH] include packet info in tun but discard it so that tun can work on platforms that include packet info --- llarp/ev.cpp | 3 ++- llarp/ev.hpp | 15 ++++++++++++--- llarp/ev_epoll.hpp | 5 +++-- vendor/libtuntap-master/tuntap-unix-linux.c | 2 +- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/llarp/ev.cpp b/llarp/ev.cpp index 4ca4d22d4..6b8bfb901 100644 --- a/llarp/ev.cpp +++ b/llarp/ev.cpp @@ -120,5 +120,6 @@ llarp_ev_add_tun(struct llarp_ev_loop *loop, struct llarp_tun_io *tun) bool llarp_ev_tun_async_write(struct llarp_tun_io *tun, const void *pkt, size_t sz) { - return static_cast< llarp::ev_io * >(tun->impl)->queue_write(pkt, sz); + // TODO: queue write + return static_cast< llarp::ev_io * >(tun->impl)->do_write(pkt, sz); } diff --git a/llarp/ev.hpp b/llarp/ev.hpp index 3ff737e19..c6176f2c0 100644 --- a/llarp/ev.hpp +++ b/llarp/ev.hpp @@ -1,6 +1,8 @@ #ifndef LLARP_EV_HPP #define LLARP_EV_HPP #include +// witev +#include #ifndef _MSC_VER #include @@ -41,9 +43,16 @@ namespace llarp /// used for tun interface bool - queue_write(const void* data, size_t sz) + do_write(void* data, size_t sz) { - return write(fd, data, sz) != -1; + iovec vecs[2]; + // TODO: IPV6 + uint32_t t = htonl(AF_INET); + vecs[0].iov_base = &t; + vecs[0].iov_len = sizeof(t); + vecs[1].iov_base = data; + vecs[1].iov_len = sz; + return writev(fd, vecs, 2) != -1; } /// called in event loop when fd is ready for writing @@ -55,7 +64,7 @@ namespace llarp m_writeq.Process([&](WriteBuffer& buffer) { // todo: wtf??? #ifndef _WIN32 - write(fd, buffer.buf, buffer.bufsz); + do_write(buffer.buf, buffer.bufsz); // if we would block we save the entries for later // discard entry diff --git a/llarp/ev_epoll.hpp b/llarp/ev_epoll.hpp index 2232a02e9..62236e1c3 100644 --- a/llarp/ev_epoll.hpp +++ b/llarp/ev_epoll.hpp @@ -96,9 +96,10 @@ namespace llarp read(void* buf, size_t sz) { ssize_t ret = tuntap_read(tunif, buf, sz); - if(ret > 0 && t->recvpkt) + if(ret > 4 && t->recvpkt) { - t->recvpkt(t, buf, ret); + // don't include packet info + t->recvpkt(t, ((byte_t*)buf) + 4, ret - 4); } return ret; } diff --git a/vendor/libtuntap-master/tuntap-unix-linux.c b/vendor/libtuntap-master/tuntap-unix-linux.c index dd8518972..21fba4507 100644 --- a/vendor/libtuntap-master/tuntap-unix-linux.c +++ b/vendor/libtuntap-master/tuntap-unix-linux.c @@ -72,7 +72,7 @@ tuntap_sys_start(struct device *dev, int mode, int tun) tuntap_log(TUNTAP_LOG_ERR, "Invalid parameter 'mode'"); return -1; } - ifr.ifr_flags |= IFF_NO_PI; + // ifr.ifr_flags |= IFF_NO_PI; if(tun < 0) {