|
@@ -115,6 +115,19 @@ extern "C" {
|
|
|
*/
|
|
|
#define ZT_FEATURE_FLAG_FIPS 0x00000002
|
|
|
|
|
|
+/**
|
|
|
+ * Maximum number of hops in a ZeroTier circuit test
|
|
|
+ *
|
|
|
+ * This is more or less the max that can be fit in a given packet (with
|
|
|
+ * fragmentation) and only one address per hop.
|
|
|
+ */
|
|
|
+#define ZT_CIRCUIT_TEST_MAX_HOPS 512
|
|
|
+
|
|
|
+/**
|
|
|
+ * Maximum number of addresses per hop in a circuit test
|
|
|
+ */
|
|
|
+#define ZT_CIRCUIT_TEST_MAX_HOP_BREADTH 256
|
|
|
+
|
|
|
/**
|
|
|
* A null/empty sockaddr (all zero) to signify an unspecified socket address
|
|
|
*/
|
|
@@ -631,6 +644,231 @@ typedef enum {
|
|
|
ZT_LOCAL_INTERFACE_ADDRESS_TRUST_ULTIMATE = 20
|
|
|
} ZT_LocalInterfaceAddressTrust;
|
|
|
|
|
|
+/**
|
|
|
+ * Vendor ID
|
|
|
+ */
|
|
|
+typedef enum {
|
|
|
+ ZT_VENDOR_UNSPECIFIED = 0,
|
|
|
+ ZT_VENDOR_ZEROTIER = 1
|
|
|
+} ZT_Vendor;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Platform type
|
|
|
+ */
|
|
|
+typedef enum {
|
|
|
+ ZT_PLATFORM_UNSPECIFIED = 0,
|
|
|
+ ZT_PLATFORM_LINUX = 1,
|
|
|
+ ZT_PLATFORM_WINDOWS = 2,
|
|
|
+ ZT_PLATFORM_MACOS = 3,
|
|
|
+ ZT_PLATFORM_ANDROID = 4,
|
|
|
+ ZT_PLATFORM_IOS = 5,
|
|
|
+ ZT_PLATFORM_SOLARIS_SMARTOS = 6,
|
|
|
+ ZT_PLATFORM_FREEBSD = 7,
|
|
|
+ ZT_PLATFORM_NETBSD = 8,
|
|
|
+ ZT_PLATFORM_OPENBSD = 9,
|
|
|
+ ZT_PLATFORM_RISCOS = 10,
|
|
|
+ ZT_PLATFORM_VXWORKS = 11,
|
|
|
+ ZT_PLATFORM_FREERTOS = 12,
|
|
|
+ ZT_PLATFORM_SYSBIOS = 13,
|
|
|
+ ZT_PLATFORM_HURD = 14
|
|
|
+} ZT_Platform;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Architecture type
|
|
|
+ */
|
|
|
+typedef enum {
|
|
|
+ ZT_ARCHITECTURE_UNSPECIFIED = 0,
|
|
|
+ ZT_ARCHITECTURE_X86 = 1,
|
|
|
+ ZT_ARCHITECTURE_X64 = 2,
|
|
|
+ ZT_ARCHITECTURE_ARM32 = 3,
|
|
|
+ ZT_ARCHITECTURE_ARM64 = 4,
|
|
|
+ ZT_ARCHITECTURE_MIPS32 = 5,
|
|
|
+ ZT_ARCHITECTURE_MIPS64 = 6,
|
|
|
+ ZT_ARCHITECTURE_POWER32 = 7,
|
|
|
+ ZT_ARCHITECTURE_POWER64 = 8
|
|
|
+} ZT_Architecture;
|
|
|
+
|
|
|
+/**
|
|
|
+ * ZeroTier circuit test configuration and path
|
|
|
+ */
|
|
|
+typedef struct {
|
|
|
+ /**
|
|
|
+ * Test ID -- an arbitrary 64-bit identifier
|
|
|
+ */
|
|
|
+ uint64_t testId;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Timestamp -- sent with test and echoed back by each reporter
|
|
|
+ */
|
|
|
+ uint64_t timestamp;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Originator credential: network ID
|
|
|
+ *
|
|
|
+ * If this is nonzero, a network ID will be set for this test and
|
|
|
+ * the originator must be its primary network controller. This is
|
|
|
+ * currently the only authorization method available, so it must
|
|
|
+ * be set to run a test.
|
|
|
+ */
|
|
|
+ uint64_t credentialNetworkId;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Hops in circuit test (a.k.a. FIFO for graph traversal)
|
|
|
+ */
|
|
|
+ struct {
|
|
|
+ /**
|
|
|
+ * Hop flags (currently unused, must be zero)
|
|
|
+ */
|
|
|
+ unsigned int flags;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Number of addresses in this hop (max: ZT_CIRCUIT_TEST_MAX_HOP_BREADTH)
|
|
|
+ */
|
|
|
+ unsigned int breadth;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 40-bit ZeroTier addresses (most significant 24 bits ignored)
|
|
|
+ */
|
|
|
+ uint64_t addresses[ZT_CIRCUIT_TEST_MAX_HOP_BREADTH];
|
|
|
+ } hops[ZT_CIRCUIT_TEST_MAX_HOPS];
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Number of hops (max: ZT_CIRCUIT_TEST_MAX_HOPS)
|
|
|
+ */
|
|
|
+ unsigned int hopCount;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * If non-zero, circuit test will report back at every hop
|
|
|
+ */
|
|
|
+ int reportAtEveryHop;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * An arbitrary user-settable pointer
|
|
|
+ */
|
|
|
+ void *ptr;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Pointer for internal use -- initialize to zero and do not modify
|
|
|
+ */
|
|
|
+ void *_internalPtr;
|
|
|
+} ZT_CircuitTest;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Circuit test result report
|
|
|
+ */
|
|
|
+typedef struct {
|
|
|
+ /**
|
|
|
+ * 64-bit test ID
|
|
|
+ */
|
|
|
+ uint64_t testId;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Timestamp from original test (echoed back at each hop)
|
|
|
+ */
|
|
|
+ uint64_t timestamp;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Timestamp on remote device
|
|
|
+ */
|
|
|
+ uint64_t remoteTimestamp;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 64-bit packet ID of packet received by the reporting device
|
|
|
+ */
|
|
|
+ uint64_t sourcePacketId;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Flags (currently unused, will be zero)
|
|
|
+ */
|
|
|
+ uint64_t flags;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * ZeroTier protocol-level hop count of packet received by reporting device (>0 indicates relayed)
|
|
|
+ */
|
|
|
+ unsigned int sourcePacketHopCount;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Error code (currently unused, will be zero)
|
|
|
+ */
|
|
|
+ unsigned int errorCode;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Remote device vendor ID
|
|
|
+ */
|
|
|
+ ZT_Vendor vendor;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Remote device protocol compliance version
|
|
|
+ */
|
|
|
+ unsigned int protocolVersion;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Software major version
|
|
|
+ */
|
|
|
+ unsigned int majorVersion;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Software minor version
|
|
|
+ */
|
|
|
+ unsigned int minorVersion;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Software revision
|
|
|
+ */
|
|
|
+ unsigned int revision;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Platform / OS
|
|
|
+ */
|
|
|
+ ZT_Platform platform;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * System architecture
|
|
|
+ */
|
|
|
+ ZT_Architecture architecture;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Local device address on which packet was received by reporting device
|
|
|
+ *
|
|
|
+ * This may have ss_family equal to zero (null address) if unspecified.
|
|
|
+ */
|
|
|
+ struct sockaddr_storage receivedOnLocalAddress;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Remote address from which reporter received the test packet
|
|
|
+ *
|
|
|
+ * This may have ss_family set to zero (null address) if unspecified.
|
|
|
+ */
|
|
|
+ struct sockaddr_storage receivedFromAddress;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Next hops to which packets are being or will be sent by the reporter
|
|
|
+ *
|
|
|
+ * In addition to reporting back, the reporter may send the test on if
|
|
|
+ * there are more recipients in the FIFO. If it does this, it can report
|
|
|
+ * back the address(es) that make up the next hop and the physical address
|
|
|
+ * for each if it has one. The physical address being null/unspecified
|
|
|
+ * typically indicates that no direct path exists and the next packet
|
|
|
+ * will be relayed.
|
|
|
+ */
|
|
|
+ struct {
|
|
|
+ /**
|
|
|
+ * 40-bit ZeroTier address
|
|
|
+ */
|
|
|
+ uint64_t address;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Physical address or null address (ss_family == 0) if unspecified or unknown
|
|
|
+ */
|
|
|
+ struct sockaddr_storage physicalAddress;
|
|
|
+ } nextHops[ZT_CIRCUIT_TEST_MAX_HOP_BREADTH];
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Number of next hops reported in nextHops[]
|
|
|
+ */
|
|
|
+ unsigned int nextHopCount;
|
|
|
+} ZT_CircuitTestReport;
|
|
|
+
|
|
|
/**
|
|
|
* An instance of a ZeroTier One node (opaque)
|
|
|
*/
|
|
@@ -1061,6 +1299,39 @@ void ZT_Node_clearLocalInterfaceAddresses(ZT_Node *node);
|
|
|
*/
|
|
|
void ZT_Node_setNetconfMaster(ZT_Node *node,void *networkConfigMasterInstance);
|
|
|
|
|
|
+/**
|
|
|
+ * Initiate a VL1 circuit test
|
|
|
+ *
|
|
|
+ * This sends an initial VERB_CIRCUIT_TEST and reports results back to the
|
|
|
+ * supplied callback until circuitTestEnd() is called. The supplied
|
|
|
+ * ZT_CircuitTest structure should be initially zeroed and then filled
|
|
|
+ * in with settings and hops.
|
|
|
+ *
|
|
|
+ * It is the caller's responsibility to call circuitTestEnd() and then
|
|
|
+ * to dispose of the test structure. Otherwise this node will listen
|
|
|
+ * for results forever.
|
|
|
+ *
|
|
|
+ * @param node Node instance
|
|
|
+ * @param test Test configuration
|
|
|
+ * @param reportCallback Function to call each time a report is received
|
|
|
+ * @return OK or error if, for example, test is too big for a packet or support isn't compiled in
|
|
|
+ */
|
|
|
+ZT_ResultCode ZT_Node_circuitTestBegin(ZT_Node *node,ZT_CircuitTest *test,void (*reportCallback)(ZT_Node *,ZT_CircuitTest *,const ZT_CircuitTestReport *));
|
|
|
+
|
|
|
+/**
|
|
|
+ * Stop listening for results to a given circuit test
|
|
|
+ *
|
|
|
+ * This does not free the 'test' structure. The caller may do that
|
|
|
+ * after calling this method to unregister it.
|
|
|
+ *
|
|
|
+ * Any reports that are received for a given test ID after it is
|
|
|
+ * terminated are ignored.
|
|
|
+ *
|
|
|
+ * @param node Node instance
|
|
|
+ * @param test Test configuration to unregister
|
|
|
+ */
|
|
|
+void ZT_Node_circuitTestEnd(ZT_Node *node,ZT_CircuitTest *test);
|
|
|
+
|
|
|
/**
|
|
|
* Get ZeroTier One version
|
|
|
*
|