Browse Source

More optimization and cleanup

Adam Ierymenko 6 years ago
parent
commit
1b20cc6075
2 changed files with 38 additions and 61 deletions
  1. 5 48
      node/Network.cpp
  2. 33 13
      node/Network.hpp

+ 5 - 48
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<MulticastGroup>::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<ZT_PROTO_MAX_PACKET_LENGTH> &chunk,unsigned int ptr)
 {
 	if (_destroyed)
@@ -1239,10 +1212,9 @@ bool Network::gate(void *tPtr,const SharedPtr<Peer> &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<MulticastGroup> Network::_allMulticastGroups() const
 	return mgs;
 }
 
-Membership &Network::_membership(const Address &a)
-{
-	// assumes _lock is locked
-	return _memberships[a];
-}
-
 } // namespace ZeroTier

+ 33 - 13
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<MulticastGroup>::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<MulticastGroup> &allMulticastGroups);
 	std::vector<MulticastGroup> _allMulticastGroups() const;
-	Membership &_membership(const Address &a);
 
 	const RuntimeEnvironment *const RR;
 	void *_uPtr;