summaryrefslogtreecommitdiff
path: root/node/Network.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'node/Network.hpp')
-rw-r--r--node/Network.hpp79
1 files changed, 35 insertions, 44 deletions
diff --git a/node/Network.hpp b/node/Network.hpp
index d7320d46..0effa8e2 100644
--- a/node/Network.hpp
+++ b/node/Network.hpp
@@ -40,6 +40,7 @@
#include "Constants.hpp"
#include "NonCopyable.hpp"
+#include "Hashtable.hpp"
#include "Address.hpp"
#include "Mutex.hpp"
#include "SharedPtr.hpp"
@@ -54,7 +55,8 @@
namespace ZeroTier {
class RuntimeEnvironment;
-class _AnnounceMulticastGroupsToPeersWithActiveDirectPaths;
+class Peer;
+class _GetPeersThatNeedMulticastAnnouncement;
/**
* A virtual LAN
@@ -62,7 +64,7 @@ class _AnnounceMulticastGroupsToPeersWithActiveDirectPaths;
class Network : NonCopyable
{
friend class SharedPtr<Network>;
- friend class _AnnounceMulticastGroupsToPeersWithActiveDirectPaths;
+ friend class _GetPeersThatNeedMulticastAnnouncement; // internal function object
public:
/**
@@ -91,7 +93,13 @@ public:
/**
* @return Address of network's controller (most significant 40 bits of ID)
*/
- inline Address controller() throw() { return Address(_id >> 24); }
+ inline Address controller() const throw() { return Address(_id >> 24); }
+
+ /**
+ * @param nwid Network ID
+ * @return Address of network's controller
+ */
+ static inline Address controllerFor(uint64_t nwid) throw() { return Address(nwid >> 24); }
/**
* @return Multicast group memberships for this network's port (local, not learned via bridging)
@@ -133,6 +141,14 @@ public:
void multicastUnsubscribe(const MulticastGroup &mg);
/**
+ * Announce multicast groups to a peer if that peer is authorized on this network
+ *
+ * @param peer Peer to try to announce multicast groups to
+ * @return True if peer was authorized and groups were announced
+ */
+ bool tryAnnounceMulticastGroupsTo(const SharedPtr<Peer> &peer);
+
+ /**
* Apply a NetworkConfig to this network
*
* @param conf Configuration in NetworkConfig form
@@ -176,33 +192,10 @@ public:
void requestConfiguration();
/**
- * Add or update a membership certificate
- *
- * @param cert Certificate of membership
- * @return True if certificate was accepted as valid
- */
- bool validateAndAddMembershipCertificate(const CertificateOfMembership &cert);
-
- /**
- * Check if we should push membership certificate to a peer, AND update last pushed
- *
- * If we haven't pushed a cert to this peer in a long enough time, this returns
- * true and updates the last pushed time. Otherwise it returns false.
- *
- * This doesn't actually send anything, since COMs can hitch a ride with several
- * different kinds of packets.
- *
- * @param to Destination peer
- * @param now Current time
- * @return True if we should include a COM with whatever we're currently sending
- */
- bool peerNeedsOurMembershipCertificate(const Address &to,uint64_t now);
-
- /**
- * @param peer Peer address to check
+ * @param peer Peer to check
* @return True if peer is allowed to communicate on this network
*/
- inline bool isAllowed(const Address &peer) const
+ inline bool isAllowed(const SharedPtr<Peer> &peer) const
{
Mutex::Lock _l(_lock);
return _isAllowed(peer);
@@ -221,7 +214,7 @@ public:
/**
* @return Status of this network
*/
- inline ZT1_VirtualNetworkStatus status() const
+ inline ZT_VirtualNetworkStatus status() const
{
Mutex::Lock _l(_lock);
return _status();
@@ -230,7 +223,7 @@ public:
/**
* @param ec Buffer to fill with externally-visible network configuration
*/
- inline void externalConfig(ZT1_VirtualNetworkConfig *ec) const
+ inline void externalConfig(ZT_VirtualNetworkConfig *ec) const
{
Mutex::Lock _l(_lock);
_externalConfig(ec);
@@ -297,10 +290,10 @@ public:
inline Address findBridgeTo(const MAC &mac) const
{
Mutex::Lock _l(_lock);
- std::map<MAC,Address>::const_iterator br(_remoteBridgeRoutes.find(mac));
- if (br == _remoteBridgeRoutes.end())
- return Address();
- return br->second;
+ const Address *const br = _remoteBridgeRoutes.get(mac);
+ if (br)
+ return *br;
+ return Address();
}
/**
@@ -346,10 +339,12 @@ public:
inline bool operator>=(const Network &n) const throw() { return (_id >= n._id); }
private:
- ZT1_VirtualNetworkStatus _status() const;
- void _externalConfig(ZT1_VirtualNetworkConfig *ec) const; // assumes _lock is locked
- bool _isAllowed(const Address &peer) const;
+ ZT_VirtualNetworkStatus _status() const;
+ void _externalConfig(ZT_VirtualNetworkConfig *ec) const; // assumes _lock is locked
+ bool _isAllowed(const SharedPtr<Peer> &peer) const;
+ bool _tryAnnounceMulticastGroupsTo(const std::vector<Address> &rootAddresses,const std::vector<MulticastGroup> &allMulticastGroups,const SharedPtr<Peer> &peer,uint64_t now) const;
void _announceMulticastGroups();
+ void _announceMulticastGroupsTo(const Address &peerAddress,const std::vector<MulticastGroup> &allMulticastGroups) const;
std::vector<MulticastGroup> _allMulticastGroups() const;
const RuntimeEnvironment *RR;
@@ -358,13 +353,9 @@ private:
volatile bool _enabled;
volatile bool _portInitialized;
- std::vector< MulticastGroup > _myMulticastGroups; // multicast groups that we belong to including those behind us (updated periodically)
- std::map< MulticastGroup,uint64_t > _multicastGroupsBehindMe; // multicast groups bridged to us and when we last saw activity on each
-
- std::map<MAC,Address> _remoteBridgeRoutes; // remote addresses where given MACs are reachable
-
- std::map<Address,CertificateOfMembership> _membershipCertificates; // Other members' certificates of membership
- std::map<Address,uint64_t> _lastPushedMembershipCertificate; // When did we last push our certificate to each remote member?
+ std::vector< MulticastGroup > _myMulticastGroups; // multicast groups that we belong to (according to tap)
+ Hashtable< MulticastGroup,uint64_t > _multicastGroupsBehindMe; // multicast groups that seem to be behind us and when we last saw them (if we are a bridge)
+ Hashtable< MAC,Address > _remoteBridgeRoutes; // remote addresses where given MACs are reachable (for tracking devices behind remote bridges)
SharedPtr<NetworkConfig> _config; // Most recent network configuration, which is an immutable value-object
volatile uint64_t _lastConfigUpdate;