Browse Source

More cleanup, and fix a bug in Multicaster::gather()

Adam Ierymenko 10 years ago
parent
commit
5484cf4309
5 changed files with 17 additions and 22 deletions
  1. 1 1
      node/Buffer.hpp
  2. 8 10
      node/IncomingPacket.cpp
  3. 0 3
      node/IncomingPacket.hpp
  4. 7 7
      node/Multicaster.cpp
  5. 1 1
      node/Packet.hpp

+ 1 - 1
node/Buffer.hpp

@@ -203,7 +203,7 @@ public:
 		throw(std::out_of_range)
 		throw(std::out_of_range)
 	{
 	{
 		if ((i + sizeof(T)) > _l)
 		if ((i + sizeof(T)) > _l)
-			throw std::out_of_range("Buffer: set() beyond end of data");
+			throw std::out_of_range("Buffer: setAt() beyond end of data");
 		T *const ZT_VAR_MAY_ALIAS p = reinterpret_cast<T *>(_b + i);
 		T *const ZT_VAR_MAY_ALIAS p = reinterpret_cast<T *>(_b + i);
 		*p = Utils::hton(v);
 		*p = Utils::hton(v);
 	}
 	}

+ 8 - 10
node/IncomingPacket.cpp

@@ -304,7 +304,9 @@ bool IncomingPacket::_doOK(const RuntimeEnvironment *RR,const SharedPtr<Peer> &p
 				uint64_t nwid = at<uint64_t>(ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_NETWORK_ID);
 				uint64_t nwid = at<uint64_t>(ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_NETWORK_ID);
 				MulticastGroup mg(MAC(field(ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_MAC,6),6),at<uint32_t>(ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_ADI));
 				MulticastGroup mg(MAC(field(ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_MAC,6),6),at<uint32_t>(ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_ADI));
 				TRACE("%s(%s): OK(MULTICAST_GATHER) %.16llx/%s length %u",source().toString().c_str(),_remoteAddress.toString().c_str(),nwid,mg.toString().c_str(),size());
 				TRACE("%s(%s): OK(MULTICAST_GATHER) %.16llx/%s length %u",source().toString().c_str(),_remoteAddress.toString().c_str(),nwid,mg.toString().c_str(),size());
-				_parseGatherResults(RR,peer,nwid,mg,ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_GATHER_RESULTS);
+
+				unsigned int count = at<uint16_t>(ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_GATHER_RESULTS + 4);
+				RR->mc->addMultiple(Utils::now(),nwid,mg,peer->address(),field(ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_GATHER_RESULTS + 6,count * 5),count,at<uint32_t>(ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_GATHER_RESULTS));
 			}	break;
 			}	break;
 
 
 			case Packet::VERB_MULTICAST_FRAME: {
 			case Packet::VERB_MULTICAST_FRAME: {
@@ -319,7 +321,7 @@ bool IncomingPacket::_doOK(const RuntimeEnvironment *RR,const SharedPtr<Peer> &p
 				if ((flags & 0x01) != 0) {
 				if ((flags & 0x01) != 0) {
 					// OK(MULTICAST_FRAME) includes certificate of membership update
 					// OK(MULTICAST_FRAME) includes certificate of membership update
 					CertificateOfMembership com;
 					CertificateOfMembership com;
-					offset += com.deserialize(*this,ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_PAYLOAD);
+					offset += com.deserialize(*this,ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_COM_AND_GATHER_RESULTS);
 					SharedPtr<Network> network(RR->nc->network(nwid));
 					SharedPtr<Network> network(RR->nc->network(nwid));
 					if ((network)&&(com.hasRequiredFields()))
 					if ((network)&&(com.hasRequiredFields()))
 						network->addMembershipCertificate(com,false);
 						network->addMembershipCertificate(com,false);
@@ -327,7 +329,10 @@ bool IncomingPacket::_doOK(const RuntimeEnvironment *RR,const SharedPtr<Peer> &p
 
 
 				if ((flags & 0x02) != 0) {
 				if ((flags & 0x02) != 0) {
 					// OK(MULTICAST_FRAME) includes implicit gather results
 					// OK(MULTICAST_FRAME) includes implicit gather results
-					_parseGatherResults(RR,peer,nwid,mg,offset + ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_PAYLOAD);
+					offset += ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_COM_AND_GATHER_RESULTS;
+					unsigned int totalKnown = at<uint32_t>(offset); offset += 4;
+					unsigned int count = at<uint16_t>(offset); offset += 2;
+					RR->mc->addMultiple(Utils::now(),nwid,mg,peer->address(),field(offset,count * 5),count,totalKnown);
 				}
 				}
 			}	break;
 			}	break;
 
 
@@ -890,11 +895,4 @@ void IncomingPacket::_sendErrorNeedCertificate(const RuntimeEnvironment *RR,cons
 	_fromSock->send(_remoteAddress,outp.data(),outp.size());
 	_fromSock->send(_remoteAddress,outp.data(),outp.size());
 }
 }
 
 
-void IncomingPacket::_parseGatherResults(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer,uint64_t nwid,const MulticastGroup &mg,unsigned int offset)
-{
-	unsigned int totalKnown = at<uint32_t>(offset);
-	unsigned int count = at<uint16_t>(offset + 4);
-	RR->mc->addMultiple(Utils::now(),nwid,mg,peer->address(),field(offset + 6,count * 5),count,totalKnown);
-}
-
 } // namespace ZeroTier
 } // namespace ZeroTier

+ 0 - 3
node/IncomingPacket.hpp

@@ -130,9 +130,6 @@ private:
 	// Send an ERROR_NEED_MEMBERSHIP_CERTIFICATE to a peer indicating that an updated cert is needed to join
 	// Send an ERROR_NEED_MEMBERSHIP_CERTIFICATE to a peer indicating that an updated cert is needed to join
 	void _sendErrorNeedCertificate(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer,uint64_t nwid);
 	void _sendErrorNeedCertificate(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer,uint64_t nwid);
 
 
-	// Parse gather results for OK(MULTICAST_GATHER) and OK(MULTICAST_FRAME)
-	void _parseGatherResults(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer,uint64_t nwid,const MulticastGroup &mg,unsigned int offset);
-
 	uint64_t _receiveTime;
 	uint64_t _receiveTime;
 	SharedPtr<Socket> _fromSock;
 	SharedPtr<Socket> _fromSock;
 	InetAddress _remoteAddress;
 	InetAddress _remoteAddress;

+ 7 - 7
node/Multicaster.cpp

@@ -74,9 +74,14 @@ unsigned int Multicaster::gather(const Address &queryingPeer,uint64_t nwid,const
 
 
 	if (!limit)
 	if (!limit)
 		return 0;
 		return 0;
-	if (limit > 0xffff) // TODO: multiple return packets not yet supported
+	else if (limit > 0xffff)
 		limit = 0xffff;
 		limit = 0xffff;
 
 
+	const unsigned int totalAt = appendTo.size();
+	appendTo.addSize(4); // sizeof(uint32_t)
+	const unsigned int addedAt = appendTo.size();
+	appendTo.addSize(2); // sizeof(uint16_t)
+
 	{ // Return myself if I am a member of this group
 	{ // Return myself if I am a member of this group
 		SharedPtr<Network> network(RR->nc->network(nwid));
 		SharedPtr<Network> network(RR->nc->network(nwid));
 		if ((network)&&(network->subscribedToMulticastGroup(mg))) {
 		if ((network)&&(network->subscribedToMulticastGroup(mg))) {
@@ -88,11 +93,6 @@ unsigned int Multicaster::gather(const Address &queryingPeer,uint64_t nwid,const
 
 
 	Mutex::Lock _l(_groups_m);
 	Mutex::Lock _l(_groups_m);
 
 
-	const unsigned int totalAt = appendTo.size();
-	appendTo.addSize(4); // sizeof(uint32_t)
-	const unsigned int addedAt = appendTo.size();
-	appendTo.addSize(2); // sizeof(uint16_t)
-
 	std::map< std::pair<uint64_t,MulticastGroup>,MulticastGroupStatus >::const_iterator gs(_groups.find(std::pair<uint64_t,MulticastGroup>(nwid,mg)));
 	std::map< std::pair<uint64_t,MulticastGroup>,MulticastGroupStatus >::const_iterator gs(_groups.find(std::pair<uint64_t,MulticastGroup>(nwid,mg)));
 	if ((gs != _groups.end())&&(!gs->second.members.empty())) {
 	if ((gs != _groups.end())&&(!gs->second.members.empty())) {
 		totalKnown += (unsigned int)gs->second.members.size();
 		totalKnown += (unsigned int)gs->second.members.size();
@@ -100,7 +100,7 @@ unsigned int Multicaster::gather(const Address &queryingPeer,uint64_t nwid,const
 		// Members are returned in random order so that repeated gather queries
 		// Members are returned in random order so that repeated gather queries
 		// will return different subsets of a large multicast group.
 		// will return different subsets of a large multicast group.
 		k = 0;
 		k = 0;
-		while ((added < limit)&&(k < gs->second.members.size())&&((appendTo.size() + ZT_ADDRESS_LENGTH) <= ZT_PROTO_MAX_PACKET_LENGTH)) {
+		while ((added < limit)&&(k < gs->second.members.size())&&((appendTo.size() + ZT_ADDRESS_LENGTH) <= ZT_UDP_DEFAULT_PAYLOAD_MTU)) {
 			rptr = (unsigned int)RR->prng->next32();
 			rptr = (unsigned int)RR->prng->next32();
 
 
 restart_member_scan:
 restart_member_scan:

+ 1 - 1
node/Packet.hpp

@@ -303,7 +303,7 @@
 #define ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_MAC (ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_NETWORK_ID + 8)
 #define ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_MAC (ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_NETWORK_ID + 8)
 #define ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_ADI (ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_MAC + 6)
 #define ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_ADI (ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_MAC + 6)
 #define ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_FLAGS (ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_ADI + 4)
 #define ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_FLAGS (ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_ADI + 4)
-#define ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_PAYLOAD (ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_FLAGS + 1)
+#define ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_COM_AND_GATHER_RESULTS (ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_FLAGS + 1)
 
 
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------