summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--node/Multicaster.cpp10
-rw-r--r--node/Switch.cpp4
-rw-r--r--node/Switch.hpp2
3 files changed, 9 insertions, 7 deletions
diff --git a/node/Multicaster.cpp b/node/Multicaster.cpp
index b3c0abd8..6f3c4395 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 32190a87..de245442 100644
--- a/node/Switch.cpp
+++ b/node/Switch.cpp
@@ -440,7 +440,7 @@ void Switch::doAnythingWaitingForPeer(const SharedPtr<Peer> &peer)
{ // finish processing any packets waiting on peer's public key / identity
Mutex::Lock _l(_rxQueue_m);
- for(std::vector< SharedPtr<IncomingPacket> >::iterator rxi(_rxQueue.begin());rxi!=_rxQueue.end();) {
+ for(std::list< SharedPtr<IncomingPacket> >::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<IncomingPacket> >::iterator i(_rxQueue.begin());i!=_rxQueue.end();) {
+ for(std::list< SharedPtr<IncomingPacket> >::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 6b81b376..543d49ca 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<IncomingPacket> > _rxQueue;
+ std::list< SharedPtr<IncomingPacket> > _rxQueue;
Mutex _rxQueue_m;
// ZeroTier-layer TX queue by destination ZeroTier address