2025-08-06 12:10:18 -04:00
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
2013-07-04 16:56:19 -04:00
*
2025-08-06 12:10:18 -04:00
* (c) ZeroTier, Inc.
* https://www.zerotier.com/
2013-07-04 16:56:19 -04:00
*/
2013-12-06 16:49:20 -08:00
# ifndef ZT_NETWORK_HPP
# define ZT_NETWORK_HPP
2013-07-04 16:56:19 -04:00
2015-04-06 15:47:57 -07:00
# include "../include/ZeroTierOne.h"
2013-07-04 16:56:19 -04:00
# include "Address.hpp"
# include "AtomicCounter.hpp"
2013-10-07 15:29:03 -04:00
# include "CertificateOfMembership.hpp"
2025-07-03 11:26:23 -04:00
# include "Constants.hpp"
# include "Dictionary.hpp"
# include "Hashtable.hpp"
# include "MAC.hpp"
# include "Membership.hpp"
2023-05-03 13:43:45 -07:00
# include "Metrics.hpp"
2025-07-03 11:26:23 -04:00
# include "MulticastGroup.hpp"
# include "Multicaster.hpp"
# include "Mutex.hpp"
# include "NetworkConfig.hpp"
# include "SharedPtr.hpp"
# include <algorithm>
# include <map>
# include <stdexcept>
# include <stdint.h>
# include <string>
# include <vector>
2013-07-04 16:56:19 -04:00
2016-09-27 11:33:48 -07:00
# define ZT_NETWORK_MAX_INCOMING_UPDATES 3
2025-07-03 11:26:23 -04:00
# define ZT_NETWORK_MAX_UPDATE_CHUNKS ((ZT_NETWORKCONFIG_DICT_CAPACITY / 1024) + 1)
2016-09-27 11:33:48 -07:00
2013-07-04 16:56:19 -04:00
namespace ZeroTier {
2013-07-29 13:56:20 -04:00
class RuntimeEnvironment ;
2015-10-01 11:11:52 -07:00
class Peer ;
2013-07-04 16:56:19 -04:00
/**
2013-07-27 16:20:08 -04:00
* A virtual LAN
2013-07-04 16:56:19 -04:00
*/
2025-07-03 11:26:23 -04:00
class Network {
2013-07-04 16:56:19 -04:00
friend class SharedPtr < Network > ;
2013-10-18 12:01:48 -04:00
2025-07-03 11:26:23 -04:00
public :
2015-04-01 19:09:18 -07:00
/**
2015-04-15 13:09:20 -07:00
* Broadcast multicast group: ff:ff:ff:ff:ff:ff / 0
*/
static const MulticastGroup BROADCAST ;
2016-09-23 16:08:38 -07:00
/**
* Compute primary controller device ID from network ID
*/
2025-07-03 11:26:23 -04:00
static inline Address controllerFor ( uint64_t nwid )
{
return Address ( nwid > > 24 ) ;
}
2016-09-23 16:08:38 -07:00
2015-04-15 13:09:20 -07:00
/**
* Construct a new network
*
* Note that init() should be called immediately after the network is
* constructed to actually configure the port.
*
2015-04-01 19:09:18 -07:00
* @param renv Runtime environment
2017-03-27 17:03:17 -07:00
* @param tPtr Thread pointer to be handed through to any callbacks called as a result of this call
2015-04-01 19:09:18 -07:00
* @param nwid Network ID
2016-01-12 11:04:35 -08:00
* @param uptr Arbitrary pointer used by externally-facing API (for user use)
2017-06-01 12:33:05 -07:00
* @param nconf Network config, if known
2015-04-01 19:09:18 -07:00
*/
2025-07-03 11:26:23 -04:00
Network ( const RuntimeEnvironment * renv , void * tPtr , uint64_t nwid , void * uptr , const NetworkConfig * nconf ) ;
2015-04-01 19:09:18 -07:00
~ Network ( ) ;
2025-07-03 11:26:23 -04:00
inline uint64_t id ( ) const
{
return _id ;
}
inline Address controller ( ) const
{
return Address ( _id > > 24 ) ;
}
inline bool multicastEnabled ( ) const
{
return ( _config . multicastLimit > 0 ) ;
}
inline bool hasConfig ( ) const
{
return ( _config ) ;
}
inline uint64_t lastConfigUpdate ( ) const
{
return _lastConfigUpdate ;
}
inline ZT_VirtualNetworkStatus status ( ) const
{
Mutex : : Lock _l ( _lock ) ;
return _status ( ) ;
}
inline const NetworkConfig & config ( ) const
{
return _config ;
}
inline const MAC & mac ( ) const
{
return _mac ;
}
2016-09-23 16:08:38 -07:00
2016-08-04 13:01:14 -07:00
/**
* Apply filters to an outgoing packet
*
* This applies filters from our network config and, if that doesn't match,
2016-08-31 16:50:22 -07:00
* our capabilities in ascending order of capability ID. Additional actions
2016-09-23 16:08:38 -07:00
* such as TEE may be taken, and credentials may be pushed, so this is not
* side-effect-free. It's basically step one in sending something over VL2.
2016-08-04 13:01:14 -07:00
*
2017-03-27 17:03:17 -07:00
* @param tPtr Thread pointer to be handed through to any callbacks called as a result of this call
2016-09-23 16:08:38 -07:00
* @param noTee If true, do not TEE anything anywhere (for two-pass filtering as done with multicast and bridging)
2016-08-04 13:01:14 -07:00
* @param ztSource Source ZeroTier address
* @param ztDest Destination ZeroTier address
* @param macSource Ethernet layer source address
* @param macDest Ethernet layer destination address
* @param frameData Ethernet frame data
* @param frameLen Ethernet frame payload length
* @param etherType 16-bit ethernet type ID
* @param vlanId 16-bit VLAN ID
2016-08-31 16:50:22 -07:00
* @return True if packet should be sent, false if dropped or redirected
2016-08-04 13:01:14 -07:00
*/
bool filterOutgoingPacket (
2025-07-03 11:26:23 -04:00
void * tPtr ,
2016-08-31 16:50:22 -07:00
const bool noTee ,
2025-07-03 11:26:23 -04:00
const Address & ztSource ,
const Address & ztDest ,
const MAC & macSource ,
const MAC & macDest ,
const uint8_t * frameData ,
2016-08-04 13:01:14 -07:00
const unsigned int frameLen ,
const unsigned int etherType ,
2018-07-10 16:50:12 -07:00
const unsigned int vlanId ,
2025-07-03 11:26:23 -04:00
uint8_t & qosBucket ) ;
2016-08-04 13:01:14 -07:00
/**
* Apply filters to an incoming packet
*
* This applies filters from our network config and, if that doesn't match,
* the peer's capabilities in ascending order of capability ID. If there is
* a match certain actions may be taken such as sending a copy of the packet
* to a TEE or REDIRECT target.
*
2017-03-27 17:03:17 -07:00
* @param tPtr Thread pointer to be handed through to any callbacks called as a result of this call
2016-08-05 15:02:01 -07:00
* @param sourcePeer Source Peer
2016-08-04 13:01:14 -07:00
* @param ztDest Destination ZeroTier address
* @param macSource Ethernet layer source address
* @param macDest Ethernet layer destination address
* @param frameData Ethernet frame data
* @param frameLen Ethernet frame payload length
* @param etherType 16-bit ethernet type ID
* @param vlanId 16-bit VLAN ID
2016-08-29 15:54:06 -07:00
* @return 0 == drop, 1 == accept, 2 == accept even if bridged
2016-08-04 13:01:14 -07:00
*/
2016-08-29 15:54:06 -07:00
int filterIncomingPacket (
2025-07-03 11:26:23 -04:00
void * tPtr ,
const SharedPtr < Peer > & sourcePeer ,
const Address & ztDest ,
const MAC & macSource ,
const MAC & macDest ,
const uint8_t * frameData ,
2016-08-04 13:01:14 -07:00
const unsigned int frameLen ,
const unsigned int etherType ,
const unsigned int vlanId ) ;
2013-07-04 16:56:19 -04:00
/**
2016-09-23 16:08:38 -07:00
* Check whether we are subscribed to a multicast group
*
2014-10-09 18:32:05 -07:00
* @param mg Multicast group
2016-09-23 16:08:38 -07:00
* @param includeBridgedGroups If true, also check groups we've learned via bridging
2014-10-09 18:32:05 -07:00
* @return True if this network endpoint / peer is a member
*/
2025-07-03 11:26:23 -04:00
bool subscribedToMulticastGroup ( const MulticastGroup & mg , bool includeBridgedGroups ) const ;
2014-10-09 18:32:05 -07:00
2015-04-06 18:27:24 -07:00
/**
* Subscribe to a multicast group
*
2017-03-27 17:03:17 -07:00
* @param tPtr Thread pointer to be handed through to any callbacks called as a result of this call
2015-04-06 18:27:24 -07:00
* @param mg New multicast group
*/
2025-07-03 11:26:23 -04:00
void multicastSubscribe ( void * tPtr , const MulticastGroup & mg ) ;
2015-04-06 18:27:24 -07:00
/**
* Unsubscribe from a multicast group
*
* @param mg Multicast group
*/
2025-07-03 11:26:23 -04:00
void multicastUnsubscribe ( const MulticastGroup & mg ) ;
2015-04-06 18:27:24 -07:00
2016-08-09 13:14:38 -07:00
/**
* Handle an inbound network config chunk
*
2016-09-27 11:33:48 -07:00
* This is called from IncomingPacket to handle incoming network config
* chunks via OK(NETWORK_CONFIG_REQUEST) or NETWORK_CONFIG. It verifies
* each chunk and once assembled applies the configuration.
2016-08-09 13:14:38 -07:00
*
2017-03-27 17:03:17 -07:00
* @param tPtr Thread pointer to be handed through to any callbacks called as a result of this call
2017-01-30 16:04:05 -08:00
* @param packetId Packet ID or 0 if none (e.g. via cluster path)
* @param source Address of sender of chunk or NULL if none (e.g. via cluster path)
* @param chunk Buffer containing chunk
2016-09-27 11:33:48 -07:00
* @param ptr Index of chunk and related fields in packet
* @return Update ID if update was fully assembled and accepted or 0 otherwise
2016-08-09 13:14:38 -07:00
*/
2025-07-03 11:26:23 -04:00
uint64_t handleConfigChunk ( void * tPtr , const uint64_t packetId , const Address & source , const Buffer < ZT_PROTO_MAX_PACKET_LENGTH > & chunk , unsigned int ptr ) ;
2016-08-09 13:14:38 -07:00
2016-11-10 11:54:47 -08:00
/**
* Set network configuration
*
2017-03-27 17:03:17 -07:00
* @param tPtr Thread pointer to be handed through to any callbacks called as a result of this call
2016-11-10 11:54:47 -08:00
* @param nconf Network configuration
* @param saveToDisk Save to disk? Used during loading, should usually be true otherwise.
* @return 0 == bad, 1 == accepted but duplicate/unchanged, 2 == accepted and new
*/
2025-07-03 11:26:23 -04:00
int setConfiguration ( void * tPtr , const NetworkConfig & nconf , bool saveToDisk ) ;
2016-11-10 11:54:47 -08:00
2014-01-27 23:13:36 -08:00
/**
2015-04-15 15:12:09 -07:00
* Set netconf failure to 'access denied' -- called in IncomingPacket when controller reports this
2014-01-27 23:13:36 -08:00
*/
2025-07-03 11:26:23 -04:00
inline void setAccessDenied ( void * tPtr )
2014-01-27 23:13:36 -08:00
{
Mutex : : Lock _l ( _lock ) ;
_netconfFailure = NETCONF_FAILURE_ACCESS_DENIED ;
2021-12-01 12:07:05 -08:00
_sendUpdateEvent ( tPtr ) ;
2014-01-27 23:13:36 -08:00
}
/**
2016-09-23 16:08:38 -07:00
* Set netconf failure to 'not found' -- called by IncomingPacket when controller reports this
2014-01-27 23:13:36 -08:00
*/
2025-07-03 11:26:23 -04:00
inline void setNotFound ( void * tPtr )
2014-01-27 23:13:36 -08:00
{
Mutex : : Lock _l ( _lock ) ;
_netconfFailure = NETCONF_FAILURE_NOT_FOUND ;
2021-12-01 12:07:05 -08:00
_sendUpdateEvent ( tPtr ) ;
2014-01-27 23:13:36 -08:00
}
2013-07-29 13:56:20 -04:00
2021-05-24 22:58:17 -04:00
/**
* Set netconf failure to 'authentication required' possibly with an authorization URL
*/
2025-07-03 11:26:23 -04:00
inline void setAuthenticationRequired ( void * tPtr , const char * url )
2021-05-24 22:58:17 -04:00
{
Mutex : : Lock _l ( _lock ) ;
_netconfFailure = NETCONF_FAILURE_AUTHENTICATION_REQUIRED ;
2021-05-25 14:49:06 -04:00
_authenticationURL = ( url ) ? url : " " ;
2021-06-05 14:00:03 -07:00
_config . ssoEnabled = true ;
2021-11-04 15:40:08 -07:00
_config . ssoVersion = 0 ;
2021-12-01 12:07:05 -08:00
_sendUpdateEvent ( tPtr ) ;
2021-11-04 15:40:08 -07:00
}
/**
* set netconf failure to 'authentication required' along with info needed
* for sso full flow authentication.
*/
2025-07-03 11:26:23 -04:00
void setAuthenticationRequired ( void * tPtr , const char * issuerURL , const char * centralEndpoint , const char * clientID , const char * ssoProvider , const char * nonce , const char * state ) ;
2021-05-24 22:58:17 -04:00
2013-07-29 13:56:20 -04:00
/**
* Causes this network to request an updated configuration from its master node now
2017-03-27 17:03:17 -07:00
*
* @param tPtr Thread pointer to be handed through to any callbacks called as a result of this call
2013-07-29 13:56:20 -04:00
*/
2025-07-03 11:26:23 -04:00
void requestConfiguration ( void * tPtr ) ;
2013-07-29 13:56:20 -04:00
2013-07-29 17:11:00 -04:00
/**
2016-09-20 21:21:34 -07:00
* Determine whether this peer is permitted to communicate on this network
2017-03-27 17:03:17 -07:00
*
* @param tPtr Thread pointer to be handed through to any callbacks called as a result of this call
* @param peer Peer to check
2013-08-06 00:05:39 -04:00
*/
2025-07-03 11:26:23 -04:00
bool gate ( void * tPtr , const SharedPtr < Peer > & peer ) ;
2016-09-09 09:32:00 -07:00
2017-07-13 10:51:05 -07:00
/**
* Check whether a given peer has recently had an association with this network
*
* This checks whether a peer has communicated with us recently about this
* network and has possessed a valid certificate of membership. This may return
* true even if the peer has been offline for a while or no longer has a valid
* certificate of membership but had one recently.
*
* @param addr Peer address
* @return True if peer has recently associated
*/
2025-07-03 11:26:23 -04:00
bool recentlyAssociatedWith ( const Address & addr ) ;
2017-07-13 10:51:05 -07:00
2013-07-29 17:11:00 -04:00
/**
2016-09-23 16:08:38 -07:00
* Do periodic cleanup and housekeeping tasks
2013-07-29 17:11:00 -04:00
*/
void clean ( ) ;
2016-09-07 15:15:52 -07:00
/**
2016-09-08 19:48:05 -07:00
* Push state to members such as multicast group memberships and latest COM (if needed)
2017-03-27 17:03:17 -07:00
*
* @param tPtr Thread pointer to be handed through to any callbacks called as a result of this call
2016-09-07 15:15:52 -07:00
*/
2025-07-03 11:26:23 -04:00
inline void sendUpdatesToMembers ( void * tPtr )
2016-09-07 15:15:52 -07:00
{
Mutex : : Lock _l ( _lock ) ;
2025-07-03 11:26:23 -04:00
_sendUpdatesToMembers ( tPtr , ( const MulticastGroup * ) 0 ) ;
2016-09-07 15:15:52 -07:00
}
2014-06-10 17:18:59 -07:00
/**
2014-09-26 12:23:43 -07:00
* Find the node on this network that has this MAC behind it (if any)
*
2014-06-10 17:18:59 -07:00
* @param mac MAC address
2014-09-26 12:23:43 -07:00
* @return ZeroTier address of bridge to this MAC
2014-06-10 17:18:59 -07:00
*/
2025-07-03 11:26:23 -04:00
inline Address findBridgeTo ( const MAC & mac ) const
2014-06-10 17:18:59 -07:00
{
Mutex : : Lock _l ( _lock ) ;
2025-07-03 11:26:23 -04:00
const Address * const br = _remoteBridgeRoutes . get ( mac ) ;
2016-09-09 11:36:10 -07:00
return ( ( br ) ? * br : Address ( ) ) ;
2014-06-10 17:18:59 -07:00
}
2019-03-14 14:29:15 -07:00
/**
* @return True if QoS is in effect for this network
*/
2025-07-03 11:26:23 -04:00
inline bool qosEnabled ( )
{
return false ;
}
2019-03-14 14:29:15 -07:00
2014-06-10 17:18:59 -07:00
/**
* Set a bridge route
*
* @param mac MAC address of destination
* @param addr Bridge this MAC is reachable behind
*/
2025-07-03 11:26:23 -04:00
void learnBridgeRoute ( const MAC & mac , const Address & addr ) ;
2014-06-10 17:18:59 -07:00
2014-06-13 14:06:34 -07:00
/**
* Learn a multicast group that is bridged to our tap device
*
2017-03-27 17:03:17 -07:00
* @param tPtr Thread pointer to be handed through to any callbacks called as a result of this call
2014-06-13 14:06:34 -07:00
* @param mg Multicast group
2014-06-26 18:13:48 -07:00
* @param now Current time
2014-06-13 14:06:34 -07:00
*/
2025-07-03 11:26:23 -04:00
void learnBridgedMulticastGroup ( void * tPtr , const MulticastGroup & mg , int64_t now ) ;
2014-06-13 14:06:34 -07:00
2016-08-08 17:33:26 -07:00
/**
2016-09-23 16:08:38 -07:00
* Validate a credential and learn it if it passes certificate and other checks
2016-08-08 17:33:26 -07:00
*/
2025-07-03 11:26:23 -04:00
Membership : : AddCredentialResult addCredential ( void * tPtr , const CertificateOfMembership & com ) ;
2016-08-08 17:33:26 -07:00
/**
2016-09-23 16:08:38 -07:00
* Validate a credential and learn it if it passes certificate and other checks
2016-08-08 17:33:26 -07:00
*/
2025-07-03 11:26:23 -04:00
inline Membership : : AddCredentialResult addCredential ( void * tPtr , const Capability & cap )
2016-08-08 17:33:26 -07:00
{
2023-05-01 14:48:16 -04:00
if ( cap . networkId ( ) ! = _id ) {
2016-09-23 16:08:38 -07:00
return Membership : : ADD_REJECTED ;
2023-05-01 14:48:16 -04:00
}
2016-08-08 17:33:26 -07:00
Mutex : : Lock _l ( _lock ) ;
2025-07-03 11:26:23 -04:00
return _membership ( cap . issuedTo ( ) ) . addCredential ( RR , tPtr , _config , cap ) ;
2016-08-08 17:33:26 -07:00
}
/**
2016-09-23 16:08:38 -07:00
* Validate a credential and learn it if it passes certificate and other checks
2016-08-08 17:33:26 -07:00
*/
2025-07-03 11:26:23 -04:00
inline Membership : : AddCredentialResult addCredential ( void * tPtr , const Tag & tag )
2016-08-08 17:33:26 -07:00
{
2023-05-01 14:48:16 -04:00
if ( tag . networkId ( ) ! = _id ) {
2016-09-23 16:08:38 -07:00
return Membership : : ADD_REJECTED ;
2023-05-01 14:48:16 -04:00
}
2016-08-08 17:33:26 -07:00
Mutex : : Lock _l ( _lock ) ;
2025-07-03 11:26:23 -04:00
return _membership ( tag . issuedTo ( ) ) . addCredential ( RR , tPtr , _config , tag ) ;
2016-08-08 17:33:26 -07:00
}
2016-08-23 13:46:36 -07:00
/**
2016-09-23 16:08:38 -07:00
* Validate a credential and learn it if it passes certificate and other checks
2016-08-23 13:46:36 -07:00
*/
2025-07-03 11:26:23 -04:00
Membership : : AddCredentialResult addCredential ( void * tPtr , const Address & sentFrom , const Revocation & rev ) ;
2016-09-23 16:08:38 -07:00
2017-02-23 11:47:36 -08:00
/**
* Validate a credential and learn it if it passes certificate and other checks
*/
2025-07-03 11:26:23 -04:00
inline Membership : : AddCredentialResult addCredential ( void * tPtr , const CertificateOfOwnership & coo )
2017-02-23 11:47:36 -08:00
{
2023-05-01 14:48:16 -04:00
if ( coo . networkId ( ) ! = _id ) {
2017-02-23 11:47:36 -08:00
return Membership : : ADD_REJECTED ;
2023-05-01 14:48:16 -04:00
}
2017-02-23 11:47:36 -08:00
Mutex : : Lock _l ( _lock ) ;
2025-07-03 11:26:23 -04:00
return _membership ( coo . issuedTo ( ) ) . addCredential ( RR , tPtr , _config , coo ) ;
2017-02-23 11:47:36 -08:00
}
2016-09-23 16:08:38 -07:00
/**
* Force push credentials (COM, etc.) to a peer now
*
2017-03-27 17:03:17 -07:00
* @param tPtr Thread pointer to be handed through to any callbacks called as a result of this call
2016-09-23 16:08:38 -07:00
* @param to Destination peer address
* @param now Current time
*/
2025-07-03 11:26:23 -04:00
inline void peerRequestedCredentials ( void * tPtr , const Address & to , const int64_t now )
2016-08-23 13:46:36 -07:00
{
Mutex : : Lock _l ( _lock ) ;
2025-07-03 11:26:23 -04:00
Membership & m = _membership ( to ) ;
2022-04-19 19:59:54 -04:00
const int64_t lastPushed = m . lastPushedCredentials ( ) ;
2025-07-03 11:26:23 -04:00
if ( ( lastPushed < _lastConfigUpdate ) | | ( ( now - lastPushed ) > ZT_PEER_CREDENTIALS_REQUEST_RATE_LIMIT ) ) {
m . pushCredentials ( RR , tPtr , now , to , _config ) ;
2023-05-01 14:48:16 -04:00
}
2016-08-23 13:46:36 -07:00
}
2019-06-25 13:42:20 -07:00
/**
* Push credentials if we haven't done so in a very long time
2019-08-23 09:23:39 -07:00
*
2019-06-25 13:42:20 -07:00
* @param tPtr Thread pointer to be handed through to any callbacks called as a result of this call
* @param to Destination peer address
* @param now Current time
*/
2025-07-03 11:26:23 -04:00
inline void pushCredentialsIfNeeded ( void * tPtr , const Address & to , const int64_t now )
2019-06-25 13:42:20 -07:00
{
Mutex : : Lock _l ( _lock ) ;
2025-07-03 11:26:23 -04:00
Membership & m = _membership ( to ) ;
2022-04-19 16:06:53 -04:00
const int64_t lastPushed = m . lastPushedCredentials ( ) ;
2025-07-03 11:26:23 -04:00
if ( ( lastPushed < _lastConfigUpdate ) | | ( ( now - lastPushed ) > ZT_PEER_ACTIVITY_TIMEOUT ) ) {
m . pushCredentials ( RR , tPtr , now , to , _config ) ;
2023-05-01 14:48:16 -04:00
}
2019-06-25 13:42:20 -07:00
}
2014-08-21 17:49:05 -07:00
/**
* Destroy this network
*
2017-04-11 08:47:02 -07:00
* This sets the network to completely remove itself on delete. This also prevents the
* call of the normal port shutdown event on delete.
2014-08-21 17:49:05 -07:00
*/
void destroy ( ) ;
2016-01-12 11:04:35 -08:00
/**
2016-09-23 16:08:38 -07:00
* Get this network's config for export via the ZT core API
*
* @param ec Buffer to fill with externally-visible network configuration
*/
2025-07-03 11:26:23 -04:00
inline void externalConfig ( ZT_VirtualNetworkConfig * ec ) const
2016-09-23 16:08:38 -07:00
{
Mutex : : Lock _l ( _lock ) ;
_externalConfig ( ec ) ;
}
/**
* @return Externally usable pointer-to-pointer exported via the core API
2016-01-12 11:04:35 -08:00
*/
2025-07-03 11:26:23 -04:00
inline void * * userPtr ( )
{
return & _uPtr ;
}
2016-01-12 11:04:35 -08:00
2025-07-03 11:26:23 -04:00
private :
2015-09-24 16:21:36 -07:00
ZT_VirtualNetworkStatus _status ( ) const ;
2025-07-03 11:26:23 -04:00
void _externalConfig ( ZT_VirtualNetworkConfig * ec ) const ; // assumes _lock is locked
bool _gate ( const SharedPtr < Peer > & peer ) ;
void _sendUpdatesToMembers ( void * tPtr , const MulticastGroup * const newMulticastGroup ) ;
void _announceMulticastGroupsTo ( void * tPtr , const Address & peer , const std : : vector < MulticastGroup > & allMulticastGroups ) ;
2015-05-25 14:21:05 -07:00
std : : vector < MulticastGroup > _allMulticastGroups ( ) const ;
2025-07-03 11:26:23 -04:00
Membership & _membership ( const Address & a ) ;
void _sendUpdateEvent ( void * tPtr ) ;
2015-04-06 16:52:52 -07:00
2025-07-03 11:26:23 -04:00
const RuntimeEnvironment * const RR ;
void * _uPtr ;
2016-09-23 16:08:38 -07:00
const uint64_t _id ;
2023-05-03 13:43:45 -07:00
std : : string _nwidStr ;
2016-09-07 15:15:52 -07:00
uint64_t _lastAnnouncedMulticastGroupsUpstream ;
2025-07-03 11:26:23 -04:00
MAC _mac ; // local MAC address
2016-09-27 11:33:48 -07:00
bool _portInitialized ;
2014-06-10 17:18:59 -07:00
2025-07-03 11:26:23 -04:00
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)
2014-09-18 18:28:14 -07:00
2016-04-12 12:11:34 -07:00
NetworkConfig _config ;
2022-04-19 12:41:38 -04:00
int64_t _lastConfigUpdate ;
2014-06-10 17:18:59 -07:00
2025-07-03 11:26:23 -04:00
struct _IncomingConfigChunk {
_IncomingConfigChunk ( )
{
memset ( this , 0 , sizeof ( _IncomingConfigChunk ) ) ;
}
2016-09-27 11:33:48 -07:00
uint64_t ts ;
uint64_t updateId ;
uint64_t haveChunkIds [ ZT_NETWORK_MAX_UPDATE_CHUNKS ] ;
unsigned long haveChunks ;
unsigned long haveBytes ;
Dictionary < ZT_NETWORKCONFIG_DICT_CAPACITY > data ;
} ;
_IncomingConfigChunk _incomingConfigChunks [ ZT_NETWORK_MAX_INCOMING_UPDATES ] ;
bool _destroyed ;
2014-06-10 17:18:59 -07:00
2025-07-03 11:26:23 -04:00
enum { NETCONF_FAILURE_NONE , NETCONF_FAILURE_ACCESS_DENIED , NETCONF_FAILURE_NOT_FOUND , NETCONF_FAILURE_INIT_FAILED , NETCONF_FAILURE_AUTHENTICATION_REQUIRED } _netconfFailure ;
int _portError ; // return value from port config callback
2021-05-25 14:49:06 -04:00
std : : string _authenticationURL ;
2014-06-10 17:18:59 -07:00
2025-07-03 11:26:23 -04:00
Hashtable < Address , Membership > _memberships ;
2016-08-05 15:02:01 -07:00
2013-07-04 16:56:19 -04:00
Mutex _lock ;
AtomicCounter __refCount ;
2023-05-03 13:43:45 -07:00
prometheus : : simpleapi : : gauge_metric_t _num_multicast_groups ;
2023-05-04 11:12:55 -07:00
prometheus : : simpleapi : : counter_metric_t _incoming_packets_accepted ;
2023-05-03 13:43:45 -07:00
prometheus : : simpleapi : : counter_metric_t _incoming_packets_dropped ;
prometheus : : simpleapi : : counter_metric_t _outgoing_packets_accepted ;
prometheus : : simpleapi : : counter_metric_t _outgoing_packets_dropped ;
2013-07-04 16:56:19 -04:00
} ;
2021-11-04 15:40:08 -07:00
} // namespace ZeroTier
2013-07-04 16:56:19 -04:00
# endif