From a8964a6d8a109573ee476536211ce989f8aaab54 Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Fri, 4 Jun 2021 07:15:00 -0400 Subject: [PATCH] add idempotent wake up for sending messages to the network and writing packets on interfaces --- llarp/handlers/tun.cpp | 11 +++++++++++ llarp/handlers/tun.hpp | 9 +++++++++ 2 files changed, 20 insertions(+) diff --git a/llarp/handlers/tun.cpp b/llarp/handlers/tun.cpp index 0c00583ad..6feee9b1f 100644 --- a/llarp/handlers/tun.cpp +++ b/llarp/handlers/tun.cpp @@ -67,6 +67,8 @@ namespace llarp : service::Endpoint(r, parent) , m_UserToNetworkPktQueue("endpoint_sendq", r->loop(), r->loop()) { + m_PacketSendWaker = r->loop()->make_waker([this]() { FlushWrite(); }); + m_MessageSendWaker = r->loop()->make_waker([this]() { FlushSend(); }); m_PacketRouter = std::make_unique( [this](net::IPPacket pkt) { HandleGotUserPacket(std::move(pkt)); }); #ifdef ANDROID @@ -224,6 +226,12 @@ namespace llarp { FlushSend(); Pump(Now()); + FlushWrite(); + } + + void + TunEndpoint::FlushWrite() + { // flush network to user while (not m_NetworkToUserPktQueue.empty()) { @@ -1144,6 +1152,8 @@ namespace llarp pkt.UpdateIPv6Address(src, dst); } m_NetworkToUserPktQueue.push(std::move(write)); + // wake up packet flushing event so we ensure that all packets are written to user + m_PacketSendWaker->Trigger(); return true; } @@ -1252,6 +1262,7 @@ namespace llarp TunEndpoint::HandleGotUserPacket(net::IPPacket pkt) { m_UserToNetworkPktQueue.Emplace(std::move(pkt)); + m_MessageSendWaker->Trigger(); } TunEndpoint::~TunEndpoint() = default; diff --git a/llarp/handlers/tun.hpp b/llarp/handlers/tun.hpp index 2f0679485..0e614a8f6 100644 --- a/llarp/handlers/tun.hpp +++ b/llarp/handlers/tun.hpp @@ -209,6 +209,10 @@ namespace llarp virtual void FlushSend(); + /// flush writing ip packets to interface + void + FlushWrite(); + /// maps ip to key (host byte order) std::unordered_map> m_IPToAddr; /// maps key to ip (host byte order) @@ -275,6 +279,11 @@ namespace llarp std::set m_OwnedRanges; /// how long to wait for path alignment llarp_time_t m_PathAlignmentTimeout; + /// idempotent wakeup for writing packets to user + std::shared_ptr m_PacketSendWaker; + + /// idempotent wakeup for writing messages to network + std::shared_ptr m_MessageSendWaker; }; } // namespace handlers