Ver código fonte

Tweak new RX queue algorithm to "expire" old entries to prevent always needing to traverse the whole queue array.

Adam Ierymenko 9 anos atrás
pai
commit
56096be8b6
3 arquivos alterados com 10 adições e 3 exclusões
  1. 5 0
      node/Constants.hpp
  2. 2 2
      node/Switch.cpp
  3. 3 1
      node/Switch.hpp

+ 5 - 0
node/Constants.hpp

@@ -169,6 +169,11 @@
  */
 #define ZT_RX_QUEUE_SIZE 64
 
+/**
+ * RX queue entries older than this do not "exist"
+ */
+#define ZT_RX_QUEUE_EXPIRE 4000
+
 /**
  * Length of secret key in bytes -- 256-bit -- do not change
  */

+ 2 - 2
node/Switch.cpp

@@ -138,7 +138,7 @@ void Switch::onRemotePacket(const InetAddress &localAddr,const InetAddress &from
 						// seeing a Packet::Fragment?
 
 						Mutex::Lock _l(_rxQueue_m);
-						RXQueueEntry *const rq = _findRXQueueEntry(fragmentPacketId);
+						RXQueueEntry *const rq = _findRXQueueEntry(now,fragmentPacketId);
 
 						if ((!rq->timestamp)||(rq->packetId != fragmentPacketId)) {
 							// No packet found, so we received a fragment without its head.
@@ -241,7 +241,7 @@ void Switch::onRemotePacket(const InetAddress &localAddr,const InetAddress &from
 					// Packet is the head of a fragmented packet series
 
 					Mutex::Lock _l(_rxQueue_m);
-					RXQueueEntry *const rq = _findRXQueueEntry(packetId);
+					RXQueueEntry *const rq = _findRXQueueEntry(now,packetId);
 
 					if ((!rq->timestamp)||(rq->packetId != packetId)) {
 						// If we have no other fragments yet, create an entry and save the head

+ 3 - 1
node/Switch.hpp

@@ -184,7 +184,7 @@ private:
 
 	/* Returns the matching or oldest entry. Caller must check timestamp and
 	 * packet ID to determine which. */
-	inline RXQueueEntry *_findRXQueueEntry(uint64_t packetId)
+	inline RXQueueEntry *_findRXQueueEntry(uint64_t now,uint64_t packetId)
 	{
 		RXQueueEntry *rq;
 		RXQueueEntry *oldest = &(_rxQueue[ZT_RX_QUEUE_SIZE - 1]);
@@ -193,6 +193,8 @@ private:
 			rq = &(_rxQueue[--i]);
 			if ((rq->packetId == packetId)&&(rq->timestamp))
 				return rq;
+			if ((now - rq->timestamp) >= ZT_RX_QUEUE_EXPIRE)
+				rq->timestamp = 0;
 			if (rq->timestamp < oldest->timestamp)
 				oldest = rq;
 		}