ZeroTierOne/node
Joseph Henry 9933d83cf8
Merge pull request #1564 from zerotier/dev-whoami
Proactively seek, and distribute external surface addresses

This patch introduces a new "self-awareness" behavior which proactively queries peers for external surface addresses and distributes them via PUSH_DIRECT_PATHS. This has the effect of making ZT more responsive to interface changes.

Current behavior:

Previously, this type of information was only mediated via RENDEZVOUS and was only triggered when the client detected that it no longer had a single alive path to a peer. While PUSH_DIRECT_PATHS would correctly (and often) send local addresses, this was not the case for external addresses collected from response HELLOs. This would lead to situations where only one physical address would be distributed to peers. Additionally, if a new physical interface were to be made available to the client, the client would correctly bind to it but never seek information about its external mapping from a peer, and thus the new physical interface would remain unavailable for other peers to learn about until all paths on the previous interface have expired which can take a couple of minutes. In traditional usage of ZT this is not usually a problem, but it becomes a problem in the following scenarios:

    Network interfaces go up and down while ZT is running (e.g. switching to LTE or WiFi from a wired connection)
    Network interfaces are added or removed in multipath setups

Proposed behavior:

I propose that normal full HELLOs are sent not only on the first interface in use, but all interfaces. This causes planets to respond with a HELLO containing the surface address for each interface. We then collect each address using SelfAwareness::whoami() and distribute them via the normal PUSH_DIRECT_PATHS mechanism.
2022-02-25 11:30:45 -08:00
..
Address.hpp BSL date bump 2020-08-20 12:51:39 -07:00
AES_aesni.cpp Windows build fixes, version bump in AIP. 2020-11-06 11:18:41 -08:00
AES_armcrypto.cpp Fixing regression in AES for ARM targets 2020-11-27 08:22:55 +00:00
AES.cpp Likely fix for some alignment issues on ARM. 2020-11-25 14:28:41 -05:00
AES.hpp Backport AES fixes for compiler, arch, and splitting into separate files. 2020-10-20 18:50:28 -04:00
AtomicCounter.hpp BSL date bump 2020-08-20 12:51:39 -07:00
Bond.cpp Force non-leaf peers into local active-backup bond when multipath is enabled 2022-02-17 15:16:33 -08:00
Bond.hpp Force non-leaf peers into local active-backup bond when multipath is enabled 2022-02-17 15:16:33 -08:00
Buffer.hpp BSL date bump 2020-08-20 12:51:39 -07:00
C25519.cpp AES integrated on send side. 2020-08-21 14:23:31 -07:00
C25519.hpp BSL date bump 2020-08-20 12:51:39 -07:00
Capability.cpp BSL date bump 2020-08-20 12:51:39 -07:00
Capability.hpp BSL date bump 2020-08-20 12:51:39 -07:00
CertificateOfMembership.cpp Revert "Use a faster method of fingerprinting identities." 2021-09-20 22:05:39 -04:00
CertificateOfMembership.hpp Remove ancient controller support. 2021-09-20 18:38:29 -04:00
CertificateOfOwnership.cpp BSL date bump 2020-08-20 12:51:39 -07:00
CertificateOfOwnership.hpp BSL date bump 2020-08-20 12:51:39 -07:00
Constants.hpp Increase min failover to 500 ms and probe period to 1/3rd of failover 2022-02-25 10:52:39 -08:00
Credential.hpp BSL date bump 2020-08-20 12:51:39 -07:00
Dictionary.hpp BSL date bump 2020-08-20 12:51:39 -07:00
DNS.hpp BSL date bump 2020-08-20 12:51:39 -07:00
Hashtable.hpp BSL date bump 2020-08-20 12:51:39 -07:00
Identity.cpp AES integrated on send side. 2020-08-21 14:23:31 -07:00
Identity.hpp Revert "Use a faster method of fingerprinting identities." 2021-09-20 22:05:39 -04:00
IncomingPacket.cpp Rate gate ECHO per Path instead of per Peer 2022-02-21 14:37:39 -08:00
IncomingPacket.hpp Consolidation of multipath logic. Better system separation 2021-09-01 21:37:49 -07:00
InetAddress.cpp missing break in InetAddress::ipScope() 2020-11-23 14:54:13 -08:00
InetAddress.hpp Fix for ZTO-33 (Jira), only assign routes if there is a viable source IP. 2020-11-06 11:01:45 -05:00
MAC.hpp BSL date bump 2020-08-20 12:51:39 -07:00
Membership.cpp BSL date bump 2020-08-20 12:51:39 -07:00
Membership.hpp Add a bit of hardening in the network certificate of membership by incorporating a full hash of the identity to which it is issued. This means the recipient need not depend entirely on the root verifying identities properly to make sure impersonation is not occurring. 2021-09-20 18:26:49 -04:00
Multicaster.cpp Tweak multicast settings to prevent failures due to TX queue overflow. 2020-11-12 22:21:43 -05:00
Multicaster.hpp Fix some timestamp signedness mismatches. 2020-11-11 11:46:09 -05:00
MulticastGroup.hpp BSL date bump 2020-08-20 12:51:39 -07:00
Mutex.hpp Use lowercase when including Windows headers 2021-12-29 16:29:08 -05:00
Network.cpp Remove stray debug trace 2022-02-08 15:32:25 -08:00
Network.hpp moar plumbing progress 2021-12-01 12:07:05 -08:00
NetworkConfig.cpp refresh token run loop 2021-12-03 15:44:04 -08:00
NetworkConfig.hpp wip 2021-12-01 10:44:29 -08:00
NetworkController.hpp Basic plumbing for authentication requirement and piping through of URL information. 2021-05-24 22:58:17 -04:00
Node.cpp moar plumbing progress 2021-12-01 12:07:05 -08:00
Node.hpp Consolidation of multipath logic. Better system separation 2021-09-01 21:37:49 -07:00
OutboundMulticast.cpp BSL date bump 2020-08-20 12:51:39 -07:00
OutboundMulticast.hpp BSL date bump 2020-08-20 12:51:39 -07:00
Packet.cpp Apple "fat binaries" are back! 2020-11-16 16:30:15 -05:00
Packet.hpp Basic plumbing for authentication requirement and piping through of URL information. 2021-05-24 22:58:17 -04:00
Path.cpp BSL date bump 2020-08-20 12:51:39 -07:00
Path.hpp Change ECHO rate-limit divsor from 16 to 20 2022-02-21 16:22:33 -08:00
Peer.cpp Merge pull request #1564 from zerotier/dev-whoami 2022-02-25 11:30:45 -08:00
Peer.hpp Rate gate ECHO per Path instead of per Peer 2022-02-21 14:37:39 -08:00
Poly1305.cpp RingBuffer<> is now templated with size, buffer is now static. 2019-03-22 14:39:52 -07:00
Poly1305.hpp BSL date bump 2020-08-20 12:51:39 -07:00
README.md Actual documentation. 2017-02-03 19:47:00 -08:00
Revocation.cpp BSL date bump 2020-08-20 12:51:39 -07:00
Revocation.hpp BSL date bump 2020-08-20 12:51:39 -07:00
RingBuffer.hpp BSL date bump 2020-08-20 12:51:39 -07:00
RuntimeEnvironment.hpp Consolidation of multipath logic. Better system separation 2021-09-01 21:37:49 -07:00
Salsa20.cpp Spellcheck sweep across codebase 2018-06-07 17:25:27 -07:00
Salsa20.hpp Disable Salsa20 SSE on MinGW 32-bit compiler 2022-01-04 20:39:08 -05:00
SelfAwareness.cpp Proactively seek, enumerate, and distribute external surface addresses 2022-02-17 15:39:17 -08:00
SelfAwareness.hpp Proactively seek, enumerate, and distribute external surface addresses 2022-02-17 15:39:17 -08:00
SHA512.cpp More selective push of AES modifications and refactoring stuff. 2020-09-10 14:48:48 -04:00
SHA512.hpp AES integrated on send side. 2020-08-21 14:23:31 -07:00
SharedPtr.hpp BSL date bump 2020-08-20 12:51:39 -07:00
Switch.cpp Consolidation of multipath logic. Better system separation 2021-09-01 21:37:49 -07:00
Switch.hpp BSL date bump 2020-08-20 12:51:39 -07:00
Tag.cpp BSL date bump 2020-08-20 12:51:39 -07:00
Tag.hpp BSL date bump 2020-08-20 12:51:39 -07:00
Topology.cpp Rev roots. 2022-02-15 09:13:58 -05:00
Topology.hpp BSL date bump 2020-08-20 12:51:39 -07:00
Trace.cpp Fix erroneous cast of verb to double that causes invalid tracing output 2021-05-04 08:59:52 -07:00
Trace.hpp BSL date bump 2020-08-20 12:51:39 -07:00
Utils.cpp yes 2021-04-13 16:12:11 +00:00
Utils.hpp Fix for ZTO-33 (Jira), only assign routes if there is a viable source IP. 2020-11-06 11:01:45 -05:00
World.hpp BSL date bump 2020-08-20 12:51:39 -07:00

ZeroTier Network Hypervisor Core

This directory contains the real ZeroTier: a completely OS-independent global virtual Ethernet switch engine. This is where the magic happens.

Give it wire packets and it gives you Ethernet packets, and vice versa. The core contains absolutely no actual I/O, port configuration, or other OS-specific code (except Utils::getSecureRandom()). It provides a simple C API via /include/ZeroTierOne.h. It's designed to be small and maximally portable for future use on small embedded and special purpose systems.

Code in here follows these guidelines:

  • Keep it minimal, especially in terms of code footprint and memory use.
  • There should be no OS-dependent code here unless absolutely necessary (e.g. getSecureRandom).
  • If it's not part of the core virtual Ethernet switch it does not belong here.
  • No C++11 or C++14 since older and embedded compilers don't support it yet and this should be maximally portable.
  • Minimize the use of complex C++ features since at some point we might end up "minus-minus'ing" this code if doing so proves necessary to port to tiny embedded systems.