浏览代码

Defer NETWORK_CONFIG_REQUEST packets and allow multithreaded processing.

Adam Ierymenko 9 年之前
父节点
当前提交
45f315e603
共有 2 个文件被更改,包括 25 次插入13 次删除
  1. 17 8
      node/IncomingPacket.cpp
  2. 8 5
      node/IncomingPacket.hpp

+ 17 - 8
node/IncomingPacket.cpp

@@ -61,13 +61,16 @@ bool IncomingPacket::tryDecode(const RuntimeEnvironment *RR,bool deferred)
 
 		SharedPtr<Peer> 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);

+ 8 - 5
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