Browse Source

Prevent "software laser" in legacy multicast support. Already hotpatched in supernodes.

Adam Ierymenko 10 years ago
parent
commit
c61e9c0ef9
1 changed files with 3 additions and 3 deletions
  1. 3 3
      node/IncomingPacket.cpp

+ 3 - 3
node/IncomingPacket.cpp

@@ -611,14 +611,14 @@ bool IncomingPacket::_doP5_MULTICAST_FRAME(const RuntimeEnvironment *RR,const Sh
 
 
 			std::vector<Address> members(RR->mc->getMembers(nwid,dest,limit));
 			std::vector<Address> members(RR->mc->getMembers(nwid,dest,limit));
 			SharedPtr<Peer> lpp;
 			SharedPtr<Peer> lpp;
+			uint64_t now = Utils::now();
 
 
 			setAt(ZT_PROTO_VERB_P5_MULTICAST_FRAME_IDX_PROPAGATION_DEPTH,(uint16_t)0xffff);
 			setAt(ZT_PROTO_VERB_P5_MULTICAST_FRAME_IDX_PROPAGATION_DEPTH,(uint16_t)0xffff);
 			setSource(RR->identity.address());
 			setSource(RR->identity.address());
 			compress();
 			compress();
 			for(std::vector<Address>::iterator lp(members.begin());lp!=members.end();++lp) {
 			for(std::vector<Address>::iterator lp(members.begin());lp!=members.end();++lp) {
-				if (!senderIsLegacy)
-					lpp = RR->topology->getPeer(*lp);
-				if ( (*lp != origin) && (*lp != peer->address()) && ((senderIsLegacy) || (!lpp) || (lpp->remoteVersionMajor() < 1)) ) {
+				lpp = RR->topology->getPeer(*lp);
+				if ( (lpp) && (lpp->hasActiveDirectPath(now)) && (*lp != origin) && (*lp != peer->address()) && ((senderIsLegacy) || (lpp->remoteVersionMajor() < 1)) ) {
 					newInitializationVector();
 					newInitializationVector();
 					setDestination(*lp);
 					setDestination(*lp);
 					RR->sw->send(*this,true);
 					RR->sw->send(*this,true);