Browse Source

Update bloom filter for MULTICAST_FRAME retransmit, and temporarily add abort() to catch gremlin

Adam Ierymenko 12 years ago
parent
commit
a004878546
3 changed files with 4 additions and 3 deletions
  1. 2 3
      node/Multicaster.hpp
  2. 1 0
      node/PacketDecoder.cpp
  3. 1 0
      node/Topology.cpp

+ 2 - 3
node/Multicaster.hpp

@@ -287,12 +287,11 @@ public:
 		}
 
 		// Add a supernode if there's nowhere else to go. Supernodes know of all multicast
-		// LIKEs and so can act to bridge sparse multicast groups. We do not remember them
-		// in the bloom filter.
+		// LIKEs and so can act to bridge sparse multicast groups.
 		if (!picked) {
 			Address avoid[2];
 			avoid[0] = upstream;
-			avoid[1] = originalSubmitter;
+			avoid[1] = originalSubmitter; // otherwise supernodes will play ping pong
 			P peer = topology.getBestSupernode(avoid,2,true);
 			if (peer)
 				peers[picked++] = peer;

+ 1 - 0
node/PacketDecoder.cpp

@@ -477,6 +477,7 @@ bool PacketDecoder::_doMULTICAST_FRAME(const RuntimeEnvironment *_r,const Shared
 
 								setSource(_r->identity.address());
 								(*this)[ZT_PROTO_VERB_MULTICAST_FRAME_IDX_HOP_COUNT] = hops;
+								memcpy(field(ZT_PROTO_VERB_MULTICAST_FRAME_IDX_BLOOM_FILTER,ZT_PROTO_VERB_MULTICAST_FRAME_BLOOM_FILTER_SIZE_BYTES),bloom.data(),ZT_PROTO_VERB_MULTICAST_FRAME_BLOOM_FILTER_SIZE_BYTES);
 								compress();
 
 								for(unsigned int i=0;i<np;++i) {

+ 1 - 0
node/Topology.cpp

@@ -115,6 +115,7 @@ void Topology::addPeer(const SharedPtr<Peer> &candidate,void (*callback)(void *,
 SharedPtr<Peer> Topology::getPeer(const Address &zta)
 {
 	if (zta == _r->identity.address()) {
+		abort();
 		TRACE("BUG: ignored attempt to getPeer() for self, returned NULL");
 		return SharedPtr<Peer>();
 	}