From e7c81ef34e9db426d6ba72e2feae4180233631e5 Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Fri, 3 Oct 2014 22:03:19 -0700 Subject: [PATCH] Turns out that needed to be a list after all. Also clean up Multicaster::gather(). --- node/Multicaster.cpp | 10 ++++++---- node/Switch.cpp | 4 ++-- node/Switch.hpp | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/node/Multicaster.cpp b/node/Multicaster.cpp index b3c0abd83..6f3c43951 100644 --- a/node/Multicaster.cpp +++ b/node/Multicaster.cpp @@ -66,12 +66,13 @@ unsigned int Multicaster::gather(const RuntimeEnvironment *RR,const Address &que if (limit > gs->second.members.size()) limit = (unsigned int)gs->second.members.size(); - if (limit > 0xffff) // sanity check -- this won't fit in a packet anyway - limit = 0xffff; + if (limit > ((ZT_PROTO_MAX_PACKET_LENGTH / 5) + 1)) + limit = (ZT_PROTO_MAX_PACKET_LENGTH / 5) + 1; - appendTo.append((uint32_t)gs->second.members.size()); + unsigned int totalAt = appendTo.size(); + appendTo.addSize(4); // sizeof(uint32_t) unsigned int nAt = appendTo.size(); - appendTo.append((uint16_t)0); // set to n later + appendTo.addSize(2); // sizeof(uint16_t) while ((n < limit)&&((appendTo.size() + ZT_ADDRESS_LENGTH) <= ZT_PROTO_MAX_PACKET_LENGTH)) { // Pick a member at random -- if we've already picked it, @@ -103,6 +104,7 @@ restart_member_scan: } } + appendTo.setAt(totalAt,(uint32_t)(gs->second.members.size() - skipped)); appendTo.setAt(nAt,(uint16_t)(n - skipped)); return n; diff --git a/node/Switch.cpp b/node/Switch.cpp index 32190a87a..de245442b 100644 --- a/node/Switch.cpp +++ b/node/Switch.cpp @@ -440,7 +440,7 @@ void Switch::doAnythingWaitingForPeer(const SharedPtr &peer) { // finish processing any packets waiting on peer's public key / identity Mutex::Lock _l(_rxQueue_m); - for(std::vector< SharedPtr >::iterator rxi(_rxQueue.begin());rxi!=_rxQueue.end();) { + for(std::list< SharedPtr >::iterator rxi(_rxQueue.begin());rxi!=_rxQueue.end();) { if ((*rxi)->tryDecode(RR)) _rxQueue.erase(rxi++); else ++rxi; @@ -527,7 +527,7 @@ unsigned long Switch::doTimerTasks() { Mutex::Lock _l(_rxQueue_m); - for(std::vector< SharedPtr >::iterator i(_rxQueue.begin());i!=_rxQueue.end();) { + for(std::list< SharedPtr >::iterator i(_rxQueue.begin());i!=_rxQueue.end();) { if ((now - (*i)->receiveTime()) > ZT_RECEIVE_QUEUE_TIMEOUT) { TRACE("RX %s -> %s timed out",(*i)->source().toString().c_str(),(*i)->destination().toString().c_str()); _rxQueue.erase(i++); diff --git a/node/Switch.hpp b/node/Switch.hpp index 6b81b3763..543d49ca5 100644 --- a/node/Switch.hpp +++ b/node/Switch.hpp @@ -242,7 +242,7 @@ private: Mutex _defragQueue_m; // ZeroTier-layer RX queue of incoming packets in the process of being decoded - std::vector< SharedPtr > _rxQueue; + std::list< SharedPtr > _rxQueue; Mutex _rxQueue_m; // ZeroTier-layer TX queue by destination ZeroTier address