Merge pull request #253 from zerotier/dev

Merge dev into main
This commit is contained in:
Joseph Henry
2023-08-23 09:24:10 -07:00
committed by GitHub
47 changed files with 1697 additions and 416 deletions

View File

@@ -1 +0,0 @@
1.8.4

View File

@@ -82,8 +82,6 @@ endif()
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# | INCLUDE DIRECTORIES | # | INCLUDE DIRECTORIES |
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Temporary measure to test GitHub workflow on Ubuntu
include_directories(/usr/lib/jvm/java-11-openjdk-amd64/include/linux/)
# ZeroTier # ZeroTier
include_directories(${ZTO_SRC_DIR}) include_directories(${ZTO_SRC_DIR})
include_directories(${ZTO_SRC_DIR}/include) include_directories(${ZTO_SRC_DIR}/include)
@@ -92,6 +90,8 @@ include_directories(${ZTO_SRC_DIR}/osdep)
# ZeroTier (ext) # ZeroTier (ext)
#include_directories(${ZTO_SRC_DIR}/ext/miniupnpc) #include_directories(${ZTO_SRC_DIR}/ext/miniupnpc)
include_directories(${ZTO_SRC_DIR}/ext/libnatpmp) include_directories(${ZTO_SRC_DIR}/ext/libnatpmp)
include_directories(${ZTO_SRC_DIR}/ext/prometheus-cpp-lite-1.0/core/include)
include_directories(${ZTO_SRC_DIR}/ext/prometheus-cpp-lite-1.0/simpleapi/include)
# libzt # libzt
include_directories(${PROJ_DIR}/src) include_directories(${PROJ_DIR}/src)
include_directories(${PROJ_DIR}/include) include_directories(${PROJ_DIR}/include)
@@ -116,7 +116,7 @@ if (ZTS_ENABLE_PINVOKE)
# Features # Features
set(BUILD_STATIC_LIB FALSE) set(BUILD_STATIC_LIB FALSE)
set(BUILD_SHARED_LIB TRUE) set(BUILD_SHARED_LIB TRUE)
set(BUILD_EXAMPLES FALSE) set(BUILD_HOST_EXAMPLES FALSE)
set(ALLOW_INSTALL_TARGET FALSE) set(ALLOW_INSTALL_TARGET FALSE)
set(BUILD_HOST_SELFTEST FALSE) set(BUILD_HOST_SELFTEST FALSE)
# Sources and libraries # Sources and libraries
@@ -129,7 +129,7 @@ if (ZTS_ENABLE_RUST)
# Features # Features
set(BUILD_STATIC_LIB TRUE) set(BUILD_STATIC_LIB TRUE)
set(BUILD_SHARED_LIB FALSE) set(BUILD_SHARED_LIB FALSE)
set(BUILD_EXAMPLES FALSE) set(BUILD_HOST_EXAMPLES FALSE)
set(ALLOW_INSTALL_TARGET FALSE) set(ALLOW_INSTALL_TARGET FALSE)
set(BUILD_HOST_SELFTEST FALSE) set(BUILD_HOST_SELFTEST FALSE)
endif() endif()
@@ -142,7 +142,7 @@ if (ZTS_ENABLE_PYTHON)
# Targets # Targets
set(BUILD_STATIC_LIB FALSE) set(BUILD_STATIC_LIB FALSE)
set(BUILD_SHARED_LIB TRUE) set(BUILD_SHARED_LIB TRUE)
set(BUILD_EXAMPLES FALSE) set(BUILD_HOST_EXAMPLES FALSE)
set(ALLOW_INSTALL_TARGET FALSE) set(ALLOW_INSTALL_TARGET FALSE)
set(BUILD_HOST_SELFTEST FALSE) set(BUILD_HOST_SELFTEST FALSE)
# Sources and libraries # Sources and libraries
@@ -190,15 +190,17 @@ if(${CMAKE_SYSTEM_NAME} MATCHES "Android")
set(BUILD_STATIC_LIB FALSE) set(BUILD_STATIC_LIB FALSE)
set(BUILD_SHARED_LIB TRUE) set(BUILD_SHARED_LIB TRUE)
set(BUILD_HOST_SELFTEST FALSE) set(BUILD_HOST_SELFTEST FALSE)
set(BUILD_EXAMPLES FALSE) set(BUILD_HOST_EXAMPLES FALSE)
set(ALLOW_INSTALL_TARGET FALSE) set(ALLOW_INSTALL_TARGET FALSE)
set(LANG_WRAPPER_FILE ${LIBZT_SRC_DIR}/bindings/java/*.cxx)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DZTS_ENABLE_JAVA=1")
endif() endif()
if(BUILD_MACOS_FRAMEWORK) if(BUILD_MACOS_FRAMEWORK)
set(BUILD_STATIC_LIB TRUE) set(BUILD_STATIC_LIB TRUE)
set(BUILD_SHARED_LIB TRUE) set(BUILD_SHARED_LIB TRUE)
set(BUILD_HOST_SELFTEST FALSE) set(BUILD_HOST_SELFTEST FALSE)
set(BUILD_EXAMPLES FALSE) set(BUILD_HOST_EXAMPLES FALSE)
set(ALLOW_INSTALL_TARGET FALSE) set(ALLOW_INSTALL_TARGET FALSE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DOMIT_JSON_SUPPORT=1") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DOMIT_JSON_SUPPORT=1")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DOMIT_JSON_SUPPORT=1") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DOMIT_JSON_SUPPORT=1")
@@ -213,7 +215,7 @@ if(BUILD_IOS_FRAMEWORK)
set(BUILD_STATIC_LIB TRUE) set(BUILD_STATIC_LIB TRUE)
set(BUILD_SHARED_LIB TRUE) set(BUILD_SHARED_LIB TRUE)
set(BUILD_HOST_SELFTEST FALSE) set(BUILD_HOST_SELFTEST FALSE)
set(BUILD_EXAMPLES FALSE) set(BUILD_HOST_EXAMPLES FALSE)
set(ALLOW_INSTALL_TARGET FALSE) set(ALLOW_INSTALL_TARGET FALSE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DOMIT_JSON_SUPPORT=1") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DOMIT_JSON_SUPPORT=1")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DOMIT_JSON_SUPPORT=1") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DOMIT_JSON_SUPPORT=1")
@@ -221,7 +223,7 @@ if(BUILD_IOS_FRAMEWORK)
"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer") "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer")
if(IOS_ARM64) if(IOS_ARM64)
set(CMAKE_OSX_ARCHITECTURES arm64) set(CMAKE_OSX_ARCHITECTURES arm64)
set(SDKVER "11.4") set(SDKVER "16.4")
endif() endif()
if(IOS_ARMV7) if(IOS_ARMV7)
# armv7 armv7s # armv7 armv7s
@@ -277,7 +279,6 @@ endif()
if(CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "debug") if(CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "debug")
set(BUILD_DEBUG ON) set(BUILD_DEBUG ON)
set(CMAKE_VERBOSE_MAKEFILE ON) set(CMAKE_VERBOSE_MAKEFILE ON)
set(DEBUG_OPTIMIZATION "-O3")
endif() endif()
if(CMAKE_BUILD_TYPE STREQUAL "Release" OR CMAKE_BUILD_TYPE STREQUAL "release") if(CMAKE_BUILD_TYPE STREQUAL "Release" OR CMAKE_BUILD_TYPE STREQUAL "release")
set(BUILD_RELEASE ON) set(BUILD_RELEASE ON)
@@ -396,7 +397,6 @@ else()
set(CMAKE_C_FLAGS_DEBUG set(CMAKE_C_FLAGS_DEBUG
"${CMAKE_C_FLAGS_DEBUG} \ "${CMAKE_C_FLAGS_DEBUG} \
${DEBUG_OPTIMIZATION} \
-DLWIP_DEBUG=1 -DLIBZT_DEBUG=1") -DLWIP_DEBUG=1 -DLIBZT_DEBUG=1")
set(CMAKE_C_FLAGS_RELEASE set(CMAKE_C_FLAGS_RELEASE
@@ -409,7 +409,6 @@ else()
set(CMAKE_CXX_FLAGS_DEBUG set(CMAKE_CXX_FLAGS_DEBUG
"${CMAKE_CXX_FLAGS_DEBUG} \ "${CMAKE_CXX_FLAGS_DEBUG} \
${DEBUG_OPTIMIZATION} \
-DLWIP_DEBUG=1 -DLIBZT_DEBUG=1") -DLWIP_DEBUG=1 -DLIBZT_DEBUG=1")
set(CMAKE_CXX_FLAGS_RELEASE set(CMAKE_CXX_FLAGS_RELEASE
@@ -467,37 +466,40 @@ endif()
if(ZTS_ENABLE_JAVA OR (BUILD_ANDROID AND NOT ZTS_NDK_ONLY)) if(ZTS_ENABLE_JAVA OR (BUILD_ANDROID AND NOT ZTS_NDK_ONLY))
message(STATUS "Looking for JNI") message(STATUS "Looking for JNI")
message(STATUS "Ignore seeing \"Found JNI: NotNeeded\" below; check that JNI_INCLUDE_DIRS is valid")
if(BUILD_WIN) #
# We are only interested in finding jni.h: we do not care about extended JVM # "trick" CMake into thinking that we have already found these
# functionality or the AWT library. set(JAVA_AWT_LIBRARY NotNeeded) # https://stackoverflow.com/a/51764145
# set(JAVA_JVM_LIBRARY NotNeeded) set(JAVA_INCLUDE_PATH2 NotNeeded) #
# set(JAVA_AWT_INCLUDE_PATH NotNeeded) # These may be missing, but we do not need them
set(JAVA_INCLUDE_PATH "C:\\Program Files\\Java\\jdk-10.0.2\\include") #
endif() # There is no official way of telling CMake: "skip looking for AWT, etc."
#
set(JAVA_AWT_LIBRARY NotNeeded) set(JAVA_AWT_LIBRARY NotNeeded)
set(JAVA_JVM_LIBRARY NotNeeded) set(JAVA_JVM_LIBRARY NotNeeded)
set(JAVA_INCLUDE_PATH2 NotNeeded)
set(JAVA_AWT_INCLUDE_PATH NotNeeded) set(JAVA_AWT_INCLUDE_PATH NotNeeded)
find_package(JNI REQUIRED)
if(JNI_FOUND) #
message(STATUS "JNI_INCLUDE_DIR=${JNI_INCLUDE_DIRS}") # Do NOT make REQUIRED
message(STATUS "JNI_LIBRARIES=${JNI_LIBRARIES}") # Until there is an official way of telling CMake to skip AWT, etc.,
list(GET JNI_INCLUDE_DIRS 0 JNI_INCLUDE_DIR) # then JNI will be considered as "not found"
message(STATUS "jni path=${JNI_INCLUDE_DIR}") #
include_directories("${JNI_INCLUDE_DIR}") find_package(JNI)
# include_directories ("${JNI_INCLUDE_DIRS}")
if(BUILD_WIN) list(FILTER JNI_INCLUDE_DIRS EXCLUDE REGEX NotNeeded)
include_directories("${JNI_INCLUDE_DIR}\\win32") list(FILTER JNI_LIBRARIES EXCLUDE REGEX NotNeeded)
endif()
if(BUILD_MACOS) #
include_directories("${JNI_INCLUDE_DIR}/darwin") # Do NOT check JNI_FOUND here, check JNI_INCLUDE_DIRS instead
endif() # because of setting the above variables to NotNeeded,
if(BUILD_LINUX) # the variable JNI_FOUND is now set to NotNeeded, which is annoying
include_directories("${JNI_INCLUDE_DIR}/linux") #
endif() # We only care about JNI_INCLUDE_DIRS
#
if(JNI_INCLUDE_DIRS)
message(STATUS "JNI_INCLUDE_DIRS: ${JNI_INCLUDE_DIRS}")
include_directories("${JNI_INCLUDE_DIRS}")
else() else()
message(STATUS "JNI not found") message(STATUS "JNI not found")
endif() endif()

View File

@@ -10,7 +10,6 @@ Peer-to-peer and cross-platform encrypted connections built right into your app
<a href="./examples">Examples</a> | <a href="./examples">Examples</a> |
<a href="https://docs.zerotier.com/sockets/tutorial.html">Documentation</a> | <a href="https://docs.zerotier.com/sockets/tutorial.html">Documentation</a> |
<a href="https://discuss.zerotier.com/">Community</a> |
<a href="https://github.com/zerotier/libzt/issues">Report a Bug</a> <a href="https://github.com/zerotier/libzt/issues">Report a Bug</a>
@@ -19,7 +18,7 @@ Peer-to-peer and cross-platform encrypted connections built right into your app
<img alt="latest libzt version" src="https://img.shields.io/github/v/tag/zerotier/libzt?label=latest"/></a> <img alt="latest libzt version" src="https://img.shields.io/github/v/tag/zerotier/libzt?label=latest"/></a>
<a href="https://github.com/zerotier/libzt/commits/master"><img alt="Last Commit" src="https://img.shields.io/github/last-commit/zerotier/libzt"/></a> <a href="https://github.com/zerotier/libzt/commits/main"><img alt="Last Commit" src="https://img.shields.io/github/last-commit/zerotier/libzt"/></a>
<a href="https://github.com/zerotier/libzt/actions"><img alt="Build Status (master branch)" src="https://img.shields.io/github/workflow/status/zerotier/libzt/CMake/master"/></a> <a href="https://github.com/zerotier/libzt/actions"><img alt="Build Status (master branch)" src="https://img.shields.io/github/workflow/status/zerotier/libzt/CMake/master"/></a>
</div> </div>
@@ -29,7 +28,7 @@ Peer-to-peer and cross-platform encrypted connections built right into your app
| C# | `Install-Package ZeroTier.Sockets` |<a href="https://www.nuget.org/packages/ZeroTier.Sockets/"><img src="https://img.shields.io/github/v/tag/zerotier/libzt?label=NuGet"/></a> |[C#](./examples/csharp) | | C# | `Install-Package ZeroTier.Sockets` |<a href="https://www.nuget.org/packages/ZeroTier.Sockets/"><img src="https://img.shields.io/github/v/tag/zerotier/libzt?label=NuGet"/></a> |[C#](./examples/csharp) |
| Python | `pip install libzt`|<a href="https://pypi.org/project/libzt/"><img src="https://img.shields.io/pypi/v/libzt?label=PyPI"/></a> |[Python](./examples/python) | | Python | `pip install libzt`|<a href="https://pypi.org/project/libzt/"><img src="https://img.shields.io/pypi/v/libzt?label=PyPI"/></a> |[Python](./examples/python) |
| Rust | See: [crates.io/crates/libzt](https://crates.io/crates/libzt) | <img alt="version" src="https://img.shields.io/crates/v/libzt?color=blue"/>|[Rust](./examples/rust) | | Rust | See: [crates.io/crates/libzt](https://crates.io/crates/libzt) | <img alt="version" src="https://img.shields.io/crates/v/libzt?color=blue"/>|[Rust](./examples/rust) |
| Java | `./build.sh host-jar` |<img src="https://img.shields.io/github/v/tag/zerotier/libzt?label="/> |[Java](./examples/java) | | Java | Install JDK, then: `./build.sh host-jar` |<img src="https://img.shields.io/github/v/tag/zerotier/libzt?label="/> |[Java](./examples/java) |
| Linux | `brew install zerotier/tap/libzt` | <img alt="version" src="https://img.shields.io/github/v/tag/zerotier/libzt?label="/></a>| [C/C++](./examples/c) | | Linux | `brew install zerotier/tap/libzt` | <img alt="version" src="https://img.shields.io/github/v/tag/zerotier/libzt?label="/></a>| [C/C++](./examples/c) |
| macOS | `brew install zerotier/tap/libzt`| <img alt="version" src="https://img.shields.io/github/v/tag/zerotier/libzt?label=Homebrew"/></a>| [C/C++](./examples/c) | | macOS | `brew install zerotier/tap/libzt`| <img alt="version" src="https://img.shields.io/github/v/tag/zerotier/libzt?label=Homebrew"/></a>| [C/C++](./examples/c) |
| iOS / iPadOS | `./build.sh iphoneos-framework` | <img src="https://img.shields.io/github/v/tag/zerotier/libzt?label="/>| [Objective-C](./attic/objective-c), [Swift](./attic/swift) | | iOS / iPadOS | `./build.sh iphoneos-framework` | <img src="https://img.shields.io/github/v/tag/zerotier/libzt?label="/>| [Objective-C](./attic/objective-c), [Swift](./attic/swift) |
@@ -93,7 +92,7 @@ Important directories:
We provide ways for your app or enterprise to function independently from any of our services if desired. We provide ways for your app or enterprise to function independently from any of our services if desired.
While we do operate a global network of redundant root servers, network controllers and an admin API/UI called [Central](https://my.zerotier.com), some use-cases require full control over the infrastructure and we try to make it as easy as possible to set up your own controllers and root servers: See [here](https://github.com/zerotier/ZeroTierOne/tree/master/controller) to learn more about how to set up your own network controller, and [here](https://www.zerotier.com/manual/#4_4) to learn more about setting up your own roots. While we do operate a global network of redundant root servers, network controllers and an admin API/UI called [Central](https://my.zerotier.com), some use-cases require full control over the infrastructure and we try to make it as easy as possible to set up your own controllers and root servers: See [here](https://github.com/zerotier/ZeroTierOne/tree/main/controller) to learn more about how to set up your own network controller, and [here](https://docs.zerotier.com/zerotier/moons) to learn more about setting up your own roots.
# Help # Help

View File

@@ -350,6 +350,8 @@ host()
mkdir -p $BIN_OUTPUT_DIR mkdir -p $BIN_OUTPUT_DIR
$CMAKE $VARIANT -H. -B$CACHE_DIR -DCMAKE_BUILD_TYPE=$BUILD_TYPE $CMAKE $VARIANT -H. -B$CACHE_DIR -DCMAKE_BUILD_TYPE=$BUILD_TYPE
$CMAKE --build $CACHE_DIR $BUILD_CONCURRENCY $CMAKE --build $CACHE_DIR $BUILD_CONCURRENCY
rm -f $BUILD_OUTPUT_DIR/native
ln -s $TARGET_BUILD_DIR $BUILD_OUTPUT_DIR/native
cp -f $CACHE_DIR/lib/libzt.* $LIB_OUTPUT_DIR cp -f $CACHE_DIR/lib/libzt.* $LIB_OUTPUT_DIR
cp -f $CACHE_DIR/bin/* $BIN_OUTPUT_DIR cp -f $CACHE_DIR/bin/* $BIN_OUTPUT_DIR
echo -e "\n - Build cache : $CACHE_DIR\n - Build output : $BUILD_OUTPUT_DIR\n" echo -e "\n - Build cache : $CACHE_DIR\n - Build output : $BUILD_OUTPUT_DIR\n"
@@ -494,12 +496,12 @@ host-jar()
{ {
check_submodules check_submodules
ARTIFACT="jar" ARTIFACT="jar"
PKG_VERSION=$(cat .version) PKG_VERSION=$(git describe --tags --abbrev=0)
# Default to release # Default to release
BUILD_TYPE=${1:-release} BUILD_TYPE=${1:-release}
if [[ $1 = *"docs"* ]]; then if [[ $1 = *"docs"* ]]; then
# Generate documentation # Generate documentation
javadoc src/bindings/java/*.java -d docs/java javadoc src/bindings/java/com/zerotier/sockets/*.java -d docs/java
exit 0 exit 0
fi fi
VARIANT="-DZTS_ENABLE_JAVA=True" VARIANT="-DZTS_ENABLE_JAVA=True"
@@ -512,7 +514,7 @@ host-jar()
JAVA_JAR_DIR=$CACHE_DIR/pkg/jar JAVA_JAR_DIR=$CACHE_DIR/pkg/jar
JAVA_JAR_SOURCE_TREE_DIR=$JAVA_JAR_DIR/com/zerotier/sockets/ JAVA_JAR_SOURCE_TREE_DIR=$JAVA_JAR_DIR/com/zerotier/sockets/
mkdir -p $JAVA_JAR_SOURCE_TREE_DIR mkdir -p $JAVA_JAR_SOURCE_TREE_DIR
cp -f src/bindings/java/*.java $JAVA_JAR_SOURCE_TREE_DIR cp -f src/bindings/java/com/zerotier/sockets/*.java $JAVA_JAR_SOURCE_TREE_DIR
# Build # Build
$CMAKE $VARIANT -H. -B$CACHE_DIR -DCMAKE_BUILD_TYPE=$BUILD_TYPE $CMAKE $VARIANT -H. -B$CACHE_DIR -DCMAKE_BUILD_TYPE=$BUILD_TYPE
$CMAKE --build $CACHE_DIR $BUILD_CONCURRENCY $CMAKE --build $CACHE_DIR $BUILD_CONCURRENCY
@@ -520,7 +522,7 @@ host-jar()
cp -f $CACHE_DIR/lib/libzt.* $JAVA_JAR_DIR cp -f $CACHE_DIR/lib/libzt.* $JAVA_JAR_DIR
cd $JAVA_JAR_DIR cd $JAVA_JAR_DIR
export JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF8 export JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF8
javac -Xlint:deprecation com/zerotier/sockets/*.java javac -Xlint:all com/zerotier/sockets/*.java
jar cf libzt-$PKG_VERSION.jar $SHARED_LIB_NAME com/zerotier/sockets/*.class jar cf libzt-$PKG_VERSION.jar $SHARED_LIB_NAME com/zerotier/sockets/*.class
rm -rf com $SHARED_LIB_NAME rm -rf com $SHARED_LIB_NAME
@@ -596,18 +598,12 @@ android-aar()
PKG_OUTPUT_DIR=$BUILD_OUTPUT_DIR/$TARGET_PLATFORM-$TARGET_MACHINE_TYPE-$ARTIFACT-$BUILD_TYPE PKG_OUTPUT_DIR=$BUILD_OUTPUT_DIR/$TARGET_PLATFORM-$TARGET_MACHINE_TYPE-$ARTIFACT-$BUILD_TYPE
mkdir -p $CACHE_DIR mkdir -p $CACHE_DIR
mkdir -p $PKG_OUTPUT_DIR mkdir -p $PKG_OUTPUT_DIR
# Unsure why, but Gradle's build script chokes on this non-source file now
rm -rf ext/ZeroTierOne/ext/miniupnpc/VERSION
export PATH=$ANDROID_HOME/cmdline-tools/tools/bin:$PATH
# Copy source files into project
mkdir -p ${ANDROID_PKG_PROJ_DIR}/app/src/main/java/com/zerotier/sockets
cp -f src/bindings/java/*.java ${ANDROID_PKG_PROJ_DIR}/app/src/main/java/com/zerotier/sockets
# Build # Build
UPPERCASE_BUILD_TYPE="$(tr '[:lower:]' '[:upper:]' <<< ${BUILD_TYPE:0:1})${BUILD_TYPE:1}" UPPERCASE_BUILD_TYPE="$(tr '[:lower:]' '[:upper:]' <<< ${BUILD_TYPE:0:1})${BUILD_TYPE:1}"
CMAKE_FLAGS="-D${CMAKE_SWITCH}=1 -D${CMAKE_SWITCH}=ON" CMAKE_FLAGS="-D${CMAKE_SWITCH}=1 -D${CMAKE_SWITCH}=ON"
cd $ANDROID_PKG_PROJ_DIR cd $ANDROID_PKG_PROJ_DIR
./gradlew $GRADLE_ARGS assemble$UPPERCASE_BUILD_TYPE # assembleRelease / assembleDebug ./gradlew $GRADLE_ARGS assemble$UPPERCASE_BUILD_TYPE # assembleRelease / assembleDebug
mv $ANDROID_PKG_PROJ_DIR/app/build/outputs/aar/*.aar \ cp $ANDROID_PKG_PROJ_DIR/app/build/outputs/aar/libzt-$BUILD_TYPE.aar \
$PKG_OUTPUT_DIR/libzt-$BUILD_TYPE.aar $PKG_OUTPUT_DIR/libzt-$BUILD_TYPE.aar
cd - cd -
echo -e "\n - Build cache : $CACHE_DIR\n - Build output : $BUILD_OUTPUT_DIR\n" echo -e "\n - Build cache : $CACHE_DIR\n - Build output : $BUILD_OUTPUT_DIR\n"
@@ -663,7 +659,7 @@ format-code()
test/*.cs \ test/*.cs \
src/bindings/csharp/*.cs \ src/bindings/csharp/*.cs \
src/bindings/csharp/*.cxx \ src/bindings/csharp/*.cxx \
src/bindings/java/*.java \ src/bindings/java/com/zerotier/sockets/*.java \
src/bindings/java/*.cxx \ src/bindings/java/*.cxx \
examples/csharp/*.cs \ examples/csharp/*.cs \
src/bindings/python/PythonSockets.cxx \ src/bindings/python/PythonSockets.cxx \
@@ -745,13 +741,12 @@ clean()
find . -type d -name "__pycache__" -exec rm -rf {} + find . -type d -name "__pycache__" -exec rm -rf {} +
# Python pkg # Python pkg
cd pkg/pypi && ./build.sh clean # cd pkg/pypi && ./build.sh clean
} }
tag_release() tag_release()
{ {
git tag -a $1 -m $2 git tag -a $1 -m $2
"$(git describe --tags --abbrev=0)" >> .version
git push origin --tags git push origin --tags
} }

View File

@@ -52,7 +52,7 @@ int main(int argc, char** argv)
{ {
if (argc != 2) { if (argc != 2) {
printf("\nUsage:\n"); printf("\nUsage:\n");
printf("pingable-node <net_id>\n"); printf("callbackapi <net_id>\n");
exit(0); exit(0);
} }
long long int net_id = strtoull(argv[1], NULL, 16); // At least 64 bits long long int net_id = strtoull(argv[1], NULL, 16); // At least 64 bits

View File

@@ -14,7 +14,7 @@ int main(int argc, char** argv)
{ {
if (argc != 5) { if (argc != 5) {
printf("\nlibzt example client\n"); printf("\nlibzt example client\n");
printf("client <id_storage_path> <net_id> <remote_addr> <remote_port>\n"); printf("nonblockingclient <id_storage_path> <net_id> <remote_addr> <remote_port>\n");
exit(0); exit(0);
} }
char* storage_path = argv[1]; char* storage_path = argv[1];

View File

@@ -14,7 +14,7 @@ int main(int argc, char** argv)
{ {
if (argc != 5) { if (argc != 5) {
printf("\nlibzt example server\n"); printf("\nlibzt example server\n");
printf("server <id_storage_path> <net_id> <local_addr> <local_port>\n"); printf("nonblockingserver <id_storage_path> <net_id> <local_addr> <local_port>\n");
exit(0); exit(0);
} }
char* storage_path = argv[1]; char* storage_path = argv[1];
@@ -95,7 +95,7 @@ int main(int argc, char** argv)
// zts_bsd_accept(int fd, struct zts_sockaddr* addr, zts_socklen_t* addrlen) // zts_bsd_accept(int fd, struct zts_sockaddr* addr, zts_socklen_t* addrlen)
char remote_ipstr[ZTS_INET6_ADDRSTRLEN] = { 0 }; char remote_ipstr[ZTS_INET6_ADDRSTRLEN] = { 0 };
unsigned int port = 0; unsigned short port = 0;
printf("Accepting on listening socket...\n"); printf("Accepting on listening socket...\n");
if ((accfd = zts_accept(fd, remote_ipstr, ZTS_INET6_ADDRSTRLEN, &port)) < 0) { if ((accfd = zts_accept(fd, remote_ipstr, ZTS_INET6_ADDRSTRLEN, &port)) < 0) {
printf("Error (fd=%d, ret=%d, zts_errno=%d). Exiting.\n", fd, err, zts_errno); printf("Error (fd=%d, ret=%d, zts_errno=%d). Exiting.\n", fd, err, zts_errno);

View File

@@ -75,7 +75,7 @@ int main(int argc, char** argv)
// Can also use traditional: zts_bsd_socket(), zts_bsd_bind(), zts_bsd_listen(), zts_bsd_accept(), etc. // Can also use traditional: zts_bsd_socket(), zts_bsd_bind(), zts_bsd_listen(), zts_bsd_accept(), etc.
char remote_addr[ZTS_INET6_ADDRSTRLEN] = { 0 }; char remote_addr[ZTS_INET6_ADDRSTRLEN] = { 0 };
int remote_port = 0; unsigned short remote_port = 0;
int len = ZTS_INET6_ADDRSTRLEN; int len = ZTS_INET6_ADDRSTRLEN;
if ((accfd = zts_tcp_server(local_addr, local_port, remote_addr, len, &remote_port)) < 0) { if ((accfd = zts_tcp_server(local_addr, local_port, remote_addr, len, &remote_port)) < 0) {
printf("Error (fd=%d, zts_errno=%d). Exiting.\n", accfd, zts_errno); printf("Error (fd=%d, zts_errno=%d). Exiting.\n", accfd, zts_errno);

View File

@@ -14,7 +14,7 @@ int main(int argc, char** argv)
{ {
if (argc != 2) { if (argc != 2) {
printf("\nUsage:\n"); printf("\nUsage:\n");
printf("pingable-node <net_id>\n"); printf("statistics <net_id>\n");
exit(0); exit(0);
} }
long long int net_id = strtoull(argv[1], NULL, 16); // At least 64 bits long long int net_id = strtoull(argv[1], NULL, 16); // At least 64 bits

View File

@@ -5,7 +5,7 @@ import java.math.BigInteger;
import java.net.DatagramPacket; import java.net.DatagramPacket;
import java.net.InetAddress; import java.net.InetAddress;
public class selftest { public class Example {
public static void main(String[] args) public static void main(String[] args)
{ {
if (args.length < 4 || args.length > 5) { if (args.length < 4 || args.length > 5) {
@@ -110,7 +110,7 @@ public class selftest {
/** /**
* (OPTIONAL) event handler * (OPTIONAL) event handler
*/ */
class MyZeroTierEventListener implements ZeroTierEventListener { class MyZeroTierEventListener implements com.zerotier.sockets.ZeroTierEventListener {
public void onZeroTierEvent(long id, int eventCode) public void onZeroTierEvent(long id, int eventCode)
{ {
if (eventCode == ZeroTierNative.ZTS_EVENT_NODE_UP) { if (eventCode == ZeroTierNative.ZTS_EVENT_NODE_UP) {

View File

@@ -1,9 +0,0 @@
all:
jar xf *.jar libzt.dylib
javac -cp *.jar Example.java
clean:
rm -rf *.class
superclean: clean
rm -rf *.dylib *.so *.jar

View File

@@ -1,11 +1,54 @@
# Java example # Java example
Build or download the `libzt-${VERSION}.jar`, and copy it to this directory. ## Build the JAR
From the top-level `libzt` directory:
``` ```
make ./build.sh host-jar
java -cp ".:libzt-${VERSION}.jar" Example server id_path 0123456789abcdef 9997 ```
java -cp ".:libzt-${VERSION}.jar" Example client id_path 0123456789abcdef ip.ip.ip.ip 9997
Should result in something like:
```
dist
└── linux-x64-jar-release
└── pkg
└── libzt-1.8.10.jar
```
Copy the JAR to the working directory:
*NOTE: If you've built multiple variants of the JAR such as debug/release or mac/linux you will need to specify their exact path in the following command. If not, you can use the wildcard form:*
```
cp -f dist/*/pkg/*.jar examples/java/libzt.jar
```
Navigate to the `examples/java` directory and extract the `libzt.so|dylib|dll` dynamic library from the JAR into the working directory:
```
jar xf *.jar libzt.dylib libzt.so libzt.dll
```
## Build the example app
```
javac -cp *.jar Example.java
```
## Run the example app
```
java -Djava.library.path=. -cp ".:libzt.jar" Example server id_path 0123456789abcdef 9997
java -Djava.library.path=. -cp ".:libzt.jar" Example client id_path 0123456789abcdef ip.ip.ip.ip 9997
```
## Clean
```
rm -rf *.dylib *.so *.jar *.dll *.class
``` ```
## Links ## Links

View File

@@ -338,7 +338,7 @@ typedef enum {
/** /**
* Maximum number of direct network paths to a given peer * Maximum number of direct network paths to a given peer
*/ */
#define ZTS_MAX_PEER_NETWORK_PATHS 16 #define ZTS_MAX_PEER_NETWORK_PATHS 64
/** /**
* Maximum number of multicast groups a device / network interface can be * Maximum number of multicast groups a device / network interface can be
@@ -437,6 +437,12 @@ typedef void (*CppCallback)(void* msg);
/** 255.255.255.255 */ /** 255.255.255.255 */
#define ZTS_INADDR_BROADCAST ZTS_IPADDR_BROADCAST #define ZTS_INADDR_BROADCAST ZTS_IPADDR_BROADCAST
#define ZTS_IN6ADDR_ANY_INIT {{{0,0,0,0}}}
// Socket protocol types // Socket protocol types
#define ZTS_SOCK_STREAM 0x0001 #define ZTS_SOCK_STREAM 0x0001
#define ZTS_SOCK_DGRAM 0x0002 #define ZTS_SOCK_DGRAM 0x0002
@@ -503,6 +509,8 @@ struct zts_in6_addr {
//#define s6_addr un.u8_addr //#define s6_addr un.u8_addr
}; };
const struct zts_in6_addr zts_in6addr_any = ZTS_IN6ADDR_ANY_INIT;
/** /**
* Address structure to specify an IPv4 endpoint * Address structure to specify an IPv4 endpoint
*/ */
@@ -1023,7 +1031,7 @@ typedef struct {
#ifndef ZTS_DISABLE_CENTRAL_API #ifndef ZTS_DISABLE_CENTRAL_API
#define ZTS_CENTRAL_DEFAULT_URL "https://my.zerotier.com" #define ZTS_CENTRAL_DEFAULT_URL "https://my.zerotier.com"
#define ZTS_CENRTAL_MAX_URL_LEN 128 #define ZTS_CENTRAL_MAX_URL_LEN 128
#define ZTS_CENTRAL_TOKEN_LEN 32 #define ZTS_CENTRAL_TOKEN_LEN 32
#define ZTS_CENTRAL_RESP_BUF_DEFAULT_SZ (128 * 1024) #define ZTS_CENTRAL_RESP_BUF_DEFAULT_SZ (128 * 1024)
@@ -1274,6 +1282,24 @@ int zts_init_set_event_handler(jobject obj_ref, jmethodID id);
ZTS_API int ZTCALL zts_init_set_event_handler(void (*callback)(void*)); ZTS_API int ZTCALL zts_init_set_event_handler(void (*callback)(void*));
#endif #endif
/**
* @brief Set TCP relay for ZeroTier to use instead of P2P UDP
*
* @param tcp_relay_addr IP address of TCP relay
* @param tcp_relay_port Port of TCP relay
*/
ZTS_API int ZTCALL zts_init_set_tcp_relay(const char* tcp_relay_addr, unsigned short tcp_relay_port);
/**
* @brief Allow TCP relay for ZeroTier to use instead of P2P UDP
*/
ZTS_API int ZTCALL zts_init_allow_tcp_relay(int enabled);
/**
* @brief Force TCP relay for ZeroTier to use instead of P2P UDP
*/
ZTS_API int ZTCALL zts_init_force_tcp_relay(int enabled);
/** /**
* @brief Blacklist an interface prefix (or name). This prevents ZeroTier from * @brief Blacklist an interface prefix (or name). This prevents ZeroTier from
* sending traffic over matching interfaces. This is an initialization function that can * sending traffic over matching interfaces. This is an initialization function that can
@@ -1297,6 +1323,23 @@ ZTS_API int ZTCALL zts_init_blacklist_if(const char* prefix, unsigned int len);
*/ */
ZTS_API int ZTCALL zts_init_set_roots(const void* roots_data, unsigned int len); ZTS_API int ZTCALL zts_init_set_roots(const void* roots_data, unsigned int len);
/**
* @brief Enable or disable low-bandwidth mode. This is an initialization function that can
* only be called before `zts_node_start()`.
*
* Low-bandwidth mode reduces the ambient traffic that ZeroTier sends
* at the expense of responsiveness to network changes. It does not reduce your
* established connection speeds. It is an adjustment to multiple internal
* timers that results in fewer keepalive probes and network configuration
* requests being sent. This is a good option if your underlying physical network
* doesn't change much.
*
* @param enabled Whether low-bandwidth mode is enabled or not (default: false)
* @return `ZTS_ERR_OK` if successful, `ZTS_ERR_SERVICE` if the node
* experiences a problem.
*/
ZTS_API int ZTCALL zts_init_set_low_bandwidth_mode(int enabled);
/** /**
* @brief Set the port to which the node should bind. This is an initialization function that can * @brief Set the port to which the node should bind. This is an initialization function that can
* only be called before `zts_node_start()`. * only be called before `zts_node_start()`.

View File

@@ -1,16 +1,18 @@
apply plugin: 'com.android.library' apply plugin: 'com.android.library'
android { android {
compileSdkVersion 28 compileSdkVersion 33
defaultConfig { defaultConfig {
minSdkVersion 14 minSdkVersion 21
targetSdkVersion 23 targetSdkVersion 33
versionCode 1 versionCode 1
versionName "1.0" versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild { externalNativeBuild {
cmake { cmake {
cppFlags "" cppFlags ""
version '3.22.1'
arguments "-DZTS_ENABLE_JAVA=ON"
} }
} }
ndk { ndk {
@@ -28,15 +30,34 @@ android {
externalNativeBuild { externalNativeBuild {
cmake { cmake {
path "../../../CMakeLists.txt" path "../../../CMakeLists.txt"
version '3.22.1'
}
}
ndkVersion '25.1.8937393'
namespace 'com.example.zerotier'
sourceSets {
main {
java {
srcDir 'src/main/java'
srcDir '../../../src/bindings/java'
}
}
}
android.libraryVariants.all { variant ->
variant.outputs.all { file ->
file.outputFileName = "libzt-${variant.buildType.name}.aar"
} }
} }
} }
dependencies { dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar']) implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0-alpha3' implementation 'com.android.support.constraint:constraint-layout:2.0.4'
implementation 'com.android.support.constraint:constraint-layout:1.1.2' testImplementation 'junit:junit:4.13.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
} }

View File

@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android">
package="com.example.zerotier">
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

View File

@@ -4,10 +4,10 @@ buildscript {
repositories { repositories {
google() google()
jcenter() mavenCentral()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:3.1.3' classpath 'com.android.tools.build:gradle:7.3.1'
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong
@@ -18,7 +18,7 @@ buildscript {
allprojects { allprojects {
repositories { repositories {
google() google()
jcenter() mavenCentral()
} }
} }

View File

@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip

View File

@@ -1,5 +1,7 @@
# This file is automatically @generated by Cargo. # This file is automatically @generated by Cargo.
# It is not intended for manual editing. # It is not intended for manual editing.
version = 3
[[package]] [[package]]
name = "aho-corasick" name = "aho-corasick"
version = "0.7.18" version = "0.7.18"
@@ -18,17 +20,78 @@ dependencies = [
"winapi", "winapi",
] ]
[[package]]
name = "anstream"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163"
dependencies = [
"anstyle",
"anstyle-parse",
"anstyle-query",
"anstyle-wincon",
"colorchoice",
"is-terminal",
"utf8parse",
]
[[package]]
name = "anstyle"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d"
[[package]]
name = "anstyle-parse"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e765fd216e48e067936442276d1d57399e37bce53c264d6fefbe298080cb57ee"
dependencies = [
"utf8parse",
]
[[package]]
name = "anstyle-query"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b"
dependencies = [
"windows-sys",
]
[[package]]
name = "anstyle-wincon"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188"
dependencies = [
"anstyle",
"windows-sys",
]
[[package]]
name = "anyhow"
version = "1.0.71"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8"
[[package]] [[package]]
name = "atty" name = "atty"
version = "0.2.14" version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
dependencies = [ dependencies = [
"hermit-abi", "hermit-abi 0.1.18",
"libc", "libc",
"winapi", "winapi",
] ]
[[package]]
name = "autocfg"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
[[package]] [[package]]
name = "bindgen" name = "bindgen"
version = "0.58.1" version = "0.58.1"
@@ -38,8 +101,8 @@ dependencies = [
"bitflags", "bitflags",
"cexpr", "cexpr",
"clang-sys", "clang-sys",
"clap", "clap 2.33.3",
"env_logger", "env_logger 0.8.3",
"lazy_static", "lazy_static",
"lazycell", "lazycell",
"log", "log",
@@ -99,12 +162,63 @@ dependencies = [
"ansi_term", "ansi_term",
"atty", "atty",
"bitflags", "bitflags",
"strsim", "strsim 0.8.0",
"textwrap", "textwrap",
"unicode-width", "unicode-width",
"vec_map", "vec_map",
] ]
[[package]]
name = "clap"
version = "4.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "401a4694d2bf92537b6867d94de48c4842089645fdcdf6c71865b175d836e9c2"
dependencies = [
"clap_builder",
"clap_derive",
"once_cell",
]
[[package]]
name = "clap-num"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "488557e97528174edaa2ee268b23a809e0c598213a4bbcb4f34575a46fda147e"
dependencies = [
"num-traits",
]
[[package]]
name = "clap_builder"
version = "4.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72394f3339a76daf211e57d4bcb374410f3965dcc606dd0e03738c7888766980"
dependencies = [
"anstream",
"anstyle",
"bitflags",
"clap_lex",
"strsim 0.10.0",
]
[[package]]
name = "clap_derive"
version = "4.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b8cd2b2a819ad6eec39e8f1d6b53001af1e5469f8c177579cdaeb313115b825f"
dependencies = [
"heck",
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "clap_lex"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b"
[[package]] [[package]]
name = "cmake" name = "cmake"
version = "0.1.45" version = "0.1.45"
@@ -114,6 +228,33 @@ dependencies = [
"cc", "cc",
] ]
[[package]]
name = "colorchoice"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7"
[[package]]
name = "dirs"
version = "5.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225"
dependencies = [
"dirs-sys",
]
[[package]]
name = "dirs-sys"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c"
dependencies = [
"libc",
"option-ext",
"redox_users",
"windows-sys",
]
[[package]] [[package]]
name = "env_logger" name = "env_logger"
version = "0.8.3" version = "0.8.3"
@@ -127,12 +268,63 @@ dependencies = [
"termcolor", "termcolor",
] ]
[[package]]
name = "env_logger"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0"
dependencies = [
"humantime",
"is-terminal",
"log",
"regex",
"termcolor",
]
[[package]]
name = "errno"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a"
dependencies = [
"errno-dragonfly",
"libc",
"windows-sys",
]
[[package]]
name = "errno-dragonfly"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
dependencies = [
"cc",
"libc",
]
[[package]]
name = "getrandom"
version = "0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4"
dependencies = [
"cfg-if",
"libc",
"wasi",
]
[[package]] [[package]]
name = "glob" name = "glob"
version = "0.3.0" version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
[[package]]
name = "heck"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
[[package]] [[package]]
name = "hermit-abi" name = "hermit-abi"
version = "0.1.18" version = "0.1.18"
@@ -142,12 +334,41 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "hermit-abi"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286"
[[package]] [[package]]
name = "humantime" name = "humantime"
version = "2.1.0" version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
[[package]]
name = "io-lifetimes"
version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2"
dependencies = [
"hermit-abi 0.3.1",
"libc",
"windows-sys",
]
[[package]]
name = "is-terminal"
version = "0.4.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f"
dependencies = [
"hermit-abi 0.3.1",
"io-lifetimes",
"rustix",
"windows-sys",
]
[[package]] [[package]]
name = "lazy_static" name = "lazy_static"
version = "1.4.0" version = "1.4.0"
@@ -162,9 +383,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.95" version = "0.2.145"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "789da6d93f1b866ffe175afc5322a4d76c038605a1c3319bb57b06967ca98a36" checksum = "fc86cde3ff845662b8f4ef6cb50ea0e20c524eb3d29ae048287e06a1b3fa6a81"
[[package]] [[package]]
name = "libloading" name = "libloading"
@@ -180,19 +401,39 @@ dependencies = [
name = "libzt" name = "libzt"
version = "0.1.2" version = "0.1.2"
dependencies = [ dependencies = [
"anyhow",
"bindgen", "bindgen",
"clap 4.3.2",
"clap-num",
"cmake", "cmake",
"dirs",
"env_logger 0.10.0",
"libc", "libc",
"log",
"parking_lot",
]
[[package]]
name = "linux-raw-sys"
version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519"
[[package]]
name = "lock_api"
version = "0.4.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16"
dependencies = [
"autocfg",
"scopeguard",
] ]
[[package]] [[package]]
name = "log" name = "log"
version = "0.4.14" version = "0.4.18"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" checksum = "518ef76f2f87365916b142844c16d8fefd85039bc5699050210a7778ee1cd1de"
dependencies = [
"cfg-if",
]
[[package]] [[package]]
name = "memchr" name = "memchr"
@@ -210,6 +451,50 @@ dependencies = [
"version_check", "version_check",
] ]
[[package]]
name = "num-traits"
version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
dependencies = [
"autocfg",
]
[[package]]
name = "once_cell"
version = "1.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
[[package]]
name = "option-ext"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"
[[package]]
name = "parking_lot"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
dependencies = [
"lock_api",
"parking_lot_core",
]
[[package]]
name = "parking_lot_core"
version = "0.9.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447"
dependencies = [
"cfg-if",
"libc",
"redox_syscall 0.3.5",
"smallvec",
"windows-targets",
]
[[package]] [[package]]
name = "peeking_take_while" name = "peeking_take_while"
version = "0.1.2" version = "0.1.2"
@@ -218,27 +503,56 @@ checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.27" version = "1.0.59"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" checksum = "6aeca18b86b413c660b781aa319e4e2648a3e6f9eadc9b47e9038e6fe9f3451b"
dependencies = [ dependencies = [
"unicode-xid", "unicode-ident",
] ]
[[package]] [[package]]
name = "quote" name = "quote"
version = "1.0.9" version = "1.0.28"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
] ]
[[package]] [[package]]
name = "regex" name = "redox_syscall"
version = "1.5.4" version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
dependencies = [
"bitflags",
]
[[package]]
name = "redox_syscall"
version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
dependencies = [
"bitflags",
]
[[package]]
name = "redox_users"
version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b"
dependencies = [
"getrandom",
"redox_syscall 0.2.16",
"thiserror",
]
[[package]]
name = "regex"
version = "1.5.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d83f127d94bdbcda4c8cc2e50f6f84f4b611f69c902699ca385a39c3a75f9ff1"
dependencies = [ dependencies = [
"aho-corasick", "aho-corasick",
"memchr", "memchr",
@@ -247,9 +561,9 @@ dependencies = [
[[package]] [[package]]
name = "regex-syntax" name = "regex-syntax"
version = "0.6.25" version = "0.6.26"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" checksum = "49b3de9ec5dc0a3417da371aab17d729997c15010e7fd24ff707773a33bddb64"
[[package]] [[package]]
name = "rustc-hash" name = "rustc-hash"
@@ -257,18 +571,61 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
[[package]]
name = "rustix"
version = "0.37.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f79bef90eb6d984c72722595b5b1348ab39275a5e5123faca6863bf07d75a4e0"
dependencies = [
"bitflags",
"errno",
"io-lifetimes",
"libc",
"linux-raw-sys",
"windows-sys",
]
[[package]]
name = "scopeguard"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
[[package]] [[package]]
name = "shlex" name = "shlex"
version = "1.0.0" version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42a568c8f2cd051a4d283bd6eb0343ac214c1b0f1ac19f93e1175b2dee38c73d" checksum = "42a568c8f2cd051a4d283bd6eb0343ac214c1b0f1ac19f93e1175b2dee38c73d"
[[package]]
name = "smallvec"
version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0"
[[package]] [[package]]
name = "strsim" name = "strsim"
version = "0.8.0" version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
[[package]]
name = "strsim"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
[[package]]
name = "syn"
version = "2.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]] [[package]]
name = "termcolor" name = "termcolor"
version = "1.1.2" version = "1.1.2"
@@ -287,6 +644,32 @@ dependencies = [
"unicode-width", "unicode-width",
] ]
[[package]]
name = "thiserror"
version = "1.0.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
version = "1.0.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "unicode-ident"
version = "1.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0"
[[package]] [[package]]
name = "unicode-width" name = "unicode-width"
version = "0.1.8" version = "0.1.8"
@@ -294,10 +677,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3"
[[package]] [[package]]
name = "unicode-xid" name = "utf8parse"
version = "0.2.2" version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
[[package]] [[package]]
name = "vec_map" name = "vec_map"
@@ -311,6 +694,12 @@ version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe"
[[package]]
name = "wasi"
version = "0.11.0+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
[[package]] [[package]]
name = "which" name = "which"
version = "3.1.1" version = "3.1.1"
@@ -350,3 +739,69 @@ name = "winapi-x86_64-pc-windows-gnu"
version = "0.4.0" version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "windows-sys"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
dependencies = [
"windows-targets",
]
[[package]]
name = "windows-targets"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5"
dependencies = [
"windows_aarch64_gnullvm",
"windows_aarch64_msvc",
"windows_i686_gnu",
"windows_i686_msvc",
"windows_x86_64_gnu",
"windows_x86_64_gnullvm",
"windows_x86_64_msvc",
]
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
[[package]]
name = "windows_aarch64_msvc"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
[[package]]
name = "windows_i686_gnu"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
[[package]]
name = "windows_i686_msvc"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
[[package]]
name = "windows_x86_64_gnu"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
[[package]]
name = "windows_x86_64_msvc"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"

View File

@@ -13,6 +13,15 @@ keywords = ["zerotier", "p2p", "vpn", "socket", "network"]
categories = ["network-programming", "cryptography"] categories = ["network-programming", "cryptography"]
[dependencies] [dependencies]
log = "0.4.18"
dirs = "5.0.1"
[dev-dependencies]
anyhow = "1.0"
clap = { version = "4.3.0", features = ["derive"] }
clap-num = "1.0"
env_logger = "0.10"
parking_lot = { version = "0.12", features = ["send_guard"] }
[build-dependencies] [build-dependencies]
bindgen = "0.58" bindgen = "0.58"
@@ -22,8 +31,3 @@ cmake = "0.1"
[lib] [lib]
name = "libzt" name = "libzt"
path = "src/lib.rs" path = "src/lib.rs"
[[example]]
name = "libzt-test-app"
path = "src/examples/libzt-test-app.rs"

View File

@@ -1,10 +1,15 @@
extern crate bindgen; extern crate bindgen;
use std::env; use std::env;
use std::path::PathBuf; use std::path::{Path, PathBuf};
fn main() { fn main() {
println!("cargo:rustc-link-lib=zt"); let dir = env::var("CARGO_MANIFEST_DIR").unwrap();
let lib_dir = Path::new(&dir).join("../../../dist/native/lib").canonicalize().unwrap();
println!("cargo:rustc-link-search=native={}", lib_dir.to_string_lossy());
println!("cargo:rustc-link-lib=static=zt");
println!("cargo:rustc-link-lib=dylib=c++");
let bindings = bindgen::Builder::default() let bindings = bindgen::Builder::default()
.header("src/include/ZeroTierSockets.h") .header("src/include/ZeroTierSockets.h")

View File

@@ -0,0 +1,202 @@
use std::{
error::Error,
fmt, fs,
io::{self, Read, Write},
net::{self, Shutdown},
sync::Arc,
thread,
time::Duration,
};
use anyhow::Result;
use clap::Parser;
use parking_lot::FairMutex;
use libzt::{node::ZeroTierNode, tcp as zt_tcp};
const BUF_SIZE: usize = 1024;
const SOCKET_IO_TIMEOUT: Duration = Duration::new(1, 0);
const DEFAULT_LISTEN_PORT: u16 = 9080;
#[derive(Debug)]
enum ForwardingError {
BindFailed(String),
ConnectFailed(String),
CopyFailed(String),
}
impl Error for ForwardingError {}
#[derive(Parser, Debug)]
struct Args {
#[arg(short, long, value_parser=clap_num::maybe_hex::<u64>)]
network_id: u64,
#[arg(short, long)]
connect: String,
#[arg(short, long, default_value_t = DEFAULT_LISTEN_PORT)]
port: u16,
}
fn setup_node(network_id: u64) -> Result<ZeroTierNode> {
log::info!("joining network: {:#x}", network_id);
let mut storage_path = dirs::data_local_dir().unwrap();
storage_path.push("libzt");
storage_path.push("forwarding");
fs::create_dir_all(&storage_path)?;
log::debug!(
"initializing from state dir: {}",
storage_path.to_string_lossy()
);
let node = ZeroTierNode {};
node.init_set_port(0);
node.init_from_storage(&storage_path.join("libzt-examples").to_string_lossy());
node.start();
log::debug!("waiting for node to come online...");
while !node.is_online() {
node.delay(250);
}
log::info!("node id: {:#x}", node.id());
node.net_join(network_id);
log::debug!("waiting for transport...");
while !node.net_transport_is_ready(network_id) {
node.delay(250);
}
let addr = node.addr_get(network_id).unwrap();
log::info!("got ZT addr: {}", addr.to_string());
Ok(node)
}
impl fmt::Display for ForwardingError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{:?}", self)
}
}
fn main() -> Result<()> {
env_logger::init();
let Args {
connect: remote_addr,
network_id,
port: local_port,
} = Args::parse();
let _node = setup_node(network_id)?;
let local_addr = format!("localhost:{}", local_port);
let listener = net::TcpListener::bind(&local_addr)
.map_err(|_| ForwardingError::BindFailed(local_addr.clone()))?;
log::info!("listener bound to {}", local_addr);
for conn in listener.incoming() {
log::debug!("incoming: {:?}", conn);
if let Ok(client) = conn {
client.set_read_timeout(Some(SOCKET_IO_TIMEOUT))?;
client.set_write_timeout(Some(SOCKET_IO_TIMEOUT))?;
let client = Arc::new(FairMutex::new(client));
log::info!("connecting to remote: {}", remote_addr);
let remote = zt_tcp::TcpStream::connect(&remote_addr)
.map_err(|_| ForwardingError::ConnectFailed(remote_addr.clone()))?;
remote.set_read_timeout(Some(SOCKET_IO_TIMEOUT))?;
remote.set_write_timeout(Some(SOCKET_IO_TIMEOUT))?;
let remote = Arc::new(FairMutex::new(remote));
log::info!("connected");
let client_ = client.clone();
let remote_ = remote.clone();
thread::spawn(move || {
let mut buf = [0u8; BUF_SIZE];
let mut running = true;
while running {
let mut client = client.lock();
let mut remote = remote.lock();
match client.read(&mut buf) {
Ok(n) if n > 0 => {
log::debug!("got {} bytes from remote", n);
running = remote
.write(&buf)
.map(|_| {
remote.flush().unwrap();
true
})
.unwrap_or_else(|e| {
let msg = format!("failed to write to remote: {:?}", e);
log::error!("{}", msg);
false
});
}
Err(e) if e.kind() == io::ErrorKind::WouldBlock => {
thread::sleep(Duration::new(0, 5000));
}
other => {
log::debug!("closing client connection: {:?}", other);
let _ = client.shutdown(Shutdown::Read);
let _ = remote.shutdown(Shutdown::Write);
break;
}
}
buf.fill(0);
}
});
thread::spawn(move || {
let mut buf = [0u8; BUF_SIZE];
let mut running = true;
while running {
let mut client = client_.lock();
let mut remote = remote_.lock();
match remote.read(&mut buf) {
Ok(n) if n > 0 => {
log::debug!("got {} bytes from remote", n);
running = client
.write(&buf)
.map(|_| {
client.flush().unwrap();
true
})
.unwrap_or_else(|e| {
let msg = format!("failed to write to remote: {:?}", e);
log::error!("{}", msg);
false
});
}
other => {
log::debug!("closing remote connection: {:?}", other);
let _ = remote.shutdown(Shutdown::Read);
let _ = client.shutdown(Shutdown::Write);
break;
}
}
buf.fill(0);
}
});
}
}
Ok(())
}

View File

@@ -338,7 +338,7 @@ typedef enum {
/** /**
* Maximum number of direct network paths to a given peer * Maximum number of direct network paths to a given peer
*/ */
#define ZTS_MAX_PEER_NETWORK_PATHS 16 #define ZTS_MAX_PEER_NETWORK_PATHS 64
/** /**
* Maximum number of multicast groups a device / network interface can be * Maximum number of multicast groups a device / network interface can be

View File

@@ -26,6 +26,7 @@ INCLUDE_DIRS = [
os.path.join(ROOT_DIR, "ext/lwip-contrib/ports/unix/port/include"), os.path.join(ROOT_DIR, "ext/lwip-contrib/ports/unix/port/include"),
os.path.join(ROOT_DIR, "ext/ZeroTierOne/include"), os.path.join(ROOT_DIR, "ext/ZeroTierOne/include"),
os.path.join(ROOT_DIR, "ext/ZeroTierOne"), os.path.join(ROOT_DIR, "ext/ZeroTierOne"),
os.path.join(ROOT_DIR, "ext/ZeroTierOne/ext"),
os.path.join(ROOT_DIR, "ext/ZeroTierOne/node"), os.path.join(ROOT_DIR, "ext/ZeroTierOne/node"),
os.path.join(ROOT_DIR, "ext/ZeroTierOne/service"), os.path.join(ROOT_DIR, "ext/ZeroTierOne/service"),
os.path.join(ROOT_DIR, "ext/ZeroTierOne/osdep"), os.path.join(ROOT_DIR, "ext/ZeroTierOne/osdep"),

View File

@@ -25,7 +25,7 @@
#define REQ_LEN 64 #define REQ_LEN 64
char api_url[ZTS_CENRTAL_MAX_URL_LEN]; char api_url[ZTS_CENTRAL_MAX_URL_LEN];
char api_token[ZTS_CENTRAL_TOKEN_LEN + 1]; char api_token[ZTS_CENTRAL_TOKEN_LEN + 1];
char* _resp_buf; char* _resp_buf;
@@ -97,12 +97,12 @@ int zts_central_init(const char* url_str, const char* token_str, char* resp_buf,
// Initialize all curl internal submodules // Initialize all curl internal submodules
curl_global_init(CURL_GLOBAL_ALL); curl_global_init(CURL_GLOBAL_ALL);
int url_len = strnlen(url_str, ZTS_CENRTAL_MAX_URL_LEN); int url_len = strnlen(url_str, ZTS_CENTRAL_MAX_URL_LEN);
if (url_len < 3 || url_len > ZTS_CENRTAL_MAX_URL_LEN) { if (url_len < 3 || url_len > ZTS_CENTRAL_MAX_URL_LEN) {
return ZTS_ERR_ARG; return ZTS_ERR_ARG;
} }
else { else {
memset(api_url, 0, ZTS_CENRTAL_MAX_URL_LEN); memset(api_url, 0, ZTS_CENTRAL_MAX_URL_LEN);
strncpy(api_url, url_str, url_len); strncpy(api_url, url_str, url_len);
} }
int token_len = strnlen(token_str, ZTS_CENTRAL_TOKEN_LEN); int token_len = strnlen(token_str, ZTS_CENTRAL_TOKEN_LEN);
@@ -146,19 +146,19 @@ int central_req(
return ZTS_ERR_SERVICE; return ZTS_ERR_SERVICE;
} }
zts_central_clear_resp_buf(); zts_central_clear_resp_buf();
int central_strlen = strnlen(central_str, ZTS_CENRTAL_MAX_URL_LEN); int central_strlen = strnlen(central_str, ZTS_CENTRAL_MAX_URL_LEN);
int api_route_strlen = strnlen(api_route_str, ZTS_CENRTAL_MAX_URL_LEN); int api_route_strlen = strnlen(api_route_str, ZTS_CENTRAL_MAX_URL_LEN);
int token_strlen = strnlen(token_str, ZTS_CENTRAL_TOKEN_LEN); int token_strlen = strnlen(token_str, ZTS_CENTRAL_TOKEN_LEN);
int url_len = central_strlen + api_route_strlen; int url_len = central_strlen + api_route_strlen;
if (token_strlen > ZTS_CENTRAL_TOKEN_LEN) { if (token_strlen > ZTS_CENTRAL_TOKEN_LEN) {
return ZTS_ERR_ARG; return ZTS_ERR_ARG;
} }
if (url_len > ZTS_CENRTAL_MAX_URL_LEN) { if (url_len > ZTS_CENTRAL_MAX_URL_LEN) {
return ZTS_ERR_ARG; return ZTS_ERR_ARG;
} }
char req_url[ZTS_CENRTAL_MAX_URL_LEN] = { 0 }; char req_url[ZTS_CENTRAL_MAX_URL_LEN] = { 0 };
strncpy(req_url, central_str, ZTS_CENRTAL_MAX_URL_LEN); strncpy(req_url, central_str, ZTS_CENTRAL_MAX_URL_LEN);
strncat(req_url, api_route_str, ZTS_CENRTAL_MAX_URL_LEN); strncat(req_url, api_route_str, ZTS_CENTRAL_MAX_URL_LEN);
CURL* curl; CURL* curl;
CURLcode res; CURLcode res;

View File

@@ -121,6 +121,27 @@ int zts_init_set_event_handler(PythonDirectorCallbackClass* callback)
return ZTS_ERR_OK; return ZTS_ERR_OK;
} }
int zts_init_set_tcp_relay(const char* tcp_relay_addr, unsigned short tcp_relay_port)
{
ACQUIRE_SERVICE_OFFLINE();
zts_service->setTcpRelayAddress(tcp_relay_addr, tcp_relay_port);
return ZTS_ERR_OK;
}
int zts_init_allow_tcp_relay(int enabled)
{
ACQUIRE_SERVICE_OFFLINE();
zts_service->allowTcpRelay(enabled);
return ZTS_ERR_OK;
}
int zts_init_force_tcp_relay(int enabled)
{
ACQUIRE_SERVICE_OFFLINE();
zts_service->forceTcpRelay(enabled);
return ZTS_ERR_OK;
}
int zts_init_blacklist_if(const char* prefix, unsigned int len) int zts_init_blacklist_if(const char* prefix, unsigned int len)
{ {
ACQUIRE_SERVICE_OFFLINE(); ACQUIRE_SERVICE_OFFLINE();
@@ -133,6 +154,12 @@ int zts_init_set_roots(const void* roots_data, unsigned int len)
return zts_service->setRoots(roots_data, len); return zts_service->setRoots(roots_data, len);
} }
int zts_init_set_low_bandwidth_mode(int enabled)
{
ACQUIRE_SERVICE_OFFLINE();
return zts_service->setLowBandwidthMode(enabled);
}
int zts_init_set_port(unsigned short port) int zts_init_set_port(unsigned short port)
{ {
ACQUIRE_SERVICE_OFFLINE(); ACQUIRE_SERVICE_OFFLINE();

View File

@@ -93,11 +93,18 @@ void Events::run()
} }
} }
void Events::enqueue(unsigned int event_code, const void* arg, int len) bool Events::enqueue(unsigned int event_code, const void* arg, int len)
{ {
if (! _enabled) { if (! _enabled) {
return; return false;
} }
if (_callbackMsgQueue.size_approx() > 1024) {
/* Rate-limit number of events. This value should only grow if the
user application isn't returning from the event handler in a timely manner.
For most applications it should hover around 1 to 2 */
return false;
}
zts_event_msg_t* msg = new zts_event_msg_t(); zts_event_msg_t* msg = new zts_event_msg_t();
msg->event_code = event_code; msg->event_code = event_code;
@@ -132,15 +139,12 @@ void Events::enqueue(unsigned int event_code, const void* arg, int len)
msg->cache = (void*)arg; msg->cache = (void*)arg;
msg->len = len; msg->len = len;
} }
if (msg && _callbackMsgQueue.size_approx() > 1024) {
/* Rate-limit number of events. This value should only grow if the //
user application isn't returning from the event handler in a timely manner. // ownership of arg is now transferred
For most applications it should hover around 1 to 2 */ //
destroy(msg);
}
else {
_callbackMsgQueue.enqueue(msg); _callbackMsgQueue.enqueue(msg);
} return true;
} }
void Events::destroy(zts_event_msg_t* msg) void Events::destroy(zts_event_msg_t* msg)
@@ -182,11 +186,10 @@ void Events::sendToUser(zts_event_msg_t* msg)
if (javaCbMethodId) { if (javaCbMethodId) {
JNIEnv* env; JNIEnv* env;
#if defined(__ANDROID__) #if defined(__ANDROID__)
jint rs = jvm->AttachCurrentThread(&env, NULL); jvm->AttachCurrentThread(&env, NULL);
#else #else
jint rs = jvm->AttachCurrentThread((void**)&env, NULL); jvm->AttachCurrentThread((void**)&env, NULL);
#endif #endif
uint64_t arg = 0;
uint64_t id = 0; uint64_t id = 0;
if (ZTS_NODE_EVENT(msg->event_code)) { if (ZTS_NODE_EVENT(msg->event_code)) {
id = msg->node ? msg->node->node_id : 0; id = msg->node ? msg->node->node_id : 0;
@@ -198,6 +201,8 @@ void Events::sendToUser(zts_event_msg_t* msg)
id = msg->peer ? msg->peer->peer_id : 0; id = msg->peer ? msg->peer->peer_id : 0;
} }
env->CallVoidMethod(javaCbObjRef, javaCbMethodId, id, msg->event_code); env->CallVoidMethod(javaCbObjRef, javaCbMethodId, id, msg->event_code);
jvm->DetachCurrentThread();
} }
#endif // ZTS_ENABLE_JAVA #endif // ZTS_ENABLE_JAVA
#ifdef ZTS_ENABLE_PINVOKE #ifdef ZTS_ENABLE_PINVOKE

View File

@@ -28,7 +28,7 @@
/* Macro substitutions to standardize state checking of service, node, callbacks, and TCP/IP /* Macro substitutions to standardize state checking of service, node, callbacks, and TCP/IP
* stack. These are used only for control functions that are called at a low frequency. All higher * stack. These are used only for control functions that are called at a low frequency. All higher
* frequency socket calls use a unguarded state flags */ * frequency socket calls use unguarded state flags */
// Lock service and check that it is running // Lock service and check that it is running
#define ACQUIRE_SERVICE(x) \ #define ACQUIRE_SERVICE(x) \
@@ -115,8 +115,12 @@ class Events {
/** /**
* Enqueue an event to be sent to the user application * Enqueue an event to be sent to the user application
*
* Returns true if arg was enqueued.
* If enqueued, then ownership of arg has been transferred.
* If NOT enqueued, then ownership of arg has NOT been transferred.
*/ */
void enqueue(unsigned int event_code, const void* arg, int len = 0); bool enqueue(unsigned int event_code, const void* arg, int len = 0);
/** /**
* Send callback message to user application * Send callback message to user application

View File

@@ -17,6 +17,8 @@
* ZeroTier Node Service * ZeroTier Node Service
*/ */
#include <stdlib.h>
#include "NodeService.hpp" #include "NodeService.hpp"
#include "../version.h" #include "../version.h"
@@ -28,14 +30,16 @@
#include "VirtualTap.hpp" #include "VirtualTap.hpp"
#if defined(__WINDOWS__) #if defined(__WINDOWS__)
#include <shlobj.h>
#include <winsock2.h>
#include <windows.h>
#include <iphlpapi.h> #include <iphlpapi.h>
#include <netioapi.h> #include <netioapi.h>
#include <shlobj.h>
#include <windows.h>
#include <winsock2.h>
#define stat _stat #define stat _stat
#endif #endif
#define ZT_TCP_FALLBACK_RELAY "204.80.128.1/443"
namespace ZeroTier { namespace ZeroTier {
static int SnodeVirtualNetworkConfigFunction( static int SnodeVirtualNetworkConfigFunction(
@@ -173,6 +177,11 @@ NodeService::NodeService()
, _randomPortRangeEnd(0) , _randomPortRangeEnd(0)
, _udpPortPickerCounter(0) , _udpPortPickerCounter(0)
, _lastDirectReceiveFromGlobal(0) , _lastDirectReceiveFromGlobal(0)
, _fallbackRelayAddress(ZT_TCP_FALLBACK_RELAY)
, _allowTcpRelay(true)
, _forceTcpRelay(false)
, _lastSendToGlobalV4(0)
, _tcpFallbackTunnel((TcpConnection*)0)
, _lastRestart(0) , _lastRestart(0)
, _nextBackgroundTaskDeadline(0) , _nextBackgroundTaskDeadline(0)
, _run(false) , _run(false)
@@ -286,7 +295,8 @@ NodeService::ReasonForTermination NodeService::run()
if (_allowSecondaryPort) { if (_allowSecondaryPort) {
if (_secondaryPort) { if (_secondaryPort) {
_ports[1] = _secondaryPort; _ports[1] = _secondaryPort;
} else { }
else {
_ports[1] = _getRandomPort(minPort, maxPort); _ports[1] = _getRandomPort(minPort, maxPort);
} }
} }
@@ -301,7 +311,8 @@ NodeService::ReasonForTermination NodeService::run()
if (_ports[1]) { if (_ports[1]) {
if (_tertiaryPort) { if (_tertiaryPort) {
_ports[2] = _tertiaryPort; _ports[2] = _tertiaryPort;
} else { }
else {
_ports[2] = minPort + (_ports[0] % 40000); _ports[2] = minPort + (_ports[0] % 40000);
for (int i = 0;; ++i) { for (int i = 0;; ++i) {
if (i > 1000) { if (i > 1000) {
@@ -398,8 +409,11 @@ NodeService::ReasonForTermination NodeService::run()
p[pc++] = _ports[i]; p[pc++] = _ports[i];
} }
} }
if (! _forceTcpRelay) {
// Only bother binding UDP ports if we aren't forcing TCP-relay mode
_binder.refresh(_phy, p, pc, explicitBind, *this); _binder.refresh(_phy, p, pc, explicitBind, *this);
} }
}
// Generate callback messages for user application // Generate callback messages for user application
generateSyntheticEvents(); generateSyntheticEvents();
@@ -411,6 +425,12 @@ NodeService::ReasonForTermination NodeService::run()
dl = _nextBackgroundTaskDeadline; dl = _nextBackgroundTaskDeadline;
} }
// Close TCP fallback tunnel if we have direct UDP
if (! _forceTcpRelay && (_tcpFallbackTunnel)
&& ((now - _lastDirectReceiveFromGlobal) < (ZT_TCP_FALLBACK_AFTER / 2))) {
_phy.close(_tcpFallbackTunnel->sock);
}
// Sync multicast group memberships // Sync multicast group memberships
if ((now - lastTapMulticastGroupCheck) >= ZT_TAP_CHECK_MULTICAST_INTERVAL) { if ((now - lastTapMulticastGroupCheck) >= ZT_TAP_CHECK_MULTICAST_INTERVAL) {
lastTapMulticastGroupCheck = now; lastTapMulticastGroupCheck = now;
@@ -616,6 +636,9 @@ void NodeService::phyOnDatagram(
void* data, void* data,
unsigned long len) unsigned long len)
{ {
if (_forceTcpRelay) {
return;
}
ZTS_UNUSED_ARG(uptr); ZTS_UNUSED_ARG(uptr);
ZTS_UNUSED_ARG(localAddr); ZTS_UNUSED_ARG(localAddr);
if ((len >= 16) && (reinterpret_cast<const InetAddress*>(from)->ipScope() == InetAddress::IP_SCOPE_GLOBAL)) if ((len >= 16) && (reinterpret_cast<const InetAddress*>(from)->ipScope() == InetAddress::IP_SCOPE_GLOBAL))
@@ -639,6 +662,189 @@ void NodeService::phyOnDatagram(
} }
} }
void NodeService::phyOnTcpConnect(PhySocket* sock, void** uptr, bool success)
{
if (! success) {
phyOnTcpClose(sock, uptr);
return;
}
TcpConnection* const tc = reinterpret_cast<TcpConnection*>(*uptr);
if (! tc) { // sanity check
_phy.close(sock, true);
return;
}
tc->sock = sock;
if (tc->type == TcpConnection::TCP_TUNNEL_OUTGOING) {
if (_tcpFallbackTunnel)
_phy.close(_tcpFallbackTunnel->sock);
_tcpFallbackTunnel = tc;
_phy.streamSend(sock, ZT_TCP_TUNNEL_HELLO, sizeof(ZT_TCP_TUNNEL_HELLO));
}
else {
_phy.close(sock, true);
}
}
void NodeService::phyOnTcpClose(PhySocket* sock, void** uptr)
{
TcpConnection* tc = (TcpConnection*)*uptr;
if (tc) {
if (tc == _tcpFallbackTunnel) {
_tcpFallbackTunnel = (TcpConnection*)0;
}
{
Mutex::Lock _l(_tcpConnections_m);
_tcpConnections.erase(
std::remove(_tcpConnections.begin(), _tcpConnections.end(), tc),
_tcpConnections.end());
}
delete tc;
}
}
void NodeService::phyOnTcpData(PhySocket* sock, void** uptr, void* data, unsigned long len)
{
try {
if (! len) {
return; // sanity check, should never happen
}
TcpConnection* tc = reinterpret_cast<TcpConnection*>(*uptr);
tc->lastReceive = OSUtils::now();
switch (tc->type) {
case TcpConnection::TCP_UNCATEGORIZED_INCOMING:
case TcpConnection::TCP_HTTP_INCOMING:
case TcpConnection::TCP_HTTP_OUTGOING:
break;
case TcpConnection::TCP_TUNNEL_OUTGOING:
tc->readq.append((const char*)data, len);
while (tc->readq.length() >= 5) {
const char* data = tc->readq.data();
const unsigned long mlen =
(((((unsigned long)data[3]) & 0xff) << 8) | (((unsigned long)data[4]) & 0xff));
if (tc->readq.length() >= (mlen + 5)) {
InetAddress from;
unsigned long plen = mlen; // payload length, modified if there's an IP header
data += 5; // skip forward past pseudo-TLS junk and mlen
if (plen == 4) {
// Hello message, which isn't sent by proxy and would be ignored by client
}
else if (plen) {
// Messages should contain IPv4 or IPv6 source IP address data
switch (data[0]) {
case 4: // IPv4
if (plen >= 7) {
from.set(
(const void*)(data + 1),
4,
((((unsigned int)data[5]) & 0xff) << 8) | (((unsigned int)data[6]) & 0xff));
data += 7; // type + 4 byte IP + 2 byte port
plen -= 7;
}
else {
_phy.close(sock);
return;
}
break;
case 6: // IPv6
if (plen >= 19) {
from.set(
(const void*)(data + 1),
16,
((((unsigned int)data[17]) & 0xff) << 8)
| (((unsigned int)data[18]) & 0xff));
data += 19; // type + 16 byte IP + 2 byte port
plen -= 19;
}
else {
_phy.close(sock);
return;
}
break;
case 0: // none/omitted
++data;
--plen;
break;
default: // invalid address type
_phy.close(sock);
return;
}
if (from) {
InetAddress fakeTcpLocalInterfaceAddress((uint32_t)0xffffffff, 0xffff);
const ZT_ResultCode rc = _node->processWirePacket(
(void*)0,
OSUtils::now(),
-1,
reinterpret_cast<struct sockaddr_storage*>(&from),
data,
plen,
&_nextBackgroundTaskDeadline);
if (ZT_ResultCode_isFatal(rc)) {
char tmp[256];
OSUtils::ztsnprintf(
tmp,
sizeof(tmp),
"fatal error code from processWirePacket: %d",
(int)rc);
Mutex::Lock _l(_termReason_m);
_termReason = ONE_UNRECOVERABLE_ERROR;
_fatalErrorMessage = tmp;
this->terminate();
_phy.close(sock);
return;
}
}
}
if (tc->readq.length() > (mlen + 5)) {
tc->readq.erase(tc->readq.begin(), tc->readq.begin() + (mlen + 5));
}
else {
tc->readq.clear();
}
}
else {
break;
}
}
return;
}
}
catch (...) {
_phy.close(sock);
}
}
void NodeService::phyOnTcpWritable(PhySocket* sock, void** uptr)
{
TcpConnection* tc = reinterpret_cast<TcpConnection*>(*uptr);
bool closeit = false;
{
Mutex::Lock _l(tc->writeq_m);
if (tc->writeq.length() > 0) {
long sent = (long)_phy.streamSend(sock, tc->writeq.data(), (unsigned long)tc->writeq.length(), true);
if (sent > 0) {
if ((unsigned long)sent >= (unsigned long)tc->writeq.length()) {
tc->writeq.clear();
_phy.setNotifyWritable(sock, false);
}
else {
tc->writeq.erase(tc->writeq.begin(), tc->writeq.begin() + sent);
}
}
}
else {
_phy.setNotifyWritable(sock, false);
}
}
if (closeit) {
_phy.close(sock);
}
}
int NodeService::nodeVirtualNetworkConfigFunction( int NodeService::nodeVirtualNetworkConfigFunction(
uint64_t net_id, uint64_t net_id,
void** nuptr, void** nuptr,
@@ -751,13 +957,17 @@ void NodeService::sendEventToUser(unsigned int zt_event_code, const void* obj, u
void* objptr = NULL; void* objptr = NULL;
zts_node_info_t* nd;
zts_net_info_t* nt;
zts_peer_info_t* pr;
switch (zt_event_code) { switch (zt_event_code) {
case ZTS_EVENT_NODE_UP: case ZTS_EVENT_NODE_UP:
case ZTS_EVENT_NODE_ONLINE: case ZTS_EVENT_NODE_ONLINE:
case ZTS_EVENT_NODE_OFFLINE: case ZTS_EVENT_NODE_OFFLINE:
case ZTS_EVENT_NODE_DOWN: case ZTS_EVENT_NODE_DOWN:
case ZTS_EVENT_NODE_FATAL_ERROR: { case ZTS_EVENT_NODE_FATAL_ERROR: {
zts_node_info_t* nd = new zts_node_info_t; nd = new zts_node_info_t;
nd->node_id = _nodeId; nd->node_id = _nodeId;
nd->ver_major = ZEROTIER_ONE_VERSION_MAJOR; nd->ver_major = ZEROTIER_ONE_VERSION_MAJOR;
nd->ver_minor = ZEROTIER_ONE_VERSION_MINOR; nd->ver_minor = ZEROTIER_ONE_VERSION_MINOR;
@@ -774,9 +984,9 @@ void NodeService::sendEventToUser(unsigned int zt_event_code, const void* obj, u
case ZTS_EVENT_NETWORK_ACCESS_DENIED: case ZTS_EVENT_NETWORK_ACCESS_DENIED:
case ZTS_EVENT_NETWORK_DOWN: { case ZTS_EVENT_NETWORK_DOWN: {
NetworkState* ns = (NetworkState*)obj; NetworkState* ns = (NetworkState*)obj;
zts_net_info_t* nd = new zts_net_info_t(); nt = new zts_net_info_t();
nd->net_id = ns->config.nwid; nt->net_id = ns->config.nwid;
objptr = (void*)nd; objptr = (void*)nt;
break; break;
} }
case ZTS_EVENT_NETWORK_UPDATE: case ZTS_EVENT_NETWORK_UPDATE:
@@ -784,33 +994,33 @@ void NodeService::sendEventToUser(unsigned int zt_event_code, const void* obj, u
case ZTS_EVENT_NETWORK_READY_IP6: case ZTS_EVENT_NETWORK_READY_IP6:
case ZTS_EVENT_NETWORK_OK: { case ZTS_EVENT_NETWORK_OK: {
NetworkState* ns = (NetworkState*)obj; NetworkState* ns = (NetworkState*)obj;
zts_net_info_t* nd = new zts_net_info_t(); nt = new zts_net_info_t();
nd->net_id = ns->config.nwid; nt->net_id = ns->config.nwid;
nd->mac = ns->config.mac; nt->mac = ns->config.mac;
strncpy(nd->name, ns->config.name, sizeof(ns->config.name)); strncpy(nt->name, ns->config.name, sizeof(ns->config.name));
nd->status = (zts_network_status_t)ns->config.status; nt->status = (zts_network_status_t)ns->config.status;
nd->type = (zts_net_info_type_t)ns->config.type; nt->type = (zts_net_info_type_t)ns->config.type;
nd->mtu = ns->config.mtu; nt->mtu = ns->config.mtu;
nd->dhcp = ns->config.dhcp; nt->dhcp = ns->config.dhcp;
nd->bridge = ns->config.bridge; nt->bridge = ns->config.bridge;
nd->broadcast_enabled = ns->config.broadcastEnabled; nt->broadcast_enabled = ns->config.broadcastEnabled;
nd->port_error = ns->config.portError; nt->port_error = ns->config.portError;
nd->netconf_rev = ns->config.netconfRevision; nt->netconf_rev = ns->config.netconfRevision;
// Copy and convert address structures // Copy and convert address structures
nd->assigned_addr_count = ns->config.assignedAddressCount; nt->assigned_addr_count = ns->config.assignedAddressCount;
for (unsigned int i = 0; i < ns->config.assignedAddressCount; i++) { for (unsigned int i = 0; i < ns->config.assignedAddressCount; i++) {
native_ss_to_zts_ss(&(nd->assigned_addrs[i]), &(ns->config.assignedAddresses[i])); native_ss_to_zts_ss(&(nt->assigned_addrs[i]), &(ns->config.assignedAddresses[i]));
} }
nd->route_count = ns->config.routeCount; nt->route_count = ns->config.routeCount;
for (unsigned int i = 0; i < ns->config.routeCount; i++) { for (unsigned int i = 0; i < ns->config.routeCount; i++) {
native_ss_to_zts_ss(&(nd->routes[i].target), &(ns->config.routes[i].target)); native_ss_to_zts_ss(&(nt->routes[i].target), &(ns->config.routes[i].target));
native_ss_to_zts_ss(&(nd->routes[i].via), &(ns->config.routes[i].via)); native_ss_to_zts_ss(&(nt->routes[i].via), &(ns->config.routes[i].via));
nd->routes[i].flags = ns->config.routes[i].flags; nt->routes[i].flags = ns->config.routes[i].flags;
nd->routes[i].metric = ns->config.routes[i].metric; nt->routes[i].metric = ns->config.routes[i].metric;
} }
nd->multicast_sub_count = ns->config.multicastSubscriptionCount; nt->multicast_sub_count = ns->config.multicastSubscriptionCount;
memcpy(nd->multicast_subs, &(ns->config.multicastSubscriptions), sizeof(ns->config.multicastSubscriptions)); memcpy(nt->multicast_subs, &(ns->config.multicastSubscriptions), sizeof(ns->config.multicastSubscriptions));
objptr = (void*)nd; objptr = (void*)nt;
break; break;
} }
case ZTS_EVENT_ADDR_ADDED_IP4: case ZTS_EVENT_ADDR_ADDED_IP4:
@@ -845,13 +1055,13 @@ void NodeService::sendEventToUser(unsigned int zt_event_code, const void* obj, u
case ZTS_EVENT_PEER_UNREACHABLE: case ZTS_EVENT_PEER_UNREACHABLE:
case ZTS_EVENT_PEER_PATH_DISCOVERED: case ZTS_EVENT_PEER_PATH_DISCOVERED:
case ZTS_EVENT_PEER_PATH_DEAD: { case ZTS_EVENT_PEER_PATH_DEAD: {
zts_peer_info_t* pd = new zts_peer_info_t(); pr = new zts_peer_info_t();
ZT_Peer* peer = (ZT_Peer*)obj; ZT_Peer* peer = (ZT_Peer*)obj;
memcpy(pd, peer, sizeof(zts_peer_info_t)); memcpy(pr, peer, sizeof(zts_peer_info_t));
for (unsigned int j = 0; j < peer->pathCount; j++) { for (unsigned int j = 0; j < peer->pathCount; j++) {
native_ss_to_zts_ss(&(pd->paths[j].address), &(peer->paths[j].address)); native_ss_to_zts_ss(&(pr->paths[j].address), &(peer->paths[j].address));
} }
objptr = (void*)pd; objptr = (void*)pr;
break; break;
} }
default: default:
@@ -861,7 +1071,64 @@ void NodeService::sendEventToUser(unsigned int zt_event_code, const void* obj, u
// Send event // Send event
if (objptr) { if (objptr) {
_events->enqueue(zt_event_code, objptr, len); if (!_events->enqueue(zt_event_code, objptr, len)) {
//
// ownership of objptr was NOT transferred, so delete any news from above
//
switch (zt_event_code) {
case ZTS_EVENT_NODE_UP:
case ZTS_EVENT_NODE_ONLINE:
case ZTS_EVENT_NODE_OFFLINE:
case ZTS_EVENT_NODE_DOWN:
case ZTS_EVENT_NODE_FATAL_ERROR: {
delete nd;
break;
}
case ZTS_EVENT_NETWORK_NOT_FOUND:
case ZTS_EVENT_NETWORK_CLIENT_TOO_OLD:
case ZTS_EVENT_NETWORK_REQ_CONFIG:
case ZTS_EVENT_NETWORK_ACCESS_DENIED:
case ZTS_EVENT_NETWORK_DOWN: {
delete nt;
break;
}
case ZTS_EVENT_NETWORK_UPDATE:
case ZTS_EVENT_NETWORK_READY_IP4:
case ZTS_EVENT_NETWORK_READY_IP6:
case ZTS_EVENT_NETWORK_OK: {
delete nt;
break;
}
case ZTS_EVENT_ADDR_ADDED_IP4:
break;
case ZTS_EVENT_ADDR_ADDED_IP6:
break;
case ZTS_EVENT_ADDR_REMOVED_IP4:
break;
case ZTS_EVENT_ADDR_REMOVED_IP6:
break;
case ZTS_EVENT_STORE_IDENTITY_PUBLIC:
break;
case ZTS_EVENT_STORE_IDENTITY_SECRET:
break;
case ZTS_EVENT_STORE_PLANET:
break;
case ZTS_EVENT_STORE_PEER:
break;
case ZTS_EVENT_STORE_NETWORK:
break;
case ZTS_EVENT_PEER_DIRECT:
case ZTS_EVENT_PEER_RELAY:
case ZTS_EVENT_PEER_UNREACHABLE:
case ZTS_EVENT_PEER_PATH_DISCOVERED:
case ZTS_EVENT_PEER_PATH_DEAD: {
delete pr;
break;
}
default:
break;
}
}
} }
} }
@@ -1061,25 +1328,24 @@ int NodeService::getRouteAtIdx(
return ZTS_ERR_ARG; return ZTS_ERR_ARG;
} }
// target // target
const char* err = NULL;
struct sockaddr* sa = (struct sockaddr*)&(netState.config.routes[idx].target); struct sockaddr* sa = (struct sockaddr*)&(netState.config.routes[idx].target);
if (sa->sa_family == AF_INET) { if (sa->sa_family == AF_INET) {
struct sockaddr_in* in4 = (struct sockaddr_in*)sa; struct sockaddr_in* in4 = (struct sockaddr_in*)sa;
err = inet_ntop(AF_INET, &(in4->sin_addr), target, ZTS_INET6_ADDRSTRLEN); inet_ntop(AF_INET, &(in4->sin_addr), target, ZTS_INET6_ADDRSTRLEN);
} }
if (sa->sa_family == AF_INET6) { if (sa->sa_family == AF_INET6) {
struct sockaddr_in6* in6 = (struct sockaddr_in6*)sa; struct sockaddr_in6* in6 = (struct sockaddr_in6*)sa;
err = inet_ntop(AF_INET6, &(in6->sin6_addr), target, ZTS_INET6_ADDRSTRLEN); inet_ntop(AF_INET6, &(in6->sin6_addr), target, ZTS_INET6_ADDRSTRLEN);
} }
// via // via
struct sockaddr* sa_via = (struct sockaddr*)&(netState.config.routes[idx].via); struct sockaddr* sa_via = (struct sockaddr*)&(netState.config.routes[idx].via);
if (sa_via->sa_family == AF_INET) { if (sa_via->sa_family == AF_INET) {
struct sockaddr_in* in4 = (struct sockaddr_in*)sa_via; struct sockaddr_in* in4 = (struct sockaddr_in*)sa_via;
err = inet_ntop(AF_INET, &(in4->sin_addr), via, ZTS_INET6_ADDRSTRLEN); inet_ntop(AF_INET, &(in4->sin_addr), via, ZTS_INET6_ADDRSTRLEN);
} }
if (sa_via->sa_family == AF_INET6) { if (sa_via->sa_family == AF_INET6) {
struct sockaddr_in6* in6 = (struct sockaddr_in6*)sa_via; struct sockaddr_in6* in6 = (struct sockaddr_in6*)sa_via;
err = inet_ntop(AF_INET6, &(in6->sin6_addr), via, ZTS_INET6_ADDRSTRLEN); inet_ntop(AF_INET6, &(in6->sin6_addr), via, ZTS_INET6_ADDRSTRLEN);
} }
if (strlen(via) == 0) { if (strlen(via) == 0) {
strncpy(via, "0.0.0.0", 7); strncpy(via, "0.0.0.0", 7);
@@ -1226,7 +1492,7 @@ uint64_t NodeService::getNodeId()
int NodeService::setIdentity(const char* keypair, unsigned int len) int NodeService::setIdentity(const char* keypair, unsigned int len)
{ {
if (keypair == NULL || len < ZT_IDENTITY_STRING_BUFFER_LENGTH) { if (keypair == NULL || len < ZT_IDENTITY_STRING_BUFFER_LENGTH) {
return ZTS_ERR_ARG; // return ZTS_ERR_ARG;
} }
// Double check user-provided keypair // Double check user-provided keypair
Identity id; Identity id;
@@ -1455,6 +1721,79 @@ int NodeService::nodeWirePacketSendFunction(
unsigned int len, unsigned int len,
unsigned int ttl) unsigned int ttl)
{ {
if (_allowTcpRelay) {
if (addr->ss_family == AF_INET) {
// TCP fallback tunnel support, currently IPv4 only
if ((len >= 16)
&& (reinterpret_cast<const InetAddress*>(addr)->ipScope() == InetAddress::IP_SCOPE_GLOBAL)) {
// Engage TCP tunnel fallback if we haven't received anything valid from a global
// IP address in ZT_TCP_FALLBACK_AFTER milliseconds. If we do start getting
// valid direct traffic we'll stop using it and close the socket after a while.
const int64_t now = OSUtils::now();
if (_forceTcpRelay
|| (((now - _lastDirectReceiveFromGlobal) > ZT_TCP_FALLBACK_AFTER)
&& ((now - _lastRestart) > ZT_TCP_FALLBACK_AFTER))) {
if (_tcpFallbackTunnel) {
bool flushNow = false;
{
Mutex::Lock _l(_tcpFallbackTunnel->writeq_m);
if (_tcpFallbackTunnel->writeq.size() < (1024 * 64)) {
if (_tcpFallbackTunnel->writeq.length() == 0) {
_phy.setNotifyWritable(_tcpFallbackTunnel->sock, true);
flushNow = true;
}
const unsigned long mlen = len + 7;
_tcpFallbackTunnel->writeq.push_back((char)0x17);
_tcpFallbackTunnel->writeq.push_back((char)0x03);
_tcpFallbackTunnel->writeq.push_back((char)0x03); // fake TLS 1.2 header
_tcpFallbackTunnel->writeq.push_back((char)((mlen >> 8) & 0xff));
_tcpFallbackTunnel->writeq.push_back((char)(mlen & 0xff));
_tcpFallbackTunnel->writeq.push_back((char)4); // IPv4
_tcpFallbackTunnel->writeq.append(
reinterpret_cast<const char*>(reinterpret_cast<const void*>(
&(reinterpret_cast<const struct sockaddr_in*>(addr)->sin_addr.s_addr))),
4);
_tcpFallbackTunnel->writeq.append(
reinterpret_cast<const char*>(reinterpret_cast<const void*>(
&(reinterpret_cast<const struct sockaddr_in*>(addr)->sin_port))),
2);
_tcpFallbackTunnel->writeq.append((const char*)data, len);
}
}
if (flushNow) {
void* tmpptr = (void*)_tcpFallbackTunnel;
phyOnTcpWritable(_tcpFallbackTunnel->sock, &tmpptr);
}
}
else if (
_forceTcpRelay
|| (((now - _lastSendToGlobalV4) < ZT_TCP_FALLBACK_AFTER)
&& ((now - _lastSendToGlobalV4) > (ZT_PING_CHECK_INTERVAL / 2)))) {
const InetAddress addr(_fallbackRelayAddress);
TcpConnection* tc = new TcpConnection();
{
Mutex::Lock _l(_tcpConnections_m);
_tcpConnections.push_back(tc);
}
tc->type = TcpConnection::TCP_TUNNEL_OUTGOING;
tc->remoteAddr = addr;
tc->lastReceive = OSUtils::now();
tc->parent = this;
tc->sock = (PhySocket*)0; // set in connect handler
bool connected = false;
_phy.tcpConnect(reinterpret_cast<const struct sockaddr*>(&addr), connected, (void*)tc, true);
}
}
_lastSendToGlobalV4 = now;
}
}
}
if (_forceTcpRelay) {
// Shortcut here so that we don't emit any UDP packets
return 0;
}
// Even when relaying we still send via UDP. This way if UDP starts // Even when relaying we still send via UDP. This way if UDP starts
// working we can instantly "fail forward" to it and stop using TCP // working we can instantly "fail forward" to it and stop using TCP
// proxy fallback, which is slow. // proxy fallback, which is slow.
@@ -1813,6 +2152,21 @@ void NodeService::enableEvents()
_events->enable(); _events->enable();
} }
void NodeService::setTcpRelayAddress(const char* tcpRelayAddr, unsigned short tcpRelayPort)
{
_fallbackRelayAddress = InetAddress(std::string(std::string(tcpRelayAddr) + std::string("/") + std::to_string(tcpRelayPort)).c_str());
}
void NodeService::allowTcpRelay(bool enabled)
{
_allowTcpRelay = enabled;
}
void NodeService::forceTcpRelay(bool enabled)
{
_forceTcpRelay = enabled;
}
int NodeService::setRoots(const void* rootsData, unsigned int len) int NodeService::setRoots(const void* rootsData, unsigned int len)
{ {
if (! rootsData || len <= 0 || len > ZTS_STORE_DATA_LEN) { if (! rootsData || len <= 0 || len > ZTS_STORE_DATA_LEN) {
@@ -1829,6 +2183,16 @@ int NodeService::setRoots(const void* rootsData, unsigned int len)
return ZTS_ERR_OK; return ZTS_ERR_OK;
} }
int NodeService::setLowBandwidthMode(bool enabled)
{
Mutex::Lock _lr(_run_m);
if (_run) {
return ZTS_ERR_SERVICE;
}
_node->setLowBandwidthMode(enabled);
return ZTS_ERR_OK;
}
int NodeService::addInterfacePrefixToBlacklist(const char* prefix, unsigned int len) int NodeService::addInterfacePrefixToBlacklist(const char* prefix, unsigned int len)
{ {
if (! prefix || len == 0 || len > 15) { if (! prefix || len == 0 || len > 15) {

View File

@@ -28,6 +28,7 @@
#include "Phy.hpp" #include "Phy.hpp"
#include "PortMapper.hpp" #include "PortMapper.hpp"
#include "ZeroTierSockets.h" #include "ZeroTierSockets.h"
#include "version.h"
#include <string> #include <string>
#include <vector> #include <vector>
@@ -43,17 +44,53 @@
// How often to check for local interface addresses // How often to check for local interface addresses
#define ZT_LOCAL_INTERFACE_CHECK_INTERVAL 60000 #define ZT_LOCAL_INTERFACE_CHECK_INTERVAL 60000
// Attempt to engage TCP fallback after this many ms of no reply to packets sent to global-scope IPs
#define ZT_TCP_FALLBACK_AFTER 30000
// Fake TLS hello for TCP tunnel outgoing connections (TUNNELED mode)
static const char ZT_TCP_TUNNEL_HELLO[9] = { 0x17,
0x03,
0x03,
0x00,
0x04,
(char)ZEROTIER_ONE_VERSION_MAJOR,
(char)ZEROTIER_ONE_VERSION_MINOR,
(char)((ZEROTIER_ONE_VERSION_REVISION >> 8) & 0xff),
(char)(ZEROTIER_ONE_VERSION_REVISION & 0xff) };
#ifdef __WINDOWS__ #ifdef __WINDOWS__
#include <windows.h> #include <windows.h>
#endif #endif
namespace ZeroTier { namespace ZeroTier {
class NodeService;
struct InetAddress; struct InetAddress;
class VirtualTap; class VirtualTap;
class MAC; class MAC;
class Events; class Events;
/**
* A TCP connection and related state and buffers
*/
struct TcpConnection {
enum {
TCP_UNCATEGORIZED_INCOMING, // uncategorized incoming connection
TCP_HTTP_INCOMING,
TCP_HTTP_OUTGOING,
TCP_TUNNEL_OUTGOING // TUNNELED mode proxy outbound connection
} type;
NodeService* parent;
PhySocket* sock;
InetAddress remoteAddr;
uint64_t lastReceive;
std::string readq;
std::string writeq;
Mutex writeq_m;
};
/** /**
* ZeroTier node service * ZeroTier node service
*/ */
@@ -161,6 +198,16 @@ class NodeService {
// Time we last received a packet from a global address // Time we last received a packet from a global address
uint64_t _lastDirectReceiveFromGlobal; uint64_t _lastDirectReceiveFromGlobal;
InetAddress _fallbackRelayAddress;
bool _allowTcpRelay;
bool _forceTcpRelay;
uint64_t _lastSendToGlobalV4;
// Active TCP/IP connections
std::vector<TcpConnection*> _tcpConnections;
Mutex _tcpConnections_m;
TcpConnection* _tcpFallbackTunnel;
// Last potential sleep/wake event // Last potential sleep/wake event
uint64_t _lastRestart; uint64_t _lastRestart;
@@ -255,6 +302,8 @@ class NodeService {
void* data, void* data,
unsigned long len); unsigned long len);
void phyOnTcpConnect(PhySocket* sock, void** uptr, bool success);
int nodeVirtualNetworkConfigFunction( int nodeVirtualNetworkConfigFunction(
uint64_t net_id, uint64_t net_id,
void** nuptr, void** nuptr,
@@ -393,11 +442,23 @@ class NodeService {
/** Set the event system instance used to convey messages to the user */ /** Set the event system instance used to convey messages to the user */
int setUserEventSystem(Events* events); int setUserEventSystem(Events* events);
/** Set the address and port for the tcp relay that ZeroTier should use */
void setTcpRelayAddress(const char* tcpRelayAddr, unsigned short tcpRelayPort);
/** Allow ZeroTier to use the TCP relay */
void allowTcpRelay(bool enabled);
/** Force ZeroTier to only use the the TCP relay */
void forceTcpRelay(bool enabled);
void enableEvents(); void enableEvents();
/** Set the roots definition */ /** Set the roots definition */
int setRoots(const void* data, unsigned int len); int setRoots(const void* data, unsigned int len);
/** Enable or disable low-bandwidth mode (sends less ambient traffic, network updates happen less frequently) */
int setLowBandwidthMode(bool enabled);
/** Add Interface prefix to blacklist (prevents ZeroTier from using that interface) */ /** Add Interface prefix to blacklist (prevents ZeroTier from using that interface) */
int addInterfacePrefixToBlacklist(const char* prefix, unsigned int len); int addInterfacePrefixToBlacklist(const char* prefix, unsigned int len);
@@ -443,12 +504,6 @@ class NodeService {
/** Return whether an address of the given family has been assigned by the network */ /** Return whether an address of the given family has been assigned by the network */
int addrIsAssigned(uint64_t net_id, unsigned int family); int addrIsAssigned(uint64_t net_id, unsigned int family);
void phyOnTcpConnect(PhySocket* sock, void** uptr, bool success)
{
ZTS_UNUSED_ARG(sock);
ZTS_UNUSED_ARG(uptr);
ZTS_UNUSED_ARG(success);
}
void phyOnTcpAccept(PhySocket* sockL, PhySocket* sockN, void** uptrL, void** uptrN, const struct sockaddr* from) void phyOnTcpAccept(PhySocket* sockL, PhySocket* sockN, void** uptrL, void** uptrN, const struct sockaddr* from)
{ {
ZTS_UNUSED_ARG(sockL); ZTS_UNUSED_ARG(sockL);
@@ -457,23 +512,13 @@ class NodeService {
ZTS_UNUSED_ARG(uptrN); ZTS_UNUSED_ARG(uptrN);
ZTS_UNUSED_ARG(from); ZTS_UNUSED_ARG(from);
} }
void phyOnTcpClose(PhySocket* sock, void** uptr)
{ void phyOnTcpClose(PhySocket* sock, void** uptr);
ZTS_UNUSED_ARG(sock);
ZTS_UNUSED_ARG(uptr); void phyOnTcpData(PhySocket* sock, void** uptr, void* data, unsigned long len);
}
void phyOnTcpData(PhySocket* sock, void** uptr, void* data, unsigned long len) void phyOnTcpWritable(PhySocket* sock, void** uptr);
{
ZTS_UNUSED_ARG(sock);
ZTS_UNUSED_ARG(uptr);
ZTS_UNUSED_ARG(data);
ZTS_UNUSED_ARG(len);
}
void phyOnTcpWritable(PhySocket* sock, void** uptr)
{
ZTS_UNUSED_ARG(sock);
ZTS_UNUSED_ARG(uptr);
}
void phyOnFileDescriptorActivity(PhySocket* sock, void** uptr, bool readable, bool writable) void phyOnFileDescriptorActivity(PhySocket* sock, void** uptr, bool readable, bool writable)
{ {
ZTS_UNUSED_ARG(sock); ZTS_UNUSED_ARG(sock);

View File

@@ -312,6 +312,10 @@ static void zts_main_lwip_driver_loop(void* arg)
zts_util_delay(LWIP_DRIVER_LOOP_INTERVAL); zts_util_delay(LWIP_DRIVER_LOOP_INTERVAL);
} }
_has_exited = true; _has_exited = true;
//
// no need to check if event was enqueued since NULL is being passed
//
zts_events->enqueue(ZTS_EVENT_STACK_DOWN, NULL); zts_events->enqueue(ZTS_EVENT_STACK_DOWN, NULL);
} }
@@ -572,7 +576,20 @@ void zts_lwip_init_interface(void* tapref, const InetAddress& ip)
LOCK_TCPIP_CORE(); LOCK_TCPIP_CORE();
if (isNewNetif) { if (isNewNetif) {
vtap->netif6 = (void*)n; vtap->netif6 = (void*)n;
netif_add(n, NULL, NULL, NULL, (void*)vtap, zts_netif_init6, ethernet_input);
//
// was:
// netif_add(n, NULL, NULL, NULL, (void*)vtap, zts_netif_init6, ethernet_input);
//
// but there is this documentation:
// > With NO_SYS=0, this must be set to tcpip_input for all netif types (whether ethernet, PPP, slipif, etc.)
// https://lwip.fandom.com/wiki/Writing_a_device_driver
//
// and also with ethernet_input and lwIP asserts turned on, we get:
// Assertion "Function called without core lock" failed at line 236 in /Users/brenton/development/github/libzt/ext/lwip-contrib/ports/unix/port/sys_arch.c
//
netif_add(n, NULL, NULL, NULL, (void*)vtap, zts_netif_init6, tcpip_input);
n->ip6_autoconfig_enabled = 1; n->ip6_autoconfig_enabled = 1;
vtap->_mac.copyTo(n->hwaddr, n->hwaddr_len); vtap->_mac.copyTo(n->hwaddr, n->hwaddr_len);
netif_create_ip6_linklocal_address(n, 1); netif_create_ip6_linklocal_address(n, 1);

View File

@@ -37,7 +37,7 @@ extern JavaVM* jvm;
void java_detach_from_thread() void java_detach_from_thread()
{ {
jint rs = jvm->DetachCurrentThread(); jvm->DetachCurrentThread();
} }
#ifdef __cplusplus #ifdef __cplusplus
@@ -53,7 +53,7 @@ void fdset2ztfdset(JNIEnv* env, int nfds, zts_fd_set* src_fd_set, jobject dest_z
* Called from Java, saves a static reference to the VM so it can be used * Called from Java, saves a static reference to the VM so it can be used
* later to call a user-specified callback method from C. * later to call a user-specified callback method from C.
*/ */
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1init(JNIEnv* env, jobject thisObj) JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1init(JNIEnv* env, jclass clazz)
{ {
jint rs = env->GetJavaVM(&jvm); jint rs = env->GetJavaVM(&jvm);
return rs != JNI_OK ? ZTS_ERR_GENERAL : ZTS_ERR_OK; return rs != JNI_OK ? ZTS_ERR_GENERAL : ZTS_ERR_OK;
@@ -61,7 +61,7 @@ JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1init(JNIEnv
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1socket( JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1socket(
JNIEnv* env, JNIEnv* env,
jobject thisObj, jclass clazz,
jint family, jint family,
jint type, jint type,
jint protocol) jint protocol)
@@ -71,7 +71,7 @@ JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1socket
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1listen(JNIEnv* env, jobject thisObj, jint fd, int backlog) Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1listen(JNIEnv* env, jclass clazz, jint fd, int backlog)
{ {
int retval = zts_bsd_listen(fd, backlog); int retval = zts_bsd_listen(fd, backlog);
return retval > -1 ? retval : -(zts_errno); return retval > -1 ? retval : -(zts_errno);
@@ -79,10 +79,9 @@ Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1listen(JNIEnv* env, jobject t
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1accept( JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1accept(
JNIEnv* env, JNIEnv* env,
jobject thisObj, jclass clazz,
jint fd, jint fd,
jobject addr, jobject addr)
jint port)
{ {
struct zts_sockaddr_storage ss; struct zts_sockaddr_storage ss;
zts_socklen_t addrlen = sizeof(struct zts_sockaddr_storage); zts_socklen_t addrlen = sizeof(struct zts_sockaddr_storage);
@@ -92,7 +91,7 @@ JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1accept
} }
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1getsockname(JNIEnv* env, jobject thisObj, jint fd, jobject addr) Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1getsockname(JNIEnv* env, jclass clazz, jint fd, jobject addr)
{ {
struct zts_sockaddr_storage ss; struct zts_sockaddr_storage ss;
zts_socklen_t addrlen = sizeof(struct zts_sockaddr_storage); zts_socklen_t addrlen = sizeof(struct zts_sockaddr_storage);
@@ -102,7 +101,7 @@ Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1getsockname(JNIEnv* env, jobj
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1getpeername(JNIEnv* env, jobject thisObj, jint fd, jobject addr) Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1getpeername(JNIEnv* env, jclass clazz, jint fd, jobject addr)
{ {
struct zts_sockaddr_storage ss; struct zts_sockaddr_storage ss;
int retval = int retval =
@@ -111,14 +110,14 @@ Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1getpeername(JNIEnv* env, jobj
return retval > -1 ? retval : -(zts_errno); return retval > -1 ? retval : -(zts_errno);
} }
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1close(JNIEnv* env, jobject thisObj, jint fd) JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1close(JNIEnv* env, jclass clazz, jint fd)
{ {
return zts_bsd_close(fd); return zts_bsd_close(fd);
} }
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1select( JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1select(
JNIEnv* env, JNIEnv* env,
jobject thisObj, jclass clazz,
jint nfds, jint nfds,
jobject readfds, jobject readfds,
jobject writefds, jobject writefds,
@@ -159,7 +158,7 @@ JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1select
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1fcntl(JNIEnv* env, jobject thisObj, jint fd, jint cmd, jint flags) Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1fcntl(JNIEnv* env, jclass clazz, jint fd, jint cmd, jint flags)
{ {
int retval = zts_bsd_fcntl(fd, cmd, flags); int retval = zts_bsd_fcntl(fd, cmd, flags);
return retval > -1 ? retval : -(zts_errno); return retval > -1 ? retval : -(zts_errno);
@@ -194,7 +193,7 @@ JNIEXPORT int JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1ioctl(
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1send( JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1send(
JNIEnv* env, JNIEnv* env,
jobject thisObj, jclass clazz,
jint fd, jint fd,
jbyteArray buf, jbyteArray buf,
int flags) int flags)
@@ -207,7 +206,7 @@ JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1send(
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1sendto( JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1sendto(
JNIEnv* env, JNIEnv* env,
jobject thisObj, jclass clazz,
jint fd, jint fd,
jbyteArray buf, jbyteArray buf,
jint flags, jint flags,
@@ -225,7 +224,7 @@ JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1sendto
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1recv( JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1recv(
JNIEnv* env, JNIEnv* env,
jobject thisObj, jclass clazz,
jint fd, jint fd,
jbyteArray buf, jbyteArray buf,
jint flags) jint flags)
@@ -238,7 +237,7 @@ JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1recv(
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1recvfrom( JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1recvfrom(
JNIEnv* env, JNIEnv* env,
jobject thisObj, jclass clazz,
jint fd, jint fd,
jbyteArray buf, jbyteArray buf,
jint flags, jint flags,
@@ -254,7 +253,7 @@ JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1recvfr
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1read(JNIEnv* env, jobject thisObj, jint fd, jbyteArray buf) Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1read(JNIEnv* env, jclass clazz, jint fd, jbyteArray buf)
{ {
void* data = env->GetPrimitiveArrayCritical(buf, NULL); void* data = env->GetPrimitiveArrayCritical(buf, NULL);
int retval = zts_bsd_read(fd, data, env->GetArrayLength(buf)); int retval = zts_bsd_read(fd, data, env->GetArrayLength(buf));
@@ -270,7 +269,7 @@ ssize_t zts_bsd_read_offset(int fd, void* buf, size_t offset, size_t len)
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1read_1offset( JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1read_1offset(
JNIEnv* env, JNIEnv* env,
jobject thisObj, jclass clazz,
jint fd, jint fd,
jbyteArray buf, jbyteArray buf,
jint offset, jint offset,
@@ -284,7 +283,7 @@ JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1read_1
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1read_1length( JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1read_1length(
JNIEnv* env, JNIEnv* env,
jobject thisObj, jclass clazz,
jint fd, jint fd,
jbyteArray buf, jbyteArray buf,
jint len) jint len)
@@ -296,7 +295,7 @@ JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1read_1
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1write__IB(JNIEnv* env, jobject thisObj, jint fd, jbyteArray buf) Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1write(JNIEnv* env, jclass clazz, jint fd, jbyteArray buf)
{ {
void* data = env->GetPrimitiveArrayCritical(buf, NULL); void* data = env->GetPrimitiveArrayCritical(buf, NULL);
int retval = zts_bsd_write(fd, data, env->GetArrayLength(buf)); int retval = zts_bsd_write(fd, data, env->GetArrayLength(buf));
@@ -306,7 +305,7 @@ Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1write__IB(JNIEnv* env, jobjec
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1write_1offset( JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1write_1offset(
JNIEnv* env, JNIEnv* env,
jobject thisObj, jclass clazz,
jint fd, jint fd,
jbyteArray buf, jbyteArray buf,
jint offset, jint offset,
@@ -319,14 +318,14 @@ JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1write_
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1write_1byte(JNIEnv* env, jobject thisObj, jint fd, jbyte buf) Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1write_1byte(JNIEnv* env, jclass clazz, jint fd, jbyte buf)
{ {
int retval = zts_bsd_write(fd, &buf, 1); int retval = zts_bsd_write(fd, &buf, 1);
return retval > -1 ? retval : -(zts_errno); return retval > -1 ? retval : -(zts_errno);
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1shutdown(JNIEnv* env, jobject thisObj, int fd, int how) Java_com_zerotier_sockets_ZeroTierNative_zts_1bsd_1shutdown(JNIEnv* env, jclass clazz, int fd, int how)
{ {
return zts_bsd_shutdown(fd, how); return zts_bsd_shutdown(fd, how);
} }
@@ -434,9 +433,8 @@ void zta2ss(JNIEnv* env, struct zts_sockaddr_storage* ss, jobject addr)
} }
if (family == ZTS_AF_INET6) { if (family == ZTS_AF_INET6) {
struct zts_sockaddr_in6* in6 = (struct zts_sockaddr_in6*)ss; struct zts_sockaddr_in6* in6 = (struct zts_sockaddr_in6*)ss;
jfieldID fid = env->GetFieldID(c, "_port", "I"); fid = env->GetFieldID(c, "_port", "I");
in6->sin6_port = lwip_htons(env->GetIntField(addr, fid)); in6->sin6_port = lwip_htons(env->GetIntField(addr, fid));
fid = env->GetFieldID(c, "_family", "I");
in6->sin6_family = ZTS_AF_INET6; in6->sin6_family = ZTS_AF_INET6;
fid = env->GetFieldID(c, "_ip6", "[B"); fid = env->GetFieldID(c, "_ip6", "[B");
jobject ipData = env->GetObjectField(addr, fid); jobject ipData = env->GetObjectField(addr, fid);
@@ -448,19 +446,19 @@ void zta2ss(JNIEnv* env, struct zts_sockaddr_storage* ss, jobject addr)
} }
} }
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1node_1get_1port(JNIEnv* jenv, jobject thisObj) JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1node_1get_1port(JNIEnv* jenv, jclass clazz)
{ {
return zts_node_get_port(); return zts_node_get_port();
} }
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1node_1stop(JNIEnv* jenv, jobject thisObj) JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1node_1stop(JNIEnv* jenv, jclass clazz)
{ {
int res = zts_node_stop(); int res = zts_node_stop();
java_detach_from_thread(); java_detach_from_thread();
return res; return res;
} }
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1node_1free(JNIEnv* jenv, jobject thisObj) JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1node_1free(JNIEnv* jenv, jclass clazz)
{ {
int res = zts_node_free(); int res = zts_node_free();
java_detach_from_thread(); java_detach_from_thread();
@@ -468,13 +466,13 @@ JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1node_1free(
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1net_1join(JNIEnv* env, jobject thisObj, jlong net_id) Java_com_zerotier_sockets_ZeroTierNative_zts_1net_1join(JNIEnv* env, jclass clazz, jlong net_id)
{ {
return zts_net_join((uint64_t)net_id); return zts_net_join((uint64_t)net_id);
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1net_1leave(JNIEnv* env, jobject thisObj, jlong net_id) Java_com_zerotier_sockets_ZeroTierNative_zts_1net_1leave(JNIEnv* env, jclass clazz, jlong net_id)
{ {
return zts_net_leave((uint64_t)net_id); return zts_net_leave((uint64_t)net_id);
} }
@@ -492,7 +490,7 @@ Java_com_zerotier_sockets_ZeroTierNative_zts_1id_1pair_1is_1valid(JNIEnv* jenv,
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1init_1from_1storage(JNIEnv* jenv, jobject thisObj, jstring path) Java_com_zerotier_sockets_ZeroTierNative_zts_1init_1from_1storage(JNIEnv* jenv, jclass clazz, jstring path)
{ {
if (! path) { if (! path) {
return ZTS_ERR_ARG; return ZTS_ERR_ARG;
@@ -507,7 +505,7 @@ Java_com_zerotier_sockets_ZeroTierNative_zts_1init_1from_1storage(JNIEnv* jenv,
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1init_1set_1event_1handler(JNIEnv* env, jobject thisObj, jobject callback) Java_com_zerotier_sockets_ZeroTierNative_zts_1init_1set_1event_1handler(JNIEnv* env, jclass clazz, jobject callback)
{ {
jclass eventListenerClass = env->GetObjectClass(callback); jclass eventListenerClass = env->GetObjectClass(callback);
if (eventListenerClass == NULL) { if (eventListenerClass == NULL) {
@@ -523,7 +521,7 @@ Java_com_zerotier_sockets_ZeroTierNative_zts_1init_1set_1event_1handler(JNIEnv*
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1init_1set_1port(JNIEnv* jenv, jobject thisObj, short port) Java_com_zerotier_sockets_ZeroTierNative_zts_1init_1set_1port(JNIEnv* jenv, jclass clazz, short port)
{ {
return zts_init_set_port(port); return zts_init_set_port(port);
} }
@@ -536,7 +534,7 @@ Java_com_zerotier_sockets_ZeroTierNative_zts_1init_1from_1memory(JNIEnv* jenv, j
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1init_1blacklist_1if( JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1init_1blacklist_1if(
JNIEnv* jenv, JNIEnv* jenv,
jobject thisObj, jclass clazz,
jstring prefix, jstring prefix,
jint len) jint len)
{ {
@@ -559,50 +557,50 @@ Java_com_zerotier_sockets_ZeroTierNative_zts_1init_1set_roots(JNIEnv* jenv, jobj
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1init_1allow_1net_1cache(JNIEnv* jenv, jobject thisObj, jint allowed) Java_com_zerotier_sockets_ZeroTierNative_zts_1init_1allow_1net_1cache(JNIEnv* jenv, jclass clazz, jint allowed)
{ {
return zts_init_allow_net_cache(allowed); return zts_init_allow_net_cache(allowed);
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1init_1allow_1peer_1cache(JNIEnv* jenv, jobject thisObj, jint allowed) Java_com_zerotier_sockets_ZeroTierNative_zts_1init_1allow_1peer_1cache(JNIEnv* jenv, jclass clazz, jint allowed)
{ {
return zts_init_allow_peer_cache(allowed); return zts_init_allow_peer_cache(allowed);
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1init_1allow_1roots_1cache(JNIEnv* jenv, jobject thisObj, jint allowed) Java_com_zerotier_sockets_ZeroTierNative_zts_1init_1allow_1roots_1cache(JNIEnv* jenv, jclass clazz, jint allowed)
{ {
return zts_init_allow_roots_cache(allowed); return zts_init_allow_roots_cache(allowed);
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1init_1allow_1id_1cache(JNIEnv* jenv, jobject thisObj, jint allowed) Java_com_zerotier_sockets_ZeroTierNative_zts_1init_1allow_1id_1cache(JNIEnv* jenv, jclass clazz, jint allowed)
{ {
return zts_init_allow_id_cache(allowed); return zts_init_allow_id_cache(allowed);
} }
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1addr_1is_1assigned( JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1addr_1is_1assigned(
JNIEnv* jenv, JNIEnv* jenv,
jobject thisObj, jclass clazz,
jlong net_id, jlong net_id,
jint family) jint family)
{ {
return zts_addr_is_assigned(net_id, family); return zts_addr_is_assigned(net_id, family);
} }
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1addr_1get( //JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1addr_1get(
JNIEnv* jenv, // JNIEnv* jenv,
jobject thisObj, // jobject thisObj,
long net_id, // long net_id,
jint family, // jint family,
struct sockaddr_storage* addr) // struct sockaddr_storage* addr)
{ //{
// Use Java_com_zerotier_sockets_ZeroTierNative_zts_1addr_1get_1str instead // // Use Java_com_zerotier_sockets_ZeroTierNative_zts_1addr_1get_1str instead
} //}
JNIEXPORT jstring JNICALL JNIEXPORT jstring JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1addr_1get_1str(JNIEnv* jenv, jobject thisObj, long net_id, jint family) Java_com_zerotier_sockets_ZeroTierNative_zts_1addr_1get_1str(JNIEnv* jenv, jclass clazz, jlong net_id, jint family)
{ {
char ip_str[ZTS_IP_MAX_STR_LEN] = { 0 }; char ip_str[ZTS_IP_MAX_STR_LEN] = { 0 };
zts_addr_get_str(net_id, family, ip_str, ZTS_IP_MAX_STR_LEN); zts_addr_get_str(net_id, family, ip_str, ZTS_IP_MAX_STR_LEN);
@@ -610,38 +608,38 @@ Java_com_zerotier_sockets_ZeroTierNative_zts_1addr_1get_1str(JNIEnv* jenv, jobje
return result; return result;
} }
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1addr_1get_1all( //JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1addr_1get_1all(
JNIEnv* jenv, // JNIEnv* jenv,
jobject thisObj, // jobject thisObj,
long net_id, // long net_id,
struct sockaddr_storage* addr, // struct sockaddr_storage* addr,
jint* count) // jint* count)
{ //{
/* This feature will be implemented once the lower-level // /* This feature will be implemented once the lower-level
limitation of one addr per family per network is removed. */ // limitation of one addr per family per network is removed. */
} //}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1addr_1compute_16plane( //JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1addr_1compute_16plane(
JNIEnv* jenv, // JNIEnv* jenv,
jobject thisObj, // jobject thisObj,
jlong net_id, // jlong net_id,
jlong node_id, // jlong node_id,
struct sockaddr_storage* addr) // struct sockaddr_storage* addr)
{ //{
} //}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1addr_1compute_1rfc4193( //JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1addr_1compute_1rfc4193(
JNIEnv* jenv, // JNIEnv* jenv,
jobject thisObj, // jobject thisObj,
jlong net_id, // jlong net_id,
jlong node_id, // jlong node_id,
struct sockaddr_storage* addr) // struct sockaddr_storage* addr)
{ //{
} //}
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1addr_1compute_1rfc4193_1str( JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1addr_1compute_1rfc4193_1str(
JNIEnv* jenv, JNIEnv* jenv,
jobject thisObj, jclass clazz,
jlong net_id, jlong net_id,
jlong node_id, jlong node_id,
jstring dst, jstring dst,
@@ -652,7 +650,7 @@ JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1addr_1compu
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1addr_1compute_16plane_1str( JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1addr_1compute_16plane_1str(
JNIEnv* jenv, JNIEnv* jenv,
jobject thisObj, jclass clazz,
jlong net_id, jlong net_id,
jlong node_id, jlong node_id,
jstring dst, jstring dst,
@@ -661,9 +659,9 @@ JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1addr_1compu
return ZTS_ERR_OK; return ZTS_ERR_OK;
} }
JNIEXPORT uint64_t JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1net_1compute_1adhoc_1id( JNIEXPORT jlong JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1net_1compute_1adhoc_1id(
JNIEnv* jenv, JNIEnv* jenv,
jobject thisObj, jclass clazz,
short start_port, short start_port,
short end_port) short end_port)
{ {
@@ -671,19 +669,19 @@ JNIEXPORT uint64_t JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1net_1co
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1net_1transport_1is_1ready(JNIEnv* jenv, jobject thisObj, jlong net_id) Java_com_zerotier_sockets_ZeroTierNative_zts_1net_1transport_1is_1ready(JNIEnv* jenv, jclass clazz, jlong net_id)
{ {
return zts_net_transport_is_ready(net_id); return zts_net_transport_is_ready(net_id);
} }
JNIEXPORT uint64_t JNICALL JNIEXPORT jlong JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1net_get_mac(JNIEnv* jenv, jobject thisObj, jlong net_id) Java_com_zerotier_sockets_ZeroTierNative_zts_1net_1get_1mac(JNIEnv* jenv, jclass clazz, jlong net_id)
{ {
return zts_net_get_mac(net_id); return zts_net_get_mac(net_id);
} }
JNIEXPORT jstring JNICALL JNIEXPORT jstring JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1net_1get_1mac_1str(JNIEnv* jenv, jobject thisObj, jlong net_id) Java_com_zerotier_sockets_ZeroTierNative_zts_1net_1get_1mac_1str(JNIEnv* jenv, jclass clazz, jlong net_id)
{ {
char mac_str[ZTS_MAC_ADDRSTRLEN] = { 0 }; char mac_str[ZTS_MAC_ADDRSTRLEN] = { 0 };
zts_net_get_mac_str(net_id, mac_str, ZTS_MAC_ADDRSTRLEN); zts_net_get_mac_str(net_id, mac_str, ZTS_MAC_ADDRSTRLEN);
@@ -692,20 +690,20 @@ Java_com_zerotier_sockets_ZeroTierNative_zts_1net_1get_1mac_1str(JNIEnv* jenv, j
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1net_1get_1broadcast(JNIEnv* jenv, jobject thisObj, jlong net_id) Java_com_zerotier_sockets_ZeroTierNative_zts_1net_1get_1broadcast(JNIEnv* jenv, jclass clazz, jlong net_id)
{ {
return zts_net_get_broadcast(net_id); return zts_net_get_broadcast(net_id);
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1net_1get_1mtu(JNIEnv* jenv, jobject thisObj, jlong net_id) Java_com_zerotier_sockets_ZeroTierNative_zts_1net_1get_1mtu(JNIEnv* jenv, jclass clazz, jlong net_id)
{ {
return zts_net_get_mtu(net_id); return zts_net_get_mtu(net_id);
} }
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1net_1get_1name( JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1net_1get_1name(
JNIEnv* jenv, JNIEnv* jenv,
jobject thisObj, jclass clazz,
jlong net_id, jlong net_id,
jstring dst, jstring dst,
jint len) jint len)
@@ -714,37 +712,37 @@ JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1net_1get_1n
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1net_1get_1status(JNIEnv* jenv, jobject thisObj, jlong net_id) Java_com_zerotier_sockets_ZeroTierNative_zts_1net_1get_1status(JNIEnv* jenv, jclass clazz, jlong net_id)
{ {
return zts_net_get_status(net_id); return zts_net_get_status(net_id);
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1net_1get_1type(JNIEnv* jenv, jobject thisObj, jlong net_id) Java_com_zerotier_sockets_ZeroTierNative_zts_1net_1get_1type(JNIEnv* jenv, jclass clazz, jlong net_id)
{ {
return zts_net_get_type(net_id); return zts_net_get_type(net_id);
} }
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1route_1is_1assigned( JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1route_1is_1assigned(
JNIEnv* jenv, JNIEnv* jenv,
jobject thisObj, jclass clazz,
jlong net_id, jlong net_id,
jint family) jint family)
{ {
return zts_route_is_assigned(net_id, family); return zts_route_is_assigned(net_id, family);
} }
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1node_1start(JNIEnv* jenv, jobject thisObj) JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1node_1start(JNIEnv* jenv, jclass clazz)
{ {
return zts_node_start(); return zts_node_start();
} }
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1node_1is_1online(JNIEnv* jenv, jobject thisObj) JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1node_1is_1online(JNIEnv* jenv, jclass clazz)
{ {
return zts_node_is_online(); return zts_node_is_online();
} }
JNIEXPORT uint64_t JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1node_1get_1id(JNIEnv* jenv, jobject thisObj) JNIEXPORT jlong JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1node_1get_1id(JNIEnv* jenv, jclass clazz)
{ {
return zts_node_get_id(); return zts_node_get_id();
} }
@@ -760,7 +758,7 @@ JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1node_1get_1
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1moon_1orbit( JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1moon_1orbit(
JNIEnv* jenv, JNIEnv* jenv,
jobject thisObj, jclass clazz,
jlong moon_roots_id, jlong moon_roots_id,
jlong moon_seed) jlong moon_seed)
{ {
@@ -768,14 +766,14 @@ JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1moon_1orbit
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1moon_1deorbit(JNIEnv* jenv, jobject thisObj, jlong moon_roots_id) Java_com_zerotier_sockets_ZeroTierNative_zts_1moon_1deorbit(JNIEnv* jenv, jclass clazz, jlong moon_roots_id)
{ {
return zts_moon_deorbit(moon_roots_id); return zts_moon_deorbit(moon_roots_id);
} }
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1connect( JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1connect(
JNIEnv* jenv, JNIEnv* jenv,
jobject thisObj, jclass clazz,
jint fd, jint fd,
jstring ipstr, jstring ipstr,
jint port, jint port,
@@ -794,7 +792,7 @@ JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1connect(
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1bind(JNIEnv* jenv, jobject thisObj, jint fd, jstring ipstr, jint port) Java_com_zerotier_sockets_ZeroTierNative_zts_1bind(JNIEnv* jenv, jclass clazz, jint fd, jstring ipstr, jint port)
{ {
if (! ipstr) { if (! ipstr) {
return ZTS_ERR_ARG; return ZTS_ERR_ARG;
@@ -827,20 +825,20 @@ Java_com_zerotier_sockets_ZeroTierNative_zts_1udp_1client(JNIEnv* jenv, jobject
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1set_1no_1delay(JNIEnv* jenv, jobject thisObj, jint fd, jint enabled) Java_com_zerotier_sockets_ZeroTierNative_zts_1set_1no_1delay(JNIEnv* jenv, jclass clazz, jint fd, jint enabled)
{ {
return zts_set_no_delay(fd, enabled); return zts_set_no_delay(fd, enabled);
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1get_1no_1delay(JNIEnv* jenv, jobject thisObj, jint fd) Java_com_zerotier_sockets_ZeroTierNative_zts_1get_1no_1delay(JNIEnv* jenv, jclass clazz, jint fd)
{ {
return zts_get_no_delay(fd); return zts_get_no_delay(fd);
} }
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1set_1linger( JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1set_1linger(
JNIEnv* jenv, JNIEnv* jenv,
jobject thisObj, jclass clazz,
jint fd, jint fd,
jint enabled, jint enabled,
jint value) jint value)
@@ -849,38 +847,38 @@ JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1set_1linger
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1get_1linger_1enabled(JNIEnv* jenv, jobject thisObj, jint fd) Java_com_zerotier_sockets_ZeroTierNative_zts_1get_1linger_1enabled(JNIEnv* jenv, jclass clazz, jint fd)
{ {
return zts_get_linger_enabled(fd); return zts_get_linger_enabled(fd);
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1get_1linger_1value(JNIEnv* jenv, jobject thisObj, jint fd) Java_com_zerotier_sockets_ZeroTierNative_zts_1get_1linger_1value(JNIEnv* jenv, jclass clazz, jint fd)
{ {
return zts_get_linger_value(fd); return zts_get_linger_value(fd);
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1get_1pending_1data_1size(JNIEnv* jenv, jobject thisObj, jint fd) Java_com_zerotier_sockets_ZeroTierNative_zts_1get_1pending_1data_1size(JNIEnv* jenv, jclass clazz, jint fd)
{ {
return zts_get_pending_data_size(fd); return zts_get_pending_data_size(fd);
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1set_1reuse_1addr(JNIEnv* jenv, jobject thisObj, jint fd, jint enabled) Java_com_zerotier_sockets_ZeroTierNative_zts_1set_1reuse_1addr(JNIEnv* jenv, jclass clazz, jint fd, jint enabled)
{ {
return zts_set_reuse_addr(fd, enabled); return zts_set_reuse_addr(fd, enabled);
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1get_1reuse_1addr(JNIEnv* jenv, jobject thisObj, jint fd) Java_com_zerotier_sockets_ZeroTierNative_zts_1get_1reuse_1addr(JNIEnv* jenv, jclass clazz, jint fd)
{ {
return zts_get_reuse_addr(fd); return zts_get_reuse_addr(fd);
} }
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1set_1recv_1timeout( JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1set_1recv_1timeout(
JNIEnv* jenv, JNIEnv* jenv,
jobject thisObj, jclass clazz,
jint fd, jint fd,
jint seconds, jint seconds,
jint microseconds) jint microseconds)
@@ -889,14 +887,14 @@ JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1set_1recv_1
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1get_1recv_1timeout(JNIEnv* jenv, jobject thisObj, jint fd) Java_com_zerotier_sockets_ZeroTierNative_zts_1get_1recv_1timeout(JNIEnv* jenv, jclass clazz, jint fd)
{ {
return zts_get_recv_timeout(fd); return zts_get_recv_timeout(fd);
} }
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1set_1send_1timeout( JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1set_1send_1timeout(
JNIEnv* jenv, JNIEnv* jenv,
jobject thisObj, jclass clazz,
jint fd, jint fd,
jint seconds, jint seconds,
jint microseconds) jint microseconds)
@@ -905,66 +903,66 @@ JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1set_1send_1
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1get_1send_1timeout(JNIEnv* jenv, jobject thisObj, jint fd) Java_com_zerotier_sockets_ZeroTierNative_zts_1get_1send_1timeout(JNIEnv* jenv, jclass clazz, jint fd)
{ {
return zts_get_send_timeout(fd); return zts_get_send_timeout(fd);
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1set_1send_1buf_1size(JNIEnv* jenv, jobject thisObj, jint fd, jint size) Java_com_zerotier_sockets_ZeroTierNative_zts_1set_1send_1buf_1size(JNIEnv* jenv, jclass clazz, jint fd, jint size)
{ {
return zts_set_send_buf_size(fd, size); return zts_set_send_buf_size(fd, size);
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1get_1send_1buf_1size(JNIEnv* jenv, jobject thisObj, jint fd) Java_com_zerotier_sockets_ZeroTierNative_zts_1get_1send_1buf_1size(JNIEnv* jenv, jclass clazz, jint fd)
{ {
return zts_get_send_buf_size(fd); return zts_get_send_buf_size(fd);
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1set_1recv_1buf_1size(JNIEnv* jenv, jobject thisObj, jint fd, jint size) Java_com_zerotier_sockets_ZeroTierNative_zts_1set_1recv_1buf_1size(JNIEnv* jenv, jclass clazz, jint fd, jint size)
{ {
return zts_set_recv_buf_size(fd, size); return zts_set_recv_buf_size(fd, size);
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1get_1recv_1buf_1size(JNIEnv* jenv, jobject thisObj, jint fd) Java_com_zerotier_sockets_ZeroTierNative_zts_1get_1recv_1buf_1size(JNIEnv* jenv, jclass clazz, jint fd)
{ {
return zts_get_recv_buf_size(fd); return zts_get_recv_buf_size(fd);
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1set_1ttl(JNIEnv* jenv, jobject thisObj, jint fd, jint ttl) Java_com_zerotier_sockets_ZeroTierNative_zts_1set_1ttl(JNIEnv* jenv, jclass clazz, jint fd, jint ttl)
{ {
return zts_set_ttl(fd, ttl); return zts_set_ttl(fd, ttl);
} }
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1get_1ttl(JNIEnv* jenv, jobject thisObj, jint fd) JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1get_1ttl(JNIEnv* jenv, jclass clazz, jint fd)
{ {
return zts_get_ttl(fd); return zts_get_ttl(fd);
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1set_1blocking(JNIEnv* jenv, jobject thisObj, jint fd, jint enabled) Java_com_zerotier_sockets_ZeroTierNative_zts_1set_1blocking(JNIEnv* jenv, jclass clazz, jint fd, jint enabled)
{ {
return zts_set_blocking(fd, enabled); return zts_set_blocking(fd, enabled);
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1get_1blocking(JNIEnv* jenv, jobject thisObj, jint fd) Java_com_zerotier_sockets_ZeroTierNative_zts_1get_1blocking(JNIEnv* jenv, jclass clazz, jint fd)
{ {
return zts_get_blocking(fd); return zts_get_blocking(fd);
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1set_1keepalive(JNIEnv* jenv, jobject thisObj, jint fd, jint enabled) Java_com_zerotier_sockets_ZeroTierNative_zts_1set_1keepalive(JNIEnv* jenv, jclass clazz, jint fd, jint enabled)
{ {
return zts_set_keepalive(fd, enabled); return zts_set_keepalive(fd, enabled);
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1get_1keepalive(JNIEnv* jenv, jobject thisObj, jint fd) Java_com_zerotier_sockets_ZeroTierNative_zts_1get_1keepalive(JNIEnv* jenv, jclass clazz, jint fd)
{ {
return zts_get_keepalive(fd); return zts_get_keepalive(fd);
} }
@@ -989,25 +987,25 @@ JNIEXPORT ip_addr* JNICALL dns_1get_1server(JNIEnv* jenv, jobject thisObj, uint8
return NULL; return NULL;
} }
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1core_1lock_1obtain(JNIEnv* jenv, jobject thisObj) JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1core_1lock_1obtain(JNIEnv* jenv, jclass clazz)
{ {
return zts_core_lock_obtain(); return zts_core_lock_obtain();
} }
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1core_1lock_1release(JNIEnv* jenv, jobject thisObj) JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1core_1lock_1release(JNIEnv* jenv, jclass clazz)
{ {
return zts_core_lock_release(); return zts_core_lock_release();
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1core_1query_1addr_1count(JNIEnv* jenv, jobject thisObj, jlong net_id) Java_com_zerotier_sockets_ZeroTierNative_zts_1core_1query_1addr_1count(JNIEnv* jenv, jclass clazz, jlong net_id)
{ {
return zts_core_query_addr_count(net_id); return zts_core_query_addr_count(net_id);
} }
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1core_1query_1addr( JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1core_1query_1addr(
JNIEnv* jenv, JNIEnv* jenv,
jobject thisObj, jclass clazz,
jlong net_id, jlong net_id,
jint idx, jint idx,
jstring addr, jstring addr,
@@ -1017,7 +1015,7 @@ JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1core_1query
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1core_1query_1route_1count(JNIEnv* jenv, jobject thisObj, jlong net_id) Java_com_zerotier_sockets_ZeroTierNative_zts_1core_1query_1route_1count(JNIEnv* jenv, jclass clazz, jlong net_id)
{ {
return zts_core_query_route_count(net_id); return zts_core_query_route_count(net_id);
} }
@@ -1037,14 +1035,14 @@ JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1core_1query
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1core_1query_1path_1count(JNIEnv* jenv, jobject thisObj, jlong peer_id) Java_com_zerotier_sockets_ZeroTierNative_zts_1core_1query_1path_1count(JNIEnv* jenv, jclass clazz, jlong peer_id)
{ {
return zts_core_query_path_count(peer_id); return zts_core_query_path_count(peer_id);
} }
JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1core_1query_1path( JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1core_1query_1path(
JNIEnv* jenv, JNIEnv* jenv,
jobject thisObj, jclass clazz,
jlong peer_id, jlong peer_id,
jint idx, jint idx,
jstring dst, jstring dst,
@@ -1054,7 +1052,7 @@ JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1core_1query
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1core_1query_1mc_1count(JNIEnv* jenv, jobject thisObj, jlong net_id) Java_com_zerotier_sockets_ZeroTierNative_zts_1core_1query_1mc_1count(JNIEnv* jenv, jclass clazz, jlong net_id)
{ {
return zts_core_query_mc_count(net_id); return zts_core_query_mc_count(net_id);
} }
@@ -1087,7 +1085,7 @@ JNIEXPORT jint JNICALL Java_com_zerotier_sockets_ZeroTierNative_zts_1util_1roots
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL
Java_com_zerotier_sockets_ZeroTierNative_zts_1util_1delay(JNIEnv* jenv, jobject thisObj, jlong milliseconds) Java_com_zerotier_sockets_ZeroTierNative_zts_1util_1delay(JNIEnv* jenv, jclass clazz, jlong milliseconds)
{ {
zts_util_delay(milliseconds); zts_util_delay(milliseconds);
} }

View File

@@ -165,7 +165,7 @@ public class ZeroTierDatagramSocket {
0, 0,
packet.getLength()); packet.getLength());
if ((bytesRead <= 0) | (bytesRead == -104) /* EINTR, from SO_RCVTIMEO */) { if ((bytesRead <= 0) | (bytesRead == -104) /* EINTR, from SO_RCVTIMEO */) {
throw new IOException("read(DatagramPacket), errno=" + bytesRead); throw new IOException("read(DatagramPacket), errno=" + bytesRead);
} }
} }
@@ -277,16 +277,16 @@ public class ZeroTierDatagramSocket {
* Return whether this ZeroTierSocket is bound to a local address * Return whether this ZeroTierSocket is bound to a local address
* @return true or false * @return true or false
*/ */
public boolean isBound() public boolean isBound()
{ {
return _socket.isBound(); return _socket.isBound();
} }
/** /**
* Return whether this ZeroTierSocket has been closed * Return whether this ZeroTierSocket has been closed
* @return true or false * @return true or false
*/ */
public boolean isClosed() public boolean isClosed()
{ {
return _socket.isClosed(); return _socket.isClosed();
} }
@@ -295,7 +295,7 @@ public class ZeroTierDatagramSocket {
* Return whether this ZeroTierSocket is connected to a remote address * Return whether this ZeroTierSocket is connected to a remote address
* @return true or false * @return true or false
*/ */
public boolean isConnected() public boolean isConnected()
{ {
return _socket.isConnected(); return _socket.isConnected();
} }

View File

@@ -18,7 +18,7 @@ package com.zerotier.sockets;
*/ */
public interface ZeroTierEventListener { public interface ZeroTierEventListener {
/* /*
* Called when an even occurs within ZeroTier * Called when an event occurs within ZeroTier
*/ */
public void onZeroTierEvent(long id, int eventCode); public void onZeroTierEvent(long id, int eventCode);
} }

View File

@@ -30,7 +30,7 @@ public class ZeroTierInputStream extends InputStream {
* Close the ZeroTierInputStream * Close the ZeroTierInputStream
* @exception IOException when an I/O error occurs * @exception IOException when an I/O error occurs
*/ */
public void close() throws IOException public void close() throws IOException
{ {
/* Note: this operation currently only stops RX on a socket that is shared /* Note: this operation currently only stops RX on a socket that is shared
between both I/OStreams. This means that closing this stream will only shutdown between both I/OStreams. This means that closing this stream will only shutdown
@@ -47,7 +47,7 @@ public class ZeroTierInputStream extends InputStream {
* @return Number of bytes transferred * @return Number of bytes transferred
* @exception IOException when an I/O error occurs * @exception IOException when an I/O error occurs
*/ */
public long transferTo(OutputStream destStream) throws IOException public long transferTo(OutputStream destStream) throws IOException
{ {
Objects.requireNonNull(destStream, "destStream must not be null"); Objects.requireNonNull(destStream, "destStream must not be null");
int bytesTransferred = 0, bytesRead; int bytesTransferred = 0, bytesRead;
@@ -64,7 +64,7 @@ public class ZeroTierInputStream extends InputStream {
* @return Single byte read * @return Single byte read
* @exception IOException when an I/O error occurs * @exception IOException when an I/O error occurs
*/ */
public int read() throws IOException public int read() throws IOException
{ {
byte[] buf = new byte[1]; byte[] buf = new byte[1];
// Unlike a native read(), if nothing is read we should return -1 // Unlike a native read(), if nothing is read we should return -1
@@ -73,7 +73,7 @@ public class ZeroTierInputStream extends InputStream {
return -1; return -1;
} }
if (retval < 0) { if (retval < 0) {
throw new IOException("read(), errno=" + retval); throw new IOException("read(), errno=" + retval);
} }
return buf[0]; return buf[0];
} }
@@ -84,7 +84,7 @@ public class ZeroTierInputStream extends InputStream {
* @return Number of bytes read * @return Number of bytes read
* @exception IOException when an I/O error occurs * @exception IOException when an I/O error occurs
*/ */
public int read(byte[] destBuffer) throws IOException public int read(byte[] destBuffer) throws IOException
{ {
Objects.requireNonNull(destBuffer, "input byte array must not be null"); Objects.requireNonNull(destBuffer, "input byte array must not be null");
// Unlike a native read(), if nothing is read we should return -1 // Unlike a native read(), if nothing is read we should return -1
@@ -93,7 +93,7 @@ public class ZeroTierInputStream extends InputStream {
return -1; return -1;
} }
if (retval < 0) { if (retval < 0) {
throw new IOException("read(destBuffer), errno=" + retval); throw new IOException("read(destBuffer), errno=" + retval);
} }
return retval; return retval;
} }
@@ -106,7 +106,7 @@ public class ZeroTierInputStream extends InputStream {
* @return Number of bytes read. * @return Number of bytes read.
* @exception IOException when an I/O error occurs * @exception IOException when an I/O error occurs
*/ */
public int read(byte[] destBuffer, int offset, int numBytes) throws IOException public int read(byte[] destBuffer, int offset, int numBytes) throws IOException
{ {
Objects.requireNonNull(destBuffer, "input byte array must not be null"); Objects.requireNonNull(destBuffer, "input byte array must not be null");
if (offset < 0) { if (offset < 0) {
@@ -127,7 +127,7 @@ public class ZeroTierInputStream extends InputStream {
return -1; return -1;
} }
if (retval < 0) { if (retval < 0) {
throw new IOException("read(destBuffer, offset, numBytes), errno=" + retval); throw new IOException("read(destBuffer, offset, numBytes), errno=" + retval);
} }
return retval; return retval;
} }
@@ -137,7 +137,7 @@ public class ZeroTierInputStream extends InputStream {
* @return Array of bytes * @return Array of bytes
* @exception IOException when an I/O error occurs * @exception IOException when an I/O error occurs
*/ */
public byte[] readAllBytes() throws IOException public byte[] readAllBytes() throws IOException
{ {
int pendingDataSize = ZeroTierNative.zts_get_pending_data_size(zfd); int pendingDataSize = ZeroTierNative.zts_get_pending_data_size(zfd);
byte[] buf = new byte[pendingDataSize]; byte[] buf = new byte[pendingDataSize];
@@ -146,7 +146,7 @@ public class ZeroTierInputStream extends InputStream {
// No action needed // No action needed
} }
if (retval < 0) { if (retval < 0) {
throw new IOException("readAllBytes(), errno=" + retval); throw new IOException("readAllBytes(), errno=" + retval);
} }
return buf; return buf;
} }
@@ -159,7 +159,7 @@ public class ZeroTierInputStream extends InputStream {
* @return Nothing. * @return Nothing.
* @exception IOException when an I/O error occurs * @exception IOException when an I/O error occurs
*/ */
public int readNBytes(byte[] destBuffer, int offset, int numBytes) throws IOException public int readNBytes(byte[] destBuffer, int offset, int numBytes) throws IOException
{ {
Objects.requireNonNull(destBuffer, "input byte array must not be null"); Objects.requireNonNull(destBuffer, "input byte array must not be null");
if (offset < 0) { if (offset < 0) {
@@ -179,7 +179,7 @@ public class ZeroTierInputStream extends InputStream {
// No action needed // No action needed
} }
if (retval < 0) { if (retval < 0) {
throw new IOException("readNBytes(destBuffer, offset, numBytes), errno=" + retval); throw new IOException("readNBytes(destBuffer, offset, numBytes), errno=" + retval);
} }
return retval; return retval;
} }
@@ -190,7 +190,7 @@ public class ZeroTierInputStream extends InputStream {
* @return Nothing. * @return Nothing.
* @exception IOException when an I/O error occurs * @exception IOException when an I/O error occurs
*/ */
public long skip(long numBytes) throws IOException public long skip(long numBytes) throws IOException
{ {
if (numBytes <= 0) { if (numBytes <= 0) {
return 0; return 0;

View File

@@ -228,7 +228,7 @@ public class ZeroTierNative {
public static int ZTS_SO_DONTROUTE = 0x00000010; // NOT YET SUPPORTED public static int ZTS_SO_DONTROUTE = 0x00000010; // NOT YET SUPPORTED
public static int ZTS_SO_USELOOPBACK = 0x00000040; // NOT YET SUPPORTED public static int ZTS_SO_USELOOPBACK = 0x00000040; // NOT YET SUPPORTED
public static int ZTS_SO_LINGER = 0x00000080; public static int ZTS_SO_LINGER = 0x00000080;
public static int ZTS_SO_DONTLINGER = ((int)(~ZTS_SO_LINGER)); public static int ZTS_SO_DONTLINGER = (~ZTS_SO_LINGER);
public static int ZTS_SO_OOBINLINE = 0x00000100; // NOT YET SUPPORTED public static int ZTS_SO_OOBINLINE = 0x00000100; // NOT YET SUPPORTED
public static int ZTS_SO_REUSEPORT = 0x00000200; // NOT YET SUPPORTED public static int ZTS_SO_REUSEPORT = 0x00000200; // NOT YET SUPPORTED
public static int ZTS_SO_SNDBUF = 0x00001001; // NOT YET SUPPORTED public static int ZTS_SO_SNDBUF = 0x00001001; // NOT YET SUPPORTED
@@ -407,7 +407,7 @@ public class ZeroTierNative {
/** /**
* Maximum number of direct network paths to a given peer * Maximum number of direct network paths to a given peer
*/ */
public static int ZTS_MAX_PEER_NETWORK_PATHS = 16; public static int ZTS_MAX_PEER_NETWORK_PATHS = 64;
/** /**
* Maximum number of multicast groups a device / network interface can be * Maximum number of multicast groups a device / network interface can be

View File

@@ -76,7 +76,6 @@ public class ZeroTierServerSocket {
/** /**
* Bind to a local address * Bind to a local address
* @param localAddr Local address to which this socket should bind * @param localAddr Local address to which this socket should bind
* @param localPort Local port to which this socket should bind
* *
* @exception IOException when an I/O error occurs * @exception IOException when an I/O error occurs
*/ */
@@ -86,19 +85,6 @@ public class ZeroTierServerSocket {
_socket.bind(inetAddr.getHostName(), inetAddr.getPort()); _socket.bind(inetAddr.getHostName(), inetAddr.getPort());
} }
/**
* Bind to a local address
* @param localAddr Local address to which this socket should bind
* @param localPort Local port to which this socket should bind
*
* @exception IOException when an I/O error occurs
*/
public void bind(SocketAddress localAddr, int backlog) throws IOException
{
InetSocketAddress inetAddr = (InetSocketAddress)localAddr;
_socket.bind(inetAddr.getHostName(), inetAddr.getPort());
}
/** /**
* Close the ZeroTierSocket. * Close the ZeroTierSocket.
* *

View File

@@ -232,12 +232,12 @@ public class ZeroTierSocket {
if (_zfd < 0) { if (_zfd < 0) {
throw new IOException("Invalid socket (fd < 0)"); throw new IOException("Invalid socket (fd < 0)");
} }
int accetpedFd = -1; int acceptedFd = -1;
ZeroTierSocketAddress addr = new ZeroTierSocketAddress(); ZeroTierSocketAddress addr = new ZeroTierSocketAddress();
if ((accetpedFd = ZeroTierNative.zts_bsd_accept(_zfd, addr)) < 0) { if ((acceptedFd = ZeroTierNative.zts_bsd_accept(_zfd, addr)) < 0) {
throw new IOException("Error while accepting connection (" + accetpedFd + ")"); throw new IOException("Error while accepting connection (" + acceptedFd + ")");
} }
return new ZeroTierSocket(_family, _type, _protocol, accetpedFd); return new ZeroTierSocket(_family, _type, _protocol, acceptedFd);
} }
/** /**
@@ -421,7 +421,7 @@ public class ZeroTierSocket {
* Return whether this ZeroTierSocket is bound to a local address * Return whether this ZeroTierSocket is bound to a local address
* @return true or false * @return true or false
*/ */
public boolean isBound() public boolean isBound()
{ {
return _isBound; return _isBound;
} }
@@ -430,7 +430,7 @@ public class ZeroTierSocket {
* Return whether this ZeroTierSocket has been closed * Return whether this ZeroTierSocket has been closed
* @return true or false * @return true or false
*/ */
public boolean isClosed() public boolean isClosed()
{ {
return _isClosed; return _isClosed;
} }
@@ -439,7 +439,7 @@ public class ZeroTierSocket {
* Return whether this ZeroTierSocket is connected to a remote address * Return whether this ZeroTierSocket is connected to a remote address
* @return true or false * @return true or false
*/ */
public boolean isConnected() public boolean isConnected()
{ {
return _isConnected; return _isConnected;
} }
@@ -526,7 +526,7 @@ public class ZeroTierSocket {
* Return whether the input-aspect of the ZeroTierSocket has been disabled. * Return whether the input-aspect of the ZeroTierSocket has been disabled.
* @return true or false * @return true or false
*/ */
public boolean inputStreamHasBeenShutdown() public boolean inputStreamHasBeenShutdown()
{ {
return _inputHasBeenShutdown; return _inputHasBeenShutdown;
} }
@@ -535,7 +535,7 @@ public class ZeroTierSocket {
* Return whether the output-aspect of the ZeroTierSocket has been disabled. * Return whether the output-aspect of the ZeroTierSocket has been disabled.
* @return true or false * @return true or false
*/ */
public boolean outputStreamHasBeenShutdown() public boolean outputStreamHasBeenShutdown()
{ {
return _outputHasBeenShutdown; return _outputHasBeenShutdown;
} }

View File

@@ -149,7 +149,7 @@ happening sooner than they should.
#define TCP_FAST_INTERVAL TCP_TMR_INTERVAL #define TCP_FAST_INTERVAL TCP_TMR_INTERVAL
#endif /* TCP_FAST_INTERVAL */ #endif /* TCP_FAST_INTERVAL */
#ifndef TCP_SLOW_INTERVALs #ifndef TCP_SLOW_INTERVAL
/* the coarse grained timeout in milliseconds */ /* the coarse grained timeout in milliseconds */
#define TCP_SLOW_INTERVAL (2*TCP_TMR_INTERVAL) #define TCP_SLOW_INTERVAL (2*TCP_TMR_INTERVAL)
#endif /* TCP_SLOW_INTERVAL */ #endif /* TCP_SLOW_INTERVAL */

77
test/ExitTest.java Normal file
View File

@@ -0,0 +1,77 @@
import com.zerotier.sockets.*;
//
// Test for:
// Java process does not exit after finishing libzt work
// https://github.com/zerotier/libzt/issues/242
//
// Run and ensure that process exits
//
public class ExitTest {
public static void main(String[] args) throws InterruptedException {
long networkId = Long.parseUnsignedLong("ebe7fbd445e76ac6", 16);
String storagePath = "exittest_storage";
ZeroTierNode node = new ZeroTierNode();
node.initFromStorage(storagePath);
node.initSetEventHandler(new ZeroTierEventListener() {
@Override
public void onZeroTierEvent(long l, int eventCode) {
if (eventCode == ZeroTierNative.ZTS_EVENT_NODE_UP) {
System.err.println("ZTS_EVENT_NODE_UP");
}
if (eventCode == ZeroTierNative.ZTS_EVENT_NODE_ONLINE) {
System.err.println("ZTS_EVENT_NODE_ONLINE");
}
if (eventCode == ZeroTierNative.ZTS_EVENT_NODE_OFFLINE) {
System.err.println("ZTS_EVENT_NODE_OFFLINE");
}
if (eventCode == ZeroTierNative.ZTS_EVENT_NODE_DOWN) {
System.err.println("ZTS_EVENT_NODE_DOWN");
}
if (eventCode == ZeroTierNative.ZTS_EVENT_NETWORK_READY_IP4) {
System.err.println("ZTS_EVENT_NETWORK_READY_IP4");
}
if (eventCode == ZeroTierNative.ZTS_EVENT_NETWORK_READY_IP6) {
System.err.println("ZTS_EVENT_NETWORK_READY_IP6");
}
if (eventCode == ZeroTierNative.ZTS_EVENT_NETWORK_DOWN) {
System.err.println("ZTS_EVENT_NETWORK_DOWN");
}
if (eventCode == ZeroTierNative.ZTS_EVENT_NETWORK_OK) {
System.err.println("ZTS_EVENT_NETWORK_OK");
}
if (eventCode == ZeroTierNative.ZTS_EVENT_NETWORK_ACCESS_DENIED) {
System.err.println("ZTS_EVENT_NETWORK_ACCESS_DENIED");
}
if (eventCode == ZeroTierNative.ZTS_EVENT_NETWORK_NOT_FOUND) {
System.err.println("ZTS_EVENT_NETWORK_NOT_FOUND");
}
}
});
System.err.println("start");
node.start();
System.err.println("delay until online");
while (!node.isOnline()) {
ZeroTierNative.zts_util_delay(50);
}
System.err.println("done delaying");
System.out.println("join");
node.join(networkId);
System.out.println("delaying until transport ready");
while (! node.isNetworkTransportReady(networkId)) {
ZeroTierNative.zts_util_delay(50);
}
System.err.println("stop");
node.stop();
System.err.println("exiting");
}
}