Parcourir la source

Always announce multicast groups, not just to peers with direct links, and push network COMs to any MULTICAST_LIKE recipient for future use.

Adam Ierymenko il y a 10 ans
Parent
commit
d6676a9d6c
2 fichiers modifiés avec 49 ajouts et 36 suppressions
  1. 47 34
      node/Network.cpp
  2. 2 2
      node/Network.hpp

+ 47 - 34
node/Network.cpp

@@ -400,11 +400,53 @@ bool Network::_isAllowed(const SharedPtr<Peer> &peer) const
 	return false; // default position on any failure
 	return false; // default position on any failure
 }
 }
 
 
-// Used in Network::_announceMulticastGroups()
-class _AnnounceMulticastGroupsToPeersWithActiveDirectPaths
+bool Network::_tryAnnounceMulticastGroupsTo(const std::vector<Address> &alwaysAddresses,const std::vector<MulticastGroup> &allMulticastGroups,const SharedPtr<Peer> &peer,uint64_t now) const
+{
+	// assumes _lock is locked
+	if (
+	    (_isAllowed(peer)) ||
+	    (peer->address() == this->controller()) ||
+	    (std::find(alwaysAddresses.begin(),alwaysAddresses.end(),peer->address()) != alwaysAddresses.end())
+	   ) {
+
+		if ((_config)&&(_config->com())&&(!_config->isPublic())&&(peer->needsOurNetworkMembershipCertificate(_id,now,true))) {
+			Packet outp(peer->address(),RR->identity.address(),Packet::VERB_NETWORK_MEMBERSHIP_CERTIFICATE);
+			_config->com().serialize(outp);
+			outp.armor(peer->key(),true);
+			peer->send(RR,outp.data(),outp.size(),now);
+		}
+
+		{
+			Packet outp(peer->address(),RR->identity.address(),Packet::VERB_MULTICAST_LIKE);
+
+			for(std::vector<MulticastGroup>::const_iterator mg(allMulticastGroups.begin());mg!=allMulticastGroups.end();++mg) {
+				if ((outp.size() + 18) >= ZT_UDP_DEFAULT_PAYLOAD_MTU) {
+					outp.armor(peer->key(),true);
+					peer->send(RR,outp.data(),outp.size(),now);
+					outp.reset(peer->address(),RR->identity.address(),Packet::VERB_MULTICAST_LIKE);
+				}
+
+				// network ID, MAC, ADI
+				outp.append((uint64_t)_id);
+				mg->mac().appendTo(outp);
+				outp.append((uint32_t)mg->adi());
+			}
+
+			if (outp.size() > ZT_PROTO_MIN_PACKET_LENGTH) {
+				outp.armor(peer->key(),true);
+				peer->send(RR,outp.data(),outp.size(),now);
+			}
+		}
+
+		return true;
+	}
+	return false;
+}
+
+class _AnnounceMulticastGroupsToAll
 {
 {
 public:
 public:
-	_AnnounceMulticastGroupsToPeersWithActiveDirectPaths(const RuntimeEnvironment *renv,Network *nw) :
+	_AnnounceMulticastGroupsToAll(const RuntimeEnvironment *renv,Network *nw) :
 		_now(renv->node->now()),
 		_now(renv->node->now()),
 		RR(renv),
 		RR(renv),
 		_network(nw),
 		_network(nw),
@@ -421,40 +463,11 @@ private:
 	std::vector<Address> _rootAddresses;
 	std::vector<Address> _rootAddresses;
 	std::vector<MulticastGroup> _allMulticastGroups;
 	std::vector<MulticastGroup> _allMulticastGroups;
 };
 };
-
-bool Network::_tryAnnounceMulticastGroupsTo(const std::vector<Address> &alwaysAddresses,const std::vector<MulticastGroup> &allMulticastGroups,const SharedPtr<Peer> &peer,uint64_t now) const
-{
-	if ( ( (peer->hasActiveDirectPath(now)) && ( _isAllowed(peer) || (peer->address() == this->controller()) ) ) || (std::find(alwaysAddresses.begin(),alwaysAddresses.end(),peer->address()) != alwaysAddresses.end()) ) {
-		Packet outp(peer->address(),RR->identity.address(),Packet::VERB_MULTICAST_LIKE);
-
-		for(std::vector<MulticastGroup>::const_iterator mg(allMulticastGroups.begin());mg!=allMulticastGroups.end();++mg) {
-			if ((outp.size() + 18) >= ZT_UDP_DEFAULT_PAYLOAD_MTU) {
-				outp.armor(peer->key(),true);
-				peer->send(RR,outp.data(),outp.size(),now);
-				outp.reset(peer->address(),RR->identity.address(),Packet::VERB_MULTICAST_LIKE);
-			}
-
-			// network ID, MAC, ADI
-			outp.append((uint64_t)_id);
-			mg->mac().appendTo(outp);
-			outp.append((uint32_t)mg->adi());
-		}
-
-		if (outp.size() > ZT_PROTO_MIN_PACKET_LENGTH) {
-			outp.armor(peer->key(),true);
-			peer->send(RR,outp.data(),outp.size(),now);
-		}
-
-		return true;
-	}
-	return false;
-}
-
 void Network::_announceMulticastGroups()
 void Network::_announceMulticastGroups()
 {
 {
 	// Assumes _lock is locked
 	// Assumes _lock is locked
-	_AnnounceMulticastGroupsToPeersWithActiveDirectPaths afunc(RR,this);
-	RR->topology->eachPeer<_AnnounceMulticastGroupsToPeersWithActiveDirectPaths &>(afunc);
+	_AnnounceMulticastGroupsToAll afunc(RR,this);
+	RR->topology->eachPeer<_AnnounceMulticastGroupsToAll &>(afunc);
 }
 }
 
 
 std::vector<MulticastGroup> Network::_allMulticastGroups() const
 std::vector<MulticastGroup> Network::_allMulticastGroups() const

+ 2 - 2
node/Network.hpp

@@ -55,8 +55,8 @@
 namespace ZeroTier {
 namespace ZeroTier {
 
 
 class RuntimeEnvironment;
 class RuntimeEnvironment;
-class _AnnounceMulticastGroupsToPeersWithActiveDirectPaths;
 class Peer;
 class Peer;
+class _AnnounceMulticastGroupsToAll; // internal function object in Network.cpp
 
 
 /**
 /**
  * A virtual LAN
  * A virtual LAN
@@ -64,7 +64,7 @@ class Peer;
 class Network : NonCopyable
 class Network : NonCopyable
 {
 {
 	friend class SharedPtr<Network>;
 	friend class SharedPtr<Network>;
-	friend class _AnnounceMulticastGroupsToPeersWithActiveDirectPaths;
+	friend class _AnnounceMulticastGroupsToAll;
 
 
 public:
 public:
 	/**
 	/**