Browse Source

Turns out that needed to be a list after all. Also clean up Multicaster::gather().

Adam Ierymenko 10 years ago
parent
commit
e7c81ef34e
3 changed files with 9 additions and 7 deletions
  1. 6 4
      node/Multicaster.cpp
  2. 2 2
      node/Switch.cpp
  3. 1 1
      node/Switch.hpp

+ 6 - 4
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;

+ 2 - 2
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++);

+ 1 - 1
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