From d063f583eecbcd98837cbbb98a79ac604664625b Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Mon, 5 Sep 2016 13:52:29 -0700 Subject: Added VirtualNetworkRoute class and added it to VirtualNetworkConfig --- java/jni/ZT_jniutils.cpp | 104 ++++++++++++++++++++- java/jni/ZT_jniutils.h | 2 + .../src/com/zerotier/sdk/VirtualNetworkConfig.java | 8 ++ java/src/com/zerotier/sdk/VirtualnetworkRoute.java | 55 +++++++++++ 4 files changed, 168 insertions(+), 1 deletion(-) create mode 100644 java/src/com/zerotier/sdk/VirtualnetworkRoute.java (limited to 'java') diff --git a/java/jni/ZT_jniutils.cpp b/java/jni/ZT_jniutils.cpp index 512bf839..5f54751d 100644 --- a/java/jni/ZT_jniutils.cpp +++ b/java/jni/ZT_jniutils.cpp @@ -609,6 +609,7 @@ jobject newNetworkConfig(JNIEnv *env, const ZT_VirtualNetworkConfig &vnetConfig) jfieldID portErrorField = NULL; jfieldID netconfRevisionField = NULL; jfieldID assignedAddressesField = NULL; + jfieldID routesField = NULL; vnetConfigClass = lookup.findClass("com/zerotier/sdk/VirtualNetworkConfig"); if(vnetConfigClass == NULL) @@ -716,6 +717,13 @@ jobject newNetworkConfig(JNIEnv *env, const ZT_VirtualNetworkConfig &vnetConfig) return NULL; } + routesField = lookup.findField(vnetConfigClass, "routes", "[Lcom/zerotier/sdk/VirtualNetworkRoute"); + if(env->ExceptionCheck() || routesField == NULL) + { + LOGE("Error getting routes field"); + return NULL; + } + env->SetLongField(vnetConfigObj, nwidField, vnetConfig.nwid); env->SetLongField(vnetConfigObj, macField, vnetConfig.mac); jstring nameStr = env->NewStringUTF(vnetConfig.name); @@ -773,6 +781,34 @@ jobject newNetworkConfig(JNIEnv *env, const ZT_VirtualNetworkConfig &vnetConfig) env->SetObjectField(vnetConfigObj, assignedAddressesField, assignedAddrArrayObj); + jclass virtualNetworkRouteClass = lookup.findClass("com/zerotier/sdk/VirtualNetworkRoute"); + if(env->ExceptionCheck() || virtualNetworkRouteClass == NULL) + { + LOGE("Error finding VirtualNetworkRoute class"); + return NULL; + } + + jobjectArray routesArrayObj = env->NewObjectArray( + vnetConfig.routeCount, virtualNetworkRouteClass, NULL); + if(env->ExceptionCheck() || routesArrayObj == NULL) + { + LOGE("Error creating VirtualNetworkRoute[] array"); + return NULL; + } + + for(unsigned int i = 0; i < vnetConfig.routeCount; ++i) + { + jobject routeObj = newVirtualNetworkRoute(env, vnetConfig.routes[i]); + env->SetObjectArrayElement(routesArrayObj, i, routeObj); + if(env->ExceptionCheck()) + { + LOGE("Error assigning VirtualNetworkRoute to array"); + return NULL; + } + } + + env->SetObjectField(vnetConfigObj, routesField, routesArrayObj); + return vnetConfigObj; } @@ -831,6 +867,72 @@ jobject newVersion(JNIEnv *env, int major, int minor, int rev) return versionObj; } +jobject newVirtualNetworkRoute(JNIEnv *env, const ZT_VirtualNetworkRoute &route) +{ + jclass virtualNetworkRouteClass = NULL; + jmethodID routeConstructor = NULL; + + virtualNetworkRouteClass = lookup.findClass("com/zerotier/sdk/VirtualNetworkRoute"); + if(env->ExceptionCheck() || virtualNetworkRouteClass == NULL) + { + return NULL; + } + + routeConstructor = lookup.findMethod(virtualNetworkRouteClass, "", "()V"); + if(env->ExceptionCheck() || routeConstructor == NULL) + { + return NULL; + } + + jobject routeObj = env->NewObject(virtualNetworkRouteClass, routeConstructor); + if(env->ExceptionCheck() || routeObj == NULL) + { + return NULL; + } + + jfieldID targetField = NULL; + jfieldID viaField = NULL; + jfieldID flagsField = NULL; + jfieldID metricField = NULL; + + targetField = lookup.findField(virtualNetworkRouteClass, "target", + "Ljava/net/InetSocketAddress"); + if(env->ExceptionCheck() || targetField == NULL) + { + return NULL; + } + + viaField = lookup.findField(virtualNetworkRouteClass, "via", + "Ljava/net/InetSocketAddress"); + if(env->ExceptionCheck() || targetField == NULL) + { + return NULL; + } + + flagsField = lookup.findField(virtualNetworkRouteClass, "flags", "I"); + if(env->ExceptionCheck() || flagsField == NULL) + { + return NULL; + } + + metricField = lookup.findField(virtualNetworkRouteClass, "metric", "I"); + if(env->ExceptionCheck() || metricField == NULL) + { + return NULL; + } + + jobject targetObj = newInetSocketAddress(env, route.target); + jobject viaObj = newInetSocketAddress(env, route.via); + + env->SetObjectField(routeObj, targetField, targetObj); + env->SetObjectField(routeObj, viaField, viaObj); + env->SetIntField(routeObj, flagsField, (jint)route.flags); + env->SetIntField(routeObj, metricField, (jint)route.metric); + + return routeObj; +} + #ifdef __cplusplus } -#endif \ No newline at end of file +#endif + diff --git a/java/jni/ZT_jniutils.h b/java/jni/ZT_jniutils.h index 34dfc471..4dec7201 100644 --- a/java/jni/ZT_jniutils.h +++ b/java/jni/ZT_jniutils.h @@ -42,6 +42,8 @@ jobject newNetworkConfig(JNIEnv *env, const ZT_VirtualNetworkConfig &config); jobject newVersion(JNIEnv *env, int major, int minor, int rev); +jobject newVirtualNetworkRoute(JNIEnv *env, const ZT_VirtualNetworkRoute &route); + #ifdef __cplusplus } #endif diff --git a/java/src/com/zerotier/sdk/VirtualNetworkConfig.java b/java/src/com/zerotier/sdk/VirtualNetworkConfig.java index fbcbd3a4..0999525c 100644 --- a/java/src/com/zerotier/sdk/VirtualNetworkConfig.java +++ b/java/src/com/zerotier/sdk/VirtualNetworkConfig.java @@ -50,6 +50,7 @@ public final class VirtualNetworkConfig implements Comparable. + * + * -- + * + * ZeroTier may be used and distributed under the terms of the GPLv3, which + * are available at: http://www.gnu.org/licenses/gpl-3.0.html + * + * If you would like to embed ZeroTier into a commercial application or + * redistribute it in a modified binary form, please contact ZeroTier Networks + * LLC. Start here: http://www.zerotier.com/ + */ + +package com.zerotier.sdk; + +import java.net.InetSocketAddress; + +class VirtualNetworkRoute +{ + private VirtualNetworkRoute() {} + + /** + * Target network / netmask bits (in port field) or NULL or 0.0.0.0/0 for default + */ + public InetSocketAddress target; + + /** + * Gateway IP address (port ignored) or NULL (family == 0) for LAN-local (no gateway) + */ + public InetSocketAddress via; + + /** + * Route flags + */ + public int flags; + + /** + * Route metric (not currently used) + */ + public int metric; +} -- cgit v1.2.3 From 8682c90c7d7dc900bcf0589fd67a98ad773f52f8 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Mon, 5 Sep 2016 14:10:07 -0700 Subject: ensure routes are also equal when checking for equality on VirtualNetworkConfig objects --- java/src/com/zerotier/sdk/VirtualNetworkConfig.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'java') diff --git a/java/src/com/zerotier/sdk/VirtualNetworkConfig.java b/java/src/com/zerotier/sdk/VirtualNetworkConfig.java index 0999525c..64512dad 100644 --- a/java/src/com/zerotier/sdk/VirtualNetworkConfig.java +++ b/java/src/com/zerotier/sdk/VirtualNetworkConfig.java @@ -61,13 +61,24 @@ public final class VirtualNetworkConfig implements Comparable Date: Mon, 5 Sep 2016 14:27:44 -0700 Subject: fix capitalization on file --- java/src/com/zerotier/sdk/VirtualNetworkRoute.java | 55 ++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 java/src/com/zerotier/sdk/VirtualNetworkRoute.java (limited to 'java') diff --git a/java/src/com/zerotier/sdk/VirtualNetworkRoute.java b/java/src/com/zerotier/sdk/VirtualNetworkRoute.java new file mode 100644 index 00000000..ce4d1b49 --- /dev/null +++ b/java/src/com/zerotier/sdk/VirtualNetworkRoute.java @@ -0,0 +1,55 @@ +/* + * ZeroTier One - Network Virtualization Everywhere + * Copyright (C) 2011-2015 ZeroTier, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * -- + * + * ZeroTier may be used and distributed under the terms of the GPLv3, which + * are available at: http://www.gnu.org/licenses/gpl-3.0.html + * + * If you would like to embed ZeroTier into a commercial application or + * redistribute it in a modified binary form, please contact ZeroTier Networks + * LLC. Start here: http://www.zerotier.com/ + */ + +package com.zerotier.sdk; + +import java.net.InetSocketAddress; + +class VirtualNetworkRoute +{ + private VirtualNetworkRoute() {} + + /** + * Target network / netmask bits (in port field) or NULL or 0.0.0.0/0 for default + */ + public InetSocketAddress target; + + /** + * Gateway IP address (port ignored) or NULL (family == 0) for LAN-local (no gateway) + */ + public InetSocketAddress via; + + /** + * Route flags + */ + public int flags; + + /** + * Route metric (not currently used) + */ + public int metric; +} -- cgit v1.2.3 From 9f717e79ea6be730e1cb7cd237c8112d6601c97e Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Mon, 5 Sep 2016 14:42:36 -0700 Subject: Fixing filename again.... --- java/jni/Android.mk | 5 +++-- java/src/com/zerotier/sdk/VirtualNetworkRoute.java | 2 +- java/src/com/zerotier/sdk/VirtualnetworkRoute.java | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) (limited to 'java') diff --git a/java/jni/Android.mk b/java/jni/Android.mk index c563879c..6b5d4a4b 100644 --- a/java/jni/Android.mk +++ b/java/jni/Android.mk @@ -11,14 +11,14 @@ LOCAL_LDLIBS := -llog # ZeroTierOne SDK source files LOCAL_SRC_FILES := \ $(ZT1)/ext/lz4/lz4.c \ - $(ZT1)/ext/json-parser/json.c \ $(ZT1)/ext/http-parser/http_parser.c \ $(ZT1)/node/C25519.cpp \ + $(ZT1)/node/Capability.cpp \ $(ZT1)/node/CertificateOfMembership.cpp \ - $(ZT1)/node/DeferredPackets.cpp \ $(ZT1)/node/Identity.cpp \ $(ZT1)/node/IncomingPacket.cpp \ $(ZT1)/node/InetAddress.cpp \ + $(ZT1)/node/Membership.cpp \ $(ZT1)/node/Multicaster.cpp \ $(ZT1)/node/Network.cpp \ $(ZT1)/node/NetworkConfig.cpp \ @@ -32,6 +32,7 @@ LOCAL_SRC_FILES := \ $(ZT1)/node/SelfAwareness.cpp \ $(ZT1)/node/SHA512.cpp \ $(ZT1)/node/Switch.cpp \ + $(ZT1)/node/Tag.cpp \ $(ZT1)/node/Topology.cpp \ $(ZT1)/node/Utils.cpp \ $(ZT1)/osdep/Http.cpp \ diff --git a/java/src/com/zerotier/sdk/VirtualNetworkRoute.java b/java/src/com/zerotier/sdk/VirtualNetworkRoute.java index ce4d1b49..32376cb9 100644 --- a/java/src/com/zerotier/sdk/VirtualNetworkRoute.java +++ b/java/src/com/zerotier/sdk/VirtualNetworkRoute.java @@ -29,7 +29,7 @@ package com.zerotier.sdk; import java.net.InetSocketAddress; -class VirtualNetworkRoute +public class VirtualNetworkRoute { private VirtualNetworkRoute() {} diff --git a/java/src/com/zerotier/sdk/VirtualnetworkRoute.java b/java/src/com/zerotier/sdk/VirtualnetworkRoute.java index ce4d1b49..32376cb9 100644 --- a/java/src/com/zerotier/sdk/VirtualnetworkRoute.java +++ b/java/src/com/zerotier/sdk/VirtualnetworkRoute.java @@ -29,7 +29,7 @@ package com.zerotier.sdk; import java.net.InetSocketAddress; -class VirtualNetworkRoute +public class VirtualNetworkRoute { private VirtualNetworkRoute() {} -- cgit v1.2.3 From 598ca48ed6aa22246b5daee7fb03aa48ee2cdad1 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Mon, 5 Sep 2016 16:12:06 -0700 Subject: Attempting to fix VirtualNetworkRoute having 2 entries in git. Yay non case sensitive filesystems --- java/src/com/zerotier/sdk/VirtualNetworkRoute.java | 55 ---------------------- java/src/com/zerotier/sdk/VirtualnetworkRoute.java | 55 ---------------------- 2 files changed, 110 deletions(-) delete mode 100644 java/src/com/zerotier/sdk/VirtualNetworkRoute.java delete mode 100644 java/src/com/zerotier/sdk/VirtualnetworkRoute.java (limited to 'java') diff --git a/java/src/com/zerotier/sdk/VirtualNetworkRoute.java b/java/src/com/zerotier/sdk/VirtualNetworkRoute.java deleted file mode 100644 index 32376cb9..00000000 --- a/java/src/com/zerotier/sdk/VirtualNetworkRoute.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * ZeroTier One - Network Virtualization Everywhere - * Copyright (C) 2011-2015 ZeroTier, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * -- - * - * ZeroTier may be used and distributed under the terms of the GPLv3, which - * are available at: http://www.gnu.org/licenses/gpl-3.0.html - * - * If you would like to embed ZeroTier into a commercial application or - * redistribute it in a modified binary form, please contact ZeroTier Networks - * LLC. Start here: http://www.zerotier.com/ - */ - -package com.zerotier.sdk; - -import java.net.InetSocketAddress; - -public class VirtualNetworkRoute -{ - private VirtualNetworkRoute() {} - - /** - * Target network / netmask bits (in port field) or NULL or 0.0.0.0/0 for default - */ - public InetSocketAddress target; - - /** - * Gateway IP address (port ignored) or NULL (family == 0) for LAN-local (no gateway) - */ - public InetSocketAddress via; - - /** - * Route flags - */ - public int flags; - - /** - * Route metric (not currently used) - */ - public int metric; -} diff --git a/java/src/com/zerotier/sdk/VirtualnetworkRoute.java b/java/src/com/zerotier/sdk/VirtualnetworkRoute.java deleted file mode 100644 index 32376cb9..00000000 --- a/java/src/com/zerotier/sdk/VirtualnetworkRoute.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * ZeroTier One - Network Virtualization Everywhere - * Copyright (C) 2011-2015 ZeroTier, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * -- - * - * ZeroTier may be used and distributed under the terms of the GPLv3, which - * are available at: http://www.gnu.org/licenses/gpl-3.0.html - * - * If you would like to embed ZeroTier into a commercial application or - * redistribute it in a modified binary form, please contact ZeroTier Networks - * LLC. Start here: http://www.zerotier.com/ - */ - -package com.zerotier.sdk; - -import java.net.InetSocketAddress; - -public class VirtualNetworkRoute -{ - private VirtualNetworkRoute() {} - - /** - * Target network / netmask bits (in port field) or NULL or 0.0.0.0/0 for default - */ - public InetSocketAddress target; - - /** - * Gateway IP address (port ignored) or NULL (family == 0) for LAN-local (no gateway) - */ - public InetSocketAddress via; - - /** - * Route flags - */ - public int flags; - - /** - * Route metric (not currently used) - */ - public int metric; -} -- cgit v1.2.3 From dcf1f70868407ef38c9ec97772141d003ad20e93 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Mon, 5 Sep 2016 16:12:29 -0700 Subject: re-adding file --- java/src/com/zerotier/sdk/VirtualNetworkRoute.java | 55 ++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 java/src/com/zerotier/sdk/VirtualNetworkRoute.java (limited to 'java') diff --git a/java/src/com/zerotier/sdk/VirtualNetworkRoute.java b/java/src/com/zerotier/sdk/VirtualNetworkRoute.java new file mode 100644 index 00000000..738c4158 --- /dev/null +++ b/java/src/com/zerotier/sdk/VirtualNetworkRoute.java @@ -0,0 +1,55 @@ +/* + * ZeroTier One - Network Virtualization Everywhere + * Copyright (C) 2011-2015 ZeroTier, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * -- + * + * ZeroTier may be used and distributed under the terms of the GPLv3, which + * are available at: http://www.gnu.org/licenses/gpl-3.0.html + * + * If you would like to embed ZeroTier into a commercial application or + * redistribute it in a modified binary form, please contact ZeroTier Networks + * LLC. Start here: http://www.zerotier.com/ + */ + +package com.zerotier.sdk; + +import java.net.InetSocketAddress; + +public final class VirtualNetworkRoute +{ + private VirtualNetworkRoute() {} + + /** + * Target network / netmask bits (in port field) or NULL or 0.0.0.0/0 for default + */ + public InetSocketAddress target; + + /** + * Gateway IP address (port ignored) or NULL (family == 0) for LAN-local (no gateway) + */ + public InetSocketAddress via; + + /** + * Route flags + */ + public int flags; + + /** + * Route metric (not currently used) + */ + public int metric; +} -- cgit v1.2.3 From 43b3ec4b1afa3c3833f1f61ec10c9f22bd5e7359 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Mon, 5 Sep 2016 16:19:04 -0700 Subject: forgot a semicolon in a JNI java type specifier. --- java/jni/ZT_jniutils.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'java') diff --git a/java/jni/ZT_jniutils.cpp b/java/jni/ZT_jniutils.cpp index 5f54751d..d7d205a7 100644 --- a/java/jni/ZT_jniutils.cpp +++ b/java/jni/ZT_jniutils.cpp @@ -710,14 +710,16 @@ jobject newNetworkConfig(JNIEnv *env, const ZT_VirtualNetworkConfig &vnetConfig) return NULL; } - assignedAddressesField = lookup.findField(vnetConfigClass, "assignedAddresses", "[Ljava/net/InetSocketAddress;"); + assignedAddressesField = lookup.findField(vnetConfigClass, "assignedAddresses", + "[Ljava/net/InetSocketAddress;"); if(env->ExceptionCheck() || assignedAddressesField == NULL) { LOGE("Error getting assignedAddresses field"); return NULL; } - routesField = lookup.findField(vnetConfigClass, "routes", "[Lcom/zerotier/sdk/VirtualNetworkRoute"); + routesField = lookup.findField(vnetConfigClass, "routes", + "[Lcom/zerotier/sdk/VirtualNetworkRoute;"); if(env->ExceptionCheck() || routesField == NULL) { LOGE("Error getting routes field"); -- cgit v1.2.3 From 407ad659eab4314764310e2c9d274e73147f6034 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Tue, 6 Sep 2016 17:59:01 -0700 Subject: Reflect changes to strut ZT_PeerPhysicalPath --- java/jni/ZT_jniutils.cpp | 9 --------- java/src/com/zerotier/sdk/PeerPhysicalPath.java | 8 -------- 2 files changed, 17 deletions(-) (limited to 'java') diff --git a/java/jni/ZT_jniutils.cpp b/java/jni/ZT_jniutils.cpp index d7d205a7..f73c408b 100644 --- a/java/jni/ZT_jniutils.cpp +++ b/java/jni/ZT_jniutils.cpp @@ -371,7 +371,6 @@ jobject newPeerPhysicalPath(JNIEnv *env, const ZT_PeerPhysicalPath &ppp) jfieldID addressField = NULL; jfieldID lastSendField = NULL; jfieldID lastReceiveField = NULL; - jfieldID activeField = NULL; jfieldID preferredField = NULL; jmethodID ppp_constructor = NULL; @@ -404,13 +403,6 @@ jobject newPeerPhysicalPath(JNIEnv *env, const ZT_PeerPhysicalPath &ppp) return NULL; } - activeField = lookup.findField(pppClass, "active", "Z"); - if(env->ExceptionCheck() || activeField == NULL) - { - LOGE("Error finding active field"); - return NULL; - } - preferredField = lookup.findField(pppClass, "preferred", "Z"); if(env->ExceptionCheck() || preferredField == NULL) { @@ -441,7 +433,6 @@ jobject newPeerPhysicalPath(JNIEnv *env, const ZT_PeerPhysicalPath &ppp) env->SetObjectField(pppObject, addressField, addressObject); env->SetLongField(pppObject, lastSendField, ppp.lastSend); env->SetLongField(pppObject, lastReceiveField, ppp.lastReceive); - env->SetBooleanField(pppObject, activeField, ppp.active); env->SetBooleanField(pppObject, preferredField, ppp.preferred); if(env->ExceptionCheck()) { diff --git a/java/src/com/zerotier/sdk/PeerPhysicalPath.java b/java/src/com/zerotier/sdk/PeerPhysicalPath.java index d64ea56b..3f9a8612 100644 --- a/java/src/com/zerotier/sdk/PeerPhysicalPath.java +++ b/java/src/com/zerotier/sdk/PeerPhysicalPath.java @@ -37,7 +37,6 @@ public final class PeerPhysicalPath { private long lastSend; private long lastReceive; private boolean fixed; - private boolean active; private boolean preferred; private PeerPhysicalPath() {} @@ -70,13 +69,6 @@ public final class PeerPhysicalPath { return fixed; } - /** - * Is path active? - */ - public final boolean isActive() { - return active; - } - /** * Is path preferred? */ -- cgit v1.2.3 From dccca7df1a893dacc50a605d707917f579d05db9 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Thu, 8 Sep 2016 17:45:40 -0700 Subject: another couple of missing semicolons --- java/jni/ZT_jniutils.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'java') diff --git a/java/jni/ZT_jniutils.cpp b/java/jni/ZT_jniutils.cpp index f73c408b..495efa12 100644 --- a/java/jni/ZT_jniutils.cpp +++ b/java/jni/ZT_jniutils.cpp @@ -889,14 +889,14 @@ jobject newVirtualNetworkRoute(JNIEnv *env, const ZT_VirtualNetworkRoute &route) jfieldID metricField = NULL; targetField = lookup.findField(virtualNetworkRouteClass, "target", - "Ljava/net/InetSocketAddress"); + "Ljava/net/InetSocketAddress;"); if(env->ExceptionCheck() || targetField == NULL) { return NULL; } viaField = lookup.findField(virtualNetworkRouteClass, "via", - "Ljava/net/InetSocketAddress"); + "Ljava/net/InetSocketAddress;"); if(env->ExceptionCheck() || targetField == NULL) { return NULL; -- cgit v1.2.3 From 5fadd8bdd25577cf8fd626a2a2decbedf28c0dd6 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Mon, 19 Sep 2016 12:54:19 -0700 Subject: ZT_PEER_ROLE_RELAY -> ZT_PEER_ROLE_UPSTREAM in JNI glue --- java/jni/ZT_jniutils.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'java') diff --git a/java/jni/ZT_jniutils.cpp b/java/jni/ZT_jniutils.cpp index 495efa12..411a836a 100644 --- a/java/jni/ZT_jniutils.cpp +++ b/java/jni/ZT_jniutils.cpp @@ -162,7 +162,7 @@ jobject createPeerRole(JNIEnv *env, ZT_PeerRole role) case ZT_PEER_ROLE_LEAF: fieldName = "PEER_ROLE_LEAF"; break; - case ZT_PEER_ROLE_RELAY: + case ZT_PEER_ROLE_UPSTREAM: fieldName = "PEER_ROLE_RELAY"; break; case ZT_PEER_ROLE_ROOT: -- cgit v1.2.3 From d87f0293e3bdbb013ce2b48d5518a22e3ecd8c71 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Mon, 19 Sep 2016 13:40:53 -0700 Subject: Don't print a few error messages when they don't matter.
 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- java/jni/ZT_jniutils.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) (limited to 'java') diff --git a/java/jni/ZT_jniutils.cpp b/java/jni/ZT_jniutils.cpp index 411a836a..6faa91a4 100644 --- a/java/jni/ZT_jniutils.cpp +++ b/java/jni/ZT_jniutils.cpp @@ -313,11 +313,20 @@ jobject newInetSocketAddress(JNIEnv *env, const sockaddr_storage &addr) return NULL; } - jobject inetAddressObject = newInetAddress(env, addr); + jobject inetAddressObject = NULL; + + if(addr.ss_family != 0) + { + inetAddressObject = newInetAddress(env, addr); - if(env->ExceptionCheck() || inetAddressObject == NULL) + if(env->ExceptionCheck() || inetAddressObject == NULL) + { + LOGE("Error creating new inet address"); + return NULL; + } + } + else { - LOGE("Error creating new inet address"); return NULL; } @@ -350,10 +359,9 @@ jobject newInetSocketAddress(JNIEnv *env, const sockaddr_storage &addr) break; default: { - LOGE("ERROR: addr.ss_family is not set or unknown"); break; } - }; + } jobject inetSocketAddressObject = env->NewObject(inetSocketAddressClass, inetSocketAddress_constructor, inetAddressObject, port); -- cgit v1.2.3 From 0564bb3b35117c7367469dd5582a5a4093078586 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Wed, 21 Sep 2016 14:09:46 -0700 Subject: added missing copyright/license info from ZT_jniutils --- java/jni/ZT_jniutils.cpp | 18 ++++++++++++++++++ java/jni/ZT_jniutils.h | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+) (limited to 'java') diff --git a/java/jni/ZT_jniutils.cpp b/java/jni/ZT_jniutils.cpp index 6faa91a4..7ecc7256 100644 --- a/java/jni/ZT_jniutils.cpp +++ b/java/jni/ZT_jniutils.cpp @@ -1,3 +1,21 @@ +/* + * ZeroTier One - Network Virtualization Everywhere + * Copyright (C) 2011-2016 ZeroTier, Inc. https://www.zerotier.com/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include "ZT_jniutils.h" #include "ZT_jnilookup.h" #include diff --git a/java/jni/ZT_jniutils.h b/java/jni/ZT_jniutils.h index 4dec7201..e35d4f42 100644 --- a/java/jni/ZT_jniutils.h +++ b/java/jni/ZT_jniutils.h @@ -1,3 +1,21 @@ +/* + * ZeroTier One - Network Virtualization Everywhere + * Copyright (C) 2011-2016 ZeroTier, Inc. https://www.zerotier.com/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #ifndef ZT_jniutils_h_ #define ZT_jniutils_h_ #include -- cgit v1.2.3 From 40d3993ceb64f924167572c3add7300abb434562 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Wed, 21 Sep 2016 14:12:20 -0700 Subject: java code still needed to reflect PEER_ROLE_RELAY rename to PEER_ROLE_UPSTREAM --- java/jni/ZT_jniutils.cpp | 2 +- java/src/com/zerotier/sdk/PeerRole.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'java') diff --git a/java/jni/ZT_jniutils.cpp b/java/jni/ZT_jniutils.cpp index 7ecc7256..27ca7374 100644 --- a/java/jni/ZT_jniutils.cpp +++ b/java/jni/ZT_jniutils.cpp @@ -181,7 +181,7 @@ jobject createPeerRole(JNIEnv *env, ZT_PeerRole role) fieldName = "PEER_ROLE_LEAF"; break; case ZT_PEER_ROLE_UPSTREAM: - fieldName = "PEER_ROLE_RELAY"; + fieldName = "PEER_ROLE_UPSTREAM"; break; case ZT_PEER_ROLE_ROOT: fieldName = "PEER_ROLE_ROOTS"; diff --git a/java/src/com/zerotier/sdk/PeerRole.java b/java/src/com/zerotier/sdk/PeerRole.java index d7d55f05..f281c1b6 100644 --- a/java/src/com/zerotier/sdk/PeerRole.java +++ b/java/src/com/zerotier/sdk/PeerRole.java @@ -34,9 +34,9 @@ public enum PeerRole { PEER_ROLE_LEAF, /** - * relay node + * upstream node */ - PEER_ROLE_RELAY, + PEER_ROLE_UPSTREAM, /** * root server -- cgit v1.2.3 From 8809c6d1221c8e617ad707ab0e4f670d615876ab Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Thu, 13 Oct 2016 14:34:54 -0700 Subject: link atomic library. seems to be required in the latest Android NDK --- java/jni/Android.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'java') diff --git a/java/jni/Android.mk b/java/jni/Android.mk index 6b5d4a4b..5e020950 100644 --- a/java/jni/Android.mk +++ b/java/jni/Android.mk @@ -5,7 +5,7 @@ include $(CLEAR_VARS) LOCAL_MODULE := ZeroTierOneJNI LOCAL_C_INCLUDES := $(ZT1)/include LOCAL_C_INCLUDES += $(ZT1)/node -LOCAL_LDLIBS := -llog +LOCAL_LDLIBS := -llog -latomic # LOCAL_CFLAGS := -g # ZeroTierOne SDK source files -- cgit v1.2.3 From 3a3fe272bbe8355a0048de312f3c333a2950a5fe Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Thu, 13 Oct 2016 15:18:07 -0700 Subject: add Revocation.cpp to android build --- java/jni/Android.mk | 1 + 1 file changed, 1 insertion(+) (limited to 'java') diff --git a/java/jni/Android.mk b/java/jni/Android.mk index 5e020950..73eb2c46 100644 --- a/java/jni/Android.mk +++ b/java/jni/Android.mk @@ -28,6 +28,7 @@ LOCAL_SRC_FILES := \ $(ZT1)/node/Path.cpp \ $(ZT1)/node/Peer.cpp \ $(ZT1)/node/Poly1305.cpp \ + $(ZT1)/node/Revocation.cpp \ $(ZT1)/node/Salsa20.cpp \ $(ZT1)/node/SelfAwareness.cpp \ $(ZT1)/node/SHA512.cpp \ -- cgit v1.2.3 From e1c930f1b7a44d2a1c37d4b9b6f348c2ed7260fc Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Wed, 9 Nov 2016 16:33:01 -0800 Subject: update JNI wrapper to reflect removal of lastMulticastFrame and lastUnicastFrame from ZT_Peer struct --- java/jni/ZT_jniutils.cpp | 18 ------------------ java/src/com/zerotier/sdk/Peer.java | 16 ---------------- 2 files changed, 34 deletions(-) (limited to 'java') diff --git a/java/jni/ZT_jniutils.cpp b/java/jni/ZT_jniutils.cpp index 27ca7374..6b882c6d 100644 --- a/java/jni/ZT_jniutils.cpp +++ b/java/jni/ZT_jniutils.cpp @@ -475,8 +475,6 @@ jobject newPeer(JNIEnv *env, const ZT_Peer &peer) jclass peerClass = NULL; jfieldID addressField = NULL; - jfieldID lastUnicastFrameField = NULL; - jfieldID lastMulticastFrameField = NULL; jfieldID versionMajorField = NULL; jfieldID versionMinorField = NULL; jfieldID versionRevField = NULL; @@ -500,20 +498,6 @@ jobject newPeer(JNIEnv *env, const ZT_Peer &peer) return NULL; } - lastUnicastFrameField = lookup.findField(peerClass, "lastUnicastFrame", "J"); - if(env->ExceptionCheck() || lastUnicastFrameField == NULL) - { - LOGE("Error finding lastUnicastFrame field of Peer object"); - return NULL; - } - - lastMulticastFrameField = lookup.findField(peerClass, "lastMulticastFrame", "J"); - if(env->ExceptionCheck() || lastMulticastFrameField == NULL) - { - LOGE("Error finding lastMulticastFrame field of Peer object"); - return NULL; - } - versionMajorField = lookup.findField(peerClass, "versionMajor", "I"); if(env->ExceptionCheck() || versionMajorField == NULL) { @@ -571,8 +555,6 @@ jobject newPeer(JNIEnv *env, const ZT_Peer &peer) } env->SetLongField(peerObject, addressField, (jlong)peer.address); - env->SetLongField(peerObject, lastUnicastFrameField, (jlong)peer.lastUnicastFrame); - env->SetLongField(peerObject, lastMulticastFrameField, (jlong)peer.lastMulticastFrame); env->SetIntField(peerObject, versionMajorField, peer.versionMajor); env->SetIntField(peerObject, versionMinorField, peer.versionMinor); env->SetIntField(peerObject, versionRevField, peer.versionRev); diff --git a/java/src/com/zerotier/sdk/Peer.java b/java/src/com/zerotier/sdk/Peer.java index fb2d1065..eb3d7130 100644 --- a/java/src/com/zerotier/sdk/Peer.java +++ b/java/src/com/zerotier/sdk/Peer.java @@ -34,8 +34,6 @@ import java.util.ArrayList; */ public final class Peer { private long address; - private long lastUnicastFrame; - private long lastMulticastFrame; private int versionMajor; private int versionMinor; private int versionRev; @@ -52,20 +50,6 @@ public final class Peer { return address; } - /** - * Time we last received a unicast frame from this peer - */ - public final long lastUnicastFrame() { - return lastUnicastFrame; - } - - /** - * Time we last received a multicast rame from this peer - */ - public final long lastMulticastFrame() { - return lastMulticastFrame; - } - /** * Remote major version or -1 if not known */ -- cgit v1.2.3 From 3c5e28a27da5aed59fa64b9fe955a2eda70feb38 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Tue, 22 Nov 2016 13:03:36 -0800 Subject: use new ZT_Node_Callbacks struct in JNI --- java/jni/com_zerotierone_sdk_Node.cpp | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) (limited to 'java') diff --git a/java/jni/com_zerotierone_sdk_Node.cpp b/java/jni/com_zerotierone_sdk_Node.cpp index 4d9a2102..d0228d13 100644 --- a/java/jni/com_zerotierone_sdk_Node.cpp +++ b/java/jni/com_zerotierone_sdk_Node.cpp @@ -56,7 +56,11 @@ namespace { , eventListener(NULL) , frameListener(NULL) , configListener(NULL) - {} + , callbacks(NULL) + { + callbacks = (ZT_Node_Callbacks*)malloc(sizeof(ZT_Node_Callbacks)); + memset(callbacks, 0, sizeof(ZT_Node_Callbacks)); + } ~JniRef() { @@ -69,6 +73,9 @@ namespace { env->DeleteGlobalRef(eventListener); env->DeleteGlobalRef(frameListener); env->DeleteGlobalRef(configListener); + + free(callbacks); + callbacks = NULL; } uint64_t id; @@ -83,6 +90,8 @@ namespace { jobject eventListener; jobject frameListener; jobject configListener; + + ZT_Node_Callbacks *callbacks; }; @@ -602,17 +611,18 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_node_1init( } ref->eventListener = env->NewGlobalRef(tmp); + ref->callbacks->dataStoreGetFunction = &DataStoreGetFunction; + ref->callbacks->dataStorePutFunction = &DataStorePutFunction; + ref->callbacks->wirePacketSendFunction = &WirePacketSendFunction; + ref->callbacks->virtualNetworkFrameFunction = &VirtualNetworkFrameFunctionCallback; + ref->callbacks->virtualNetworkConfigFunction = &VirtualNetworkConfigFunctionCallback; + ref->callbacks->eventCallback = &EventCallback; + ZT_ResultCode rc = ZT_Node_new( &node, ref, - (uint64_t)now, - &DataStoreGetFunction, - &DataStorePutFunction, - &WirePacketSendFunction, - &VirtualNetworkFrameFunctionCallback, - &VirtualNetworkConfigFunctionCallback, - NULL, - &EventCallback); + ref->callbacks, + (uint64_t)now); if(rc != ZT_RESULT_OK) { -- cgit v1.2.3 From e41d71cd19b4179c0b061d1121527788f388c6e2 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Thu, 5 Jan 2017 13:56:07 -0800 Subject: add implementations of compareTo() and equals() for VirtualNetworkRoute(). Android app was relying on these, but since they didn't exist, they didn't function properly --- java/src/com/zerotier/sdk/VirtualNetworkRoute.java | 51 +++++++++++++++++++++- 1 file changed, 49 insertions(+), 2 deletions(-) (limited to 'java') diff --git a/java/src/com/zerotier/sdk/VirtualNetworkRoute.java b/java/src/com/zerotier/sdk/VirtualNetworkRoute.java index 738c4158..b89dce7b 100644 --- a/java/src/com/zerotier/sdk/VirtualNetworkRoute.java +++ b/java/src/com/zerotier/sdk/VirtualNetworkRoute.java @@ -29,9 +29,14 @@ package com.zerotier.sdk; import java.net.InetSocketAddress; -public final class VirtualNetworkRoute +public final class VirtualNetworkRoute implements Comparable { - private VirtualNetworkRoute() {} + private VirtualNetworkRoute() { + target = null; + via = null; + flags = 0; + metric = 0; + } /** * Target network / netmask bits (in port field) or NULL or 0.0.0.0/0 for default @@ -52,4 +57,46 @@ public final class VirtualNetworkRoute * Route metric (not currently used) */ public int metric; + + + @Override + public int compareTo(VirtualNetworkRoute other) { + return target.toString().compareTo(other.target.toString()); + } + + public boolean equals(VirtualNetworkRoute other) { + boolean targetEquals; + if (target == null && other.target == null) { + targetEquals = true; + } + else if (target == null && other.target != null) { + targetEquals = false; + } + else if (target != null && other.target == null) { + targetEquals = false; + } + else { + targetEquals = target.equals(other.target); + } + + + boolean viaEquals; + if (via == null && other.via == null) { + viaEquals = true; + } + else if (via == null && other.via != null) { + viaEquals = false; + } + else if (via != null && other.via == null) { + viaEquals = false; + } + else { + viaEquals = via.equals(other.via); + } + + return viaEquals && + viaEquals && + flags == other.flags && + metric == other.metric; + } } -- cgit v1.2.3 From f149dd9401b1cd3f9b32a59bcdd8abe65af3bc77 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Fri, 13 Jan 2017 11:36:48 -0800 Subject: fix Android NDK build --- java/jni/Android.mk | 6 ++-- java/jni/ZT_jniutils.cpp | 20 ++++++------ java/jni/com_zerotierone_sdk_Node.cpp | 58 ++++++++++++++++++----------------- 3 files changed, 44 insertions(+), 40 deletions(-) (limited to 'java') diff --git a/java/jni/Android.mk b/java/jni/Android.mk index 73eb2c46..e5d501f8 100644 --- a/java/jni/Android.mk +++ b/java/jni/Android.mk @@ -35,9 +35,9 @@ LOCAL_SRC_FILES := \ $(ZT1)/node/Switch.cpp \ $(ZT1)/node/Tag.cpp \ $(ZT1)/node/Topology.cpp \ - $(ZT1)/node/Utils.cpp \ - $(ZT1)/osdep/Http.cpp \ - $(ZT1)/osdep/OSUtils.cpp + $(ZT1)/node/Utils.cpp +# $(ZT1)/osdep/Http.cpp \ +# $(ZT1)/osdep/OSUtils.cpp # JNI Files LOCAL_SRC_FILES += \ diff --git a/java/jni/ZT_jniutils.cpp b/java/jni/ZT_jniutils.cpp index 6b882c6d..e355271c 100644 --- a/java/jni/ZT_jniutils.cpp +++ b/java/jni/ZT_jniutils.cpp @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ - + #include "ZT_jniutils.h" #include "ZT_jnilookup.h" #include @@ -30,7 +30,7 @@ extern "C" { jobject createResultObject(JNIEnv *env, ZT_ResultCode code) { jclass resultClass = NULL; - + jobject resultObject = NULL; resultClass = lookup.findClass("com/zerotier/sdk/ResultCode"); @@ -67,14 +67,14 @@ jobject createResultObject(JNIEnv *env, ZT_ResultCode code) } jfieldID enumField = lookup.findStaticField(resultClass, fieldName.c_str(), "Lcom/zerotier/sdk/ResultCode;"); - if(env->ExceptionCheck() || enumField == NULL) + if(env->ExceptionCheck() || enumField == NULL) { LOGE("Error on FindStaticField"); return NULL; } resultObject = env->GetStaticObjectField(resultClass, enumField); - if(env->ExceptionCheck() || resultObject == NULL) + if(env->ExceptionCheck() || resultObject == NULL) { LOGE("Error on GetStaticObjectField"); } @@ -154,6 +154,8 @@ jobject createEvent(JNIEnv *env, ZT_Event event) case ZT_EVENT_TRACE: fieldName = "EVENT_TRACE"; break; + case ZT_EVENT_USER_MESSAGE: + break; } jfieldID enumField = lookup.findStaticField(eventClass, fieldName.c_str(), "Lcom/zerotier/sdk/Event;"); @@ -332,7 +334,7 @@ jobject newInetSocketAddress(JNIEnv *env, const sockaddr_storage &addr) } jobject inetAddressObject = NULL; - + if(addr.ss_family != 0) { inetAddressObject = newInetAddress(env, addr); @@ -468,7 +470,7 @@ jobject newPeerPhysicalPath(JNIEnv *env, const ZT_PeerPhysicalPath &ppp) return pppObject; } -jobject newPeer(JNIEnv *env, const ZT_Peer &peer) +jobject newPeer(JNIEnv *env, const ZT_Peer &peer) { LOGV("newPeer called"); @@ -570,7 +572,7 @@ jobject newPeer(JNIEnv *env, const ZT_Peer &peer) jobjectArray arrayObject = env->NewObjectArray( peer.pathCount, peerPhysicalPathClass, NULL); - if(env->ExceptionCheck() || arrayObject == NULL) + if(env->ExceptionCheck() || arrayObject == NULL) { LOGE("Error creating PeerPhysicalPath[] array"); return NULL; @@ -709,7 +711,7 @@ jobject newNetworkConfig(JNIEnv *env, const ZT_VirtualNetworkConfig &vnetConfig) return NULL; } - assignedAddressesField = lookup.findField(vnetConfigClass, "assignedAddresses", + assignedAddressesField = lookup.findField(vnetConfigClass, "assignedAddresses", "[Ljava/net/InetSocketAddress;"); if(env->ExceptionCheck() || assignedAddressesField == NULL) { @@ -717,7 +719,7 @@ jobject newNetworkConfig(JNIEnv *env, const ZT_VirtualNetworkConfig &vnetConfig) return NULL; } - routesField = lookup.findField(vnetConfigClass, "routes", + routesField = lookup.findField(vnetConfigClass, "routes", "[Lcom/zerotier/sdk/VirtualNetworkRoute;"); if(env->ExceptionCheck() || routesField == NULL) { diff --git a/java/jni/com_zerotierone_sdk_Node.cpp b/java/jni/com_zerotierone_sdk_Node.cpp index d0228d13..eb62d985 100644 --- a/java/jni/com_zerotierone_sdk_Node.cpp +++ b/java/jni/com_zerotierone_sdk_Node.cpp @@ -139,8 +139,8 @@ namespace { } return env->CallIntMethod( - ref->configListener, - configListenerCallbackMethod, + ref->configListener, + configListenerCallbackMethod, (jlong)nwid, operationObject, networkConfigObject); } @@ -203,7 +203,7 @@ namespace { void EventCallback(ZT_Node *node, void *userData, - enum ZT_Event event, + enum ZT_Event event, const void *data) { LOGV("EventCallback"); @@ -291,6 +291,8 @@ namespace { } } break; + case ZT_EVENT_USER_MESSAGE: + break; } } @@ -348,7 +350,7 @@ namespace { objectName, buffer, bufferIndex, objectSizeObj); long retval = (long)env->CallLongMethod( - ref->dataStoreGetListener, dataStoreGetCallbackMethod, + ref->dataStoreGetListener, dataStoreGetCallbackMethod, nameStr, bufferObj, (jlong)bufferIndex, objectSizeObj); if(retval > 0) @@ -463,7 +465,7 @@ namespace { LOGE("Couldn't find onSendPacketRequested method"); return -2; } - + jobject localAddressObj = NULL; if(memcmp(localAddress, &ZT_SOCKADDR_NULL, sizeof(sockaddr_storage)) != 0) { @@ -496,7 +498,7 @@ namespace { } } -JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) +JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) { lookup.setJavaVM(vm); return JNI_VERSION_1_6; @@ -641,7 +643,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_node_1init( ZeroTier::Mutex::Lock lock(nodeMapMutex); ref->node = node; nodeMap.insert(std::make_pair(ref->id, ref)); - + return resultObject; } @@ -659,7 +661,7 @@ JNIEXPORT void JNICALL Java_com_zerotier_sdk_Node_node_1delete( NodeMap::iterator found; { - ZeroTier::Mutex::Lock lock(nodeMapMutex); + ZeroTier::Mutex::Lock lock(nodeMapMutex); found = nodeMap.find(nodeId); } @@ -685,9 +687,9 @@ JNIEXPORT void JNICALL Java_com_zerotier_sdk_Node_node_1delete( * Signature: (JJJJJII[B[J)Lcom/zerotier/sdk/ResultCode; */ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processVirtualNetworkFrame( - JNIEnv *env, jobject obj, - jlong id, - jlong in_now, + JNIEnv *env, jobject obj, + jlong id, + jlong in_now, jlong in_nwid, jlong in_sourceMac, jlong in_destMac, @@ -697,7 +699,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processVirtualNetworkFrame( jlongArray out_nextBackgroundTaskDeadline) { uint64_t nodeId = (uint64_t) id; - + ZT_Node *node = findNode(nodeId); if(node == NULL) { @@ -752,9 +754,9 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processVirtualNetworkFrame( * Signature: (JJLjava/net/InetSocketAddress;I[B[J)Lcom/zerotier/sdk/ResultCode; */ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processWirePacket( - JNIEnv *env, jobject obj, + JNIEnv *env, jobject obj, jlong id, - jlong in_now, + jlong in_now, jobject in_localAddress, jobject in_remoteAddress, jbyteArray in_packetData, @@ -820,7 +822,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processWirePacket( jmethodID inetSock_getPort = lookup.findMethod( InetSocketAddressClass, "getPort", "()I"); - if(env->ExceptionCheck() || inetSock_getPort == NULL) + if(env->ExceptionCheck() || inetSock_getPort == NULL) { LOGE("Couldn't find getPort method on InetSocketAddress"); return createResultObject(env, ZT_RESULT_FATAL_ERROR_INTERNAL); @@ -844,10 +846,10 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processWirePacket( } unsigned int addrSize = env->GetArrayLength(remoteAddressArray); - + sockaddr_storage localAddress = {}; - + if(localAddrObj == NULL) { localAddress = ZT_SOCKADDR_NULL; @@ -939,7 +941,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processWirePacket( localData, packetLength, &nextBackgroundTaskDeadline); - if(rc != ZT_RESULT_OK) + if(rc != ZT_RESULT_OK) { LOGE("ZT_Node_processWirePacket returned: %d", rc); } @@ -959,7 +961,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processWirePacket( * Signature: (JJ[J)Lcom/zerotier/sdk/ResultCode; */ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processBackgroundTasks( - JNIEnv *env, jobject obj, + JNIEnv *env, jobject obj, jlong id, jlong in_now, jlongArray out_nextBackgroundTaskDeadline) @@ -1032,7 +1034,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_leave( uint64_t nwid = (uint64_t)in_nwid; ZT_ResultCode rc = ZT_Node_leave(node, nwid, NULL); - + return createResultObject(env, rc); } @@ -1042,8 +1044,8 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_leave( * Signature: (JJJJ)Lcom/zerotier/sdk/ResultCode; */ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_multicastSubscribe( - JNIEnv *env, jobject obj, - jlong id, + JNIEnv *env, jobject obj, + jlong id, jlong in_nwid, jlong in_multicastGroup, jlong in_multicastAdi) @@ -1072,8 +1074,8 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_multicastSubscribe( * Signature: (JJJJ)Lcom/zerotier/sdk/ResultCode; */ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_multicastUnsubscribe( - JNIEnv *env, jobject obj, - jlong id, + JNIEnv *env, jobject obj, + jlong id, jlong in_nwid, jlong in_multicastGroup, jlong in_multicastAdi) @@ -1141,7 +1143,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_status { return NULL; } - + nodeStatusConstructor = lookup.findMethod( nodeStatusClass, "", "()V"); if(nodeStatusConstructor == NULL) @@ -1225,7 +1227,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_networkConfig( } ZT_VirtualNetworkConfig *vnetConfig = ZT_Node_networkConfig(node, nwid); - + jobject vnetConfigObject = newNetworkConfig(env, *vnetConfig); ZT_Node_freeQueryResult(node, vnetConfig); @@ -1267,7 +1269,7 @@ JNIEXPORT jobjectArray JNICALL Java_com_zerotier_sdk_Node_peers( } ZT_PeerList *peerList = ZT_Node_peers(node); - + if(peerList == NULL) { LOGE("ZT_Node_peers returned NULL"); @@ -1306,7 +1308,7 @@ JNIEXPORT jobjectArray JNICALL Java_com_zerotier_sdk_Node_peers( { jobject peerObj = newPeer(env, peerList->peers[i]); env->SetObjectArrayElement(peerArrayObj, i, peerObj); - if(env->ExceptionCheck()) + if(env->ExceptionCheck()) { LOGE("Error assigning Peer object to array"); break; -- cgit v1.2.3 From 923d3f1fe8f4b61b95043813b79e73e2974a54de Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Thu, 26 Jan 2017 15:01:32 -0800 Subject: remove references to deleted source files in Android NDK build files --- java/jni/Android.mk | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'java') diff --git a/java/jni/Android.mk b/java/jni/Android.mk index e5d501f8..774c2015 100644 --- a/java/jni/Android.mk +++ b/java/jni/Android.mk @@ -10,8 +10,6 @@ LOCAL_LDLIBS := -llog -latomic # ZeroTierOne SDK source files LOCAL_SRC_FILES := \ - $(ZT1)/ext/lz4/lz4.c \ - $(ZT1)/ext/http-parser/http_parser.c \ $(ZT1)/node/C25519.cpp \ $(ZT1)/node/Capability.cpp \ $(ZT1)/node/CertificateOfMembership.cpp \ @@ -36,8 +34,7 @@ LOCAL_SRC_FILES := \ $(ZT1)/node/Tag.cpp \ $(ZT1)/node/Topology.cpp \ $(ZT1)/node/Utils.cpp -# $(ZT1)/osdep/Http.cpp \ -# $(ZT1)/osdep/OSUtils.cpp + # JNI Files LOCAL_SRC_FILES += \ -- cgit v1.2.3 From 9ae49b5b85092ad3d6d9128a084c93f2a70661f9 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Mon, 13 Feb 2017 10:51:36 -0800 Subject: Update JNI with new root terminology --- java/jni/ZT_jniutils.cpp | 8 ++++---- java/src/com/zerotier/sdk/PeerRole.java | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) (limited to 'java') diff --git a/java/jni/ZT_jniutils.cpp b/java/jni/ZT_jniutils.cpp index e355271c..7bdc7611 100644 --- a/java/jni/ZT_jniutils.cpp +++ b/java/jni/ZT_jniutils.cpp @@ -182,11 +182,11 @@ jobject createPeerRole(JNIEnv *env, ZT_PeerRole role) case ZT_PEER_ROLE_LEAF: fieldName = "PEER_ROLE_LEAF"; break; - case ZT_PEER_ROLE_UPSTREAM: - fieldName = "PEER_ROLE_UPSTREAM"; + case ZT_PEER_ROLE_MOON: + fieldName = "PEER_ROLE_MOON"; break; - case ZT_PEER_ROLE_ROOT: - fieldName = "PEER_ROLE_ROOTS"; + case ZT_PEER_ROLE_PLANET: + fieldName = "PEER_ROLE_PLANET"; break; } diff --git a/java/src/com/zerotier/sdk/PeerRole.java b/java/src/com/zerotier/sdk/PeerRole.java index f281c1b6..fce183d9 100644 --- a/java/src/com/zerotier/sdk/PeerRole.java +++ b/java/src/com/zerotier/sdk/PeerRole.java @@ -34,12 +34,12 @@ public enum PeerRole { PEER_ROLE_LEAF, /** - * upstream node + * moon root */ - PEER_ROLE_UPSTREAM, + PEER_ROLE_MOON, /** - * root server + * planetary root */ - PEER_ROLE_ROOT + PEER_ROLE_PLANET } \ No newline at end of file -- cgit v1.2.3 From 06c866ceb448dd41b2e7ec2eed353a5cbfc1ff79 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Thu, 23 Feb 2017 12:47:07 -0800 Subject: Android JNI fix --- java/jni/Android.mk | 1 + 1 file changed, 1 insertion(+) (limited to 'java') diff --git a/java/jni/Android.mk b/java/jni/Android.mk index 774c2015..ebd89376 100644 --- a/java/jni/Android.mk +++ b/java/jni/Android.mk @@ -13,6 +13,7 @@ LOCAL_SRC_FILES := \ $(ZT1)/node/C25519.cpp \ $(ZT1)/node/Capability.cpp \ $(ZT1)/node/CertificateOfMembership.cpp \ + $(ZT1)/node/CertificateOfOwnership.cpp \ $(ZT1)/node/Identity.cpp \ $(ZT1)/node/IncomingPacket.cpp \ $(ZT1)/node/InetAddress.cpp \ -- cgit v1.2.3 From 1520534660698698d9db064e1d9f7b3f0ae9913c Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Thu, 9 Mar 2017 17:48:40 -0800 Subject: fix some rediculousness in NDK-14 Apparently having -fPIC on the command line multiple times turns it back off --- java/jni/Application.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'java') diff --git a/java/jni/Application.mk b/java/jni/Application.mk index 6950c0e6..19891cc8 100644 --- a/java/jni/Application.mk +++ b/java/jni/Application.mk @@ -1,5 +1,5 @@ # NDK_TOOLCHAIN_VERSION := clang3.5 -APP_STL := gnustl_static -APP_CPPFLAGS := -O3 -fPIC -fPIE -Wall -fstack-protector -fexceptions -fno-strict-aliasing -Wno-deprecated-register -DZT_NO_TYPE_PUNNING=1 +APP_STL := c++_static +APP_CPPFLAGS := -O3 -Wall -fstack-protector -fexceptions -fno-strict-aliasing -Wno-deprecated-register -DZT_NO_TYPE_PUNNING=1 APP_PLATFORM := android-14 APP_ABI := all -- cgit v1.2.3 From 855361b5b88297eba3e62a9bdfa3e0933b962e81 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Tue, 28 Mar 2017 17:49:00 -0700 Subject: fix native end of JNI code for new thread data ptr --- java/jni/com_zerotierone_sdk_Node.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) (limited to 'java') diff --git a/java/jni/com_zerotierone_sdk_Node.cpp b/java/jni/com_zerotierone_sdk_Node.cpp index eb62d985..47bbc40e 100644 --- a/java/jni/com_zerotierone_sdk_Node.cpp +++ b/java/jni/com_zerotierone_sdk_Node.cpp @@ -98,6 +98,7 @@ namespace { int VirtualNetworkConfigFunctionCallback( ZT_Node *node, void *userData, + void *threadData, uint64_t nwid, void **, enum ZT_VirtualNetworkConfigOperation operation, @@ -146,6 +147,7 @@ namespace { void VirtualNetworkFrameFunctionCallback(ZT_Node *node, void *userData, + void *threadData, uint64_t nwid, void**, uint64_t sourceMac, @@ -203,6 +205,7 @@ namespace { void EventCallback(ZT_Node *node, void *userData, + void *threadData, enum ZT_Event event, const void *data) { @@ -298,6 +301,7 @@ namespace { long DataStoreGetFunction(ZT_Node *node, void *userData, + void *threadData, const char *objectName, void *buffer, unsigned long bufferSize, @@ -371,6 +375,7 @@ namespace { int DataStorePutFunction(ZT_Node *node, void *userData, + void *threadData, const char *objectName, const void *buffer, unsigned long bufferSize, @@ -437,6 +442,7 @@ namespace { int WirePacketSendFunction(ZT_Node *node, void *userData, + void *threadData, const struct sockaddr_storage *localAddress, const struct sockaddr_storage *remoteAddress, const void *buffer, @@ -623,6 +629,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_node_1init( ZT_ResultCode rc = ZT_Node_new( &node, ref, + NULL, ref->callbacks, (uint64_t)now); @@ -731,6 +738,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processVirtualNetworkFrame( ZT_ResultCode rc = ZT_Node_processVirtualNetworkFrame( node, + NULL, now, nwid, sourceMac, @@ -935,6 +943,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processWirePacket( ZT_ResultCode rc = ZT_Node_processWirePacket( node, + NULL, now, &localAddress, &remoteAddress, @@ -983,7 +992,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processBackgroundTasks( uint64_t now = (uint64_t)in_now; uint64_t nextBackgroundTaskDeadline = 0; - ZT_ResultCode rc = ZT_Node_processBackgroundTasks(node, now, &nextBackgroundTaskDeadline); + ZT_ResultCode rc = ZT_Node_processBackgroundTasks(node, NULL, now, &nextBackgroundTaskDeadline); jlong *outDeadline = (jlong*)env->GetPrimitiveArrayCritical(out_nextBackgroundTaskDeadline, NULL); outDeadline[0] = (jlong)nextBackgroundTaskDeadline; @@ -1010,7 +1019,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_join( uint64_t nwid = (uint64_t)in_nwid; - ZT_ResultCode rc = ZT_Node_join(node, nwid, NULL); + ZT_ResultCode rc = ZT_Node_join(node, nwid, NULL, NULL); return createResultObject(env, rc); } @@ -1033,7 +1042,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_leave( uint64_t nwid = (uint64_t)in_nwid; - ZT_ResultCode rc = ZT_Node_leave(node, nwid, NULL); + ZT_ResultCode rc = ZT_Node_leave(node, nwid, NULL, NULL); return createResultObject(env, rc); } @@ -1063,7 +1072,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_multicastSubscribe( unsigned long multicastAdi = (unsigned long)in_multicastAdi; ZT_ResultCode rc = ZT_Node_multicastSubscribe( - node, nwid, multicastGroup, multicastAdi); + node, NULL, nwid, multicastGroup, multicastAdi); return createResultObject(env, rc); } -- cgit v1.2.3 From de4b9e9a16eecab6b731c7b51cb2d08e112a3044 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Wed, 29 Mar 2017 12:52:29 -0700 Subject: Added path checking interface for Java --- java/jni/com_zerotierone_sdk_Node.cpp | 178 +++++++++++++++++++++++++++++ java/src/com/zerotier/sdk/Node.java | 5 +- java/src/com/zerotier/sdk/PathChecker.java | 45 ++++++++ 3 files changed, 227 insertions(+), 1 deletion(-) create mode 100644 java/src/com/zerotier/sdk/PathChecker.java (limited to 'java') diff --git a/java/jni/com_zerotierone_sdk_Node.cpp b/java/jni/com_zerotierone_sdk_Node.cpp index 47bbc40e..307add39 100644 --- a/java/jni/com_zerotierone_sdk_Node.cpp +++ b/java/jni/com_zerotierone_sdk_Node.cpp @@ -56,6 +56,7 @@ namespace { , eventListener(NULL) , frameListener(NULL) , configListener(NULL) + , pathChecker(NULL) , callbacks(NULL) { callbacks = (ZT_Node_Callbacks*)malloc(sizeof(ZT_Node_Callbacks)); @@ -73,6 +74,7 @@ namespace { env->DeleteGlobalRef(eventListener); env->DeleteGlobalRef(frameListener); env->DeleteGlobalRef(configListener); + env->DeleteGlobalRef(pathChecker); free(callbacks); callbacks = NULL; @@ -90,6 +92,7 @@ namespace { jobject eventListener; jobject frameListener; jobject configListener; + jobject pathChecker; ZT_Node_Callbacks *callbacks; }; @@ -487,6 +490,165 @@ namespace { return retval; } + int PathCheckFunction(ZT_Node *node, + void *userPtr, + void *threadPtr, + uint64_t address, + const struct sockaddr_storage *localAddress, + const struct sockaddr_storage *remoteAddress) + { + JniRef *ref = (JniRef*)userPtr; + assert(ref->node == node); + + if(ref->pathChecker == NULL) { + return true; + } + + JNIEnv *env = NULL; + ref->jvm->GetEnv((void**)&env, JNI_VERSION_1_6); + + jclass pathCheckerClass = env->GetObjectClass(ref->pathChecker); + if(pathCheckerClass == NULL) + { + LOGE("Couldn't find class for PathChecker instance"); + return true; + } + + jmethodID pathCheckCallbackMethod = lookup.findMethod(pathCheckerClass, + "onPathCheck", "(JLjava/net/InetSocketAddress;Ljava/net/InetSocketAddress;)Z"); + if(pathCheckCallbackMethod == NULL) + { + LOGE("Couldn't find onPathCheck method implementation"); + return true; + } + + jobject localAddressObj = NULL; + jobject remoteAddressObj = NULL; + + if(memcmp(localAddress, &ZT_SOCKADDR_NULL, sizeof(sockaddr_storage)) != 0) + { + localAddressObj = newInetSocketAddress(env, *localAddress); + } + if(memcmp(remoteAddress, &ZT_SOCKADDR_NULL, sizeof(sockaddr_storage)) != 0) + { + remoteAddressObj = newInetSocketAddress(env, *remoteAddress); + } + + return env->CallBooleanMethod(ref->pathChecker, pathCheckCallbackMethod, address, localAddressObj, remoteAddressObj); + } + + int PathLookupFunction(ZT_Node *node, + void *userPtr, + void *threadPtr, + uint64_t address, + int ss_family, + struct sockaddr_storage *result) + { + JniRef *ref = (JniRef*)userPtr; + assert(ref->node == node); + + if(ref->pathChecker == NULL) { + return false; + } + + JNIEnv *env = NULL; + ref->jvm->GetEnv((void**)&env, JNI_VERSION_1_6); + + jclass pathCheckerClass = env->GetObjectClass(ref->pathChecker); + if(pathCheckerClass == NULL) + { + LOGE("Couldn't find class for PathChecker instance"); + return false; + } + + jmethodID pathLookupMethod = lookup.findMethod(pathCheckerClass, + "onPathLookup", "(JI)Ljava/net/InetSocketAddress;"); + if(pathLookupMethod == NULL) { + return false; + } + + jobject sockAddressObject = env->CallObjectMethod(ref->pathChecker, pathLookupMethod, address, ss_family); + if(sockAddressObject == NULL) + { + LOGE("Unable to call onPathLookup implementation"); + return false; + } + + jclass inetSockAddressClass = env->GetObjectClass(sockAddressObject); + if(inetSockAddressClass == NULL) + { + LOGE("Unable to find InetSocketAddress class"); + return false; + } + + jmethodID getAddressMethod = lookup.findMethod(inetSockAddressClass, "getAddress", "()Ljava/net/InetAddress;"); + if(getAddressMethod == NULL) + { + LOGE("Unable to find InetSocketAddress.getAddress() method"); + return false; + } + + jmethodID getPortMethod = lookup.findMethod(inetSockAddressClass, "getPort", "()I"); + if(getPortMethod == NULL) + { + LOGE("Unable to find InetSocketAddress.getPort() method"); + return false; + } + + jint port = env->CallIntMethod(sockAddressObject, getPortMethod); + jobject addressObject = env->CallObjectMethod(sockAddressObject, getAddressMethod); + + jclass inetAddressClass = lookup.findClass("java/net/InetAddress"); + if(inetAddressClass == NULL) + { + LOGE("Unable to find InetAddress class"); + return false; + } + + getAddressMethod = lookup.findMethod(inetAddressClass, "getAddress", "()[B"); + if(getAddressMethod == NULL) + { + LOGE("Unable to find InetAddress.getAddress() method"); + return false; + } + + jbyteArray addressBytes = (jbyteArray)env->CallObjectMethod(addressObject, getAddressMethod); + if(addressBytes == NULL) + { + LOGE("Unable to call InetAddress.getBytes()"); + return false; + } + + int addressSize = env->GetArrayLength(addressBytes); + if(addressSize == 4) + { + // IPV4 + sockaddr_in *addr = (sockaddr_in*)result; + addr->sin_family = AF_INET; + addr->sin_port = htons(port); + + void *data = env->GetPrimitiveArrayCritical(addressBytes, NULL); + memcpy(&addr->sin_addr, data, 4); + env->ReleasePrimitiveArrayCritical(addressBytes, data, 0); + } + else if (addressSize == 16) + { + // IPV6 + sockaddr_in6 *addr = (sockaddr_in6*)result; + addr->sin6_family = AF_INET6; + addr->sin6_port = htons(port); + void *data = env->GetPrimitiveArrayCritical(addressBytes, NULL); + memcpy(&addr->sin6_addr, data, 16); + env->ReleasePrimitiveArrayCritical(addressBytes, data, 0); + } + else + { + return false; + } + + return true; + } + typedef std::map NodeMap; static NodeMap nodeMap; ZeroTier::Mutex nodeMapMutex; @@ -619,12 +781,28 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_node_1init( } ref->eventListener = env->NewGlobalRef(tmp); + fid = lookup.findField( + cls, "pathChecker", "Lcom/zerotier/sdk/PathChecker;"); + if(fid == NULL) + { + return NULL; + } + + tmp = env->GetObjectField(obj, fid); + if(tmp == NULL) + { + return NULL; + } + ref->pathChecker = env->NewGlobalRef(tmp); + ref->callbacks->dataStoreGetFunction = &DataStoreGetFunction; ref->callbacks->dataStorePutFunction = &DataStorePutFunction; ref->callbacks->wirePacketSendFunction = &WirePacketSendFunction; ref->callbacks->virtualNetworkFrameFunction = &VirtualNetworkFrameFunctionCallback; ref->callbacks->virtualNetworkConfigFunction = &VirtualNetworkConfigFunctionCallback; ref->callbacks->eventCallback = &EventCallback; + ref->callbacks->pathCheckFunction = &PathCheckFunction; + ref->callbacks->pathLookupFunction = &PathLookupFunction; ZT_ResultCode rc = ZT_Node_new( &node, diff --git a/java/src/com/zerotier/sdk/Node.java b/java/src/com/zerotier/sdk/Node.java index 4bc6e184..7b111f74 100644 --- a/java/src/com/zerotier/sdk/Node.java +++ b/java/src/com/zerotier/sdk/Node.java @@ -74,6 +74,7 @@ public class Node { private final EventListener eventListener; private final VirtualNetworkFrameListener frameListener; private final VirtualNetworkConfigListener configListener; + private final PathChecker pathChecker; /** * Create a new ZeroTier One node @@ -95,7 +96,8 @@ public class Node { PacketSender sender, EventListener eventListener, VirtualNetworkFrameListener frameListener, - VirtualNetworkConfigListener configListener) throws NodeException + VirtualNetworkConfigListener configListener, + PathChecker pathChecker) throws NodeException { this.nodeId = now; @@ -105,6 +107,7 @@ public class Node { this.eventListener = eventListener; this.frameListener = frameListener; this.configListener = configListener; + this.pathChecker = pathChecker; ResultCode rc = node_init(now); if(rc != ResultCode.RESULT_OK) diff --git a/java/src/com/zerotier/sdk/PathChecker.java b/java/src/com/zerotier/sdk/PathChecker.java new file mode 100644 index 00000000..3e02f112 --- /dev/null +++ b/java/src/com/zerotier/sdk/PathChecker.java @@ -0,0 +1,45 @@ +/* + * ZeroTier One - Network Virtualization Everywhere + * Copyright (C) 2011-2017 ZeroTier, Inc. https://www.zerotier.com/ + */ + +package com.zerotier.sdk; + +import java.net.InetSocketAddress; + +public interface PathChecker { + /** + * Callback to check whether a path should be used for ZeroTier traffic + * + * This function must return true if the path should be used. + * + * If no path check function is specified, ZeroTier will still exclude paths + * that overlap with ZeroTier-assigned and managed IP address blocks. But the + * use of a path check function is recommended to ensure that recursion does + * not occur in cases where addresses are assigned by the OS or managed by + * an out of band mechanism like DHCP. The path check function should examine + * all configured ZeroTier interfaces and check to ensure that the supplied + * addresses will not result in ZeroTier traffic being sent over a ZeroTier + * interface (recursion). + * + * Obviously this is not required in configurations where this can't happen, + * such as network containers or embedded. + * + * @param ztAddress ZeroTier address or 0 for none/any + * @param localAddress Local interface address + * @param remoteAddress remote address + */ + boolean onPathCheck(long ztAddress, InetSocketAddress localAddress, InetSocketAddress remoteAddress); + + /** + * Function to get physical addresses for ZeroTier peers + * + * If provided this function will be occasionally called to get physical + * addresses that might be tried to reach a ZeroTier address. + * + * @param ztAddress ZeroTier address (least significant 40 bits) + * @param ss_family desired address family or -1 for any + * @return address and port of ztAddress or null + */ + InetSocketAddress onPathLookup(long ztAddress, int ss_family); +} -- cgit v1.2.3 From 1c5fdb8a0a20654cdec57347647034357e0f92a4 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Wed, 29 Mar 2017 13:28:06 -0700 Subject: fix path checker initialization --- java/jni/com_zerotierone_sdk_Node.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'java') diff --git a/java/jni/com_zerotierone_sdk_Node.cpp b/java/jni/com_zerotierone_sdk_Node.cpp index 307add39..ac0453ba 100644 --- a/java/jni/com_zerotierone_sdk_Node.cpp +++ b/java/jni/com_zerotierone_sdk_Node.cpp @@ -785,15 +785,15 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_node_1init( cls, "pathChecker", "Lcom/zerotier/sdk/PathChecker;"); if(fid == NULL) { + LOGE("no path checker?"); return NULL; } tmp = env->GetObjectField(obj, fid); - if(tmp == NULL) + if(tmp != NULL) { - return NULL; + ref->pathChecker = env->NewGlobalRef(tmp); } - ref->pathChecker = env->NewGlobalRef(tmp); ref->callbacks->dataStoreGetFunction = &DataStoreGetFunction; ref->callbacks->dataStorePutFunction = &DataStorePutFunction; -- cgit v1.2.3 From 5f611dad51f8244b59a63ecdf48a2126c5995d74 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Wed, 29 Mar 2017 13:29:02 -0700 Subject: added orbit/deorbit methods to java Node implementation --- java/jni/com_zerotierone_sdk_Node.cpp | 48 +++++++++++++++++++++++++++++++++++ java/src/com/zerotier/sdk/Node.java | 38 +++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) (limited to 'java') diff --git a/java/jni/com_zerotierone_sdk_Node.cpp b/java/jni/com_zerotierone_sdk_Node.cpp index ac0453ba..defbe7f2 100644 --- a/java/jni/com_zerotierone_sdk_Node.cpp +++ b/java/jni/com_zerotierone_sdk_Node.cpp @@ -1285,6 +1285,54 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_multicastUnsubscribe( return createResultObject(env, rc); } +/* + * Class: com_zerotier_sdk_Node + * Method: orbit + * Signature: (JJJ)Lcom/zerotier/sdk/ResultCode; + */ +JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_orbit( + JNIEnv *env, jobject obj, + jlong id, + jlong in_moonWorldId, + jlong in_moonSeed) +{ + uint64_t nodeId = (uint64_t)id; + ZT_Node *node = findNode(nodeId); + if(node == NULL) + { + return createResultObject(env, ZT_RESULT_FATAL_ERROR_INTERNAL); + } + + uint64_t moonWorldId = (uint64_t)in_moonWorldId; + uint64_t moonSeed = (uint64_t)in_moonSeed; + + ZT_ResultCode rc = ZT_Node_orbit(node, NULL, moonWorldId, moonSeed); + return createResultObject(env, rc); +} + +/* + * Class: com_zerotier_sdk_Node + * Method: deorbit + * Signature: (JJ)L/com/zerotier/sdk/ResultCode; + */ +JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_deorbit( + JNIEnv *env, jobject obj, + jlong id, + jlong in_moonWorldId) +{ + uint64_t nodeId = (uint64_t)id; + ZT_Node *node = findNode(nodeId); + if(node == NULL) + { + return createResultObject(env, ZT_RESULT_FATAL_ERROR_INTERNAL); + } + + uint64_t moonWorldId = (uint64_t)in_moonWorldId; + + ZT_ResultCode rc = ZT_Node_deorbit(node, NULL, moonWorldId); + return createResultObject(env, rc); +} + /* * Class: com_zerotier_sdk_Node * Method: address diff --git a/java/src/com/zerotier/sdk/Node.java b/java/src/com/zerotier/sdk/Node.java index 7b111f74..8e7d44e7 100644 --- a/java/src/com/zerotier/sdk/Node.java +++ b/java/src/com/zerotier/sdk/Node.java @@ -89,6 +89,7 @@ public class Node { * @param eventListener User written instance of the {@link EventListener} interface to receive status updates and non-fatal error notices. This instance must be unique per Node object. * @param frameListener * @param configListener User written instance of the {@link VirtualNetworkConfigListener} interface to be called when virtual LANs are created, deleted, or their config parameters change. This instance must be unique per Node object. + * @param pathChecker User written instance of the {@link PathChecker} interface. Not required and can be null. */ public Node(long now, DataStoreGetListener getListener, @@ -321,6 +322,34 @@ public class Node { return multicastUnsubscribe(nodeId, nwid, multicastGroup, multicastAdi); } + /** + * Add or update a moon + * + * Moons are persisted in the data store in moons.d/, so this can persist + * across invocations if the contents of moon.d are scanned and orbit is + * called for each on startup. + * + * @param moonWorldId Moon's world ID + * @param moonSeed If non-zero, the ZeroTier address of any member of the moon to query for moon definition + * @return Error if moon was invalid or failed to be added + */ + public ResultCode orbit( + long moonWorldId, + long moonSeed) { + return orbit(nodeId, moonWorldId, moonSeed); + } + + /** + * Remove a moon (does nothing if not present) + * + * @param moonWorldId World ID of moon to remove + * @return Error if anything bad happened + */ + public ResultCode deorbit( + long moonWorldId) { + return deorbit(nodeId, moonWorldId); + } + /** * Get this node's 40-bit ZeroTier address * @@ -423,6 +452,15 @@ public class Node { long multicastGroup, long multicastAdi); + private native ResultCode orbit( + long nodeId, + long moonWorldId, + long moonSeed); + + private native ResultCode deorbit( + long nodeId, + long moonWorldId); + private native long address(long nodeId); private native NodeStatus status(long nodeId); -- cgit v1.2.3 From 952834f7f365206c1a1a349adfefc313f00060bb Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Tue, 23 May 2017 14:56:29 -0700 Subject: Let Android Studio determine debug/release build --- java/jni/Application.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'java') diff --git a/java/jni/Application.mk b/java/jni/Application.mk index 19891cc8..f5a87ac7 100644 --- a/java/jni/Application.mk +++ b/java/jni/Application.mk @@ -1,5 +1,5 @@ # NDK_TOOLCHAIN_VERSION := clang3.5 APP_STL := c++_static -APP_CPPFLAGS := -O3 -Wall -fstack-protector -fexceptions -fno-strict-aliasing -Wno-deprecated-register -DZT_NO_TYPE_PUNNING=1 +APP_CPPFLAGS := -Wall -fstack-protector -fexceptions -fno-strict-aliasing -Wno-deprecated-register -DZT_NO_TYPE_PUNNING=1 APP_PLATFORM := android-14 APP_ABI := all -- cgit v1.2.3 From d8f1c3dff73277000b1c4fe0f8e6dc169576a880 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Wed, 12 Jul 2017 11:34:53 -0700 Subject: Update JNI code to reflect new ZeroTier API --- java/jni/Android.mk | 1 + java/jni/com_zerotierone_sdk_Node.cpp | 420 +++++++++------------ java/jni/com_zerotierone_sdk_Node.h | 2 +- .../src/com/zerotier/sdk/DataStoreGetListener.java | 8 +- java/src/com/zerotier/sdk/PacketSender.java | 4 +- java/src/com/zerotier/sdk/PathChecker.java | 4 +- 6 files changed, 193 insertions(+), 246 deletions(-) (limited to 'java') diff --git a/java/jni/Android.mk b/java/jni/Android.mk index ebd89376..3c5b555c 100644 --- a/java/jni/Android.mk +++ b/java/jni/Android.mk @@ -34,6 +34,7 @@ LOCAL_SRC_FILES := \ $(ZT1)/node/Switch.cpp \ $(ZT1)/node/Tag.cpp \ $(ZT1)/node/Topology.cpp \ + $(ZT1)/node/Trace.cpp \ $(ZT1)/node/Utils.cpp diff --git a/java/jni/com_zerotierone_sdk_Node.cpp b/java/jni/com_zerotierone_sdk_Node.cpp index defbe7f2..94466db1 100644 --- a/java/jni/com_zerotierone_sdk_Node.cpp +++ b/java/jni/com_zerotierone_sdk_Node.cpp @@ -210,107 +210,202 @@ namespace { void *userData, void *threadData, enum ZT_Event event, - const void *data) - { + const void *data) { LOGV("EventCallback"); - JniRef *ref = (JniRef*)userData; - if(ref->node != node && event != ZT_EVENT_UP) - { + JniRef *ref = (JniRef *) userData; + if (ref->node != node && event != ZT_EVENT_UP) { LOGE("Nodes not equal. ref->node %p, node %p. Event: %d", ref->node, node, event); return; } JNIEnv *env = NULL; - ref->jvm->GetEnv((void**)&env, JNI_VERSION_1_6); + ref->jvm->GetEnv((void **) &env, JNI_VERSION_1_6); jclass eventListenerClass = env->GetObjectClass(ref->eventListener); - if(eventListenerClass == NULL) - { + if (eventListenerClass == NULL) { LOGE("Couldn't class for EventListener instance"); return; } jmethodID onEventMethod = lookup.findMethod(eventListenerClass, - "onEvent", "(Lcom/zerotier/sdk/Event;)V"); - if(onEventMethod == NULL) - { + "onEvent", "(Lcom/zerotier/sdk/Event;)V"); + if (onEventMethod == NULL) { LOGE("Couldn't find onEvent method"); return; } jmethodID onTraceMethod = lookup.findMethod(eventListenerClass, - "onTrace", "(Ljava/lang/String;)V"); - if(onTraceMethod == NULL) - { + "onTrace", "(Ljava/lang/String;)V"); + if (onTraceMethod == NULL) { LOGE("Couldn't find onTrace method"); return; } jobject eventObject = createEvent(env, event); - if(eventObject == NULL) - { + if (eventObject == NULL) { return; } - switch(event) - { - case ZT_EVENT_UP: - { - LOGD("Event Up"); - env->CallVoidMethod(ref->eventListener, onEventMethod, eventObject); - break; + switch (event) { + case ZT_EVENT_UP: { + LOGD("Event Up"); + env->CallVoidMethod(ref->eventListener, onEventMethod, eventObject); + break; + } + case ZT_EVENT_OFFLINE: { + LOGD("Event Offline"); + env->CallVoidMethod(ref->eventListener, onEventMethod, eventObject); + break; + } + case ZT_EVENT_ONLINE: { + LOGD("Event Online"); + env->CallVoidMethod(ref->eventListener, onEventMethod, eventObject); + break; + } + case ZT_EVENT_DOWN: { + LOGD("Event Down"); + env->CallVoidMethod(ref->eventListener, onEventMethod, eventObject); + break; + } + case ZT_EVENT_FATAL_ERROR_IDENTITY_COLLISION: { + LOGV("Identity Collision"); + // call onEvent() + env->CallVoidMethod(ref->eventListener, onEventMethod, eventObject); + } + break; + case ZT_EVENT_TRACE: { + LOGV("Trace Event"); + // call onTrace() + if (data != NULL) { + const char *message = (const char *) data; + jstring messageStr = env->NewStringUTF(message); + env->CallVoidMethod(ref->eventListener, onTraceMethod, messageStr); + } + } + break; + case ZT_EVENT_USER_MESSAGE: + break; } - case ZT_EVENT_OFFLINE: - { - LOGD("Event Offline"); - env->CallVoidMethod(ref->eventListener, onEventMethod, eventObject); - break; + } + + void StatePutFunction( + ZT_Node *node, + void *userData, + void *threadData, + enum ZT_StateObjectType type, + const uint64_t id[2], + const void *buffer, + int bufferLength) { + char p[4096] = {0}; + bool secure = false; + switch (type) { + case ZT_STATE_OBJECT_IDENTITY_PUBLIC: + snprintf(p, sizeof(p), "identity.public"); + break; + case ZT_STATE_OBJECT_IDENTITY_SECRET: + snprintf(p, sizeof(p), "identity.secret"); + secure = true; + break; + case ZT_STATE_OBJECT_PLANET: + snprintf(p, sizeof(p), "planet"); + break; + case ZT_STATE_OBJECT_MOON: + snprintf(p, sizeof(p), "moons.d/%.16llx", (unsigned long long)id[0]); + break; + case ZT_STATE_OBJECT_NETWORK_CONFIG: + snprintf(p, sizeof(p), "networks.d/%.16llx", (unsigned long long)id[0]); + break; + case ZT_STATE_OBJECT_PEER: + snprintf(p, sizeof(p), "peers.d/%.10llx", (unsigned long long)id[0]); + break; + default: + return; } - case ZT_EVENT_ONLINE: + + JniRef *ref = (JniRef*)userData; + JNIEnv *env = NULL; + ref->jvm->GetEnv((void**)&env, JNI_VERSION_1_6); + + jclass dataStorePutClass = env->GetObjectClass(ref->dataStorePutListener); + if (dataStorePutClass == NULL) { - LOGD("Event Online"); - env->CallVoidMethod(ref->eventListener, onEventMethod, eventObject); - break; + LOGE("Couldn't find class for DataStorePutListener instance"); + return; } - case ZT_EVENT_DOWN: + + jmethodID dataStorePutCallbackMethod = lookup.findMethod( + dataStorePutClass, + "onDataStorePut", + "(Ljava/lang/String;[BZ)I"); + if(dataStorePutCallbackMethod == NULL) { - LOGD("Event Down"); - env->CallVoidMethod(ref->eventListener, onEventMethod, eventObject); - break; + LOGE("Couldn't find onDataStorePut method"); + return; } - case ZT_EVENT_FATAL_ERROR_IDENTITY_COLLISION: + + jmethodID deleteMethod = lookup.findMethod(dataStorePutClass, + "onDelete", "(Ljava/lang/String;)I"); + if(deleteMethod == NULL) { - LOGV("Identity Collision"); - // call onEvent() - env->CallVoidMethod(ref->eventListener, onEventMethod, eventObject); + LOGE("Couldn't find onDelete method"); + return; } - break; - case ZT_EVENT_TRACE: - { - LOGV("Trace Event"); - // call onTrace() - if(data != NULL) + + jstring nameStr = env->NewStringUTF(p); + + if (bufferLength >= 0) { + LOGD("JNI: Write file: %s", p); + // set operation + jbyteArray bufferObj = env->NewByteArray(bufferLength); + if(env->ExceptionCheck() || bufferObj == NULL) { - const char* message = (const char*)data; - jstring messageStr = env->NewStringUTF(message); - env->CallVoidMethod(ref->eventListener, onTraceMethod, messageStr); + LOGE("Error creating byte array buffer!"); + return; } - } - break; - case ZT_EVENT_USER_MESSAGE: - break; + + env->SetByteArrayRegion(bufferObj, 0, bufferLength, (jbyte*)buffer); + + env->CallIntMethod(ref->dataStorePutListener, + dataStorePutCallbackMethod, + nameStr, bufferObj, secure); + } else { + LOGD("JNI: Delete file: %s", p); + env->CallIntMethod(ref->dataStorePutListener, deleteMethod, nameStr); } } - long DataStoreGetFunction(ZT_Node *node, - void *userData, - void *threadData, - const char *objectName, - void *buffer, - unsigned long bufferSize, - unsigned long bufferIndex, - unsigned long *out_objectSize) - { + int StateGetFunction( + ZT_Node *node, + void *userData, + void *threadData, + ZT_StateObjectType type, + const uint64_t id[2], + void *buffer, + unsigned int bufferLength) { + char p[4096] = {0}; + switch (type) { + case ZT_STATE_OBJECT_IDENTITY_PUBLIC: + snprintf(p, sizeof(p), "identity.public"); + break; + case ZT_STATE_OBJECT_IDENTITY_SECRET: + snprintf(p, sizeof(p), "identity.secret"); + break; + case ZT_STATE_OBJECT_PLANET: + snprintf(p, sizeof(p), "planet"); + break; + case ZT_STATE_OBJECT_MOON: + snprintf(p, sizeof(p), "moons.d/%.16llx", (unsigned long long)id[0]); + break; + case ZT_STATE_OBJECT_NETWORK_CONFIG: + snprintf(p, sizeof(p), "networks.d/%.16llx", (unsigned long long)id[0]); + break; + case ZT_STATE_OBJECT_PEER: + snprintf(p, sizeof(p), "peers.d/%.10llx", (unsigned long long)id[0]); + break; + default: + return -1; + } + JniRef *ref = (JniRef*)userData; JNIEnv *env = NULL; ref->jvm->GetEnv((void**)&env, JNI_VERSION_1_6); @@ -323,136 +418,48 @@ namespace { } jmethodID dataStoreGetCallbackMethod = lookup.findMethod( - dataStoreGetClass, - "onDataStoreGet", - "(Ljava/lang/String;[BJ[J)J"); + dataStoreGetClass, + "onDataStoreGet", + "(Ljava/lang/String;[B)J"); if(dataStoreGetCallbackMethod == NULL) { LOGE("Couldn't find onDataStoreGet method"); return -2; } - jstring nameStr = env->NewStringUTF(objectName); + jstring nameStr = env->NewStringUTF(p); if(nameStr == NULL) { LOGE("Error creating name string object"); return -2; // out of memory } - jbyteArray bufferObj = env->NewByteArray(bufferSize); + jbyteArray bufferObj = env->NewByteArray(bufferLength); if(bufferObj == NULL) { - LOGE("Error creating byte[] buffer of size: %lu", bufferSize); + LOGE("Error creating byte[] buffer of size: %u", bufferLength); return -2; } - jlongArray objectSizeObj = env->NewLongArray(1); - if(objectSizeObj == NULL) - { - LOGE("Error creating long[1] array for actual object size"); - return -2; // couldn't create long[1] array - } - - LOGV("Calling onDataStoreGet(%s, %p, %lu, %p)", - objectName, buffer, bufferIndex, objectSizeObj); - - long retval = (long)env->CallLongMethod( - ref->dataStoreGetListener, dataStoreGetCallbackMethod, - nameStr, bufferObj, (jlong)bufferIndex, objectSizeObj); + LOGV("Calling onDataStoreGet(%s, %p)", p, buffer); - if(retval > 0) - { - void *data = env->GetPrimitiveArrayCritical(bufferObj, NULL); - memcpy(buffer, data, retval); - env->ReleasePrimitiveArrayCritical(bufferObj, data, 0); - - jlong *objSize = (jlong*)env->GetPrimitiveArrayCritical(objectSizeObj, NULL); - *out_objectSize = (unsigned long)objSize[0]; - env->ReleasePrimitiveArrayCritical(objectSizeObj, objSize, 0); - } - - LOGV("Out Object Size: %lu", *out_objectSize); - - return retval; - } - - int DataStorePutFunction(ZT_Node *node, - void *userData, - void *threadData, - const char *objectName, - const void *buffer, - unsigned long bufferSize, - int secure) - { - JniRef *ref = (JniRef*)userData; - JNIEnv *env = NULL; - ref->jvm->GetEnv((void**)&env, JNI_VERSION_1_6); - - - jclass dataStorePutClass = env->GetObjectClass(ref->dataStorePutListener); - if(dataStorePutClass == NULL) - { - LOGE("Couldn't find class for DataStorePutListener instance"); - return -1; - } - - jmethodID dataStorePutCallbackMethod = lookup.findMethod( - dataStorePutClass, - "onDataStorePut", - "(Ljava/lang/String;[BZ)I"); - if(dataStorePutCallbackMethod == NULL) - { - LOGE("Couldn't find onDataStorePut method"); - return -2; - } - - jmethodID deleteMethod = lookup.findMethod(dataStorePutClass, - "onDelete", "(Ljava/lang/String;)I"); - if(deleteMethod == NULL) - { - LOGE("Couldn't find onDelete method"); - return -3; - } - - jstring nameStr = env->NewStringUTF(objectName); - - if(buffer == NULL) - { - LOGD("JNI: Delete file: %s", objectName); - // delete operation - return env->CallIntMethod( - ref->dataStorePutListener, deleteMethod, nameStr); - } - else - { - LOGD("JNI: Write file: %s", objectName); - // set operation - jbyteArray bufferObj = env->NewByteArray(bufferSize); - if(env->ExceptionCheck() || bufferObj == NULL) - { - LOGE("Error creating byte array buffer!"); - return -4; - } - - env->SetByteArrayRegion(bufferObj, 0, bufferSize, (jbyte*)buffer); - bool bsecure = secure != 0; - - return env->CallIntMethod(ref->dataStorePutListener, - dataStorePutCallbackMethod, - nameStr, bufferObj, bsecure); - } + return (int)env->CallLongMethod( + ref->dataStoreGetListener, + dataStoreGetCallbackMethod, + nameStr, + bufferObj); } int WirePacketSendFunction(ZT_Node *node, void *userData, void *threadData, - const struct sockaddr_storage *localAddress, + int64_t localSocket, const struct sockaddr_storage *remoteAddress, const void *buffer, unsigned int bufferSize, unsigned int ttl) { - LOGV("WirePacketSendFunction(%p, %p, %p, %d)", localAddress, remoteAddress, buffer, bufferSize); + LOGV("WirePacketSendFunction(%ld, %p, %p, %d)", localSocket, remoteAddress, buffer, bufferSize); JniRef *ref = (JniRef*)userData; assert(ref->node == node); @@ -468,23 +475,17 @@ namespace { } jmethodID packetSenderCallbackMethod = lookup.findMethod(packetSenderClass, - "onSendPacketRequested", "(Ljava/net/InetSocketAddress;Ljava/net/InetSocketAddress;[BI)I"); + "onSendPacketRequested", "(JLjava/net/InetSocketAddress;[BI)I"); if(packetSenderCallbackMethod == NULL) { LOGE("Couldn't find onSendPacketRequested method"); return -2; } - jobject localAddressObj = NULL; - if(memcmp(localAddress, &ZT_SOCKADDR_NULL, sizeof(sockaddr_storage)) != 0) - { - localAddressObj = newInetSocketAddress(env, *localAddress); - } - jobject remoteAddressObj = newInetSocketAddress(env, *remoteAddress); jbyteArray bufferObj = env->NewByteArray(bufferSize); env->SetByteArrayRegion(bufferObj, 0, bufferSize, (jbyte*)buffer); - int retval = env->CallIntMethod(ref->packetSender, packetSenderCallbackMethod, localAddressObj, remoteAddressObj, bufferObj); + int retval = env->CallIntMethod(ref->packetSender, packetSenderCallbackMethod, localSocket, remoteAddressObj, bufferObj); LOGV("JNI Packet Sender returned: %d", retval); return retval; @@ -494,7 +495,7 @@ namespace { void *userPtr, void *threadPtr, uint64_t address, - const struct sockaddr_storage *localAddress, + int64_t localSocket, const struct sockaddr_storage *remoteAddress) { JniRef *ref = (JniRef*)userPtr; @@ -515,26 +516,22 @@ namespace { } jmethodID pathCheckCallbackMethod = lookup.findMethod(pathCheckerClass, - "onPathCheck", "(JLjava/net/InetSocketAddress;Ljava/net/InetSocketAddress;)Z"); + "onPathCheck", "(JJLjava/net/InetSocketAddress;)Z"); if(pathCheckCallbackMethod == NULL) { LOGE("Couldn't find onPathCheck method implementation"); return true; } - jobject localAddressObj = NULL; + struct sockaddr_storage nullAddress = {0}; jobject remoteAddressObj = NULL; - if(memcmp(localAddress, &ZT_SOCKADDR_NULL, sizeof(sockaddr_storage)) != 0) - { - localAddressObj = newInetSocketAddress(env, *localAddress); - } - if(memcmp(remoteAddress, &ZT_SOCKADDR_NULL, sizeof(sockaddr_storage)) != 0) + if(memcmp(remoteAddress, &nullAddress, sizeof(sockaddr_storage)) != 0) { remoteAddressObj = newInetSocketAddress(env, *remoteAddress); } - return env->CallBooleanMethod(ref->pathChecker, pathCheckCallbackMethod, address, localAddressObj, remoteAddressObj); + return env->CallBooleanMethod(ref->pathChecker, pathCheckCallbackMethod, address, localSocket, remoteAddressObj); } int PathLookupFunction(ZT_Node *node, @@ -795,8 +792,8 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_node_1init( ref->pathChecker = env->NewGlobalRef(tmp); } - ref->callbacks->dataStoreGetFunction = &DataStoreGetFunction; - ref->callbacks->dataStorePutFunction = &DataStorePutFunction; + ref->callbacks->stateGetFunction = &StateGetFunction; + ref->callbacks->statePutFunction = &StatePutFunction; ref->callbacks->wirePacketSendFunction = &WirePacketSendFunction; ref->callbacks->virtualNetworkFrameFunction = &VirtualNetworkFrameFunctionCallback; ref->callbacks->virtualNetworkConfigFunction = &VirtualNetworkConfigFunctionCallback; @@ -937,13 +934,13 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processVirtualNetworkFrame( /* * Class: com_zerotier_sdk_Node * Method: processWirePacket - * Signature: (JJLjava/net/InetSocketAddress;I[B[J)Lcom/zerotier/sdk/ResultCode; + * Signature: (JJJLjava/net/InetSocketAddress;I[B[J)Lcom/zerotier/sdk/ResultCode; */ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processWirePacket( JNIEnv *env, jobject obj, jlong id, jlong in_now, - jobject in_localAddress, + jlong in_localSocket, jobject in_remoteAddress, jbyteArray in_packetData, jlongArray out_nextBackgroundTaskDeadline) @@ -957,7 +954,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processWirePacket( return createResultObject(env, ZT_RESULT_FATAL_ERROR_INTERNAL); } - unsigned int nbtd_len = env->GetArrayLength(out_nextBackgroundTaskDeadline); + unsigned int nbtd_len = (unsigned int)env->GetArrayLength(out_nextBackgroundTaskDeadline); if(nbtd_len < 1) { LOGE("nbtd_len < 1"); @@ -992,12 +989,6 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processWirePacket( jmethodID inetSockGetAddressMethod = lookup.findMethod( InetSocketAddressClass, "getAddress", "()Ljava/net/InetAddress;"); - jobject localAddrObj = NULL; - if(in_localAddress != NULL) - { - localAddrObj = env->CallObjectMethod(in_localAddress, inetSockGetAddressMethod); - } - jobject remoteAddrObject = env->CallObjectMethod(in_remoteAddress, inetSockGetAddressMethod); if(remoteAddrObject == NULL) @@ -1034,47 +1025,6 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processWirePacket( unsigned int addrSize = env->GetArrayLength(remoteAddressArray); - sockaddr_storage localAddress = {}; - - if(localAddrObj == NULL) - { - localAddress = ZT_SOCKADDR_NULL; - } - else - { - int localPort = env->CallIntMethod(in_localAddress, inetSock_getPort); - jbyteArray localAddressArray = (jbyteArray)env->CallObjectMethod(localAddrObj, getAddressMethod); - if(localAddressArray != NULL) - { - - unsigned int localAddrSize = env->GetArrayLength(localAddressArray); - jbyte *addr = (jbyte*)env->GetPrimitiveArrayCritical(localAddressArray, NULL); - - if(localAddrSize == 16) - { - sockaddr_in6 ipv6 = {}; - ipv6.sin6_family = AF_INET6; - ipv6.sin6_port = htons(localPort); - memcpy(ipv6.sin6_addr.s6_addr, addr, 16); - memcpy(&localAddress, &ipv6, sizeof(sockaddr_in6)); - } - else if(localAddrSize) - { - // IPV4 address - sockaddr_in ipv4 = {}; - ipv4.sin_family = AF_INET; - ipv4.sin_port = htons(localPort); - memcpy(&ipv4.sin_addr, addr, 4); - memcpy(&localAddress, &ipv4, sizeof(sockaddr_in)); - } - else - { - localAddress = ZT_SOCKADDR_NULL; - } - env->ReleasePrimitiveArrayCritical(localAddressArray, addr, 0); - } - } - // get the address bytes jbyte *addr = (jbyte*)env->GetPrimitiveArrayCritical(remoteAddressArray, NULL); sockaddr_storage remoteAddress = {}; @@ -1106,7 +1056,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processWirePacket( } env->ReleasePrimitiveArrayCritical(remoteAddressArray, addr, 0); - unsigned int packetLength = env->GetArrayLength(in_packetData); + unsigned int packetLength = (unsigned int)env->GetArrayLength(in_packetData); if(packetLength == 0) { LOGE("Empty packet?!?"); @@ -1123,7 +1073,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processWirePacket( node, NULL, now, - &localAddress, + in_localSocket, &remoteAddress, localData, packetLength, diff --git a/java/jni/com_zerotierone_sdk_Node.h b/java/jni/com_zerotierone_sdk_Node.h index 7c1011ab..8487d8af 100644 --- a/java/jni/com_zerotierone_sdk_Node.h +++ b/java/jni/com_zerotierone_sdk_Node.h @@ -37,7 +37,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processVirtualNetworkFrame * Signature: (JJLjava/net/InetSockAddress;Ljava/net/InetSockAddress;[B[J)Lcom/zerotier/sdk/ResultCode; */ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processWirePacket - (JNIEnv *, jobject, jlong, jlong, jobject, jobject, jbyteArray, jlongArray); + (JNIEnv *, jobject, jlong, jlong, jlong, jobject, jbyteArray, jlongArray); /* * Class: com_zerotier_sdk_Node diff --git a/java/src/com/zerotier/sdk/DataStoreGetListener.java b/java/src/com/zerotier/sdk/DataStoreGetListener.java index b525be63..317511e0 100644 --- a/java/src/com/zerotier/sdk/DataStoreGetListener.java +++ b/java/src/com/zerotier/sdk/DataStoreGetListener.java @@ -46,13 +46,9 @@ public interface DataStoreGetListener { * * @param name Name of the object in the data store * @param out_buffer buffer to put the object in - * @param bufferIndex index in the object to start reading - * @param out_objectSize long[1] to be set to the actual size of the object if it exists. - * @return the actual number of bytes read. + * @return size of the object */ public long onDataStoreGet( String name, - byte[] out_buffer, - long bufferIndex, - long[] out_objectSize); + byte[] out_buffer); } diff --git a/java/src/com/zerotier/sdk/PacketSender.java b/java/src/com/zerotier/sdk/PacketSender.java index 22893ec7..06ec01bc 100644 --- a/java/src/com/zerotier/sdk/PacketSender.java +++ b/java/src/com/zerotier/sdk/PacketSender.java @@ -37,13 +37,13 @@ public interface PacketSender { * on failure. Note that success does not (of course) guarantee packet * delivery. It only means that the packet appears to have been sent.

* - * @param localAddr {@link InetSocketAddress} to send from. Set to null if not specified. + * @param localSocket socket file descriptor to send from. Set to -1 if not specified. * @param remoteAddr {@link InetSocketAddress} to send to * @param packetData data to send * @return 0 on success, any error code on failure. */ public int onSendPacketRequested( - InetSocketAddress localAddr, + long localSocket, InetSocketAddress remoteAddr, byte[] packetData, int ttl); diff --git a/java/src/com/zerotier/sdk/PathChecker.java b/java/src/com/zerotier/sdk/PathChecker.java index 3e02f112..6bf31df2 100644 --- a/java/src/com/zerotier/sdk/PathChecker.java +++ b/java/src/com/zerotier/sdk/PathChecker.java @@ -26,10 +26,10 @@ public interface PathChecker { * such as network containers or embedded. * * @param ztAddress ZeroTier address or 0 for none/any - * @param localAddress Local interface address + * @param localSocket Local interface socket. -1 if unspecified * @param remoteAddress remote address */ - boolean onPathCheck(long ztAddress, InetSocketAddress localAddress, InetSocketAddress remoteAddress); + boolean onPathCheck(long ztAddress, long localSocket, InetSocketAddress remoteAddress); /** * Function to get physical addresses for ZeroTier peers -- cgit v1.2.3 From 512c3af4eabaa085aca1c8b3dfdbcdd383135b9a Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Wed, 12 Jul 2017 13:12:45 -0700 Subject: fix packet sending functions --- java/jni/com_zerotierone_sdk_Node.cpp | 15 +++++++++++++-- java/src/com/zerotier/sdk/Node.java | 6 +++--- 2 files changed, 16 insertions(+), 5 deletions(-) (limited to 'java') diff --git a/java/jni/com_zerotierone_sdk_Node.cpp b/java/jni/com_zerotierone_sdk_Node.cpp index 94466db1..4d0dcff9 100644 --- a/java/jni/com_zerotierone_sdk_Node.cpp +++ b/java/jni/com_zerotierone_sdk_Node.cpp @@ -443,11 +443,22 @@ namespace { LOGV("Calling onDataStoreGet(%s, %p)", p, buffer); - return (int)env->CallLongMethod( + int retval = (int)env->CallLongMethod( ref->dataStoreGetListener, dataStoreGetCallbackMethod, nameStr, bufferObj); + + LOGV("onDataStoreGet returned %d", retval); + + if(retval > 0) + { + void *data = env->GetPrimitiveArrayCritical(bufferObj, NULL); + memcpy(buffer, data, retval); + env->ReleasePrimitiveArrayCritical(bufferObj, data, 0); + } + + return retval; } int WirePacketSendFunction(ZT_Node *node, @@ -459,7 +470,7 @@ namespace { unsigned int bufferSize, unsigned int ttl) { - LOGV("WirePacketSendFunction(%ld, %p, %p, %d)", localSocket, remoteAddress, buffer, bufferSize); + LOGV("WirePacketSendFunction(%lld, %p, %p, %d)", (long long)localSocket, remoteAddress, buffer, bufferSize); JniRef *ref = (JniRef*)userData; assert(ref->node == node); diff --git a/java/src/com/zerotier/sdk/Node.java b/java/src/com/zerotier/sdk/Node.java index 8e7d44e7..ef6ac9d2 100644 --- a/java/src/com/zerotier/sdk/Node.java +++ b/java/src/com/zerotier/sdk/Node.java @@ -173,12 +173,12 @@ public class Node { */ public ResultCode processWirePacket( long now, - InetSocketAddress localAddress, + long localSocket, InetSocketAddress remoteAddress, byte[] packetData, long[] nextBackgroundTaskDeadline) { return processWirePacket( - nodeId, now, localAddress, remoteAddress, packetData, + nodeId, now, localSocket, remoteAddress, packetData, nextBackgroundTaskDeadline); } @@ -426,7 +426,7 @@ public class Node { private native ResultCode processWirePacket( long nodeId, long now, - InetSocketAddress localAddress, + long localSocket, InetSocketAddress remoteAddress, byte[] packetData, long[] nextBackgroundTaskDeadline); -- cgit v1.2.3 From 69ae35494e86cbee83dbfdb166a14100f99e3010 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Wed, 12 Jul 2017 13:36:08 -0700 Subject: put the correct file extensions on data written to disk in JNI --- java/jni/com_zerotierone_sdk_Node.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'java') diff --git a/java/jni/com_zerotierone_sdk_Node.cpp b/java/jni/com_zerotierone_sdk_Node.cpp index 4d0dcff9..91561ff9 100644 --- a/java/jni/com_zerotierone_sdk_Node.cpp +++ b/java/jni/com_zerotierone_sdk_Node.cpp @@ -310,10 +310,10 @@ namespace { snprintf(p, sizeof(p), "planet"); break; case ZT_STATE_OBJECT_MOON: - snprintf(p, sizeof(p), "moons.d/%.16llx", (unsigned long long)id[0]); + snprintf(p, sizeof(p), "moons.d/%.16llx.moon", (unsigned long long)id[0]); break; case ZT_STATE_OBJECT_NETWORK_CONFIG: - snprintf(p, sizeof(p), "networks.d/%.16llx", (unsigned long long)id[0]); + snprintf(p, sizeof(p), "networks.d/%.16llx.conf", (unsigned long long)id[0]); break; case ZT_STATE_OBJECT_PEER: snprintf(p, sizeof(p), "peers.d/%.10llx", (unsigned long long)id[0]); @@ -394,10 +394,10 @@ namespace { snprintf(p, sizeof(p), "planet"); break; case ZT_STATE_OBJECT_MOON: - snprintf(p, sizeof(p), "moons.d/%.16llx", (unsigned long long)id[0]); + snprintf(p, sizeof(p), "moons.d/%.16llx.moon", (unsigned long long)id[0]); break; case ZT_STATE_OBJECT_NETWORK_CONFIG: - snprintf(p, sizeof(p), "networks.d/%.16llx", (unsigned long long)id[0]); + snprintf(p, sizeof(p), "networks.d/%.16llx.conf", (unsigned long long)id[0]); break; case ZT_STATE_OBJECT_PEER: snprintf(p, sizeof(p), "peers.d/%.10llx", (unsigned long long)id[0]); -- cgit v1.2.3 From bcf697cc2bd0f49b3b6c5acd120dfc28537bd97c Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Mon, 17 Jul 2017 16:15:13 -0700 Subject: Wire up PortMapper in Android Enables UPnP port mapping for Android client on networks with UPnP routers --- ext/miniupnpc/minisoap.c | 6 +++++ ext/miniupnpc/miniwget.c | 6 +++++ java/jni/Android.mk | 34 ++++++++++++++++++++++--- java/jni/com_zerotierone_sdk_Node.cpp | 16 +++++++++++- osdep/PortMapper.cpp | 47 ++++++++++++++++++++++++----------- 5 files changed, 89 insertions(+), 20 deletions(-) (limited to 'java') diff --git a/ext/miniupnpc/minisoap.c b/ext/miniupnpc/minisoap.c index 7aa0213e..01102a01 100644 --- a/ext/miniupnpc/minisoap.c +++ b/ext/miniupnpc/minisoap.c @@ -26,6 +26,12 @@ #define UPNP_VERSION_STRING "UPnP/1.1" #endif +#ifdef __ANDROID__ +#define OS_STRING "Android" +#define MINIUPNPC_VERSION_STRING "2.0" +#define UPNP_VERSION_STRING "UPnP/1.1" +#endif + /* only for malloc */ #include diff --git a/ext/miniupnpc/miniwget.c b/ext/miniupnpc/miniwget.c index 93c8aa6b..dfa6004e 100644 --- a/ext/miniupnpc/miniwget.c +++ b/ext/miniupnpc/miniwget.c @@ -55,6 +55,12 @@ #define UPNP_VERSION_STRING "UPnP/1.1" #endif +#ifdef __ANDROID__ +#define OS_STRING "Android" +#define MINIUPNPC_VERSION_STRING "2.0" +#define UPNP_VERSION_STRING "UPnP/1.1" +#endif + #include "miniwget.h" #include "connecthostport.h" #include "receivedata.h" diff --git a/java/jni/Android.mk b/java/jni/Android.mk index 3c5b555c..8cda2474 100644 --- a/java/jni/Android.mk +++ b/java/jni/Android.mk @@ -3,14 +3,21 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := ZeroTierOneJNI -LOCAL_C_INCLUDES := $(ZT1)/include -LOCAL_C_INCLUDES += $(ZT1)/node +LOCAL_C_INCLUDES := \ + $(ZT1)/include \ + $(ZT1)/node \ + $(ZT1)/osdep \ + $(ZT1)/ext/miniupnpc \ + $(ZT1)/ext/libnatpmp + LOCAL_LDLIBS := -llog -latomic # LOCAL_CFLAGS := -g +LOCAL_CFLAGS := -DZT_USE_MINIUPNPC + # ZeroTierOne SDK source files LOCAL_SRC_FILES := \ - $(ZT1)/node/C25519.cpp \ + $(ZT1)/node/C25519.cpp \ $(ZT1)/node/Capability.cpp \ $(ZT1)/node/CertificateOfMembership.cpp \ $(ZT1)/node/CertificateOfOwnership.cpp \ @@ -35,8 +42,27 @@ LOCAL_SRC_FILES := \ $(ZT1)/node/Tag.cpp \ $(ZT1)/node/Topology.cpp \ $(ZT1)/node/Trace.cpp \ - $(ZT1)/node/Utils.cpp + $(ZT1)/node/Utils.cpp \ + $(ZT1)/osdep/OSUtils.cpp \ + $(ZT1)/osdep/PortMapper.cpp +# libminiupnpc and libnatpmp files +LOCAL_SRC_FILES += \ + $(ZT1)/ext/miniupnpc/connecthostport.c \ + $(ZT1)/ext/miniupnpc/igd_desc_parse.c \ + $(ZT1)/ext/miniupnpc/minisoap.c \ + $(ZT1)/ext/miniupnpc/minissdpc.c \ + $(ZT1)/ext/miniupnpc/miniupnpc.c \ + $(ZT1)/ext/miniupnpc/miniwget.c \ + $(ZT1)/ext/miniupnpc/minixml.c \ + $(ZT1)/ext/miniupnpc/portlistingparse.c \ + $(ZT1)/ext/miniupnpc/receivedata.c \ + $(ZT1)/ext/miniupnpc/upnpcommands.c \ + $(ZT1)/ext/miniupnpc/upnpdev.c \ + $(ZT1)/ext/miniupnpc/upnperrors.c \ + $(ZT1)/ext/miniupnpc/upnpreplyparse.c \ + $(ZT1)/ext/libnatpmp/natpmp.c \ + $(ZT1)/ext/libnatpmp/getgateway.c # JNI Files LOCAL_SRC_FILES += \ diff --git a/java/jni/com_zerotierone_sdk_Node.cpp b/java/jni/com_zerotierone_sdk_Node.cpp index 91561ff9..01ca6d7f 100644 --- a/java/jni/com_zerotierone_sdk_Node.cpp +++ b/java/jni/com_zerotierone_sdk_Node.cpp @@ -32,6 +32,8 @@ #include #include "Mutex.hpp" +#include "PortMapper.hpp" + #include #include #include @@ -58,6 +60,7 @@ namespace { , configListener(NULL) , pathChecker(NULL) , callbacks(NULL) + , portMapper(NULL) { callbacks = (ZT_Node_Callbacks*)malloc(sizeof(ZT_Node_Callbacks)); memset(callbacks, 0, sizeof(ZT_Node_Callbacks)); @@ -78,6 +81,9 @@ namespace { free(callbacks); callbacks = NULL; + + delete portMapper; + portMapper = NULL; } uint64_t id; @@ -95,6 +101,8 @@ namespace { jobject pathChecker; ZT_Node_Callbacks *callbacks; + + ZeroTier::PortMapper *portMapper; }; @@ -833,11 +841,17 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_node_1init( return resultObject; } + uint64_t nodeId = ZT_Node_address(node); + if (nodeId != 0) { + char uniqueName[64]; + snprintf(uniqueName, sizeof(uniqueName), "ZeroTier Android/%.10llx@%u", (unsigned long long)nodeId, 9993); + ref->portMapper = new ZeroTier::PortMapper(9993, uniqueName); + } + ZeroTier::Mutex::Lock lock(nodeMapMutex); ref->node = node; nodeMap.insert(std::make_pair(ref->id, ref)); - return resultObject; } diff --git a/osdep/PortMapper.cpp b/osdep/PortMapper.cpp index b1990486..0da00653 100644 --- a/osdep/PortMapper.cpp +++ b/osdep/PortMapper.cpp @@ -29,6 +29,13 @@ // Uncomment to dump debug messages //#define ZT_PORTMAPPER_TRACE 1 +#ifdef __ANDROID__ +#include +#define PM_TRACE(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, "PortMapper", __VA_ARGS__)) +#else +#define PM_TRACE(...) fprintf(stderr, __VA_ARGS__) +#endif + #include #include #include @@ -53,15 +60,24 @@ #include #include #else +#ifdef __ANDROID__ +#include "miniupnpc.h" +#include "upnpcommands.h" +#else #include "../ext/miniupnpc/miniupnpc.h" #include "../ext/miniupnpc/upnpcommands.h" #endif +#endif #ifdef ZT_USE_SYSTEM_NATPMP #include #else +#ifdef __ANDROID__ +#include "natpmp.h" +#else #include "../ext/libnatpmp/natpmp.h" #endif +#endif namespace ZeroTier { @@ -83,7 +99,7 @@ public: int mode = 0; // 0 == NAT-PMP, 1 == UPnP #ifdef ZT_PORTMAPPER_TRACE - fprintf(stderr,"PortMapper: started for UDP port %d"ZT_EOL_S,localPort); + fprintf(stderr,"PortMapper: started for UDP port %d" ZT_EOL_S,localPort); #endif while (run) { @@ -108,7 +124,7 @@ public: if (initnatpmp(&natpmp,0,0) != 0) { mode = 1; #ifdef ZT_PORTMAPPER_TRACE - fprintf(stderr,"PortMapper: NAT-PMP: init failed, switching to UPnP mode"ZT_EOL_S); + PM_TRACE("PortMapper: NAT-PMP: init failed, switching to UPnP mode" ZT_EOL_S); #endif break; } @@ -131,7 +147,7 @@ public: publicAddress = InetAddress((uint32_t)response.pnu.publicaddress.addr.s_addr,0); } else { #ifdef ZT_PORTMAPPER_TRACE - fprintf(stderr,"PortMapper: NAT-PMP: request for external address failed, aborting..."ZT_EOL_S); + PM_TRACE("PortMapper: NAT-PMP: request for external address failed, aborting..." ZT_EOL_S); #endif closenatpmp(&natpmp); break; @@ -153,7 +169,8 @@ public: if (r == 0) { publicAddress.setPort(response.pnu.newportmapping.mappedpublicport); #ifdef ZT_PORTMAPPER_TRACE - fprintf(stderr,"PortMapper: NAT-PMP: mapped %u to %s"ZT_EOL_S,(unsigned int)localPort,publicAddress.toString().c_str()); + char paddr[128]; + PM_TRACE("PortMapper: NAT-PMP: mapped %u to %s" ZT_EOL_S,(unsigned int)localPort,publicAddress.toString(paddr)); #endif Mutex::Lock sl(surface_l); surface.clear(); @@ -170,7 +187,7 @@ public: if (!natPmpSuccess) { mode = 1; #ifdef ZT_PORTMAPPER_TRACE - fprintf(stderr,"PortMapper: NAT-PMP: request failed, switching to UPnP mode"ZT_EOL_S); + PM_TRACE("PortMapper: NAT-PMP: request failed, switching to UPnP mode" ZT_EOL_S); #endif } } @@ -195,7 +212,7 @@ public: { UPNPDev *dev = devlist; while (dev) { - fprintf(stderr,"PortMapper: found UPnP device at URL '%s': %s"ZT_EOL_S,dev->descURL,dev->st); + PM_TRACE("PortMapper: found UPnP device at URL '%s': %s" ZT_EOL_S,dev->descURL,dev->st); dev = dev->pNext; } } @@ -209,11 +226,11 @@ public: if ((UPNP_GetValidIGD(devlist,&urls,&data,lanaddr,sizeof(lanaddr)))&&(lanaddr[0])) { #ifdef ZT_PORTMAPPER_TRACE - fprintf(stderr,"PortMapper: UPnP: my LAN IP address: %s"ZT_EOL_S,lanaddr); + PM_TRACE("PortMapper: UPnP: my LAN IP address: %s" ZT_EOL_S,lanaddr); #endif if ((UPNP_GetExternalIPAddress(urls.controlURL,data.first.servicetype,externalip) == UPNPCOMMAND_SUCCESS)&&(externalip[0])) { #ifdef ZT_PORTMAPPER_TRACE - fprintf(stderr,"PortMapper: UPnP: my external IP address: %s"ZT_EOL_S,externalip); + PM_TRACE("PortMapper: UPnP: my external IP address: %s" ZT_EOL_S,externalip); #endif for(int tries=0;tries<60;++tries) { @@ -239,7 +256,7 @@ public: memset(haveLeaseDuration,0,sizeof(haveLeaseDuration)); if ((UPNP_GetSpecificPortMappingEntry(urls.controlURL,data.first.servicetype,outport,"UDP",(const char *)0,haveIntClient,haveIntPort,haveDesc,haveEnabled,haveLeaseDuration) == UPNPCOMMAND_SUCCESS)&&(uniqueName == haveDesc)) { #ifdef ZT_PORTMAPPER_TRACE - fprintf(stderr,"PortMapper: UPnP: reusing previously reserved external port: %s"ZT_EOL_S,outport); + PM_TRACE("PortMapper: UPnP: reusing previously reserved external port: %s" ZT_EOL_S,outport); #endif Mutex::Lock sl(surface_l); surface.clear(); @@ -254,7 +271,7 @@ public: int mapResult = 0; if ((mapResult = UPNP_AddPortMapping(urls.controlURL,data.first.servicetype,outport,inport,lanaddr,uniqueName.c_str(),"UDP",(const char *)0,"0")) == UPNPCOMMAND_SUCCESS) { #ifdef ZT_PORTMAPPER_TRACE - fprintf(stderr,"PortMapper: UPnP: reserved external port: %s"ZT_EOL_S,outport); + PM_TRACE("PortMapper: UPnP: reserved external port: %s" ZT_EOL_S,outport); #endif Mutex::Lock sl(surface_l); surface.clear(); @@ -264,7 +281,7 @@ public: break; } else { #ifdef ZT_PORTMAPPER_TRACE - fprintf(stderr,"PortMapper: UPnP: UPNP_AddPortMapping(%s) failed: %d"ZT_EOL_S,outport,mapResult); + PM_TRACE("PortMapper: UPnP: UPNP_AddPortMapping(%s) failed: %d" ZT_EOL_S,outport,mapResult); #endif Thread::sleep(1000); } @@ -273,13 +290,13 @@ public: } else { mode = 0; #ifdef ZT_PORTMAPPER_TRACE - fprintf(stderr,"PortMapper: UPnP: UPNP_GetExternalIPAddress failed, returning to NAT-PMP mode"ZT_EOL_S); + PM_TRACE("PortMapper: UPnP: UPNP_GetExternalIPAddress failed, returning to NAT-PMP mode" ZT_EOL_S); #endif } } else { mode = 0; #ifdef ZT_PORTMAPPER_TRACE - fprintf(stderr,"PortMapper: UPnP: UPNP_GetValidIGD failed, returning to NAT-PMP mode"ZT_EOL_S); + PM_TRACE("PortMapper: UPnP: UPNP_GetValidIGD failed, returning to NAT-PMP mode" ZT_EOL_S); #endif } @@ -288,14 +305,14 @@ public: } else { mode = 0; #ifdef ZT_PORTMAPPER_TRACE - fprintf(stderr,"PortMapper: upnpDiscover failed, returning to NAT-PMP mode: %d"ZT_EOL_S,upnpError); + PM_TRACE("PortMapper: upnpDiscover failed, returning to NAT-PMP mode: %d" ZT_EOL_S,upnpError); #endif } } // --------------------------------------------------------------------- #ifdef ZT_PORTMAPPER_TRACE - fprintf(stderr,"UPNPClient: rescanning in %d ms"ZT_EOL_S,ZT_PORTMAPPER_REFRESH_DELAY); + PM_TRACE("UPNPClient: rescanning in %d ms" ZT_EOL_S,ZT_PORTMAPPER_REFRESH_DELAY); #endif Thread::sleep(ZT_PORTMAPPER_REFRESH_DELAY); } -- cgit v1.2.3 From 3d4a1b575e693b5a0b907eb9bc5edf8739af63f8 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Tue, 3 Oct 2017 11:25:26 -0700 Subject: Update Android NDK with uint64_t -> int64_t changes --- java/jni/ZT_jniutils.cpp | 3 ++ java/jni/com_zerotierone_sdk_Node.cpp | 54 ++++++++++++++++++----------------- 2 files changed, 31 insertions(+), 26 deletions(-) (limited to 'java') diff --git a/java/jni/ZT_jniutils.cpp b/java/jni/ZT_jniutils.cpp index 7bdc7611..c52a2066 100644 --- a/java/jni/ZT_jniutils.cpp +++ b/java/jni/ZT_jniutils.cpp @@ -156,6 +156,9 @@ jobject createEvent(JNIEnv *env, ZT_Event event) break; case ZT_EVENT_USER_MESSAGE: break; + case ZT_EVENT_REMOTE_TRACE: + default: + break; } jfieldID enumField = lookup.findStaticField(eventClass, fieldName.c_str(), "Lcom/zerotier/sdk/Event;"); diff --git a/java/jni/com_zerotierone_sdk_Node.cpp b/java/jni/com_zerotierone_sdk_Node.cpp index 01ca6d7f..02a42837 100644 --- a/java/jni/com_zerotierone_sdk_Node.cpp +++ b/java/jni/com_zerotierone_sdk_Node.cpp @@ -86,7 +86,7 @@ namespace { portMapper = NULL; } - uint64_t id; + int64_t id; JavaVM *jvm; @@ -292,6 +292,8 @@ namespace { } break; case ZT_EVENT_USER_MESSAGE: + case ZT_EVENT_REMOTE_TRACE: + default: break; } } @@ -665,11 +667,11 @@ namespace { return true; } - typedef std::map NodeMap; + typedef std::map NodeMap; static NodeMap nodeMap; ZeroTier::Mutex nodeMapMutex; - ZT_Node* findNode(uint64_t nodeId) + ZT_Node* findNode(int64_t nodeId) { ZeroTier::Mutex::Lock lock(nodeMapMutex); NodeMap::iterator found = nodeMap.find(nodeId); @@ -707,7 +709,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_node_1init( ZT_Node *node; JniRef *ref = new JniRef; - ref->id = (uint64_t)now; + ref->id = (int64_t)now; env->GetJavaVM(&ref->jvm); jclass cls = env->GetObjectClass(obj); @@ -825,7 +827,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_node_1init( ref, NULL, ref->callbacks, - (uint64_t)now); + (int64_t)now); if(rc != ZT_RESULT_OK) { @@ -864,7 +866,7 @@ JNIEXPORT void JNICALL Java_com_zerotier_sdk_Node_node_1delete( JNIEnv *env, jobject obj, jlong id) { LOGV("Destroying ZT_Node struct"); - uint64_t nodeId = (uint64_t)id; + int64_t nodeId = (int64_t)id; NodeMap::iterator found; { @@ -905,7 +907,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processVirtualNetworkFrame( jbyteArray in_frameData, jlongArray out_nextBackgroundTaskDeadline) { - uint64_t nodeId = (uint64_t) id; + int64_t nodeId = (int64_t) id; ZT_Node *node = findNode(nodeId); if(node == NULL) @@ -921,7 +923,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processVirtualNetworkFrame( return createResultObject(env, ZT_RESULT_FATAL_ERROR_INTERNAL); } - uint64_t now = (uint64_t)in_now; + int64_t now = (int64_t)in_now; uint64_t nwid = (uint64_t)in_nwid; uint64_t sourceMac = (uint64_t)in_sourceMac; uint64_t destMac = (uint64_t)in_destMac; @@ -934,7 +936,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processVirtualNetworkFrame( memcpy(localData, frameData, frameLength); env->ReleasePrimitiveArrayCritical(in_frameData, frameData, 0); - uint64_t nextBackgroundTaskDeadline = 0; + int64_t nextBackgroundTaskDeadline = 0; ZT_ResultCode rc = ZT_Node_processVirtualNetworkFrame( node, @@ -970,7 +972,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processWirePacket( jbyteArray in_packetData, jlongArray out_nextBackgroundTaskDeadline) { - uint64_t nodeId = (uint64_t) id; + int64_t nodeId = (int64_t) id; ZT_Node *node = findNode(nodeId); if(node == NULL) { @@ -986,7 +988,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processWirePacket( return createResultObject(env, ZT_RESULT_FATAL_ERROR_INTERNAL); } - uint64_t now = (uint64_t)in_now; + int64_t now = (int64_t)in_now; // get the java.net.InetSocketAddress class and getAddress() method jclass inetAddressClass = lookup.findClass("java/net/InetAddress"); @@ -1092,7 +1094,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processWirePacket( memcpy(localData, packetData, packetLength); env->ReleasePrimitiveArrayCritical(in_packetData, packetData, 0); - uint64_t nextBackgroundTaskDeadline = 0; + int64_t nextBackgroundTaskDeadline = 0; ZT_ResultCode rc = ZT_Node_processWirePacket( node, @@ -1128,7 +1130,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processBackgroundTasks( jlong in_now, jlongArray out_nextBackgroundTaskDeadline) { - uint64_t nodeId = (uint64_t) id; + int64_t nodeId = (int64_t) id; ZT_Node *node = findNode(nodeId); if(node == NULL) { @@ -1142,8 +1144,8 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processBackgroundTasks( return createResultObject(env, ZT_RESULT_FATAL_ERROR_INTERNAL); } - uint64_t now = (uint64_t)in_now; - uint64_t nextBackgroundTaskDeadline = 0; + int64_t now = (int64_t)in_now; + int64_t nextBackgroundTaskDeadline = 0; ZT_ResultCode rc = ZT_Node_processBackgroundTasks(node, NULL, now, &nextBackgroundTaskDeadline); @@ -1162,7 +1164,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processBackgroundTasks( JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_join( JNIEnv *env, jobject obj, jlong id, jlong in_nwid) { - uint64_t nodeId = (uint64_t) id; + int64_t nodeId = (int64_t) id; ZT_Node *node = findNode(nodeId); if(node == NULL) { @@ -1185,7 +1187,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_join( JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_leave( JNIEnv *env, jobject obj, jlong id, jlong in_nwid) { - uint64_t nodeId = (uint64_t) id; + int64_t nodeId = (int64_t) id; ZT_Node *node = findNode(nodeId); if(node == NULL) { @@ -1212,7 +1214,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_multicastSubscribe( jlong in_multicastGroup, jlong in_multicastAdi) { - uint64_t nodeId = (uint64_t) id; + int64_t nodeId = (int64_t) id; ZT_Node *node = findNode(nodeId); if(node == NULL) { @@ -1242,7 +1244,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_multicastUnsubscribe( jlong in_multicastGroup, jlong in_multicastAdi) { - uint64_t nodeId = (uint64_t) id; + int64_t nodeId = (int64_t) id; ZT_Node *node = findNode(nodeId); if(node == NULL) { @@ -1271,7 +1273,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_orbit( jlong in_moonWorldId, jlong in_moonSeed) { - uint64_t nodeId = (uint64_t)id; + int64_t nodeId = (int64_t)id; ZT_Node *node = findNode(nodeId); if(node == NULL) { @@ -1295,7 +1297,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_deorbit( jlong id, jlong in_moonWorldId) { - uint64_t nodeId = (uint64_t)id; + int64_t nodeId = (int64_t)id; ZT_Node *node = findNode(nodeId); if(node == NULL) { @@ -1316,7 +1318,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_deorbit( JNIEXPORT jlong JNICALL Java_com_zerotier_sdk_Node_address( JNIEnv *env , jobject obj, jlong id) { - uint64_t nodeId = (uint64_t) id; + int64_t nodeId = (int64_t) id; ZT_Node *node = findNode(nodeId); if(node == NULL) { @@ -1336,7 +1338,7 @@ JNIEXPORT jlong JNICALL Java_com_zerotier_sdk_Node_address( JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_status (JNIEnv *env, jobject obj, jlong id) { - uint64_t nodeId = (uint64_t) id; + int64_t nodeId = (int64_t) id; ZT_Node *node = findNode(nodeId); if(node == NULL) { @@ -1428,7 +1430,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_status JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_networkConfig( JNIEnv *env, jobject obj, jlong id, jlong nwid) { - uint64_t nodeId = (uint64_t) id; + int64_t nodeId = (int64_t) id; ZT_Node *node = findNode(nodeId); if(node == NULL) { @@ -1470,7 +1472,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_version( JNIEXPORT jobjectArray JNICALL Java_com_zerotier_sdk_Node_peers( JNIEnv *env, jobject obj, jlong id) { - uint64_t nodeId = (uint64_t) id; + int64_t nodeId = (int64_t) id; ZT_Node *node = findNode(nodeId); if(node == NULL) { @@ -1539,7 +1541,7 @@ JNIEXPORT jobjectArray JNICALL Java_com_zerotier_sdk_Node_peers( JNIEXPORT jobjectArray JNICALL Java_com_zerotier_sdk_Node_networks( JNIEnv *env, jobject obj, jlong id) { - uint64_t nodeId = (uint64_t) id; + int64_t nodeId = (int64_t) id; ZT_Node *node = findNode(nodeId); if(node == NULL) { -- cgit v1.2.3 From f049740ae567fd4f4c855766869beb905b226a9b Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Wed, 7 Feb 2018 15:53:14 -0800 Subject: silence LOGV and LOGD in release builds for android --- java/jni/ZT_jniutils.h | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) (limited to 'java') diff --git a/java/jni/ZT_jniutils.h b/java/jni/ZT_jniutils.h index e35d4f42..56b63179 100644 --- a/java/jni/ZT_jniutils.h +++ b/java/jni/ZT_jniutils.h @@ -28,17 +28,31 @@ extern "C" { #define LOG_TAG "ZeroTierOneJNI" -#if __ANDROID__ +#if defined(__ANDROID__) + #include -#define LOGV(...) ((void)__android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__)) -#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)) -#define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)) -#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)) + + #if !defined(NDEBUG) + #define LOGV(...) ((void)__android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__)) + #define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)) + #else + #define LOGV(...) + #define LOGD(...) + #endif + + #define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)) + #define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)) #else -#define LOGV(...) fprintf(stdout, __VA_ARGS__) -#define LOGI(...) fprintf(stdout, __VA_ARGS__) -#define LOGD(...) fprintf(stdout, __VA_ARGS__) -#define LOGE(...) fprintf(stdout, __VA_ARGS__) + #if !defined(NDEBUG) + #define LOGV(...) fprintf(stdout, __VA_ARGS__) + #define LOGD(...) fprintf(stdout, __VA_ARGS__) + #else + #define LOGV(...) + #define LOGD(...) + #endif + + #define LOGI(...) fprintf(stdout, __VA_ARGS__) + #define LOGE(...) fprintf(stdout, __VA_ARGS__) #endif jobject createResultObject(JNIEnv *env, ZT_ResultCode code); -- cgit v1.2.3 From 8828fc75209fb998bb1ba76b69a37969ec843527 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Mon, 12 Feb 2018 09:29:44 -0800 Subject: some JNI error checking --- java/jni/com_zerotierone_sdk_Node.cpp | 37 +++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'java') diff --git a/java/jni/com_zerotierone_sdk_Node.cpp b/java/jni/com_zerotierone_sdk_Node.cpp index 02a42837..9a36e99b 100644 --- a/java/jni/com_zerotierone_sdk_Node.cpp +++ b/java/jni/com_zerotierone_sdk_Node.cpp @@ -120,6 +120,11 @@ namespace { JNIEnv *env = NULL; ref->jvm->GetEnv((void**)&env, JNI_VERSION_1_6); + if (ref->configListener == NULL) { + LOGE("configListener is NULL"); + return -1; + } + jclass configListenerClass = env->GetObjectClass(ref->configListener); if(configListenerClass == NULL) { @@ -169,13 +174,19 @@ namespace { unsigned int frameLength) { LOGV("VirtualNetworkFrameFunctionCallback"); +#ifndef NDEBUG unsigned char* local = (unsigned char*)frameData; LOGV("Type Bytes: 0x%02x%02x", local[12], local[13]); +#endif JniRef *ref = (JniRef*)userData; assert(ref->node == node); JNIEnv *env = NULL; ref->jvm->GetEnv((void**)&env, JNI_VERSION_1_6); + if (ref->frameListener == NULL) { + LOGE("frameListener is NULL"); + return; + } jclass frameListenerClass = env->GetObjectClass(ref->frameListener); if(env->ExceptionCheck() || frameListenerClass == NULL) @@ -228,6 +239,10 @@ namespace { JNIEnv *env = NULL; ref->jvm->GetEnv((void **) &env, JNI_VERSION_1_6); + if (ref->eventListener == NULL) { + LOGE("eventListener is NULL"); + return; + } jclass eventListenerClass = env->GetObjectClass(ref->eventListener); if (eventListenerClass == NULL) { @@ -332,10 +347,19 @@ namespace { return; } + if (strlen(p) < 1) { + return; + } + JniRef *ref = (JniRef*)userData; JNIEnv *env = NULL; ref->jvm->GetEnv((void**)&env, JNI_VERSION_1_6); + if (ref->dataStorePutListener == NULL) { + LOGE("dataStorePutListener is NULL"); + return; + } + jclass dataStorePutClass = env->GetObjectClass(ref->dataStorePutListener); if (dataStorePutClass == NULL) { @@ -416,10 +440,19 @@ namespace { return -1; } + if (strlen(p) < 1) { + return -1; + } + JniRef *ref = (JniRef*)userData; JNIEnv *env = NULL; ref->jvm->GetEnv((void**)&env, JNI_VERSION_1_6); + if (ref->dataStoreGetListener == NULL) { + LOGE("dataStoreGetListener is NULL"); + return -2; + } + jclass dataStoreGetClass = env->GetObjectClass(ref->dataStoreGetListener); if(dataStoreGetClass == NULL) { @@ -487,6 +520,10 @@ namespace { JNIEnv *env = NULL; ref->jvm->GetEnv((void**)&env, JNI_VERSION_1_6); + if (ref->packetSender == NULL) { + LOGE("packetSender is NULL"); + return -1; + } jclass packetSenderClass = env->GetObjectClass(ref->packetSender); if(packetSenderClass == NULL) -- cgit v1.2.3