add idempotent wake up for sending messages to the network and writing packets on interfaces

pull/1658/head
Jeff Becker 3 years ago
parent 108b8e089e
commit a8964a6d8a
No known key found for this signature in database
GPG Key ID: F357B3B42F6F9B05

@ -67,6 +67,8 @@ namespace llarp
: service::Endpoint(r, parent) : service::Endpoint(r, parent)
, m_UserToNetworkPktQueue("endpoint_sendq", r->loop(), r->loop()) , 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<vpn::PacketRouter>( m_PacketRouter = std::make_unique<vpn::PacketRouter>(
[this](net::IPPacket pkt) { HandleGotUserPacket(std::move(pkt)); }); [this](net::IPPacket pkt) { HandleGotUserPacket(std::move(pkt)); });
#ifdef ANDROID #ifdef ANDROID
@ -224,6 +226,12 @@ namespace llarp
{ {
FlushSend(); FlushSend();
Pump(Now()); Pump(Now());
FlushWrite();
}
void
TunEndpoint::FlushWrite()
{
// flush network to user // flush network to user
while (not m_NetworkToUserPktQueue.empty()) while (not m_NetworkToUserPktQueue.empty())
{ {
@ -1144,6 +1152,8 @@ namespace llarp
pkt.UpdateIPv6Address(src, dst); pkt.UpdateIPv6Address(src, dst);
} }
m_NetworkToUserPktQueue.push(std::move(write)); 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; return true;
} }
@ -1252,6 +1262,7 @@ namespace llarp
TunEndpoint::HandleGotUserPacket(net::IPPacket pkt) TunEndpoint::HandleGotUserPacket(net::IPPacket pkt)
{ {
m_UserToNetworkPktQueue.Emplace(std::move(pkt)); m_UserToNetworkPktQueue.Emplace(std::move(pkt));
m_MessageSendWaker->Trigger();
} }
TunEndpoint::~TunEndpoint() = default; TunEndpoint::~TunEndpoint() = default;

@ -209,6 +209,10 @@ namespace llarp
virtual void virtual void
FlushSend(); FlushSend();
/// flush writing ip packets to interface
void
FlushWrite();
/// maps ip to key (host byte order) /// maps ip to key (host byte order)
std::unordered_map<huint128_t, AlignedBuffer<32>> m_IPToAddr; std::unordered_map<huint128_t, AlignedBuffer<32>> m_IPToAddr;
/// maps key to ip (host byte order) /// maps key to ip (host byte order)
@ -275,6 +279,11 @@ namespace llarp
std::set<IPRange> m_OwnedRanges; std::set<IPRange> m_OwnedRanges;
/// how long to wait for path alignment /// how long to wait for path alignment
llarp_time_t m_PathAlignmentTimeout; llarp_time_t m_PathAlignmentTimeout;
/// idempotent wakeup for writing packets to user
std::shared_ptr<EventLoopWakeup> m_PacketSendWaker;
/// idempotent wakeup for writing messages to network
std::shared_ptr<EventLoopWakeup> m_MessageSendWaker;
}; };
} // namespace handlers } // namespace handlers

Loading…
Cancel
Save