summaryrefslogtreecommitdiff
path: root/node
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2016-04-07 16:41:28 +0000
committerAdam Ierymenko <adam.ierymenko@gmail.com>2016-04-07 16:41:28 +0000
commit9085a04b165dc2a2c7c77091e507fdd98757d363 (patch)
tree51790b8db47bfd8ad39b800bd365cf3d8b122466 /node
parentc7df61a3c32d66b31f047602da9ce982164c6757 (diff)
parentc278f051817719fc3c4bbda0e13c279ce44f0966 (diff)
downloadinfinitytier-9085a04b165dc2a2c7c77091e507fdd98757d363.tar.gz
infinitytier-9085a04b165dc2a2c7c77091e507fdd98757d363.zip
Merge branch 'dev' of http://git.int.zerotier.com:/zerotier/ZeroTierOne into dev
Diffstat (limited to 'node')
-rw-r--r--node/Constants.hpp5
-rw-r--r--node/Switch.cpp4
-rw-r--r--node/Switch.hpp4
3 files changed, 10 insertions, 3 deletions
diff --git a/node/Constants.hpp b/node/Constants.hpp
index c9356da0..6c44a8dc 100644
--- a/node/Constants.hpp
+++ b/node/Constants.hpp
@@ -170,6 +170,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
*/
#define ZT_PEER_SECRET_KEY_LENGTH 32
diff --git a/node/Switch.cpp b/node/Switch.cpp
index 890a9465..968d1a4a 100644
--- a/node/Switch.cpp
+++ b/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
diff --git a/node/Switch.hpp b/node/Switch.hpp
index 219bfb41..ce4f00a1 100644
--- a/node/Switch.hpp
+++ b/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;
}