|
@@ -62,19 +62,29 @@ namespace ZeroTier {
|
|
|
#define ZT_NETWORKCONFIG_DICT_KEY_IPV6_STATIC "v6s"
|
|
|
#define ZT_NETWORKCONFIG_DICT_KEY_CERTIFICATE_OF_MEMBERSHIP "com"
|
|
|
#define ZT_NETWORKCONFIG_DICT_KEY_ENABLE_BROADCAST "eb"
|
|
|
+#define ZT_NETWORKCONFIG_DICT_KEY_BRIDGING_MODE "br"
|
|
|
+#define ZT_NETWORKCONFIG_DICT_KEY_ACTIVE_BRIDGES "ab"
|
|
|
|
|
|
/**
|
|
|
* Network configuration received from netconf master nodes
|
|
|
*
|
|
|
- * This is designed to work as an immutable value object held in a shared
|
|
|
- * pointer so that it can be both updated and used without too much mutex
|
|
|
- * boogie.
|
|
|
+ * This is an immutable value object created from a dictionary received from netconf master.
|
|
|
*/
|
|
|
class NetworkConfig
|
|
|
{
|
|
|
public:
|
|
|
friend class SharedPtr<NetworkConfig>;
|
|
|
|
|
|
+ /**
|
|
|
+ * Network bridging mode
|
|
|
+ */
|
|
|
+ enum BridgingMode
|
|
|
+ {
|
|
|
+ BRIDGING_DISABLED = 0, // no bridging
|
|
|
+ BRIDGING_ACTIVE_ONLY = 1, // only active bridges may bridge
|
|
|
+ BRIDGING_PERMISSIVE = 2 // allow passive bridging by any peer
|
|
|
+ };
|
|
|
+
|
|
|
/**
|
|
|
* Tuple of multicast rate parameters
|
|
|
*/
|
|
@@ -102,7 +112,7 @@ public:
|
|
|
* @param etherType Ethernet frame type to check
|
|
|
* @return True if allowed on this network
|
|
|
*/
|
|
|
- inline bool permitsEtherType(unsigned int etherType)
|
|
|
+ inline bool permitsEtherType(unsigned int etherType) const
|
|
|
throw()
|
|
|
{
|
|
|
if ((!etherType)||(etherType > 0xffff)) // sanity checks
|
|
@@ -124,6 +134,7 @@ public:
|
|
|
inline const std::string &name() const throw() { return _name; }
|
|
|
inline const std::string &description() const throw() { return _description; }
|
|
|
inline const std::set<InetAddress> &staticIps() const throw() { return _staticIps; }
|
|
|
+ inline const std::set<Address> &activeBridges() const throw() { return _activeBridges; }
|
|
|
inline const CertificateOfMembership &com() const throw() { return _com; }
|
|
|
inline bool enableBroadcast() const throw() { return _enableBroadcast; }
|
|
|
|
|
@@ -134,7 +145,15 @@ public:
|
|
|
inline bool permitsBridging(const Address &fromPeer) const
|
|
|
throw()
|
|
|
{
|
|
|
- return false; // TODO: bridging not implemented yet
|
|
|
+ switch(_bridgingMode) {
|
|
|
+ case BRIDGING_ACTIVE_ONLY:
|
|
|
+ return (_activeBridges.count(fromPeer) > 0);
|
|
|
+ case BRIDGING_PERMISSIVE:
|
|
|
+ return true;
|
|
|
+ //case BRIDGING_DISABLED:
|
|
|
+ default:
|
|
|
+ return false;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -156,11 +175,13 @@ private:
|
|
|
Address _issuedTo;
|
|
|
unsigned int _multicastPrefixBits;
|
|
|
unsigned int _multicastDepth;
|
|
|
+ BridgingMode _bridgingMode;
|
|
|
bool _private;
|
|
|
bool _enableBroadcast;
|
|
|
std::string _name;
|
|
|
std::string _description;
|
|
|
std::set<InetAddress> _staticIps;
|
|
|
+ std::set<Address> _activeBridges;
|
|
|
std::map<MulticastGroup,MulticastRate> _multicastRates;
|
|
|
CertificateOfMembership _com;
|
|
|
|