diff options
Diffstat (limited to 'node')
-rw-r--r-- | node/Membership.cpp | 4 | ||||
-rw-r--r-- | node/Membership.hpp | 3 | ||||
-rw-r--r-- | node/Network.cpp | 31 | ||||
-rw-r--r-- | node/Network.hpp | 9 |
4 files changed, 30 insertions, 17 deletions
diff --git a/node/Membership.cpp b/node/Membership.cpp index 74a01350..25ae1d9c 100644 --- a/node/Membership.cpp +++ b/node/Membership.cpp @@ -89,11 +89,10 @@ void Membership::sendCredentialsIfNeeded(const RuntimeEnvironment *RR,const uint } } -int Membership::addCredential(const RuntimeEnvironment *RR,const Network *network,const CertificateOfMembership &com) +int Membership::addCredential(const RuntimeEnvironment *RR,const CertificateOfMembership &com) { if (_com == com) { TRACE("addCredential(CertificateOfMembership) for %s on %.16llx ACCEPTED (redundant)",com.issuedTo().toString().c_str(),com.networkId()); - sendCredentialsIfNeeded(RR,RR->node->now(),com.issuedTo(),network->config(),(const Capability *)0); return 0; } @@ -104,7 +103,6 @@ int Membership::addCredential(const RuntimeEnvironment *RR,const Network *networ if (com.timestamp().first > _com.timestamp().first) { _com = com; } - sendCredentialsIfNeeded(RR,RR->node->now(),com.issuedTo(),network->config(),(const Capability *)0); } else { TRACE("addCredential(CertificateOfMembership) for %s on %.16llx REJECTED (%d)",com.issuedTo().toString().c_str(),com.networkId(),vr); } diff --git a/node/Membership.hpp b/node/Membership.hpp index 324f92a6..22910148 100644 --- a/node/Membership.hpp +++ b/node/Membership.hpp @@ -218,11 +218,10 @@ public: * Validate and add a credential if signature is okay and it's otherwise good * * @param RR Runtime environment - * @param network Network that owns this Membership * @param com Certificate of membership * @return 0 == OK, 1 == waiting for WHOIS, -1 == BAD signature or credential */ - int addCredential(const RuntimeEnvironment *RR,const Network *network,const CertificateOfMembership &com); + int addCredential(const RuntimeEnvironment *RR,const CertificateOfMembership &com); /** * Validate and add a credential if signature is okay and it's otherwise good diff --git a/node/Network.cpp b/node/Network.cpp index 4fd88f67..8b22c097 100644 --- a/node/Network.cpp +++ b/node/Network.cpp @@ -678,7 +678,7 @@ bool Network::filterOutgoingPacket( accept = true; if ((!noTee)&&(cc2)) { - _memberships[cc2].sendCredentialsIfNeeded(RR,RR->node->now(),cc2,_config,relevantCap); + _membership(cc2).sendCredentialsIfNeeded(RR,RR->node->now(),cc2,_config,relevantCap); Packet outp(cc2,RR->identity.address(),Packet::VERB_EXT_FRAME); outp.append(_id); @@ -710,7 +710,7 @@ bool Network::filterOutgoingPacket( if (accept) { if ((!noTee)&&(cc)) { - _memberships[cc].sendCredentialsIfNeeded(RR,RR->node->now(),cc,_config,relevantCap); + _membership(cc).sendCredentialsIfNeeded(RR,RR->node->now(),cc,_config,relevantCap); Packet outp(cc,RR->identity.address(),Packet::VERB_EXT_FRAME); outp.append(_id); @@ -724,7 +724,7 @@ bool Network::filterOutgoingPacket( } if ((ztDest != ztDest2)&&(ztDest2)) { - _memberships[ztDest2].sendCredentialsIfNeeded(RR,RR->node->now(),ztDest2,_config,relevantCap); + _membership(ztDest2).sendCredentialsIfNeeded(RR,RR->node->now(),ztDest2,_config,relevantCap); Packet outp(ztDest2,RR->identity.address(),Packet::VERB_EXT_FRAME); outp.append(_id); @@ -764,7 +764,7 @@ int Network::filterIncomingPacket( Mutex::Lock _l(_lock); - Membership &m = _memberships[ztDest]; + Membership &m = _membership(ztDest); const unsigned int remoteTagCount = m.getAllTags(_config,remoteTagIds,remoteTagValues,ZT_MAX_NETWORK_TAGS); switch (_doZtFilter(RR,_config,true,sourcePeer->address(),ztDest2,macSource,macDest,frameData,frameLen,etherType,vlanId,_config.rules,_config.ruleCount,_config.tags,_config.tagCount,remoteTagIds,remoteTagValues,remoteTagCount,cc,ccLength)) { @@ -791,7 +791,7 @@ int Network::filterIncomingPacket( if (accept) { if (cc2) { - _memberships[cc2].sendCredentialsIfNeeded(RR,RR->node->now(),cc2,_config,(const Capability *)0); + _membership(cc2).sendCredentialsIfNeeded(RR,RR->node->now(),cc2,_config,(const Capability *)0); Packet outp(cc2,RR->identity.address(),Packet::VERB_EXT_FRAME); outp.append(_id); @@ -822,7 +822,7 @@ int Network::filterIncomingPacket( if (accept) { if (cc) { - _memberships[cc].sendCredentialsIfNeeded(RR,RR->node->now(),cc,_config,(const Capability *)0); + _membership(cc).sendCredentialsIfNeeded(RR,RR->node->now(),cc,_config,(const Capability *)0); Packet outp(cc,RR->identity.address(),Packet::VERB_EXT_FRAME); outp.append(_id); @@ -836,7 +836,7 @@ int Network::filterIncomingPacket( } if ((ztDest != ztDest2)&&(ztDest2)) { - _memberships[ztDest2].sendCredentialsIfNeeded(RR,RR->node->now(),ztDest2,_config,(const Capability *)0); + _membership(ztDest2).sendCredentialsIfNeeded(RR,RR->node->now(),ztDest2,_config,(const Capability *)0); Packet outp(ztDest2,RR->identity.address(),Packet::VERB_EXT_FRAME); outp.append(_id); @@ -1247,7 +1247,8 @@ void Network::_announceMulticastGroups(const MulticastGroup *const onlyThis) } // Make sure that all "network anchors" have Membership records so we will - // push multicasts to them. + // push multicasts to them. Note that _membership() also does this but in a + // piecemeal on-demand fashion. const std::vector<Address> anchors(_config.anchors()); for(std::vector<Address>::const_iterator a(anchors.begin());a!=anchors.end();++a) _memberships[*a]; @@ -1306,4 +1307,18 @@ std::vector<MulticastGroup> Network::_allMulticastGroups() const return mgs; } +Membership &Network::_membership(const Address &a) +{ + // assumes _lock is locked + const unsigned long ms = _memberships.size(); + Membership &m = _memberships[a]; + if (ms != _memberships.size()) { + const uint64_t now = RR->node->now(); + m.sendCredentialsIfNeeded(RR,now,a,_config,(const Capability *)0); + _announceMulticastGroupsTo(a,_allMulticastGroups()); + m.likingMulticasts(now); + } + return m; +} + } // namespace ZeroTier diff --git a/node/Network.hpp b/node/Network.hpp index 4d0e25b7..bcef2872 100644 --- a/node/Network.hpp +++ b/node/Network.hpp @@ -353,7 +353,7 @@ public: if (com.networkId() != _id) return -1; Mutex::Lock _l(_lock); - return _memberships[com.issuedTo()].addCredential(RR,this,com); + return _membership(com.issuedTo()).addCredential(RR,com); } /** @@ -365,7 +365,7 @@ public: if (cap.networkId() != _id) return -1; Mutex::Lock _l(_lock); - return _memberships[cap.issuedTo()].addCredential(RR,cap); + return _membership(cap.issuedTo()).addCredential(RR,cap); } /** @@ -377,7 +377,7 @@ public: if (tag.networkId() != _id) return -1; Mutex::Lock _l(_lock); - return _memberships[tag.issuedTo()].addCredential(RR,tag); + return _membership(tag.issuedTo()).addCredential(RR,tag); } /** @@ -388,7 +388,7 @@ public: inline void blacklistBefore(const Address &peerAddress,const uint64_t ts) { Mutex::Lock _l(_lock); - _memberships[peerAddress].blacklistBefore(ts); + _membership(peerAddress).blacklistBefore(ts); } /** @@ -412,6 +412,7 @@ private: void _announceMulticastGroups(const MulticastGroup *const onlyThis); void _announceMulticastGroupsTo(const Address &peer,const std::vector<MulticastGroup> &allMulticastGroups); std::vector<MulticastGroup> _allMulticastGroups() const; + Membership &_membership(const Address &a); // also lazily sends COM and MULTICAST_LIKE(s) if this is a new member const RuntimeEnvironment *RR; void *_uPtr; |