diff --git a/node/Network.cpp b/node/Network.cpp index b094afc11..0b89d487d 100644 --- a/node/Network.cpp +++ b/node/Network.cpp @@ -757,7 +757,7 @@ int Network::filterIncomingPacket( Mutex::Lock _l(_lock); - Membership &membership = _membership(sourcePeer->address()); + Membership &membership = _memberships[sourcePeer->address()]; switch (_doZtFilter(RR,rrl,_config,&membership,true,sourcePeer->address(),ztFinalDest,macSource,macDest,frameData,frameLen,etherType,vlanId,_config.rules,_config.ruleCount,cc,ccLength,ccWatch,qosBucket)) { @@ -847,33 +847,6 @@ int Network::filterIncomingPacket( return accept; } -bool Network::subscribedToMulticastGroup(const MulticastGroup &mg,bool includeBridgedGroups) const -{ - Mutex::Lock _l(_lock); - if (std::binary_search(_myMulticastGroups.begin(),_myMulticastGroups.end(),mg)) - return true; - else if (includeBridgedGroups) - return _multicastGroupsBehindMe.contains(mg); - return false; -} - -void Network::multicastSubscribe(void *tPtr,const MulticastGroup &mg) -{ - Mutex::Lock _l(_lock); - if (!std::binary_search(_myMulticastGroups.begin(),_myMulticastGroups.end(),mg)) { - _myMulticastGroups.insert(std::upper_bound(_myMulticastGroups.begin(),_myMulticastGroups.end(),mg),mg); - _sendUpdatesToMembers(tPtr,&mg); - } -} - -void Network::multicastUnsubscribe(const MulticastGroup &mg) -{ - Mutex::Lock _l(_lock); - std::vector::iterator i(std::lower_bound(_myMulticastGroups.begin(),_myMulticastGroups.end(),mg)); - if ( (i != _myMulticastGroups.end()) && (*i == mg) ) - _myMulticastGroups.erase(i); -} - uint64_t Network::handleConfigChunk(void *tPtr,const uint64_t packetId,const Address &source,const Buffer &chunk,unsigned int ptr) { if (_destroyed) @@ -1239,10 +1212,9 @@ bool Network::gate(void *tPtr,const SharedPtr &peer) Membership *m = _memberships.get(peer->address()); if ( (_config.isPublic()) || ((m)&&(m->isAllowedOnNetwork(_config))) ) { if (!m) - m = &(_membership(peer->address())); - if (m->multicastLikeGate(now)) { + m = &(_memberships[peer->address()]); + if (m->multicastLikeGate(now)) _announceMulticastGroupsTo(tPtr,peer->address(),_allMulticastGroups()); - } return true; } } @@ -1324,21 +1296,12 @@ void Network::learnBridgeRoute(const MAC &mac,const Address &addr) } } -void Network::learnBridgedMulticastGroup(void *tPtr,const MulticastGroup &mg,int64_t now) -{ - Mutex::Lock _l(_lock); - const unsigned long tmp = (unsigned long)_multicastGroupsBehindMe.size(); - _multicastGroupsBehindMe.set(mg,now); - if (tmp != _multicastGroupsBehindMe.size()) - _sendUpdatesToMembers(tPtr,&mg); -} - Membership::AddCredentialResult Network::addCredential(void *tPtr,const CertificateOfMembership &com) { if (com.networkId() != _id) return Membership::ADD_REJECTED; Mutex::Lock _l(_lock); - return _membership(com.issuedTo()).addCredential(RR,tPtr,_config,com); + return _memberships[com.issuedTo()].addCredential(RR,tPtr,_config,com); } Membership::AddCredentialResult Network::addCredential(void *tPtr,const Address &sentFrom,const Revocation &rev) @@ -1347,7 +1310,7 @@ Membership::AddCredentialResult Network::addCredential(void *tPtr,const Address return Membership::ADD_REJECTED; Mutex::Lock _l(_lock); - Membership &m = _membership(rev.target()); + Membership &m = _memberships[rev.target()]; const Membership::AddCredentialResult result = m.addCredential(RR,tPtr,_config,rev); @@ -1521,10 +1484,4 @@ std::vector Network::_allMulticastGroups() const return mgs; } -Membership &Network::_membership(const Address &a) -{ - // assumes _lock is locked - return _memberships[a]; -} - } // namespace ZeroTier diff --git a/node/Network.hpp b/node/Network.hpp index 5e5738123..1f25122da 100644 --- a/node/Network.hpp +++ b/node/Network.hpp @@ -172,23 +172,44 @@ public: * @param includeBridgedGroups If true, also check groups we've learned via bridging * @return True if this network endpoint / peer is a member */ - bool subscribedToMulticastGroup(const MulticastGroup &mg,bool includeBridgedGroups) const; - + inline bool subscribedToMulticastGroup(const MulticastGroup &mg,bool includeBridgedGroups) const + { + Mutex::Lock _l(_lock); + if (std::binary_search(_myMulticastGroups.begin(),_myMulticastGroups.end(),mg)) + return true; + else if (includeBridgedGroups) + return _multicastGroupsBehindMe.contains(mg); + return false; + } + /** * Subscribe to a multicast group * * @param tPtr Thread pointer to be handed through to any callbacks called as a result of this call * @param mg New multicast group */ - void multicastSubscribe(void *tPtr,const MulticastGroup &mg); - + inline void multicastSubscribe(void *tPtr,const MulticastGroup &mg) + { + Mutex::Lock _l(_lock); + if (!std::binary_search(_myMulticastGroups.begin(),_myMulticastGroups.end(),mg)) { + _myMulticastGroups.insert(std::upper_bound(_myMulticastGroups.begin(),_myMulticastGroups.end(),mg),mg); + _sendUpdatesToMembers(tPtr,&mg); + } + } + /** * Unsubscribe from a multicast group * * @param mg Multicast group */ - void multicastUnsubscribe(const MulticastGroup &mg); - + inline void multicastUnsubscribe(const MulticastGroup &mg) + { + Mutex::Lock _l(_lock); + std::vector::iterator i(std::lower_bound(_myMulticastGroups.begin(),_myMulticastGroups.end(),mg)); + if ( (i != _myMulticastGroups.end()) && (*i == mg) ) + _myMulticastGroups.erase(i); + } + /** * Handle an inbound network config chunk * @@ -260,7 +281,7 @@ public: * @return True if peer has recently associated */ bool recentlyAssociatedWith(const Address &addr); - + /** * Do periodic cleanup and housekeeping tasks */ @@ -325,7 +346,7 @@ public: if (cap.networkId() != _id) return Membership::ADD_REJECTED; Mutex::Lock _l(_lock); - return _membership(cap.issuedTo()).addCredential(RR,tPtr,_config,cap); + return _memberships[cap.issuedTo()].addCredential(RR,tPtr,_config,cap); } /** @@ -336,7 +357,7 @@ public: if (tag.networkId() != _id) return Membership::ADD_REJECTED; Mutex::Lock _l(_lock); - return _membership(tag.issuedTo()).addCredential(RR,tPtr,_config,tag); + return _memberships[tag.issuedTo()].addCredential(RR,tPtr,_config,tag); } /** @@ -352,7 +373,7 @@ public: if (coo.networkId() != _id) return Membership::ADD_REJECTED; Mutex::Lock _l(_lock); - return _membership(coo.issuedTo()).addCredential(RR,tPtr,_config,coo); + return _memberships[coo.issuedTo()].addCredential(RR,tPtr,_config,coo); } /** @@ -365,7 +386,7 @@ public: inline void pushCredentialsNow(void *tPtr,const Address &to,const int64_t now) { Mutex::Lock _l(_lock); - _membership(to).pushCredentials(RR,tPtr,now,to,_config); + _memberships[to].pushCredentials(RR,tPtr,now,to,_config); } /** @@ -378,7 +399,7 @@ public: inline void pushCredentialsIfNeeded(void *tPtr,const Address &to,const int64_t now) { Mutex::Lock _l(_lock); - Membership &m = _membership(to); + Membership &m = _memberships[to]; if (m.shouldPushCredentials(now)) m.pushCredentials(RR,tPtr,now,to,_config); } @@ -414,7 +435,6 @@ private: void _sendUpdatesToMembers(void *tPtr,const MulticastGroup *const newMulticastGroup); void _announceMulticastGroupsTo(void *tPtr,const Address &peer,const std::vector &allMulticastGroups); std::vector _allMulticastGroups() const; - Membership &_membership(const Address &a); const RuntimeEnvironment *const RR; void *_uPtr;