Re-work of thread model
This commit is contained in:
@@ -1,346 +0,0 @@
|
||||
/*
|
||||
* ZeroTier SDK - Network Virtualization Everywhere
|
||||
* Copyright (C) 2011-2019 ZeroTier, Inc. https://www.zerotier.com/
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* --
|
||||
*
|
||||
* You can be released from the requirements of the license by purchasing
|
||||
* a commercial license. Buying such a license is mandatory as soon as you
|
||||
* develop commercial closed-source software that incorporates or links
|
||||
* directly against ZeroTier software without disclosing the source code
|
||||
* of your own application.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* Useful constants
|
||||
*/
|
||||
|
||||
#ifndef LIBZT_CONSTANTS_HPP
|
||||
#define LIBZT_CONSTANTS_HPP
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// Callbacks //
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#define ZTS_NODE_CALLBACKS 1
|
||||
#define ZTS_NETWORK_CALLBACKS 1
|
||||
#define ZTS_NETIF_CALLBACKS 1
|
||||
#define ZTS_PEER_CALLBACKS 1
|
||||
|
||||
#define ZTS_CALLBACK_PROCESSING_INTERVAL ZTS_WRAPPER_CHECK_INTERVAL // 100 // ms
|
||||
#define ZTS_CALLBACK_MSG_QUEUE_LEN 256
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// Error codes returned by ZeroTier and the libzt API //
|
||||
// See ext/ZeroTierOne/include/ZeroTierOne.h //
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
typedef int zts_err_t;
|
||||
|
||||
#define ZTS_ERR_OK 0 // Everything is ok
|
||||
#define ZTS_ERR_INVALID_ARG -1 // A parameter provided by the user application is invalid (e.g. our of range, NULL, etc)
|
||||
#define ZTS_ERR_SERVICE -2 // The service isn't initialized or is for some other reason currently unavailable
|
||||
#define ZTS_ERR_INVALID_OP -3 // For some reason this API operation is not permitted (perhaps the service is still starting?)
|
||||
|
||||
#define ZTS_EVENT_NONE 0x00000000
|
||||
// Node-specific events
|
||||
#define ZTS_EVENT_NODE_ONLINE 0x00000001 // Node is online
|
||||
#define ZTS_EVENT_NODE_OFFLINE 0x00000002 // Node is offline
|
||||
#define ZTS_EVENT_NODE_DOWN 0x00000004 // Node is shutting down
|
||||
#define ZTS_EVENT_NODE_IDENTITY_COLLISION 0x00000008 // Identity collision - check for duplicate instances
|
||||
#define ZTS_EVENT_NODE_UNRECOVERABLE_ERROR 0x00000010 // Something is seriously wrong
|
||||
#define ZTS_EVENT_NODE_NORMAL_TERMINATION 0x00000020 // Service thread has stopped
|
||||
// Network-specific events
|
||||
#define ZTS_EVENT_NETWORK_NOT_FOUND 0x00000080
|
||||
#define ZTS_EVENT_NETWORK_CLIENT_TOO_OLD 0x00000100
|
||||
#define ZTS_EVENT_NETWORK_REQUESTING_CONFIG 0x00000200
|
||||
#define ZTS_EVENT_NETWORK_OK 0x00000400
|
||||
#define ZTS_EVENT_NETWORK_ACCESS_DENIED 0x00000800
|
||||
#define ZTS_EVENT_NETWORK_READY_IP4 0x00001000
|
||||
#define ZTS_EVENT_NETWORK_READY_IP6 0x00002000
|
||||
#define ZTS_EVENT_NETWORK_DOWN 0x00004000
|
||||
#define ZTS_EVENT_NETWORK_STATUS_CHANGE ZTS_EVENT_NETWORK_NOT_FOUND | ZTS_EVENT_NETWORK_CLIENT_TOO_OLD | ZTS_EVENT_NETWORK_REQUESTING_CONFIG | ZTS_EVENT_NETWORK_OK | ZTS_EVENT_NETWORK_ACCESS_DENIED
|
||||
// lwIP netif events
|
||||
#define ZTS_EVENT_NETIF_UP_IP4 0x00100000
|
||||
#define ZTS_EVENT_NETIF_UP_IP6 0x00200000
|
||||
#define ZTS_EVENT_NETIF_DOWN_IP4 0x00400000
|
||||
#define ZTS_EVENT_NETIF_DOWN_IP6 0x00800000
|
||||
#define ZTS_EVENT_NETIF_REMOVED 0x01000000
|
||||
#define ZTS_EVENT_NETIF_LINK_UP 0x02000000
|
||||
#define ZTS_EVENT_NETIF_LINK_DOWN 0x04000000
|
||||
#define ZTS_EVENT_NETIF_NEW_ADDRESS 0x08000000
|
||||
#define ZTS_EVENT_NETIF_STATUS_CHANGE ZTS_EVENT_NETIF_UP_IP4 | ZTS_EVENT_NETIF_UP_IP6 | ZTS_EVENT_NETIF_DOWN_IP4 | ZTS_EVENT_NETIF_DOWN_IP6 | ZTS_EVENT_NETIF_LINK_UP | ZTS_EVENT_NETIF_LINK_DOWN
|
||||
//
|
||||
#define ZTS_EVENT_GENERIC_DOWN ZTS_EVENT_NETWORK_DOWN | ZTS_EVENT_NETIF_DOWN_IP4 | ZTS_EVENT_NETIF_DOWN_IP6 | ZTS_EVENT_NETIF_LINK_DOWN
|
||||
// Peer events
|
||||
#define ZTS_EVENT_PEER_P2P 0x20000000
|
||||
#define ZTS_EVENT_PEER_RELAY 0x40000000
|
||||
#define ZTS_EVENT_PEER_UNREACHABLE 0x80000000 // Not yet supported
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// libzt config //
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/**
|
||||
* Default port that libzt will use to support all virtual communication
|
||||
*/
|
||||
#define ZTS_DEFAULT_PORT 9994
|
||||
|
||||
/**
|
||||
* Maximum port number allowed
|
||||
*/
|
||||
#define ZTS_MAX_PORT 65535
|
||||
|
||||
/**
|
||||
* For layer-2 only (this will omit all user-space network stack code)
|
||||
*/
|
||||
#define ZTS_NO_STACK 0
|
||||
|
||||
/**
|
||||
* How fast service states are re-checked (in milliseconds)
|
||||
*/
|
||||
#define ZTS_WRAPPER_CHECK_INTERVAL 50
|
||||
|
||||
/**
|
||||
* By how much thread I/O and callback loop delays are multiplied (unitless)
|
||||
*/
|
||||
#define ZTS_HIBERNATION_MULTIPLIER 50
|
||||
|
||||
/**
|
||||
* Maximum allowed number of networks joined to concurrently
|
||||
*/
|
||||
#define ZTS_MAX_JOINED_NETWORKS 64
|
||||
|
||||
/**
|
||||
* Maximum address assignments per network
|
||||
*/
|
||||
#define ZTS_MAX_ASSIGNED_ADDRESSES 16
|
||||
|
||||
/**
|
||||
* Maximum routes per network
|
||||
*/
|
||||
#define ZTS_MAX_NETWORK_ROUTES 32
|
||||
|
||||
/**
|
||||
* Length of buffer required to hold a ztAddress/nodeID
|
||||
*/
|
||||
#define ZTS_ID_LEN 16
|
||||
|
||||
/**
|
||||
* Polling interval (in ms) for file descriptors wrapped in the Phy I/O loop (for raw drivers only)
|
||||
*/
|
||||
#define ZTS_PHY_POLL_INTERVAL 1
|
||||
|
||||
/**
|
||||
* Maximum length of libzt/ZeroTier home path (where keys, and config files are stored)
|
||||
*/
|
||||
#define ZTS_HOME_PATH_MAX_LEN 256
|
||||
|
||||
/**
|
||||
* Length of human-readable MAC address string
|
||||
*/
|
||||
#define ZTS_MAC_ADDRSTRLEN 18
|
||||
|
||||
/**
|
||||
* Interval (in ms) for performing background tasks
|
||||
*/
|
||||
#define ZTS_HOUSEKEEPING_INTERVAL 1000
|
||||
|
||||
/**
|
||||
* Name of the service thread (for debug purposes only)
|
||||
*/
|
||||
#define ZTS_SERVICE_THREAD_NAME "ZeroTierServiceThread"
|
||||
|
||||
/**
|
||||
* Name of the callback monitor thread (for debug purposes only)
|
||||
*/
|
||||
#define ZTS_EVENT_CALLBACK_THREAD_NAME "ZeroTierEventCallbackThread"
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// lwIP driver config //
|
||||
// For more LWIP configuration options see: include/lwipopts.h //
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/*
|
||||
* The following three quantities are related and govern how incoming frames are fed into the
|
||||
* network stack's core:
|
||||
|
||||
* Every LWIP_GUARDED_BUF_CHECK_INTERVAL milliseconds, a callback will be called from the core and
|
||||
* will input a maximum of LWIP_FRAMES_HANDLED_PER_CORE_CALL frames before returning control back
|
||||
* to the core. Meanwhile, incoming frames from the ZeroTier wire will be allocated and their
|
||||
* pointers will be cached in the receive frame buffer of the size LWIP_MAX_GUARDED_RX_BUF_SZ to
|
||||
* await the next callback from the core
|
||||
*/
|
||||
|
||||
#define LWIP_GUARDED_BUF_CHECK_INTERVAL 5 // in ms
|
||||
#define LWIP_MAX_GUARDED_RX_BUF_SZ 1024 // number of frame pointers that can be cached waiting for receipt into core
|
||||
#define LWIP_FRAMES_HANDLED_PER_CORE_CALL 16 // How many frames are handled per call from core
|
||||
|
||||
typedef signed char err_t;
|
||||
|
||||
#define ND6_DISCOVERY_INTERVAL 1000
|
||||
#define ARP_DISCOVERY_INTERVAL ARP_TMR_INTERVAL
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// Subset of: ZeroTierOne.h and Constants.hpp //
|
||||
// We redefine a few ZT structures here so that we don't need to drag the //
|
||||
// entire ZeroTierOne.h file into the user application //
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/**
|
||||
* Maximum MTU size for ZeroTier
|
||||
*/
|
||||
#define ZT_MAX_MTU 10000
|
||||
|
||||
/**
|
||||
* Maximum number of direct network paths to a given peer
|
||||
*/
|
||||
#define ZT_MAX_PEER_NETWORK_PATHS 16
|
||||
|
||||
//
|
||||
// This include file also auto-detects and canonicalizes some environment
|
||||
// information defines:
|
||||
//
|
||||
// __LINUX__
|
||||
// __APPLE__
|
||||
// __BSD__ (OSX also defines this)
|
||||
// __UNIX_LIKE__ (Linux, BSD, etc.)
|
||||
// __WINDOWS__
|
||||
//
|
||||
// Also makes sure __BYTE_ORDER is defined reasonably.
|
||||
//
|
||||
|
||||
// Hack: make sure __GCC__ is defined on old GCC compilers
|
||||
#ifndef __GCC__
|
||||
#if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1) || defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2) || defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)
|
||||
#define __GCC__
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(__linux__) || defined(linux) || defined(__LINUX__) || defined(__linux)
|
||||
#ifndef __LINUX__
|
||||
#define __LINUX__
|
||||
#endif
|
||||
#ifndef __UNIX_LIKE__
|
||||
#define __UNIX_LIKE__
|
||||
#endif
|
||||
#include <endian.h>
|
||||
#endif
|
||||
|
||||
#ifdef __APPLE__
|
||||
#define likely(x) __builtin_expect((x),1)
|
||||
#define unlikely(x) __builtin_expect((x),0)
|
||||
#include <TargetConditionals.h>
|
||||
#ifndef __UNIX_LIKE__
|
||||
#define __UNIX_LIKE__
|
||||
#endif
|
||||
#ifndef __BSD__
|
||||
#define __BSD__
|
||||
#endif
|
||||
#include <machine/endian.h>
|
||||
#endif
|
||||
|
||||
// Defined this macro to disable "type punning" on a number of targets that
|
||||
// have issues with unaligned memory access.
|
||||
#if defined(__arm__) || defined(__ARMEL__) || (defined(__APPLE__) && ( (defined(TARGET_OS_IPHONE) && (TARGET_OS_IPHONE != 0)) || (defined(TARGET_OS_WATCH) && (TARGET_OS_WATCH != 0)) || (defined(TARGET_IPHONE_SIMULATOR) && (TARGET_IPHONE_SIMULATOR != 0)) ) )
|
||||
#ifndef ZT_NO_TYPE_PUNNING
|
||||
#define ZT_NO_TYPE_PUNNING
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__)
|
||||
#ifndef __UNIX_LIKE__
|
||||
#define __UNIX_LIKE__
|
||||
#endif
|
||||
#ifndef __BSD__
|
||||
#define __BSD__
|
||||
#endif
|
||||
#include <machine/endian.h>
|
||||
#ifndef __BYTE_ORDER
|
||||
#define __BYTE_ORDER _BYTE_ORDER
|
||||
#define __LITTLE_ENDIAN _LITTLE_ENDIAN
|
||||
#define __BIG_ENDIAN _BIG_ENDIAN
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(_WIN32) || defined(_WIN64)
|
||||
#ifndef __WINDOWS__
|
||||
#define __WINDOWS__
|
||||
#endif
|
||||
#ifndef NOMINMAX
|
||||
#define NOMINMAX
|
||||
#endif
|
||||
#pragma warning(disable : 4290)
|
||||
#pragma warning(disable : 4996)
|
||||
#pragma warning(disable : 4101)
|
||||
#undef __UNIX_LIKE__
|
||||
#undef __BSD__
|
||||
#define ZT_PATH_SEPARATOR '\\'
|
||||
#define ZT_PATH_SEPARATOR_S "\\"
|
||||
#define ZT_EOL_S "\r\n"
|
||||
#include <WinSock2.h>
|
||||
#include <Windows.h>
|
||||
#endif
|
||||
|
||||
// Assume little endian if not defined
|
||||
#if (defined(__APPLE__) || defined(__WINDOWS__)) && (!defined(__BYTE_ORDER))
|
||||
#undef __BYTE_ORDER
|
||||
#undef __LITTLE_ENDIAN
|
||||
#undef __BIG_ENDIAN
|
||||
#define __BIG_ENDIAN 4321
|
||||
#define __LITTLE_ENDIAN 1234
|
||||
#define __BYTE_ORDER 1234
|
||||
#endif
|
||||
|
||||
#ifdef __UNIX_LIKE__
|
||||
#define ZT_PATH_SEPARATOR '/'
|
||||
#define ZT_PATH_SEPARATOR_S "/"
|
||||
#define ZT_EOL_S "\n"
|
||||
#endif
|
||||
|
||||
#ifndef __BYTE_ORDER
|
||||
#include <endian.h>
|
||||
#endif
|
||||
|
||||
#ifdef __NetBSD__
|
||||
#define RTF_MULTICAST 0x20000000
|
||||
#endif
|
||||
|
||||
#if (defined(__GNUC__) && (__GNUC__ >= 3)) || (defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 800)) || defined(__clang__)
|
||||
#ifndef likely
|
||||
#define likely(x) __builtin_expect((x),1)
|
||||
#endif
|
||||
#ifndef unlikely
|
||||
#define unlikely(x) __builtin_expect((x),0)
|
||||
#endif
|
||||
#else
|
||||
#ifndef likely
|
||||
#define likely(x) (x)
|
||||
#endif
|
||||
#ifndef unlikely
|
||||
#define unlikely(x) (x)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef __WINDOWS__
|
||||
#define ZT_PACKED_STRUCT(D) __pragma(pack(push,1)) D __pragma(pack(pop))
|
||||
#else
|
||||
#define ZT_PACKED_STRUCT(D) D __attribute__((packed))
|
||||
#endif
|
||||
|
||||
#endif // _H
|
||||
@@ -1,167 +0,0 @@
|
||||
/*
|
||||
* ZeroTier SDK - Network Virtualization Everywhere
|
||||
* Copyright (C) 2011-2019 ZeroTier, Inc. https://www.zerotier.com/
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* --
|
||||
*
|
||||
* You can be released from the requirements of the license by purchasing
|
||||
* a commercial license. Buying such a license is mandatory as soon as you
|
||||
* develop commercial closed-source software that incorporates or links
|
||||
* directly against ZeroTier software without disclosing the source code
|
||||
* of your own application.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* Debug macros
|
||||
*/
|
||||
|
||||
#ifndef LIBZT_DEBUG_HPP
|
||||
#define LIBZT_DEBUG_HPP
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// Debugging Macros //
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#if defined(__linux__) || defined(__APPLE__)
|
||||
#include <sys/syscall.h>
|
||||
#include <pthread.h>
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#include <string.h>
|
||||
|
||||
#define ZT_MSG_ERROR true // Errors
|
||||
#define ZT_MSG_INFO true // Information which is generally useful to any developer
|
||||
#define ZT_MSG_TEST true // For use in selftest
|
||||
#define ZT_MSG_TRANSFER true // RX/TX specific statements
|
||||
|
||||
#define ZT_COLOR true
|
||||
|
||||
// Debug output colors
|
||||
#if defined(__APPLE__)
|
||||
#include "TargetConditionals.h"
|
||||
#endif
|
||||
#if defined(ZT_COLOR) && !defined(_WIN32) && !defined(__ANDROID__) && !defined(TARGET_OS_IPHONE) && !defined(TARGET_IPHONE_SIMULATOR) && !defined(__APP_FRAMEWORK__)
|
||||
#define ZT_RED "\x1B[31m"
|
||||
#define ZT_GRN "\x1B[32m"
|
||||
#define ZT_YEL "\x1B[33m"
|
||||
#define ZT_BLU "\x1B[34m"
|
||||
#define ZT_MAG "\x1B[35m"
|
||||
#define ZT_CYN "\x1B[36m"
|
||||
#define ZT_WHT "\x1B[37m"
|
||||
#define ZT_RESET "\x1B[0m"
|
||||
#else
|
||||
#define ZT_RED
|
||||
#define ZT_GRN
|
||||
#define ZT_YEL
|
||||
#define ZT_BLU
|
||||
#define ZT_MAG
|
||||
#define ZT_CYN
|
||||
#define ZT_WHT
|
||||
#define ZT_RESET
|
||||
#endif
|
||||
|
||||
#define ZT_FILENAME (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__) // short
|
||||
|
||||
#if defined(__JNI_LIB__)
|
||||
#include <jni.h>
|
||||
#endif
|
||||
#if defined(__ANDROID__)
|
||||
#include <android/log.h>
|
||||
#define ZT_LOG_TAG "ZTSDK"
|
||||
#endif
|
||||
|
||||
#if defined(LIBZT_DEBUG) || defined(LIBZT_TRACE) || defined(__NATIVETEST__)
|
||||
//
|
||||
#if ZT_MSG_ERROR == true
|
||||
#if defined(__ANDROID__)
|
||||
#define DEBUG_ERROR(fmt, args...) ((void)__android_log_print(ANDROID_LOG_VERBOSE, ZT_LOG_TAG, \
|
||||
"%17s:%5d:%20s: " fmt "\n", ZT_FILENAME, __LINE__, __FUNCTION__, ##args))
|
||||
#elif defined(_WIN32)
|
||||
#define DEBUG_ERROR(fmt, ...) fprintf(stderr, ZT_RED "%17s:%5d:%25s: " fmt "\n" \
|
||||
ZT_RESET, ZT_FILENAME, __LINE__, __FUNCTION__, __VA_ARGS__)
|
||||
#else
|
||||
#define DEBUG_ERROR(fmt, args ...) fprintf(stderr, ZT_RED "%17s:%5d:%25s: " fmt "\n" \
|
||||
ZT_RESET, ZT_FILENAME, __LINE__, __FUNCTION__, ##args)
|
||||
#endif
|
||||
#else
|
||||
#define DEBUG_ERROR(fmt, args...)
|
||||
#endif
|
||||
|
||||
//
|
||||
#if ZT_MSG_TEST == true
|
||||
#if defined(__ANDROID__)
|
||||
#define DEBUG_TEST(fmt, args...) ((void)__android_log_print(ANDROID_LOG_VERBOSE, ZT_LOG_TAG, \
|
||||
"%17s:%5d:%25s: " fmt "\n", ZT_FILENAME, __LINE__, __FUNCTION__, ##args))
|
||||
#elif defined(_WIN32)
|
||||
#define DEBUG_TEST(fmt, ...) fprintf(stderr, ZT_CYN "%17s:%5d:%25s: " fmt "\n" \
|
||||
ZT_RESET, ZT_FILENAME, __LINE__, __FUNCTION__, __VA_ARGS__)
|
||||
#else
|
||||
#define DEBUG_TEST(fmt, args ...) fprintf(stderr, ZT_CYN "%17s:%5d:%25s: " fmt "\n" \
|
||||
ZT_RESET, ZT_FILENAME, __LINE__, __FUNCTION__, ##args)
|
||||
#endif
|
||||
#else
|
||||
#define DEBUG_TEST(fmt, args...)
|
||||
#endif
|
||||
|
||||
//
|
||||
#if ZT_MSG_INFO == true
|
||||
#if defined(__ANDROID__)
|
||||
#define DEBUG_INFO(fmt, args...) ((void)__android_log_print(ANDROID_LOG_VERBOSE, ZT_LOG_TAG, \
|
||||
"%17s:%5d:%20s: " fmt "\n", ZT_FILENAME, __LINE__, __FUNCTION__, ##args))
|
||||
#elif defined(_WIN32)
|
||||
#define DEBUG_INFO(fmt, ...) fprintf(stderr, ZT_WHT "%17s:%5d:%25s: " fmt "\n" \
|
||||
ZT_RESET, ZT_FILENAME, __LINE__, __FUNCTION__, __VA_ARGS__)
|
||||
#else
|
||||
#define DEBUG_INFO(fmt, args ...) fprintf(stderr, ZT_WHT "%17s:%5d:%25s: " fmt "\n" \
|
||||
ZT_RESET, ZT_FILENAME, __LINE__, __FUNCTION__, ##args)
|
||||
#endif
|
||||
#else
|
||||
#define DEBUG_INFO(fmt, args...)
|
||||
#endif
|
||||
|
||||
//
|
||||
#if ZT_MSG_TRANSFER == true
|
||||
#if defined(__ANDROID__)
|
||||
#define DEBUG_TRANS(fmt, args...) ((void)__android_log_print(ANDROID_LOG_VERBOSE, ZT_LOG_TAG, \
|
||||
"%17s:%5d:%25s: " fmt "\n", ZT_FILENAME, __LINE__, __FUNCTION__, ##args))
|
||||
#elif defined(_WIN32)
|
||||
#define DEBUG_TRANS(fmt, ...) fprintf(stderr, ZT_GRN "%17s:%5d:%25s: " fmt "\n" \
|
||||
ZT_RESET, ZT_FILENAME, __LINE__, __FUNCTION__, __VA_ARGS__)
|
||||
#else
|
||||
#define DEBUG_TRANS(fmt, args ...) fprintf(stderr, ZT_GRN "%17s:%5d:%25s: " fmt "\n" \
|
||||
ZT_RESET, ZT_FILENAME, __LINE__, __FUNCTION__, ##args)
|
||||
#endif
|
||||
#else
|
||||
#define DEBUG_TRANS(fmt, args...)
|
||||
#endif
|
||||
|
||||
#else // !LIBZT_DEBUG || !__NATIVE_TEST__
|
||||
#if defined(_WIN32)
|
||||
#define DEBUG_ERROR(...)
|
||||
#define DEBUG_TEST(...)
|
||||
#define DEBUG_INFO(...)
|
||||
#define DEBUG_TRANS(...)
|
||||
#else
|
||||
#define DEBUG_ERROR(fmt, args...)
|
||||
#define DEBUG_TEST(fmt, args...)
|
||||
#define DEBUG_INFO(fmt, args...)
|
||||
#define DEBUG_TRANS(fmt, args...)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif // _H
|
||||
215
include/Defs.hpp
215
include/Defs.hpp
@@ -1,215 +0,0 @@
|
||||
/*
|
||||
* ZeroTier SDK - Network Virtualization Everywhere
|
||||
* Copyright (C) 2011-2019 ZeroTier, Inc. https://www.zerotier.com/
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* --
|
||||
*
|
||||
* You can be released from the requirements of the license by purchasing
|
||||
* a commercial license. Buying such a license is mandatory as soon as you
|
||||
* develop commercial closed-source software that incorporates or links
|
||||
* directly against ZeroTier software without disclosing the source code
|
||||
* of your own application.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* Management of virtual tap interfaces
|
||||
*/
|
||||
|
||||
#ifndef LIBZT_DEFS_HPP
|
||||
#define LIBZT_DEFS_HPP
|
||||
|
||||
#include "Constants.hpp"
|
||||
|
||||
#ifndef _USING_LWIP_DEFINITIONS_
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
|
||||
namespace ZeroTier {
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// Subset of: ZeroTierOne.h //
|
||||
// We redefine a few ZT structures here so that we don't need to drag the //
|
||||
// entire ZeroTierOne.h file into the user application //
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/**
|
||||
* What trust hierarchy role does this peer have?
|
||||
*/
|
||||
enum zts_peer_role
|
||||
{
|
||||
ZTS_PEER_ROLE_LEAF = 0, // ordinary node
|
||||
ZTS_PEER_ROLE_MOON = 1, // moon root
|
||||
ZTS_PEER_ROLE_PLANET = 2 // planetary root
|
||||
};
|
||||
|
||||
/**
|
||||
* A structure used to represent a virtual network route
|
||||
*/
|
||||
struct zts_virtual_network_route
|
||||
{
|
||||
/**
|
||||
* Target network / netmask bits (in port field) or NULL or 0.0.0.0/0 for default
|
||||
*/
|
||||
struct sockaddr_storage target;
|
||||
|
||||
/**
|
||||
* Gateway IP address (port ignored) or NULL (family == 0) for LAN-local (no gateway)
|
||||
*/
|
||||
struct sockaddr_storage via;
|
||||
|
||||
/**
|
||||
* Route flags
|
||||
*/
|
||||
uint16_t flags;
|
||||
|
||||
/**
|
||||
* Route metric (not currently used)
|
||||
*/
|
||||
uint16_t metric;
|
||||
};
|
||||
|
||||
/**
|
||||
* A structure used to convey network-specific details to the user application
|
||||
*/
|
||||
struct zts_network_details
|
||||
{
|
||||
/**
|
||||
* Network ID
|
||||
*/
|
||||
uint64_t nwid;
|
||||
|
||||
/**
|
||||
* Maximum Transmission Unit size for this network
|
||||
*/
|
||||
int mtu;
|
||||
|
||||
/**
|
||||
* Number of addresses (actually) assigned to the node on this network
|
||||
*/
|
||||
short num_addresses;
|
||||
|
||||
/**
|
||||
* Array of IPv4 and IPv6 addresses assigned to the node on this network
|
||||
*/
|
||||
struct sockaddr_storage addr[ZTS_MAX_ASSIGNED_ADDRESSES];
|
||||
|
||||
/**
|
||||
* Number of routes
|
||||
*/
|
||||
unsigned int num_routes;
|
||||
|
||||
/**
|
||||
* Array of IPv4 and IPv6 addresses assigned to the node on this network
|
||||
*/
|
||||
struct zts_virtual_network_route routes[ZTS_MAX_NETWORK_ROUTES];
|
||||
};
|
||||
|
||||
/**
|
||||
* Physical network path to a peer
|
||||
*/
|
||||
struct zts_physical_path
|
||||
{
|
||||
/**
|
||||
* Address of endpoint
|
||||
*/
|
||||
struct sockaddr_storage address;
|
||||
|
||||
/**
|
||||
* Time of last send in milliseconds or 0 for never
|
||||
*/
|
||||
uint64_t lastSend;
|
||||
|
||||
/**
|
||||
* Time of last receive in milliseconds or 0 for never
|
||||
*/
|
||||
uint64_t lastReceive;
|
||||
|
||||
/**
|
||||
* Is this a trusted path? If so this will be its nonzero ID.
|
||||
*/
|
||||
uint64_t trustedPathId;
|
||||
|
||||
/**
|
||||
* Is path expired?
|
||||
*/
|
||||
int expired;
|
||||
|
||||
/**
|
||||
* Is path preferred?
|
||||
*/
|
||||
int preferred;
|
||||
};
|
||||
|
||||
/**
|
||||
* Peer status result buffer
|
||||
*/
|
||||
struct zts_peer_details
|
||||
{
|
||||
/**
|
||||
* ZeroTier address (40 bits)
|
||||
*/
|
||||
uint64_t address;
|
||||
|
||||
/**
|
||||
* Remote major version or -1 if not known
|
||||
*/
|
||||
int versionMajor;
|
||||
|
||||
/**
|
||||
* Remote minor version or -1 if not known
|
||||
*/
|
||||
int versionMinor;
|
||||
|
||||
/**
|
||||
* Remote revision or -1 if not known
|
||||
*/
|
||||
int versionRev;
|
||||
|
||||
/**
|
||||
* Last measured latency in milliseconds or -1 if unknown
|
||||
*/
|
||||
int latency;
|
||||
|
||||
/**
|
||||
* What trust hierarchy role does this device have?
|
||||
*/
|
||||
enum zts_peer_role role;
|
||||
|
||||
/**
|
||||
* Number of paths (size of paths[])
|
||||
*/
|
||||
unsigned int pathCount;
|
||||
|
||||
/**
|
||||
* Known network paths to peer
|
||||
*/
|
||||
zts_physical_path paths[ZT_MAX_PEER_NETWORK_PATHS];
|
||||
};
|
||||
|
||||
/**
|
||||
* List of peers
|
||||
*/
|
||||
struct zts_peer_list
|
||||
{
|
||||
zts_peer_details *peers;
|
||||
unsigned long peerCount;
|
||||
};
|
||||
|
||||
} // namespace ZeroTier
|
||||
|
||||
#endif // _H
|
||||
@@ -1,97 +0,0 @@
|
||||
/*
|
||||
* ZeroTier SDK - Network Virtualization Everywhere
|
||||
* Copyright (C) 2011-2019 ZeroTier, Inc. https://www.zerotier.com/
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* --
|
||||
*
|
||||
* You can be released from the requirements of the license by purchasing
|
||||
* a commercial license. Buying such a license is mandatory as soon as you
|
||||
* develop commercial closed-source software that incorporates or links
|
||||
* directly against ZeroTier software without disclosing the source code
|
||||
* of your own application.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* Ring buffer implementation for network stack drivers
|
||||
*/
|
||||
|
||||
#ifndef ZT_RINGBUFFER_H
|
||||
#define ZT_RINGBUFFER_H
|
||||
|
||||
#include <cstdint>
|
||||
#include <stdlib.h>
|
||||
|
||||
typedef char bufElementType;
|
||||
|
||||
class RingBuffer
|
||||
{
|
||||
private:
|
||||
bufElementType * buf;
|
||||
size_t size;
|
||||
size_t begin;
|
||||
size_t end;
|
||||
bool wrap;
|
||||
|
||||
public:
|
||||
/**
|
||||
* create a RingBuffer with space for up to size elements.
|
||||
*/
|
||||
explicit RingBuffer(size_t size)
|
||||
: size(size),
|
||||
begin(0),
|
||||
end(0),
|
||||
wrap(false)
|
||||
{
|
||||
buf = new bufElementType[size];
|
||||
}
|
||||
/*
|
||||
RingBuffer(const RingBuffer<T> & ring)
|
||||
{
|
||||
this(ring.size);
|
||||
begin = ring.begin;
|
||||
end = ring.end;
|
||||
memcpy(buf, ring.buf, sizeof(T) * size);
|
||||
}
|
||||
*/
|
||||
~RingBuffer()
|
||||
{
|
||||
delete[] buf;
|
||||
}
|
||||
|
||||
// get a reference to the underlying buffer
|
||||
bufElementType* get_buf();
|
||||
|
||||
// adjust buffer index pointer as if we copied data in
|
||||
size_t produce(size_t n);
|
||||
|
||||
// merely reset the buffer pointer, doesn't erase contents
|
||||
void reset();
|
||||
|
||||
// adjust buffer index pointer as if we copied data out
|
||||
size_t consume(size_t n);
|
||||
|
||||
size_t write(const bufElementType * data, size_t n);
|
||||
|
||||
size_t read(bufElementType * dest, size_t n);
|
||||
|
||||
size_t count();
|
||||
|
||||
size_t getFree();
|
||||
};
|
||||
|
||||
#endif // _H
|
||||
@@ -1,393 +0,0 @@
|
||||
/*
|
||||
* ZeroTier SDK - Network Virtualization Everywhere
|
||||
* Copyright (C) 2011-2019 ZeroTier, Inc. https://www.zerotier.com/
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* --
|
||||
*
|
||||
* You can be released from the requirements of the license by purchasing
|
||||
* a commercial license. Buying such a license is mandatory as soon as you
|
||||
* develop commercial closed-source software that incorporates or links
|
||||
* directly against ZeroTier software without disclosing the source code
|
||||
* of your own application.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* Header for ZeroTier service controls
|
||||
*/
|
||||
|
||||
#ifndef LIBZT_SERVICE_CONTROLS_HPP
|
||||
#define LIBZT_SERVICE_CONTROLS_HPP
|
||||
|
||||
#include "Constants.hpp"
|
||||
|
||||
namespace ZeroTier {
|
||||
|
||||
#ifdef _WIN32
|
||||
#ifdef ADD_EXPORTS
|
||||
#define ZT_SOCKET_API __declspec(dllexport)
|
||||
#else
|
||||
#define ZT_SOCKET_API __declspec(dllimport)
|
||||
#endif
|
||||
#define ZTCALL __cdecl
|
||||
#else
|
||||
#define ZT_SOCKET_API
|
||||
#define ZTCALL
|
||||
#endif
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// ZeroTier Service Controls //
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief (optional) Sets the port for the background libzt service. If this function is called
|
||||
* with a port number between 1-65535 it will attempt to bind to that port. If it is called with
|
||||
* a port number of 0 it will attempt to randomly search for an available port. If this function
|
||||
* is never called, the service will try to bind on LIBZT_DEFAULT_PORT which is 9994.
|
||||
*
|
||||
* @usage Should be called at the beginning of your application before `zts_startjoin()`
|
||||
* @param portno Port number
|
||||
* @return 0 if successful; or -1 if failed
|
||||
*/
|
||||
ZT_SOCKET_API int ZTCALL zts_set_service_port(int portno);
|
||||
|
||||
/**
|
||||
* @brief (optional) Returns the port number used by the ZeroTier service
|
||||
* @usage Can be called if a port number was previously assigned
|
||||
* @return the port number used by the ZeroTier service
|
||||
*/
|
||||
ZT_SOCKET_API int ZTCALL zts_get_service_port();
|
||||
|
||||
/**
|
||||
* @brief Starts the ZeroTier service
|
||||
*
|
||||
* @usage Should be called at the beginning of your application. Will blocks until all of the following conditions are met:
|
||||
* - ZeroTier core service has been initialized
|
||||
* - Cryptographic identity has been generated or loaded from directory specified by `path`
|
||||
* - Virtual network is successfully joined
|
||||
* - IP address is assigned by network controller service
|
||||
* @param path path directory where cryptographic identities and network configuration files are stored and retrieved
|
||||
* (`identity.public`, `identity.secret`)
|
||||
* @param blocking whether or not this call will block until the entire service is up and running
|
||||
* @return 0 if successful; or 1 if failed
|
||||
*/
|
||||
ZT_SOCKET_API int ZTCALL zts_start(const char *path, int blocking);
|
||||
|
||||
/**
|
||||
* @brief Starts the ZeroTier service and notifies user application of events via callback
|
||||
*
|
||||
* @usage Should be called at the beginning of your application. Will blocks until all of the following conditions are met:
|
||||
* - ZeroTier core service has been initialized
|
||||
* - Cryptographic identity has been generated or loaded from directory specified by `path`
|
||||
* - Virtual network is successfully joined
|
||||
* - IP address is assigned by network controller service
|
||||
* @param path path directory where cryptographic identities and network configuration files are stored and retrieved
|
||||
* (`identity.public`, `identity.secret`)
|
||||
* @param userCallbackFunc User-specified callback for ZeroTier events
|
||||
* @param blocking whether or not this call will block until the entire service is up and running
|
||||
* @return 0 if successful; or 1 if failed
|
||||
*/
|
||||
ZT_SOCKET_API int ZTCALL zts_start_with_callback(const char *path, void (*userCallbackFunc)(uint64_t, int), int blocking);
|
||||
|
||||
/**
|
||||
* @brief Starts the ZeroTier service
|
||||
*
|
||||
* @usage Should be called at the beginning of your application. Will blocks until all of the following conditions are met:
|
||||
* - ZeroTier core service has been initialized
|
||||
* - Cryptographic identity has been generated or loaded from directory specified by `path`
|
||||
* - Virtual network is successfully joined
|
||||
* - IP address is assigned by network controller service
|
||||
* @param path path directory where cryptographic identities and network configuration files are stored and retrieved
|
||||
* (`identity.public`, `identity.secret`)
|
||||
* @param nwid A 16-digit hexidecimal network identifier (e.g. Earth: `8056c2e21c000001`)
|
||||
* @return 0 if successful; or 1 if failed
|
||||
*/
|
||||
ZT_SOCKET_API int ZTCALL zts_startjoin(const char *path, const uint64_t nwid);
|
||||
|
||||
/**
|
||||
* @brief Stops the ZeroTier service, brings down all virtual interfaces in order to stop all traffic processing.
|
||||
*
|
||||
* @usage This should be called when the application anticipates not needing any sort of traffic processing for a
|
||||
* prolonged period of time. The stack driver (with associated timers) will remain active in case future traffic
|
||||
* processing is required. Note that the application must tolerate a multi-second startup time if zts_start()
|
||||
* zts_startjoin() is called again. To stop this background thread and free all resources use zts_free() instead.
|
||||
* @param blocking whether or not this call will block until the entire service is torn down
|
||||
* @return Returns 0 on success, -1 on failure
|
||||
*/
|
||||
ZT_SOCKET_API int ZTCALL zts_stop(int blocking = 1);
|
||||
|
||||
/**
|
||||
* @brief Stops all background services, brings down all interfaces, frees all resources. After calling this function
|
||||
* an application restart will be required before the library can be used again. This is a blocking call.
|
||||
*
|
||||
* @usage This should be called at the end of your program or when you do not anticipate communicating over ZeroTier
|
||||
* @return Returns 0 on success, -1 on failure
|
||||
*/
|
||||
ZT_SOCKET_API int ZTCALL zts_free();
|
||||
|
||||
/**
|
||||
* @brief Return whether the ZeroTier service is currently running
|
||||
*
|
||||
* @usage Call this after zts_start()
|
||||
* @return 1 if running, 0 if not running
|
||||
*/
|
||||
ZT_SOCKET_API int ZTCALL zts_core_running();
|
||||
|
||||
/**
|
||||
* @brief Return whether libzt is ready to handle socket API calls. Alternatively you could
|
||||
* have just called zts_startjoin(path, nwid)
|
||||
*
|
||||
* @usage Call this after zts_start()
|
||||
* @return 1 if running, 0 if not running
|
||||
*/
|
||||
ZT_SOCKET_API int ZTCALL zts_ready();
|
||||
|
||||
/**
|
||||
* @brief Return the number of networks currently joined by this node
|
||||
*
|
||||
* @usage Call this after zts_start(), zts_startjoin() and/or zts_join()
|
||||
* @return Number of networks joined by this node
|
||||
*/
|
||||
ZT_SOCKET_API zts_err_t ZTCALL zts_get_num_joined_networks();
|
||||
|
||||
/**
|
||||
* @brief Populates a structure with details for a given network
|
||||
*
|
||||
* @usage Call this from the application thread any time after the node has joined a network
|
||||
* @param nwid A 16-digit hexidecimal virtual network ID
|
||||
* @param nd Pointer to a zts_network_details structure to populate
|
||||
* @return ZTS_ERR_SERVICE if failed, 0 if otherwise
|
||||
*/
|
||||
ZT_SOCKET_API zts_err_t ZTCALL zts_get_network_details(uint64_t nwid, struct zts_network_details *nd);
|
||||
|
||||
/**
|
||||
* @brief Populates an array of structures with details for any given number of networks
|
||||
*
|
||||
* @usage Call this from the application thread any time after the node has joined a network
|
||||
* @param nds Pointer to an array of zts_network_details structures to populate
|
||||
* @param num Number of zts_network_details structures available to copy data into, will be updated
|
||||
* to reflect number of structures that were actually populated
|
||||
* @return ZTS_ERR_SERVICE if failed, 0 if otherwise
|
||||
*/
|
||||
ZT_SOCKET_API zts_err_t ZTCALL zts_get_all_network_details(struct zts_network_details *nds, int *num);
|
||||
|
||||
/**
|
||||
* @brief Join a network
|
||||
*
|
||||
* @usage Call this from application thread. Only after zts_start() has succeeded
|
||||
* @param nwid A 16-digit hexidecimal virtual network ID
|
||||
* @return 0 if successful, -1 for any failure
|
||||
*/
|
||||
ZT_SOCKET_API zts_err_t ZTCALL zts_join(const uint64_t nwid, int blocking = 1);
|
||||
|
||||
/**
|
||||
* @brief Leave a network
|
||||
*
|
||||
* @usage Call this from application thread. Only after zts_start() has succeeded
|
||||
* @param nwid A 16-digit hexidecimal virtual network ID
|
||||
* @return 0 if successful, -1 for any failure
|
||||
*/
|
||||
ZT_SOCKET_API zts_err_t ZTCALL zts_leave(const uint64_t nwid, int blocking = 1);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Leaves all networks
|
||||
*
|
||||
* @usage Call this from application thread. Only after zts_start() has succeeded
|
||||
* @param nwid A 16-digit hexidecimal virtual network ID
|
||||
* @return 0 if successful, -1 for any failure
|
||||
*/
|
||||
ZT_SOCKET_API zts_err_t ZTCALL zts_leave_all(int blocking = 1);
|
||||
|
||||
/**
|
||||
* @brief Orbits a given moon (user-defined root server)
|
||||
*
|
||||
* @usage Call this from application thread. Only after zts_start() has succeeded
|
||||
* @param moonWorldId A 16-digit hexidecimal world ID
|
||||
* @param moonSeed A 16-digit hexidecimal seed ID
|
||||
* @return ZTS_ERR_OK if successful, ZTS_ERR_SERVICE, ZTS_ERR_INVALID_ARG, ZTS_ERR_INVALID_OP if otherwise
|
||||
*/
|
||||
ZT_SOCKET_API zts_err_t ZTCALL zts_orbit(uint64_t moonWorldId, uint64_t moonSeed);
|
||||
|
||||
/**
|
||||
* @brief De-orbits a given moon (user-defined root server)
|
||||
*
|
||||
* @usage Call this from application thread. Only after zts_start() has succeeded
|
||||
* @param moonWorldId A 16-digit hexidecimal world ID
|
||||
* @return ZTS_ERR_OK if successful, ZTS_ERR_SERVICE, ZTS_ERR_INVALID_ARG, ZTS_ERR_INVALID_OP if otherwise
|
||||
*/
|
||||
ZT_SOCKET_API zts_err_t ZTCALL zts_deorbit(uint64_t moonWorldId);
|
||||
|
||||
/**
|
||||
* @brief Copies the configuration path used by ZeroTier into the provided buffer
|
||||
*
|
||||
* @usage Use this to determine where ZeroTier is storing identity files
|
||||
* @param homePath Path to ZeroTier configuration files
|
||||
* @param len Length of destination buffer
|
||||
* @return 0 if no error, -1 if invalid argument was supplied
|
||||
*/
|
||||
ZT_SOCKET_API zts_err_t ZTCALL zts_get_path(char *homePath, size_t *len);
|
||||
|
||||
/**
|
||||
* @brief Returns the node ID of this instance
|
||||
*
|
||||
* @usage Call this after zts_start() and/or when zts_running() returns true
|
||||
* @return
|
||||
*/
|
||||
ZT_SOCKET_API uint64_t ZTCALL zts_get_node_id();
|
||||
|
||||
/**
|
||||
* @brief Returns whether any address has been assigned to the SockTap for this network
|
||||
*
|
||||
* @usage This is used as an indicator of readiness for service for the ZeroTier core and stack
|
||||
* @param nwid Network ID
|
||||
* @return
|
||||
*/
|
||||
ZT_SOCKET_API int ZTCALL zts_has_address(const uint64_t nwid);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Returns the number of addresses assigned to this node for the given nwid
|
||||
*
|
||||
* @param nwid Network ID
|
||||
* @return The number of addresses assigned
|
||||
*/
|
||||
ZT_SOCKET_API int ZTCALL zts_get_num_assigned_addresses(const uint64_t nwid);
|
||||
|
||||
/**
|
||||
* @brief Returns the assigned address located at the given index
|
||||
*
|
||||
* @usage The indices of each assigned address are not guaranteed and should only
|
||||
* be used for iterative purposes.
|
||||
* @param nwid Network ID
|
||||
* @param index location of assigned address
|
||||
* @return The number of addresses assigned
|
||||
*/
|
||||
ZT_SOCKET_API int ZTCALL zts_get_address_at_index(
|
||||
const uint64_t nwid, const int index, struct sockaddr *addr, socklen_t *addrlen);
|
||||
|
||||
/**
|
||||
* @brief Get IP address for this device on a given network
|
||||
*
|
||||
* @usage FIXME: Only returns first address found, good enough for most cases
|
||||
* @param nwid Network ID
|
||||
* @param addr Destination structure for address
|
||||
* @param addrlen size of destination address buffer, will be changed to size of returned address
|
||||
* @return 0 if an address was successfully found, -1 if failure
|
||||
*/
|
||||
ZT_SOCKET_API int ZTCALL zts_get_address(
|
||||
const uint64_t nwid, struct sockaddr_storage *addr, const int address_family);
|
||||
|
||||
/**
|
||||
* @brief Computes a 6PLANE IPv6 address for the given Network ID and Node ID
|
||||
*
|
||||
* @usage Can call any time
|
||||
* @param addr Destination structure for address
|
||||
* @param nwid Network ID
|
||||
* @param nodeId Node ID
|
||||
* @return
|
||||
*/
|
||||
ZT_SOCKET_API void ZTCALL zts_get_6plane_addr(
|
||||
struct sockaddr_storage *addr, const uint64_t nwid, const uint64_t nodeId);
|
||||
|
||||
/**
|
||||
* @brief Computes a RFC4193 IPv6 address for the given Network ID and Node ID
|
||||
*
|
||||
* @usage Can call any time
|
||||
* @param addr Destination structure for address
|
||||
* @param nwid Network ID
|
||||
* @param nodeId Node ID
|
||||
* @return
|
||||
*/
|
||||
ZT_SOCKET_API void ZTCALL zts_get_rfc4193_addr(
|
||||
struct sockaddr_storage *addr, const uint64_t nwid, const uint64_t nodeId);
|
||||
|
||||
/**
|
||||
* @brief Return the number of peers
|
||||
*
|
||||
* @usage Call this after zts_start() has succeeded
|
||||
* @return
|
||||
*/
|
||||
ZT_SOCKET_API zts_err_t zts_get_peer_count();
|
||||
|
||||
ZT_SOCKET_API zts_err_t zts_get_peers(struct zts_peer_details *pds, int *num);
|
||||
|
||||
/**
|
||||
* @brief Enables the HTTP backplane management system
|
||||
*
|
||||
* @usage Call this after zts_start() has succeeded
|
||||
* @return ZTS_ERR_OK if successful, ZTS_ERR_SERVICE if otherwise
|
||||
*/
|
||||
ZT_SOCKET_API zts_err_t zts_enable_http_backplane_mgmt();
|
||||
|
||||
/**
|
||||
* @brief Disables the HTTP backplane management system
|
||||
*
|
||||
* @usage Call this after zts_start() has succeeded
|
||||
* @return ZTS_ERR_OK if successful, ZTS_ERR_SERVICE, ZTS_ERR_INVALID_OP if otherwise
|
||||
*/
|
||||
ZT_SOCKET_API zts_err_t zts_disable_http_backplane_mgmt();
|
||||
|
||||
|
||||
/**
|
||||
* @brief Starts a ZeroTier service in the background
|
||||
*
|
||||
* @usage For internal use only.
|
||||
* @param
|
||||
* @return
|
||||
*/
|
||||
#if defined(_WIN32)
|
||||
DWORD WINAPI _zts_start_service(LPVOID thread_id);
|
||||
#else
|
||||
void *_zts_start_service(void *thread_id);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief [Should not be called from user application] This function must be surrounded by
|
||||
* ZT service locks. It will determine if it is currently safe and allowed to operate on
|
||||
* the service.
|
||||
* @usage Can be called at any time
|
||||
* @return 1 or 0
|
||||
*/
|
||||
int _zts_can_perform_service_operation();
|
||||
|
||||
/**
|
||||
* @brief [Should not be called from user application] Returns whether or not the node is
|
||||
* online.
|
||||
* @usage Can be called at any time
|
||||
* @return 1 or 0
|
||||
*/
|
||||
int _zts_node_online();
|
||||
|
||||
/**
|
||||
* @brief [Should not be called from user application] Adjusts the delay multiplier for the
|
||||
* network stack driver thread.
|
||||
* @usage Can be called at any time
|
||||
*/
|
||||
void _hibernate_if_needed();
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
} // namespace ZeroTier
|
||||
|
||||
#endif // _H
|
||||
@@ -1,263 +0,0 @@
|
||||
/*
|
||||
* ZeroTier SDK - Network Virtualization Everywhere
|
||||
* Copyright (C) 2011-2019 ZeroTier, Inc. https://www.zerotier.com/
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* --
|
||||
*
|
||||
* You can be released from the requirements of the license by purchasing
|
||||
* a commercial license. Buying such a license is mandatory as soon as you
|
||||
* develop commercial closed-source software that incorporates or links
|
||||
* directly against ZeroTier software without disclosing the source code
|
||||
* of your own application.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* Virtual Ethernet tap device
|
||||
*/
|
||||
|
||||
#ifndef LIBZT_VIRTUALTAP_HPP
|
||||
#define LIBZT_VIRTUALTAP_HPP
|
||||
|
||||
#ifndef _MSC_VER
|
||||
extern int errno;
|
||||
#endif
|
||||
|
||||
#include "Phy.hpp"
|
||||
#include "Thread.hpp"
|
||||
#include "InetAddress.hpp"
|
||||
#include "MulticastGroup.hpp"
|
||||
#include "Mutex.hpp"
|
||||
|
||||
#include "Defs.hpp"
|
||||
|
||||
#if defined(_WIN32)
|
||||
#include <WinSock2.h>
|
||||
#include <Windows.h>
|
||||
#include <IPHlpApi.h>
|
||||
#include <Ifdef.h>
|
||||
#endif
|
||||
|
||||
namespace ZeroTier {
|
||||
|
||||
class Mutex;
|
||||
|
||||
/**
|
||||
* A virtual tap device. The ZeroTier core service creates one of these for each
|
||||
* virtual network joined. It will be destroyed upon leave().
|
||||
*/
|
||||
class VirtualTap
|
||||
{
|
||||
friend class Phy<VirtualTap *>;
|
||||
|
||||
public:
|
||||
VirtualTap(
|
||||
const char *homePath,
|
||||
const MAC &mac,
|
||||
unsigned int mtu,
|
||||
unsigned int metric,
|
||||
uint64_t nwid,
|
||||
const char *friendlyName,
|
||||
void (*handler)(void *, void *, uint64_t, const MAC &,
|
||||
const MAC &, unsigned int, unsigned int, const void *, unsigned int),
|
||||
void *arg);
|
||||
|
||||
~VirtualTap();
|
||||
|
||||
void setEnabled(bool en);
|
||||
bool enabled() const;
|
||||
|
||||
/**
|
||||
* Adds an address to the userspace stack interface associated with this VirtualTap
|
||||
* - Starts VirtualTap main thread ONLY if successful
|
||||
*/
|
||||
bool addIp(const InetAddress &ip);
|
||||
|
||||
/**
|
||||
* Removes an address from the userspace stack interface associated with this VirtualTap
|
||||
*/
|
||||
bool removeIp(const InetAddress &ip);
|
||||
|
||||
/**
|
||||
* Presents data to the userspace stack
|
||||
*/
|
||||
void put(const MAC &from,const MAC &to,unsigned int etherType,const void *data,
|
||||
unsigned int len);
|
||||
|
||||
/**
|
||||
* Get VirtualTap device name (e.g. 'libzt17d72843bc2c5760')
|
||||
*/
|
||||
std::string deviceName() const;
|
||||
|
||||
/**
|
||||
* Get Node ID (ZT address)
|
||||
*/
|
||||
std::string nodeId() const;
|
||||
|
||||
/**
|
||||
* Set friendly name
|
||||
*/
|
||||
void setFriendlyName(const char *friendlyName);
|
||||
|
||||
/**
|
||||
* Scan multicast groups
|
||||
*/
|
||||
void scanMulticastGroups(std::vector<MulticastGroup> &added,
|
||||
std::vector<MulticastGroup> &removed);
|
||||
|
||||
/**
|
||||
* Set MTU
|
||||
*/
|
||||
void setMtu(unsigned int mtu);
|
||||
|
||||
/**
|
||||
* Calls main network stack loops
|
||||
*/
|
||||
void threadMain()
|
||||
throw();
|
||||
|
||||
#if defined(__MINGW32__)
|
||||
/* The following is merely to make ZeroTier's OneService happy while building on Windows.
|
||||
we won't use these in libzt */
|
||||
NET_LUID _deviceLuid;
|
||||
std::string _deviceInstanceId;
|
||||
|
||||
/**
|
||||
* Returns whether the VirtualTap interface has been initialized
|
||||
*/
|
||||
bool isInitialized() const { return _initialized; };
|
||||
|
||||
inline const NET_LUID &luid() const { return _deviceLuid; }
|
||||
inline const std::string &instanceId() const { return _deviceInstanceId; }
|
||||
#endif
|
||||
/**
|
||||
* For moving data onto the ZeroTier virtual wire
|
||||
*/
|
||||
void (*_handler)(void *, void *, uint64_t, const MAC &, const MAC &, unsigned int, unsigned int,
|
||||
const void *, unsigned int);
|
||||
|
||||
void phyOnUnixClose(PhySocket *sock, void **uptr);
|
||||
void phyOnUnixData(PhySocket *sock, void **uptr, void *data, ssize_t len);
|
||||
void phyOnUnixWritable(PhySocket *sock, void **uptr, bool stack_invoked);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// Lower-level lwIP netif handling and traffic handling readiness //
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void *netif4 = NULL;
|
||||
void *netif6 = NULL;
|
||||
|
||||
bool netif4WasUpLastCheck = false;
|
||||
bool netif6WasUpLastCheck = false;
|
||||
|
||||
/**
|
||||
* Notes the current state of the lower level lwIP netif and reports if a state change
|
||||
* has happened since the last check. This method is likely temporary.
|
||||
*/
|
||||
uint64_t recognizeLowerLevelInterfaceStateChange(void *n);
|
||||
|
||||
/**
|
||||
* A state will only be reported via callback if it differs from this value. Subsequently this
|
||||
* value will be updated.
|
||||
*/
|
||||
//int _lastReportedStatus;
|
||||
|
||||
/**
|
||||
* The last time that this virtual tap received a network config update from the core
|
||||
*/
|
||||
uint64_t _lastConfigUpdateTime = 0;
|
||||
|
||||
/**
|
||||
* The last time that a callback notification was sent to the user application signalling
|
||||
* that this interface is ready to process traffic.
|
||||
*/
|
||||
uint64_t _lastReadyReportTime = 0;
|
||||
|
||||
void lastConfigUpdate(uint64_t lastConfigUpdateTime);
|
||||
|
||||
int _networkStatus = 0;
|
||||
int _netifStatus = 0;
|
||||
/**
|
||||
* Returns whether or not this interface is ready for traffic.
|
||||
*/
|
||||
bool isReady();
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// Vars //
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
std::vector<std::pair<InetAddress, InetAddress> > routes;
|
||||
|
||||
char vtap_full_name[64];
|
||||
char vtap_abbr_name[16];
|
||||
|
||||
size_t ifindex = 0;
|
||||
|
||||
std::vector<InetAddress> ips() const;
|
||||
std::vector<InetAddress> _ips;
|
||||
|
||||
std::string _homePath;
|
||||
void *_arg;
|
||||
volatile bool _initialized;
|
||||
volatile bool _enabled;
|
||||
volatile bool _run;
|
||||
MAC _mac;
|
||||
unsigned int _mtu;
|
||||
uint64_t _nwid;
|
||||
PhySocket *_unixListenSocket;
|
||||
Phy<VirtualTap *> _phy;
|
||||
|
||||
Thread _thread;
|
||||
|
||||
int _shutdownSignalPipe[2];
|
||||
|
||||
std::string _dev; // path to Unix domain socket
|
||||
|
||||
std::vector<MulticastGroup> _multicastGroups;
|
||||
Mutex _multicastGroups_m;
|
||||
Mutex _ips_m;
|
||||
|
||||
//struct zts_network_details nd;
|
||||
|
||||
/*
|
||||
* Timestamp of last run of housekeeping
|
||||
* SEE: ZT_HOUSEKEEPING_INTERVAL in libzt.h
|
||||
*/
|
||||
uint64_t last_housekeeping_ts = 0;
|
||||
|
||||
/**
|
||||
* Performs miscellaneous background tasks
|
||||
*/
|
||||
void Housekeeping();
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// Not used in this implementation //
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void phyOnDatagram(PhySocket *sock,void **uptr,const struct sockaddr *local_address,
|
||||
const struct sockaddr *from,void *data,unsigned long len);
|
||||
void phyOnTcpConnect(PhySocket *sock,void **uptr,bool success);
|
||||
void phyOnTcpAccept(PhySocket *sockL,PhySocket *sockN,void **uptrL,void **uptrN,
|
||||
const struct sockaddr *from);
|
||||
void phyOnTcpClose(PhySocket *sock,void **uptr);
|
||||
void phyOnTcpData(PhySocket *sock,void **uptr,void *data,unsigned long len);
|
||||
void phyOnTcpWritable(PhySocket *sock,void **uptr);
|
||||
};
|
||||
|
||||
} // namespace ZeroTier
|
||||
|
||||
#endif // _H
|
||||
527
include/libzt.h
527
include/libzt.h
@@ -63,22 +63,86 @@ typedef int socklen_t;
|
||||
#include <Windows.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
#ifdef _USING_LWIP_DEFINITIONS_
|
||||
#include "lwip/sockets.h"
|
||||
#endif
|
||||
|
||||
#include "Constants.hpp"
|
||||
#include "Defs.hpp"
|
||||
#include "ServiceControls.hpp"
|
||||
|
||||
class InetAddress;
|
||||
class VirtualTap;
|
||||
*/
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#include <BaseTsd.h>
|
||||
typedef SSIZE_T ssize_t;
|
||||
#endif
|
||||
|
||||
namespace ZeroTier {
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
// Custom errno to prevent conflicts with platform's own errno
|
||||
extern int zts_errno;
|
||||
typedef int zts_err_t;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* The system port upon which ZT traffic is sent and received
|
||||
*/
|
||||
#define ZTS_DEFAULT_PORT 9994
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// Control API error codes //
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#define ZTS_ERR_OK 0 // Everything is ok
|
||||
#define ZTS_ERR_INVALID_ARG -1 // A parameter provided by the user application is invalid (e.g. our of range, NULL, etc)
|
||||
#define ZTS_ERR_SERVICE -2 // The service isn't initialized or is for some other reason currently unavailable
|
||||
#define ZTS_ERR_INVALID_OP -3 // For some reason this API operation is not permitted (perhaps the service is still starting?)
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// Control API event codes //
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#define ZTS_EVENT_NONE -1
|
||||
#define ZTS_EVENT_NODE_UP 0
|
||||
// Standard node events
|
||||
#define ZTS_EVENT_NODE_OFFLINE 1
|
||||
#define ZTS_EVENT_NODE_ONLINE 2
|
||||
#define ZTS_EVENT_NODE_DOWN 3
|
||||
#define ZTS_EVENT_NODE_IDENTITY_COLLISION 4
|
||||
// libzt node events
|
||||
#define ZTS_EVENT_NODE_UNRECOVERABLE_ERROR 16
|
||||
#define ZTS_EVENT_NODE_NORMAL_TERMINATION 17
|
||||
// Network-specific events
|
||||
#define ZTS_EVENT_NETWORK_NOT_FOUND 32
|
||||
#define ZTS_EVENT_NETWORK_CLIENT_TOO_OLD 33
|
||||
#define ZTS_EVENT_NETWORK_REQUESTING_CONFIG 34
|
||||
#define ZTS_EVENT_NETWORK_OK 35
|
||||
#define ZTS_EVENT_NETWORK_ACCESS_DENIED 36
|
||||
#define ZTS_EVENT_NETWORK_READY_IP4 37
|
||||
#define ZTS_EVENT_NETWORK_READY_IP6 38
|
||||
#define ZTS_EVENT_NETWORK_DOWN 39
|
||||
//
|
||||
#define ZTS_EVENT_NETWORK_STACK_UP 48
|
||||
#define ZTS_EVENT_NETWORK_STACK_DOWN 49
|
||||
|
||||
// lwIP netif events
|
||||
#define ZTS_EVENT_NETIF_UP_IP4 64
|
||||
#define ZTS_EVENT_NETIF_UP_IP6 65
|
||||
#define ZTS_EVENT_NETIF_DOWN_IP4 66
|
||||
#define ZTS_EVENT_NETIF_DOWN_IP6 67
|
||||
#define ZTS_EVENT_NETIF_REMOVED 68
|
||||
#define ZTS_EVENT_NETIF_LINK_UP 69
|
||||
#define ZTS_EVENT_NETIF_LINK_DOWN 70
|
||||
#define ZTS_EVENT_NETIF_NEW_ADDRESS 71
|
||||
// Peer events
|
||||
#define ZTS_EVENT_PEER_P2P 96
|
||||
#define ZTS_EVENT_PEER_RELAY 97
|
||||
#define ZTS_EVENT_PEER_UNREACHABLE 98
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// Common definitions and structures for interacting with the ZT socket API //
|
||||
// This is a subset of lwip/sockets.h, lwip/arch.h, and lwip/inet.h //
|
||||
@@ -196,7 +260,7 @@ typedef SSIZE_T ssize_t;
|
||||
#error "external ZTS_FD_SETSIZE too small for number of sockets"
|
||||
#endif // FD_SET
|
||||
|
||||
#if !defined(_USING_LWIP_DEFINITIONS_)
|
||||
#if defined(_USING_LWIP_DEFINITIONS_)
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
@@ -322,15 +386,454 @@ struct sockaddr_ll {
|
||||
#endif
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// Socket API //
|
||||
// Subset of: ZeroTierOne.h //
|
||||
// We redefine a few ZT structures here so that we don't need to drag the //
|
||||
// entire ZeroTierOne.h file into the user application //
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/**
|
||||
* Maximum address assignments per network
|
||||
*/
|
||||
#define ZTS_MAX_ASSIGNED_ADDRESSES 16
|
||||
|
||||
/**
|
||||
* Maximum routes per network
|
||||
*/
|
||||
#define ZTS_MAX_NETWORK_ROUTES 32
|
||||
|
||||
/**
|
||||
* Maximum number of direct network paths to a given peer
|
||||
*/
|
||||
#define ZT_MAX_PEER_NETWORK_PATHS 16
|
||||
|
||||
/**
|
||||
* What trust hierarchy role does this peer have?
|
||||
*/
|
||||
enum zts_peer_role
|
||||
{
|
||||
ZTS_PEER_ROLE_LEAF = 0, // ordinary node
|
||||
ZTS_PEER_ROLE_MOON = 1, // moon root
|
||||
ZTS_PEER_ROLE_PLANET = 2 // planetary root
|
||||
};
|
||||
|
||||
/**
|
||||
* A structure used to represent a virtual network route
|
||||
*/
|
||||
struct zts_virtual_network_route
|
||||
{
|
||||
/**
|
||||
* Target network / netmask bits (in port field) or NULL or 0.0.0.0/0 for default
|
||||
*/
|
||||
struct sockaddr_storage target;
|
||||
|
||||
/**
|
||||
* Gateway IP address (port ignored) or NULL (family == 0) for LAN-local (no gateway)
|
||||
*/
|
||||
struct sockaddr_storage via;
|
||||
|
||||
/**
|
||||
* Route flags
|
||||
*/
|
||||
uint16_t flags;
|
||||
|
||||
/**
|
||||
* Route metric (not currently used)
|
||||
*/
|
||||
uint16_t metric;
|
||||
};
|
||||
|
||||
/**
|
||||
* A structure used to convey network-specific details to the user application
|
||||
*/
|
||||
struct zts_network_details
|
||||
{
|
||||
/**
|
||||
* Network ID
|
||||
*/
|
||||
uint64_t nwid;
|
||||
|
||||
/**
|
||||
* Maximum Transmission Unit size for this network
|
||||
*/
|
||||
int mtu;
|
||||
|
||||
/**
|
||||
* Number of addresses (actually) assigned to the node on this network
|
||||
*/
|
||||
short num_addresses;
|
||||
|
||||
/**
|
||||
* Array of IPv4 and IPv6 addresses assigned to the node on this network
|
||||
*/
|
||||
struct sockaddr_storage addr[ZTS_MAX_ASSIGNED_ADDRESSES];
|
||||
|
||||
/**
|
||||
* Number of routes
|
||||
*/
|
||||
unsigned int num_routes;
|
||||
|
||||
/**
|
||||
* Array of IPv4 and IPv6 addresses assigned to the node on this network
|
||||
*/
|
||||
struct zts_virtual_network_route routes[ZTS_MAX_NETWORK_ROUTES];
|
||||
};
|
||||
|
||||
/**
|
||||
* Physical network path to a peer
|
||||
*/
|
||||
struct zts_physical_path
|
||||
{
|
||||
/**
|
||||
* Address of endpoint
|
||||
*/
|
||||
struct sockaddr_storage address;
|
||||
|
||||
/**
|
||||
* Time of last send in milliseconds or 0 for never
|
||||
*/
|
||||
uint64_t lastSend;
|
||||
|
||||
/**
|
||||
* Time of last receive in milliseconds or 0 for never
|
||||
*/
|
||||
uint64_t lastReceive;
|
||||
|
||||
/**
|
||||
* Is this a trusted path? If so this will be its nonzero ID.
|
||||
*/
|
||||
uint64_t trustedPathId;
|
||||
|
||||
/**
|
||||
* Is path expired?
|
||||
*/
|
||||
int expired;
|
||||
|
||||
/**
|
||||
* Is path preferred?
|
||||
*/
|
||||
int preferred;
|
||||
};
|
||||
|
||||
/**
|
||||
* Peer status result buffer
|
||||
*/
|
||||
struct zts_peer_details
|
||||
{
|
||||
/**
|
||||
* ZeroTier address (40 bits)
|
||||
*/
|
||||
uint64_t address;
|
||||
|
||||
/**
|
||||
* Remote major version or -1 if not known
|
||||
*/
|
||||
int versionMajor;
|
||||
|
||||
/**
|
||||
* Remote minor version or -1 if not known
|
||||
*/
|
||||
int versionMinor;
|
||||
|
||||
/**
|
||||
* Remote revision or -1 if not known
|
||||
*/
|
||||
int versionRev;
|
||||
|
||||
/**
|
||||
* Last measured latency in milliseconds or -1 if unknown
|
||||
*/
|
||||
int latency;
|
||||
|
||||
/**
|
||||
* What trust hierarchy role does this device have?
|
||||
*/
|
||||
enum zts_peer_role role;
|
||||
|
||||
/**
|
||||
* Number of paths (size of paths[])
|
||||
*/
|
||||
unsigned int pathCount;
|
||||
|
||||
/**
|
||||
* Known network paths to peer
|
||||
*/
|
||||
zts_physical_path paths[ZT_MAX_PEER_NETWORK_PATHS];
|
||||
};
|
||||
|
||||
/**
|
||||
* List of peers
|
||||
*/
|
||||
struct zts_peer_list
|
||||
{
|
||||
zts_peer_details *peers;
|
||||
unsigned long peerCount;
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// ZeroTier Service Controls //
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
// Custom errno to prevent conflicts with platform's own errno
|
||||
extern int zts_errno;
|
||||
/**
|
||||
* @brief Starts the ZeroTier service and notifies user application of events via callback
|
||||
*
|
||||
* @usage Should be called at the beginning of your application. Will blocks until all of the following conditions are met:
|
||||
* - ZeroTier core service has been initialized
|
||||
* - Cryptographic identity has been generated or loaded from directory specified by `path`
|
||||
* - Virtual network is successfully joined
|
||||
* - IP address is assigned by network controller service
|
||||
* @param path path directory where cryptographic identities and network configuration files are stored and retrieved
|
||||
* (`identity.public`, `identity.secret`)
|
||||
* @param userCallbackFunc User-specified callback for ZeroTier events
|
||||
* @return 0 if successful; or 1 if failed
|
||||
*/
|
||||
ZT_SOCKET_API int ZTCALL zts_start(const char *path, void (*userCallbackFunc)(uint64_t, int), int port = ZTS_DEFAULT_PORT);
|
||||
|
||||
/**
|
||||
* @brief Stops the ZeroTier service, brings down all virtual interfaces in order to stop all traffic processing.
|
||||
*
|
||||
* @usage This should be called when the application anticipates not needing any sort of traffic processing for a
|
||||
* prolonged period of time. The stack driver (with associated timers) will remain active in case future traffic
|
||||
* processing is required. Note that the application must tolerate a multi-second startup time if zts_start()
|
||||
* zts_startjoin() is called again. To stop this background thread and free all resources use zts_free() instead.
|
||||
* @return Returns 0 on success, -1 on failure
|
||||
*/
|
||||
ZT_SOCKET_API int ZTCALL zts_stop();
|
||||
|
||||
/**
|
||||
* @brief Stops all background services, brings down all interfaces, frees all resources. After calling this function
|
||||
* an application restart will be required before the library can be used again. This is a blocking call.
|
||||
*
|
||||
* @usage This should be called at the end of your program or when you do not anticipate communicating over ZeroTier
|
||||
* @return Returns 0 on success, -1 on failure
|
||||
*/
|
||||
ZT_SOCKET_API int ZTCALL zts_free();
|
||||
|
||||
/**
|
||||
* @brief Return whether the ZeroTier service is currently running
|
||||
*
|
||||
* @usage Call this after zts_start()
|
||||
* @return 1 if running, 0 if not running
|
||||
*/
|
||||
ZT_SOCKET_API int ZTCALL zts_core_running();
|
||||
|
||||
/**
|
||||
* @brief Return the number of networks currently joined by this node
|
||||
*
|
||||
* @usage Call this after zts_start(), zts_startjoin() and/or zts_join()
|
||||
* @return Number of networks joined by this node
|
||||
*/
|
||||
ZT_SOCKET_API zts_err_t ZTCALL zts_get_num_joined_networks();
|
||||
|
||||
/**
|
||||
* @brief Populates a structure with details for a given network
|
||||
*
|
||||
* @usage Call this from the application thread any time after the node has joined a network
|
||||
* @param nwid A 16-digit hexidecimal virtual network ID
|
||||
* @param nd Pointer to a zts_network_details structure to populate
|
||||
* @return ZTS_ERR_SERVICE if failed, 0 if otherwise
|
||||
*/
|
||||
ZT_SOCKET_API zts_err_t ZTCALL zts_get_network_details(uint64_t nwid, struct zts_network_details *nd);
|
||||
|
||||
/**
|
||||
* @brief Populates an array of structures with details for any given number of networks
|
||||
*
|
||||
* @usage Call this from the application thread any time after the node has joined a network
|
||||
* @param nds Pointer to an array of zts_network_details structures to populate
|
||||
* @param num Number of zts_network_details structures available to copy data into, will be updated
|
||||
* to reflect number of structures that were actually populated
|
||||
* @return ZTS_ERR_SERVICE if failed, 0 if otherwise
|
||||
*/
|
||||
ZT_SOCKET_API zts_err_t ZTCALL zts_get_all_network_details(struct zts_network_details *nds, int *num);
|
||||
|
||||
/**
|
||||
* @brief Join a network
|
||||
*
|
||||
* @usage Call this from application thread. Only after zts_start() has succeeded
|
||||
* @param nwid A 16-digit hexidecimal virtual network ID
|
||||
* @return 0 if successful, -1 for any failure
|
||||
*/
|
||||
ZT_SOCKET_API zts_err_t ZTCALL zts_join(const uint64_t nwid);
|
||||
|
||||
/**
|
||||
* @brief Leave a network
|
||||
*
|
||||
* @usage Call this from application thread. Only after zts_start() has succeeded
|
||||
* @param nwid A 16-digit hexidecimal virtual network ID
|
||||
* @return 0 if successful, -1 for any failure
|
||||
*/
|
||||
ZT_SOCKET_API zts_err_t ZTCALL zts_leave(const uint64_t nwid);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Leaves all networks
|
||||
*
|
||||
* @usage Call this from application thread. Only after zts_start() has succeeded
|
||||
* @return 0 if successful, -1 for any failure
|
||||
*/
|
||||
ZT_SOCKET_API zts_err_t ZTCALL zts_leave_all();
|
||||
|
||||
/**
|
||||
* @brief Orbits a given moon (user-defined root server)
|
||||
*
|
||||
* @usage Call this from application thread. Only after zts_start() has succeeded
|
||||
* @param moonWorldId A 16-digit hexidecimal world ID
|
||||
* @param moonSeed A 16-digit hexidecimal seed ID
|
||||
* @return ZTS_ERR_OK if successful, ZTS_ERR_SERVICE, ZTS_ERR_INVALID_ARG, ZTS_ERR_INVALID_OP if otherwise
|
||||
*/
|
||||
ZT_SOCKET_API zts_err_t ZTCALL zts_orbit(uint64_t moonWorldId, uint64_t moonSeed);
|
||||
|
||||
/**
|
||||
* @brief De-orbits a given moon (user-defined root server)
|
||||
*
|
||||
* @usage Call this from application thread. Only after zts_start() has succeeded
|
||||
* @param moonWorldId A 16-digit hexidecimal world ID
|
||||
* @return ZTS_ERR_OK if successful, ZTS_ERR_SERVICE, ZTS_ERR_INVALID_ARG, ZTS_ERR_INVALID_OP if otherwise
|
||||
*/
|
||||
ZT_SOCKET_API zts_err_t ZTCALL zts_deorbit(uint64_t moonWorldId);
|
||||
|
||||
/**
|
||||
* @brief Copies the configuration path used by ZeroTier into the provided buffer
|
||||
*
|
||||
* @usage Use this to determine where ZeroTier is storing identity files
|
||||
* @param homePath Path to ZeroTier configuration files
|
||||
* @param len Length of destination buffer
|
||||
* @return 0 if no error, -1 if invalid argument was supplied
|
||||
*/
|
||||
ZT_SOCKET_API zts_err_t ZTCALL zts_get_path(char *homePath, size_t *len);
|
||||
|
||||
/**
|
||||
* @brief Returns the node ID of this instance
|
||||
*
|
||||
* @usage Call this after zts_start() and/or when zts_running() returns true
|
||||
* @return
|
||||
*/
|
||||
ZT_SOCKET_API uint64_t ZTCALL zts_get_node_id();
|
||||
|
||||
/**
|
||||
* @brief Returns whether any address has been assigned to the SockTap for this network
|
||||
*
|
||||
* @usage This is used as an indicator of readiness for service for the ZeroTier core and stack
|
||||
* @param nwid Network ID
|
||||
* @return
|
||||
*/
|
||||
ZT_SOCKET_API int ZTCALL zts_has_address(const uint64_t nwid);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Returns the number of addresses assigned to this node for the given nwid
|
||||
*
|
||||
* @param nwid Network ID
|
||||
* @return The number of addresses assigned
|
||||
*/
|
||||
ZT_SOCKET_API int ZTCALL zts_get_num_assigned_addresses(const uint64_t nwid);
|
||||
|
||||
/**
|
||||
* @brief Returns the assigned address located at the given index
|
||||
*
|
||||
* @usage The indices of each assigned address are not guaranteed and should only
|
||||
* be used for iterative purposes.
|
||||
* @param nwid Network ID
|
||||
* @param index location of assigned address
|
||||
* @return The number of addresses assigned
|
||||
*/
|
||||
ZT_SOCKET_API int ZTCALL zts_get_address_at_index(
|
||||
const uint64_t nwid, const int index, struct sockaddr *addr, socklen_t *addrlen);
|
||||
|
||||
/**
|
||||
* @brief Get IP address for this device on a given network
|
||||
*
|
||||
* @usage FIXME: Only returns first address found, good enough for most cases
|
||||
* @param nwid Network ID
|
||||
* @param addr Destination structure for address
|
||||
* @param addrlen size of destination address buffer, will be changed to size of returned address
|
||||
* @return 0 if an address was successfully found, -1 if failure
|
||||
*/
|
||||
ZT_SOCKET_API int ZTCALL zts_get_address(
|
||||
const uint64_t nwid, struct sockaddr_storage *addr, const int address_family);
|
||||
|
||||
/**
|
||||
* @brief Computes a 6PLANE IPv6 address for the given Network ID and Node ID
|
||||
*
|
||||
* @usage Can call any time
|
||||
* @param addr Destination structure for address
|
||||
* @param nwid Network ID
|
||||
* @param nodeId Node ID
|
||||
* @return
|
||||
*/
|
||||
ZT_SOCKET_API void ZTCALL zts_get_6plane_addr(
|
||||
struct sockaddr_storage *addr, const uint64_t nwid, const uint64_t nodeId);
|
||||
|
||||
/**
|
||||
* @brief Computes a RFC4193 IPv6 address for the given Network ID and Node ID
|
||||
*
|
||||
* @usage Can call any time
|
||||
* @param addr Destination structure for address
|
||||
* @param nwid Network ID
|
||||
* @param nodeId Node ID
|
||||
* @return
|
||||
*/
|
||||
ZT_SOCKET_API void ZTCALL zts_get_rfc4193_addr(
|
||||
struct sockaddr_storage *addr, const uint64_t nwid, const uint64_t nodeId);
|
||||
|
||||
/**
|
||||
* @brief Return the number of peers
|
||||
*
|
||||
* @usage Call this after zts_start() has succeeded
|
||||
* @return
|
||||
*/
|
||||
ZT_SOCKET_API zts_err_t zts_get_peer_count();
|
||||
|
||||
ZT_SOCKET_API zts_err_t zts_get_peers(struct zts_peer_details *pds, int *num);
|
||||
|
||||
/**
|
||||
* @brief Determines whether a peer is reachable via a P2P connection
|
||||
* or is being relayed via roots.
|
||||
*
|
||||
* @usage
|
||||
* @param nodeId The ID of the peer to check
|
||||
* @return The status of a peer
|
||||
*/
|
||||
ZT_SOCKET_API zts_err_t zts_get_peer_status(uint64_t nodeId);
|
||||
|
||||
/**
|
||||
* @brief Starts a ZeroTier service in the background
|
||||
*
|
||||
* @usage For internal use only.
|
||||
* @param
|
||||
* @return
|
||||
*/
|
||||
#if defined(_WIN32)
|
||||
DWORD WINAPI _zts_start_service(LPVOID thread_id);
|
||||
#else
|
||||
void *_zts_start_service(void *thread_id);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief [Should not be called from user application] This function must be surrounded by
|
||||
* ZT service locks. It will determine if it is currently safe and allowed to operate on
|
||||
* the service.
|
||||
* @usage Can be called at any time
|
||||
* @return 1 or 0
|
||||
*/
|
||||
int _zts_can_perform_service_operation();
|
||||
|
||||
/**
|
||||
* @brief [Should not be called from user application] Returns whether or not the node is
|
||||
* online.
|
||||
* @usage Can be called at any time
|
||||
* @return 1 or 0
|
||||
*/
|
||||
int _zts_node_online();
|
||||
|
||||
int zts_ready();
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// Socket API //
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/**
|
||||
* @brief Create a socket
|
||||
@@ -679,4 +1182,6 @@ ZT_SOCKET_API zts_err_t ZTCALL zts_del_dns_nameserver(struct sockaddr *addr);
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
||||
} // namespace ZeroTier
|
||||
|
||||
#endif // _H
|
||||
|
||||
179
include/lwIP.h
179
include/lwIP.h
@@ -1,179 +0,0 @@
|
||||
/*
|
||||
* ZeroTier SDK - Network Virtualization Everywhere
|
||||
* Copyright (C) 2011-2019 ZeroTier, Inc. https://www.zerotier.com/
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* --
|
||||
*
|
||||
* You can be released from the requirements of the license by purchasing
|
||||
* a commercial license. Buying such a license is mandatory as soon as you
|
||||
* develop commercial closed-source software that incorporates or links
|
||||
* directly against ZeroTier software without disclosing the source code
|
||||
* of your own application.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* lwIP network stack driver
|
||||
*/
|
||||
|
||||
#ifndef ZT_LWIP_HPP
|
||||
#define ZT_LWIP_HPP
|
||||
|
||||
#include "Debug.hpp"
|
||||
#include "lwip/err.h"
|
||||
|
||||
namespace ZeroTier {
|
||||
|
||||
class MAC;
|
||||
class Mutex;
|
||||
class VirtualTap;
|
||||
struct InetAddress;
|
||||
|
||||
/**
|
||||
* @brief Structure used to associate packets with interfaces.
|
||||
*/
|
||||
struct zts_sorted_packet
|
||||
{
|
||||
// lwIP pbuf containing packet (originally encapsulated by ZT packet)
|
||||
struct pbuf *p;
|
||||
// ZT VirtualTap from which this packet originates
|
||||
ZeroTier::VirtualTap *vtap;
|
||||
// lwIP netif we should accept this packet on
|
||||
struct netif *n;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Return whether a given netif's NETIF_FLAG_UP flag is set
|
||||
*
|
||||
* @usage This is a convenience function to encapsulate a macro
|
||||
*/
|
||||
bool lwip_is_netif_up(void *netif);
|
||||
|
||||
/**
|
||||
* @brief Increase the delay multiplier for the main driver loop
|
||||
*
|
||||
* @usage This should be called when we know the stack won't be used by any virtual taps
|
||||
*/
|
||||
void lwip_hibernate_driver();
|
||||
|
||||
/**
|
||||
* @brief Decrease the delay multiplier for the main driver loop
|
||||
*
|
||||
* @usage This should be called when at least one virtual tap is active
|
||||
*/
|
||||
void lwip_wake_driver();
|
||||
|
||||
/**
|
||||
* @brief Initialize network stack semaphores, threads, and timers.
|
||||
*
|
||||
* @usage This is called during the initial setup of each VirtualTap but is only allowed to execute once
|
||||
* @return
|
||||
*/
|
||||
void lwip_driver_init();
|
||||
|
||||
/**
|
||||
* @brief Shutdown the stack as completely as possible (not officially supported by lwIP)
|
||||
*
|
||||
* @usage This is to be called after it is determined that no further network activity will take place.
|
||||
* The tcpip thread will be stopped, all interfaces will be brought down and all resources will
|
||||
* be deallocated. A full application restart will be required to bring the stack back online.
|
||||
* @return
|
||||
*/
|
||||
void lwip_driver_shutdown();
|
||||
|
||||
/**
|
||||
* @brief Bring down and delete all interfaces belonging to the given virtual tap
|
||||
*
|
||||
* @usage This is to be called when the application desires to stop all traffic processing in the
|
||||
* stack. Unlike lwip_driver_shutdown(), the application can easily resume traffic processing
|
||||
* by re-adding a virtual tap (and associated lwip netifs)
|
||||
* @return
|
||||
*/
|
||||
void lwip_dispose_of_netifs(void *tapref);
|
||||
|
||||
/**
|
||||
* @brief Initialize and start the DNS client
|
||||
*
|
||||
* @usage Called after lwip_driver_init()
|
||||
* @return
|
||||
*/
|
||||
void lwip_dns_init();
|
||||
|
||||
/**
|
||||
* @brief Starts DHCP timers
|
||||
*
|
||||
* @usage lwip_driver_init()
|
||||
* @return
|
||||
*/
|
||||
void lwip_start_dhcp(void *netif);
|
||||
|
||||
/**
|
||||
* @brief Called when the status of a netif changes:
|
||||
* - Interface is up/down (ZTS_EVENT_NETIF_UP, ZTS_EVENT_NETIF_DOWN)
|
||||
* - Address changes while up (ZTS_EVENT_NETIF_NEW_ADDRESS)
|
||||
*/
|
||||
static void netif_status_callback(struct netif *netif);
|
||||
|
||||
/**
|
||||
* @brief Called when a netif is removed (ZTS_EVENT_NETIF_INTERFACE_REMOVED)
|
||||
*/
|
||||
static void netif_remove_callback(struct netif *netif);
|
||||
|
||||
/**
|
||||
* @brief Called when a link is brought up or down (ZTS_EVENT_NETIF_LINK_UP, ZTS_EVENT_NETIF_LINK_DOWN)
|
||||
*/
|
||||
static void netif_link_callback(struct netif *netif);
|
||||
|
||||
/**
|
||||
* @brief Set up an interface in the network stack for the VirtualTap.
|
||||
*
|
||||
* @param
|
||||
* @param tapref Reference to VirtualTap that will be responsible for sending and receiving data
|
||||
* @param mac Virtual hardware address for this ZeroTier VirtualTap interface
|
||||
* @param ip Virtual IP address for this ZeroTier VirtualTap interface
|
||||
* @return
|
||||
*/
|
||||
void lwip_init_interface(void *tapref, const MAC &mac, const InetAddress &ip);
|
||||
|
||||
/**
|
||||
* @brief Called from the stack, outbound ethernet frames from the network stack enter the ZeroTier virtual wire here.
|
||||
*
|
||||
* @usage This shall only be called from the stack or the stack driver. Not the application thread.
|
||||
* @param netif Transmits an outgoing Ethernet fram from the network stack onto the ZeroTier virtual wire
|
||||
* @param p A pointer to the beginning of a chain pf struct pbufs
|
||||
* @return
|
||||
*/
|
||||
err_t lwip_eth_tx(struct netif *netif, struct pbuf *p);
|
||||
|
||||
/**
|
||||
* @brief Receives incoming Ethernet frames from the ZeroTier virtual wire
|
||||
*
|
||||
* @usage This shall be called from the VirtualTap's I/O thread (via VirtualTap::put())
|
||||
* @param tap Pointer to VirtualTap from which this data comes
|
||||
* @param from Origin address (virtual ZeroTier hardware address)
|
||||
* @param to Intended destination address (virtual ZeroTier hardware address)
|
||||
* @param etherType Protocol type
|
||||
* @param data Pointer to Ethernet frame
|
||||
* @param len Length of Ethernet frame
|
||||
* @return
|
||||
*/
|
||||
void lwip_eth_rx(VirtualTap *tap, const MAC &from, const MAC &to, unsigned int etherType,
|
||||
const void *data, unsigned int len);
|
||||
|
||||
} // namespace ZeroTier
|
||||
|
||||
#endif // _H
|
||||
3602
include/lwipopts.h
3602
include/lwipopts.h
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user