From 45f315e603fdc1330bcce7458ac3975520db2613 Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Mon, 27 Jun 2016 17:09:04 -0700 Subject: Defer NETWORK_CONFIG_REQUEST packets and allow multithreaded processing. --- node/IncomingPacket.cpp | 25 +++++++++++++++++-------- node/IncomingPacket.hpp | 13 ++++++++----- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/node/IncomingPacket.cpp b/node/IncomingPacket.cpp index 871297f7..e6959be6 100644 --- a/node/IncomingPacket.cpp +++ b/node/IncomingPacket.cpp @@ -61,13 +61,16 @@ bool IncomingPacket::tryDecode(const RuntimeEnvironment *RR,bool deferred) SharedPtr peer(RR->topology->getPeer(sourceAddress)); if (peer) { - if (!dearmor(peer->key())) { - TRACE("dropped packet from %s(%s), MAC authentication failed (size: %u)",peer->address().toString().c_str(),_remoteAddress.toString().c_str(),size()); - return true; - } - if (!uncompress()) { - TRACE("dropped packet from %s(%s), compressed data invalid",peer->address().toString().c_str(),_remoteAddress.toString().c_str()); - return true; + if (!_authenticated) { + if (!dearmor(peer->key())) { + TRACE("dropped packet from %s(%s), MAC authentication failed (size: %u)",peer->address().toString().c_str(),_remoteAddress.toString().c_str(),size()); + return true; + } + if (!uncompress()) { + TRACE("dropped packet from %s(%s), compressed data invalid",peer->address().toString().c_str(),_remoteAddress.toString().c_str()); + return true; + } + _authenticated = true; } const Packet::Verb v = verb(); @@ -88,7 +91,13 @@ bool IncomingPacket::tryDecode(const RuntimeEnvironment *RR,bool deferred) case Packet::VERB_ECHO: return _doECHO(RR,peer); case Packet::VERB_MULTICAST_LIKE: return _doMULTICAST_LIKE(RR,peer); case Packet::VERB_NETWORK_MEMBERSHIP_CERTIFICATE: return _doNETWORK_MEMBERSHIP_CERTIFICATE(RR,peer); - case Packet::VERB_NETWORK_CONFIG_REQUEST: return _doNETWORK_CONFIG_REQUEST(RR,peer); + case Packet::VERB_NETWORK_CONFIG_REQUEST: + if ((RR->dpEnabled > 0)&&(!deferred)) { + RR->dp->enqueue(this); + return true; + } else { + return _doNETWORK_CONFIG_REQUEST(RR,peer); + } case Packet::VERB_NETWORK_CONFIG_REFRESH: return _doNETWORK_CONFIG_REFRESH(RR,peer); case Packet::VERB_MULTICAST_GATHER: return _doMULTICAST_GATHER(RR,peer); case Packet::VERB_MULTICAST_FRAME: return _doMULTICAST_FRAME(RR,peer); diff --git a/node/IncomingPacket.hpp b/node/IncomingPacket.hpp index 96e46c00..3be49bf8 100644 --- a/node/IncomingPacket.hpp +++ b/node/IncomingPacket.hpp @@ -58,7 +58,8 @@ public: Packet(), _receiveTime(0), _localAddress(), - _remoteAddress() + _remoteAddress(), + _authenticated(false) { } @@ -79,10 +80,11 @@ public: * @throws std::out_of_range Range error processing packet */ IncomingPacket(const void *data,unsigned int len,const InetAddress &localAddress,const InetAddress &remoteAddress,uint64_t now) : - Packet(data,len), - _receiveTime(now), - _localAddress(localAddress), - _remoteAddress(remoteAddress) + Packet(data,len), + _receiveTime(now), + _localAddress(localAddress), + _remoteAddress(remoteAddress), + _authenticated(false) { } @@ -188,6 +190,7 @@ private: uint64_t _receiveTime; InetAddress _localAddress; InetAddress _remoteAddress; + bool _authenticated; }; } // namespace ZeroTier -- cgit v1.2.3