summaryrefslogtreecommitdiff
path: root/node
diff options
context:
space:
mode:
Diffstat (limited to 'node')
-rw-r--r--node/Network.cpp81
-rw-r--r--node/Network.hpp4
2 files changed, 49 insertions, 36 deletions
diff --git a/node/Network.cpp b/node/Network.cpp
index d86145da..a9e4e55b 100644
--- a/node/Network.cpp
+++ b/node/Network.cpp
@@ -400,11 +400,53 @@ bool Network::_isAllowed(const SharedPtr<Peer> &peer) const
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:
- _AnnounceMulticastGroupsToPeersWithActiveDirectPaths(const RuntimeEnvironment *renv,Network *nw) :
+ _AnnounceMulticastGroupsToAll(const RuntimeEnvironment *renv,Network *nw) :
_now(renv->node->now()),
RR(renv),
_network(nw),
@@ -421,40 +463,11 @@ private:
std::vector<Address> _rootAddresses;
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()
{
// 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
diff --git a/node/Network.hpp b/node/Network.hpp
index b942e5f9..f7939323 100644
--- a/node/Network.hpp
+++ b/node/Network.hpp
@@ -55,8 +55,8 @@
namespace ZeroTier {
class RuntimeEnvironment;
-class _AnnounceMulticastGroupsToPeersWithActiveDirectPaths;
class Peer;
+class _AnnounceMulticastGroupsToAll; // internal function object in Network.cpp
/**
* A virtual LAN
@@ -64,7 +64,7 @@ class Peer;
class Network : NonCopyable
{
friend class SharedPtr<Network>;
- friend class _AnnounceMulticastGroupsToPeersWithActiveDirectPaths;
+ friend class _AnnounceMulticastGroupsToAll;
public:
/**