diff options
Diffstat (limited to 'java/jni')
-rw-r--r-- | java/jni/Android.mk | 9 | ||||
-rw-r--r-- | java/jni/Application.mk | 9 | ||||
-rw-r--r-- | java/jni/ZT1_jnicache.cpp | 242 | ||||
-rw-r--r-- | java/jni/ZT_jnilookup.cpp | 158 | ||||
-rw-r--r-- | java/jni/ZT_jnilookup.h (renamed from java/jni/ZT1_jnicache.h) | 23 | ||||
-rw-r--r-- | java/jni/ZT_jniutils.cpp (renamed from java/jni/ZT1_jniutils.cpp) | 241 | ||||
-rw-r--r-- | java/jni/ZT_jniutils.h (renamed from java/jni/ZT1_jniutils.h) | 24 | ||||
-rw-r--r-- | java/jni/com_zerotierone_sdk_Node.cpp | 478 | ||||
-rw-r--r-- | java/jni/com_zerotierone_sdk_Node.h | 4 |
9 files changed, 580 insertions, 608 deletions
diff --git a/java/jni/Android.mk b/java/jni/Android.mk index bbf14348..5c2f1c79 100644 --- a/java/jni/Android.mk +++ b/java/jni/Android.mk @@ -4,7 +4,9 @@ include $(CLEAR_VARS) LOCAL_MODULE := ZeroTierOneJNI LOCAL_C_INCLUDES := $(ZT1)/include +LOCAL_C_INCLUDES += $(ZT1)/node LOCAL_LDLIBS := -llog +# LOCAL_CFLAGS := -g # ZeroTierOne SDK source files LOCAL_SRC_FILES := \ @@ -13,7 +15,7 @@ LOCAL_SRC_FILES := \ $(ZT1)/ext/http-parser/http_parser.c \ $(ZT1)/node/C25519.cpp \ $(ZT1)/node/CertificateOfMembership.cpp \ - $(ZT1)/node/Defaults.cpp \ + $(ZT1)/node/DeferredPackets.cpp \ $(ZT1)/node/Dictionary.cpp \ $(ZT1)/node/Identity.cpp \ $(ZT1)/node/IncomingPacket.cpp \ @@ -24,6 +26,7 @@ LOCAL_SRC_FILES := \ $(ZT1)/node/Node.cpp \ $(ZT1)/node/OutboundMulticast.cpp \ $(ZT1)/node/Packet.cpp \ + $(ZT1)/node/Path.cpp \ $(ZT1)/node/Peer.cpp \ $(ZT1)/node/Poly1305.cpp \ $(ZT1)/node/Salsa20.cpp \ @@ -38,7 +41,7 @@ LOCAL_SRC_FILES := \ # JNI Files LOCAL_SRC_FILES += \ com_zerotierone_sdk_Node.cpp \ - ZT1_jniutils.cpp \ - ZT1_jnicache.cpp + ZT_jniutils.cpp \ + ZT_jnilookup.cpp include $(BUILD_SHARED_LIBRARY)
\ No newline at end of file diff --git a/java/jni/Application.mk b/java/jni/Application.mk index 3118ec2e..608e94c0 100644 --- a/java/jni/Application.mk +++ b/java/jni/Application.mk @@ -1,4 +1,5 @@ -APP_ABI := armeabi armeabi-v7a arm64-v8a x86 -APP_STL := gnustl_static -APP_CPPFLAGS += -Wall -fPIE -fstack-protector -fexceptions -DZT_TRACE - +NDK_TOOLCHAIN_VERSION := clang +APP_STL := c++_static +APP_CPPFLAGS := -O3 -fPIC -fPIE -fvectorize -Wall -fstack-protector -fexceptions -fno-strict-aliasing -Wno-deprecated-register -DZT_NO_TYPE_PUNNING=1 +APP_PLATFORM := android-14 +APP_ABI := all diff --git a/java/jni/ZT1_jnicache.cpp b/java/jni/ZT1_jnicache.cpp deleted file mode 100644 index 8d6305cb..00000000 --- a/java/jni/ZT1_jnicache.cpp +++ /dev/null @@ -1,242 +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 <http://www.gnu.org/licenses/>. - * - * -- - * - * 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/ - */ - -#include "ZT1_jnicache.h" -#include "ZT1_jniutils.h" - -JniCache::JniCache() - : m_jvm(NULL) - , m_classes() - , m_fields() - , m_staticFields() - , m_methods() - , m_staticMethods() -{ - LOGV("JNI Cache Created"); -} - -JniCache::JniCache(JavaVM *jvm) - : m_jvm(jvm) - , m_classes() - , m_fields() - , m_staticFields() - , m_methods() - , m_staticMethods() -{ - LOGV("JNI Cache Created"); -} - -JniCache::~JniCache() -{ - LOGV("JNI Cache Destroyed"); - clearCache(); -} - -void JniCache::clearCache() -{ - if(m_jvm) - { - JNIEnv *env = NULL; - if(m_jvm->GetEnv((void**)&env, JNI_VERSION_1_6) != JNI_OK) - return; - - for(ClassMap::iterator iter = m_classes.begin(), end = m_classes.end(); - iter != end; ++iter) - { - env->DeleteGlobalRef(iter->second); - } - } - - m_classes.clear(); - m_fields.clear(); - m_staticFields.clear(); - m_methods.clear(); - m_staticMethods.clear(); -} - -void JniCache::setJavaVM(JavaVM *jvm) -{ - LOGV("Assigned JVM to object"); - m_jvm = jvm; -} - - -jclass JniCache::findClass(const std::string &name) -{ - if(!m_jvm) - return NULL; - - ClassMap::iterator found = m_classes.find(name); - - if(found == m_classes.end()) - { - // get the class from the JVM - JNIEnv *env = NULL; - if(m_jvm->GetEnv((void**)&env, JNI_VERSION_1_6) != JNI_OK) - { - LOGE("Error retreiving JNI Environment"); - return NULL; - } - - jclass localCls = env->FindClass(name.c_str()); - if(env->ExceptionCheck()) - { - LOGE("Error finding class: %s", name.c_str()); - return NULL; - } - - jclass cls = (jclass)env->NewGlobalRef(localCls); - - m_classes.insert(std::make_pair(name, cls)); - - return cls; - } - - LOGV("Returning cached %s", name.c_str()); - return found->second; -} - - -jmethodID JniCache::findMethod(jclass cls, const std::string &methodName, const std::string &methodSig) -{ - if(!m_jvm) - return NULL; - - std::string id = methodName + methodSig; - - MethodMap::iterator found = m_methods.find(id); - if(found == m_methods.end()) - { - JNIEnv *env = NULL; - if(m_jvm->GetEnv((void**)&env, JNI_VERSION_1_6) != JNI_OK) - { - return NULL; - } - - jmethodID mid = env->GetMethodID(cls, methodName.c_str(), methodSig.c_str()); - if(env->ExceptionCheck()) - { - return NULL; - } - - m_methods.insert(std::make_pair(id, mid)); - - return mid; - } - - return found->second; -} - -jmethodID JniCache::findStaticMethod(jclass cls, const std::string &methodName, const std::string &methodSig) -{ - if(!m_jvm) - return NULL; - - std::string id = methodName + methodSig; - - MethodMap::iterator found = m_staticMethods.find(id); - if(found == m_staticMethods.end()) - { - JNIEnv *env = NULL; - if(m_jvm->GetEnv((void**)&env, JNI_VERSION_1_6) != JNI_OK) - { - return NULL; - } - - jmethodID mid = env->GetStaticMethodID(cls, methodName.c_str(), methodSig.c_str()); - if(env->ExceptionCheck()) - { - return NULL; - } - - m_staticMethods.insert(std::make_pair(id, mid)); - - return mid; - } - - return found->second; -} - -jfieldID JniCache::findField(jclass cls, const std::string &fieldName, const std::string &typeStr) -{ - if(!m_jvm) - return NULL; - - std::string id = fieldName + typeStr; - - FieldMap::iterator found = m_fields.find(id); - if(found == m_fields.end()) - { - JNIEnv *env = NULL; - if(m_jvm->GetEnv((void**)&env, JNI_VERSION_1_6) != JNI_OK) - { - return NULL; - } - - jfieldID fid = env->GetFieldID(cls, fieldName.c_str(), typeStr.c_str()); - if(env->ExceptionCheck()) - { - return NULL; - } - - m_fields.insert(std::make_pair(id, fid)); - - return fid; - } - - return found->second; -} - -jfieldID JniCache::findStaticField(jclass cls, const std::string &fieldName, const std::string &typeStr) -{ - if(!m_jvm) - return NULL; - - std::string id = fieldName + typeStr; - - FieldMap::iterator found = m_staticFields.find(id); - if(found == m_staticFields.end()) - { - JNIEnv *env = NULL; - if(m_jvm->GetEnv((void**)&env, JNI_VERSION_1_6) != JNI_OK) - { - return NULL; - } - - jfieldID fid = env->GetStaticFieldID(cls, fieldName.c_str(), typeStr.c_str()); - if(env->ExceptionCheck()) - { - return NULL; - } - - m_staticFields.insert(std::make_pair(id, fid)); - - return fid; - } - - return found->second; -}
\ No newline at end of file diff --git a/java/jni/ZT_jnilookup.cpp b/java/jni/ZT_jnilookup.cpp new file mode 100644 index 00000000..be52a366 --- /dev/null +++ b/java/jni/ZT_jnilookup.cpp @@ -0,0 +1,158 @@ +/* + * 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 <http://www.gnu.org/licenses/>. + * + * -- + * + * 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/ + */ + +#include "ZT_jnilookup.h" +#include "ZT_jniutils.h" + +JniLookup::JniLookup() + : m_jvm(NULL) +{ + LOGV("JNI Cache Created"); +} + +JniLookup::JniLookup(JavaVM *jvm) + : m_jvm(jvm) +{ + LOGV("JNI Cache Created"); +} + +JniLookup::~JniLookup() +{ + LOGV("JNI Cache Destroyed"); +} + + +void JniLookup::setJavaVM(JavaVM *jvm) +{ + LOGV("Assigned JVM to object"); + m_jvm = jvm; +} + + +jclass JniLookup::findClass(const std::string &name) +{ + if(!m_jvm) + return NULL; + + // get the class from the JVM + JNIEnv *env = NULL; + if(m_jvm->GetEnv((void**)&env, JNI_VERSION_1_6) != JNI_OK) + { + LOGE("Error retreiving JNI Environment"); + return NULL; + } + + jclass cls = env->FindClass(name.c_str()); + if(env->ExceptionCheck()) + { + LOGE("Error finding class: %s", name.c_str()); + return NULL; + } + + return cls; +} + + +jmethodID JniLookup::findMethod(jclass cls, const std::string &methodName, const std::string &methodSig) +{ + if(!m_jvm) + return NULL; + + JNIEnv *env = NULL; + if(m_jvm->GetEnv((void**)&env, JNI_VERSION_1_6) != JNI_OK) + { + return NULL; + } + + jmethodID mid = env->GetMethodID(cls, methodName.c_str(), methodSig.c_str()); + if(env->ExceptionCheck()) + { + return NULL; + } + + return mid; +} + +jmethodID JniLookup::findStaticMethod(jclass cls, const std::string &methodName, const std::string &methodSig) +{ + if(!m_jvm) + return NULL; + + JNIEnv *env = NULL; + if(m_jvm->GetEnv((void**)&env, JNI_VERSION_1_6) != JNI_OK) + { + return NULL; + } + + jmethodID mid = env->GetStaticMethodID(cls, methodName.c_str(), methodSig.c_str()); + if(env->ExceptionCheck()) + { + return NULL; + } + + return mid; +} + +jfieldID JniLookup::findField(jclass cls, const std::string &fieldName, const std::string &typeStr) +{ + if(!m_jvm) + return NULL; + + JNIEnv *env = NULL; + if(m_jvm->GetEnv((void**)&env, JNI_VERSION_1_6) != JNI_OK) + { + return NULL; + } + + jfieldID fid = env->GetFieldID(cls, fieldName.c_str(), typeStr.c_str()); + if(env->ExceptionCheck()) + { + return NULL; + } + + return fid; +} + +jfieldID JniLookup::findStaticField(jclass cls, const std::string &fieldName, const std::string &typeStr) +{ + if(!m_jvm) + return NULL; + + JNIEnv *env = NULL; + if(m_jvm->GetEnv((void**)&env, JNI_VERSION_1_6) != JNI_OK) + { + return NULL; + } + + jfieldID fid = env->GetStaticFieldID(cls, fieldName.c_str(), typeStr.c_str()); + if(env->ExceptionCheck()) + { + return NULL; + } + + return fid; +}
\ No newline at end of file diff --git a/java/jni/ZT1_jnicache.h b/java/jni/ZT_jnilookup.h index 43f43a08..f5bd97d7 100644 --- a/java/jni/ZT1_jnicache.h +++ b/java/jni/ZT_jnilookup.h @@ -25,8 +25,8 @@ * LLC. Start here: http://www.zerotier.com/ */ -#ifndef ZT1_JNICACHE_H_ -#define ZT1_JNICACHE_H_ +#ifndef ZT_JNILOOKUP_H_ +#define ZT_JNILOOKUP_H_ #include <jni.h> #include <map> @@ -34,14 +34,13 @@ -class JniCache { +class JniLookup { public: - JniCache(); - JniCache(JavaVM *jvm); - ~JniCache(); + JniLookup(); + JniLookup(JavaVM *jvm); + ~JniLookup(); void setJavaVM(JavaVM *jvm); - void clearCache(); jclass findClass(const std::string &name); jmethodID findMethod(jclass cls, const std::string &methodName, const std::string &methodSig); @@ -49,17 +48,7 @@ public: jfieldID findField(jclass cls, const std::string &fieldName, const std::string &typeStr); jfieldID findStaticField(jclass cls, const std::string &fieldName, const std::string &typeStr); private: - typedef std::map<std::string, jmethodID> MethodMap; - typedef std::map<std::string, jfieldID> FieldMap; - typedef std::map<std::string, jclass> ClassMap; - JavaVM *m_jvm; - ClassMap m_classes; - FieldMap m_fields; - FieldMap m_staticFields; - MethodMap m_methods; - MethodMap m_staticMethods; - }; #endif
\ No newline at end of file diff --git a/java/jni/ZT1_jniutils.cpp b/java/jni/ZT_jniutils.cpp index 8779c3c3..ae1aa929 100644 --- a/java/jni/ZT1_jniutils.cpp +++ b/java/jni/ZT_jniutils.cpp @@ -1,21 +1,21 @@ -#include "ZT1_jniutils.h" -#include "ZT1_jnicache.h" +#include "ZT_jniutils.h" +#include "ZT_jnilookup.h" #include <string> #include <assert.h> -extern JniCache cache; +extern JniLookup lookup; #ifdef __cplusplus extern "C" { #endif -jobject createResultObject(JNIEnv *env, ZT1_ResultCode code) +jobject createResultObject(JNIEnv *env, ZT_ResultCode code) { jclass resultClass = NULL; jobject resultObject = NULL; - resultClass = cache.findClass("com/zerotier/sdk/ResultCode"); + resultClass = lookup.findClass("com/zerotier/sdk/ResultCode"); if(resultClass == NULL) { LOGE("Couldnt find ResultCode class"); @@ -25,30 +25,30 @@ jobject createResultObject(JNIEnv *env, ZT1_ResultCode code) std::string fieldName; switch(code) { - case ZT1_RESULT_OK: - LOGV("ZT1_RESULT_OK"); + case ZT_RESULT_OK: + LOGV("ZT_RESULT_OK"); fieldName = "RESULT_OK"; break; - case ZT1_RESULT_FATAL_ERROR_OUT_OF_MEMORY: - LOGV("ZT1_RESULT_FATAL_ERROR_OUT_OF_MEMORY"); + case ZT_RESULT_FATAL_ERROR_OUT_OF_MEMORY: + LOGV("ZT_RESULT_FATAL_ERROR_OUT_OF_MEMORY"); fieldName = "RESULT_FATAL_ERROR_OUT_OF_MEMORY"; break; - case ZT1_RESULT_FATAL_ERROR_DATA_STORE_FAILED: + case ZT_RESULT_FATAL_ERROR_DATA_STORE_FAILED: LOGV("RESULT_FATAL_ERROR_DATA_STORE_FAILED"); fieldName = "RESULT_FATAL_ERROR_DATA_STORE_FAILED"; break; - case ZT1_RESULT_ERROR_NETWORK_NOT_FOUND: + case ZT_RESULT_ERROR_NETWORK_NOT_FOUND: LOGV("RESULT_FATAL_ERROR_DATA_STORE_FAILED"); fieldName = "RESULT_ERROR_NETWORK_NOT_FOUND"; break; - case ZT1_RESULT_FATAL_ERROR_INTERNAL: + case ZT_RESULT_FATAL_ERROR_INTERNAL: default: LOGV("RESULT_FATAL_ERROR_DATA_STORE_FAILED"); fieldName = "RESULT_FATAL_ERROR_INTERNAL"; break; } - jfieldID enumField = cache.findStaticField(resultClass, fieldName.c_str(), "Lcom/zerotier/sdk/ResultCode;"); + jfieldID enumField = lookup.findStaticField(resultClass, fieldName.c_str(), "Lcom/zerotier/sdk/ResultCode;"); if(env->ExceptionCheck() || enumField == NULL) { LOGE("Error on FindStaticField"); @@ -64,11 +64,11 @@ jobject createResultObject(JNIEnv *env, ZT1_ResultCode code) } -jobject createVirtualNetworkStatus(JNIEnv *env, ZT1_VirtualNetworkStatus status) +jobject createVirtualNetworkStatus(JNIEnv *env, ZT_VirtualNetworkStatus status) { jobject statusObject = NULL; - jclass statusClass = cache.findClass("com/zerotier/sdk/VirtualNetworkStatus"); + jclass statusClass = lookup.findClass("com/zerotier/sdk/VirtualNetworkStatus"); if(statusClass == NULL) { return NULL; // exception thrown @@ -77,39 +77,39 @@ jobject createVirtualNetworkStatus(JNIEnv *env, ZT1_VirtualNetworkStatus status) std::string fieldName; switch(status) { - case ZT1_NETWORK_STATUS_REQUESTING_CONFIGURATION: + case ZT_NETWORK_STATUS_REQUESTING_CONFIGURATION: fieldName = "NETWORK_STATUS_REQUESTING_CONFIGURATION"; break; - case ZT1_NETWORK_STATUS_OK: + case ZT_NETWORK_STATUS_OK: fieldName = "NETWORK_STATUS_OK"; break; - case ZT1_NETWORK_STATUS_ACCESS_DENIED: + case ZT_NETWORK_STATUS_ACCESS_DENIED: fieldName = "NETWORK_STATUS_ACCESS_DENIED"; break; - case ZT1_NETWORK_STATUS_NOT_FOUND: + case ZT_NETWORK_STATUS_NOT_FOUND: fieldName = "NETWORK_STATUS_NOT_FOUND"; break; - case ZT1_NETWORK_STATUS_PORT_ERROR: + case ZT_NETWORK_STATUS_PORT_ERROR: fieldName = "NETWORK_STATUS_PORT_ERROR"; break; - case ZT1_NETWORK_STATUS_CLIENT_TOO_OLD: + case ZT_NETWORK_STATUS_CLIENT_TOO_OLD: fieldName = "NETWORK_STATUS_CLIENT_TOO_OLD"; break; } - jfieldID enumField = cache.findStaticField(statusClass, fieldName.c_str(), "Lcom/zerotier/sdk/VirtualNetworkStatus;"); + jfieldID enumField = lookup.findStaticField(statusClass, fieldName.c_str(), "Lcom/zerotier/sdk/VirtualNetworkStatus;"); statusObject = env->GetStaticObjectField(statusClass, enumField); return statusObject; } -jobject createEvent(JNIEnv *env, ZT1_Event event) +jobject createEvent(JNIEnv *env, ZT_Event event) { jclass eventClass = NULL; jobject eventObject = NULL; - eventClass = cache.findClass("com/zerotier/sdk/Event"); + eventClass = lookup.findClass("com/zerotier/sdk/Event"); if(eventClass == NULL) { return NULL; @@ -118,48 +118,39 @@ jobject createEvent(JNIEnv *env, ZT1_Event event) std::string fieldName; switch(event) { - case ZT1_EVENT_UP: + case ZT_EVENT_UP: fieldName = "EVENT_UP"; break; - case ZT1_EVENT_OFFLINE: + case ZT_EVENT_OFFLINE: fieldName = "EVENT_OFFLINE"; break; - case ZT1_EVENT_ONLINE: + case ZT_EVENT_ONLINE: fieldName = "EVENT_ONLINE"; break; - case ZT1_EVENT_DOWN: + case ZT_EVENT_DOWN: fieldName = "EVENT_DOWN"; break; - case ZT1_EVENT_FATAL_ERROR_IDENTITY_COLLISION: + case ZT_EVENT_FATAL_ERROR_IDENTITY_COLLISION: fieldName = "EVENT_FATAL_ERROR_IDENTITY_COLLISION"; break; - case ZT1_EVENT_SAW_MORE_RECENT_VERSION: - fieldName = "EVENT_SAW_MORE_RECENT_VERSION"; - break; - case ZT1_EVENT_AUTHENTICATION_FAILURE: - fieldName = "EVENT_AUTHENTICATION_FAILURE"; - break; - case ZT1_EVENT_INVALID_PACKET: - fieldName = "EVENT_INVALID_PACKET"; - break; - case ZT1_EVENT_TRACE: + case ZT_EVENT_TRACE: fieldName = "EVENT_TRACE"; break; } - jfieldID enumField = cache.findStaticField(eventClass, fieldName.c_str(), "Lcom/zerotier/sdk/Event;"); + jfieldID enumField = lookup.findStaticField(eventClass, fieldName.c_str(), "Lcom/zerotier/sdk/Event;"); eventObject = env->GetStaticObjectField(eventClass, enumField); return eventObject; } -jobject createPeerRole(JNIEnv *env, ZT1_PeerRole role) +jobject createPeerRole(JNIEnv *env, ZT_PeerRole role) { jclass peerRoleClass = NULL; jobject peerRoleObject = NULL; - peerRoleClass = cache.findClass("com/zerotier/sdk/PeerRole"); + peerRoleClass = lookup.findClass("com/zerotier/sdk/PeerRole"); if(peerRoleClass == NULL) { return NULL; @@ -168,30 +159,30 @@ jobject createPeerRole(JNIEnv *env, ZT1_PeerRole role) std::string fieldName; switch(role) { - case ZT1_PEER_ROLE_LEAF: + case ZT_PEER_ROLE_LEAF: fieldName = "PEER_ROLE_LEAF"; break; - case ZT1_PEER_ROLE_HUB: - fieldName = "PEER_ROLE_HUB"; + case ZT_PEER_ROLE_RELAY: + fieldName = "PEER_ROLE_RELAY"; break; - case ZT1_PEER_ROLE_ROOTSERVER: - fieldName = "PEER_ROLE_ROOTSERVER"; + case ZT_PEER_ROLE_ROOT: + fieldName = "PEER_ROLE_ROOTS"; break; } - jfieldID enumField = cache.findStaticField(peerRoleClass, fieldName.c_str(), "Lcom/zerotier/sdk/PeerRole;"); + jfieldID enumField = lookup.findStaticField(peerRoleClass, fieldName.c_str(), "Lcom/zerotier/sdk/PeerRole;"); peerRoleObject = env->GetStaticObjectField(peerRoleClass, enumField); return peerRoleObject; } -jobject createVirtualNetworkType(JNIEnv *env, ZT1_VirtualNetworkType type) +jobject createVirtualNetworkType(JNIEnv *env, ZT_VirtualNetworkType type) { jclass vntypeClass = NULL; jobject vntypeObject = NULL; - vntypeClass = cache.findClass("com/zerotier/sdk/VirtualNetworkType"); + vntypeClass = lookup.findClass("com/zerotier/sdk/VirtualNetworkType"); if(env->ExceptionCheck() || vntypeClass == NULL) { return NULL; @@ -200,25 +191,25 @@ jobject createVirtualNetworkType(JNIEnv *env, ZT1_VirtualNetworkType type) std::string fieldName; switch(type) { - case ZT1_NETWORK_TYPE_PRIVATE: + case ZT_NETWORK_TYPE_PRIVATE: fieldName = "NETWORK_TYPE_PRIVATE"; break; - case ZT1_NETWORK_TYPE_PUBLIC: + case ZT_NETWORK_TYPE_PUBLIC: fieldName = "NETWORK_TYPE_PUBLIC"; break; } - jfieldID enumField = cache.findStaticField(vntypeClass, fieldName.c_str(), "Lcom/zerotier/sdk/VirtualNetworkType;"); + jfieldID enumField = lookup.findStaticField(vntypeClass, fieldName.c_str(), "Lcom/zerotier/sdk/VirtualNetworkType;"); vntypeObject = env->GetStaticObjectField(vntypeClass, enumField); return vntypeObject; } -jobject createVirtualNetworkConfigOperation(JNIEnv *env, ZT1_VirtualNetworkConfigOperation op) +jobject createVirtualNetworkConfigOperation(JNIEnv *env, ZT_VirtualNetworkConfigOperation op) { jclass vnetConfigOpClass = NULL; jobject vnetConfigOpObject = NULL; - vnetConfigOpClass = cache.findClass("com/zerotier/sdk/VirtualNetworkConfigOperation"); + vnetConfigOpClass = lookup.findClass("com/zerotier/sdk/VirtualNetworkConfigOperation"); if(env->ExceptionCheck() || vnetConfigOpClass == NULL) { return NULL; @@ -227,21 +218,21 @@ jobject createVirtualNetworkConfigOperation(JNIEnv *env, ZT1_VirtualNetworkConfi std::string fieldName; switch(op) { - case ZT1_VIRTUAL_NETWORK_CONFIG_OPERATION_UP: + case ZT_VIRTUAL_NETWORK_CONFIG_OPERATION_UP: fieldName = "VIRTUAL_NETWORK_CONFIG_OPERATION_UP"; break; - case ZT1_VIRTUAL_NETWORK_CONFIG_OPERATION_CONFIG_UPDATE: + case ZT_VIRTUAL_NETWORK_CONFIG_OPERATION_CONFIG_UPDATE: fieldName = "VIRTUAL_NETWORK_CONFIG_OPERATION_CONFIG_UPDATE"; break; - case ZT1_VIRTUAL_NETWORK_CONFIG_OPERATION_DOWN: + case ZT_VIRTUAL_NETWORK_CONFIG_OPERATION_DOWN: fieldName = "VIRTUAL_NETWORK_CONFIG_OPERATION_DOWN"; break; - case ZT1_VIRTUAL_NETWORK_CONFIG_OPERATION_DESTROY: + case ZT_VIRTUAL_NETWORK_CONFIG_OPERATION_DESTROY: fieldName = "VIRTUAL_NETWORK_CONFIG_OPERATION_DESTROY"; break; } - jfieldID enumField = cache.findStaticField(vnetConfigOpClass, fieldName.c_str(), "Lcom/zerotier/sdk/VirtualNetworkConfigOperation;"); + jfieldID enumField = lookup.findStaticField(vnetConfigOpClass, fieldName.c_str(), "Lcom/zerotier/sdk/VirtualNetworkConfigOperation;"); vnetConfigOpObject = env->GetStaticObjectField(vnetConfigOpClass, enumField); return vnetConfigOpObject; } @@ -252,14 +243,14 @@ jobject newInetAddress(JNIEnv *env, const sockaddr_storage &addr) jclass inetAddressClass = NULL; jmethodID inetAddress_getByAddress = NULL; - inetAddressClass = cache.findClass("java/net/InetAddress"); + inetAddressClass = lookup.findClass("java/net/InetAddress"); if(env->ExceptionCheck() || inetAddressClass == NULL) { LOGE("Error finding InetAddress class"); return NULL; } - inetAddress_getByAddress = cache.findStaticMethod( + inetAddress_getByAddress = lookup.findStaticMethod( inetAddressClass, "getByAddress", "([B)Ljava/net/InetAddress;"); if(env->ExceptionCheck() || inetAddress_getByAddress == NULL) { @@ -315,7 +306,7 @@ jobject newInetSocketAddress(JNIEnv *env, const sockaddr_storage &addr) jclass inetSocketAddressClass = NULL; jmethodID inetSocketAddress_constructor = NULL; - inetSocketAddressClass = cache.findClass("java/net/InetSocketAddress"); + inetSocketAddressClass = lookup.findClass("java/net/InetSocketAddress"); if(env->ExceptionCheck() || inetSocketAddressClass == NULL) { LOGE("Error finding InetSocketAddress Class"); @@ -330,7 +321,7 @@ jobject newInetSocketAddress(JNIEnv *env, const sockaddr_storage &addr) return NULL; } - inetSocketAddress_constructor = cache.findMethod( + inetSocketAddress_constructor = lookup.findMethod( inetSocketAddressClass, "<init>", "(Ljava/net/InetAddress;I)V"); if(env->ExceptionCheck() || inetSocketAddress_constructor == NULL) { @@ -343,18 +334,18 @@ jobject newInetSocketAddress(JNIEnv *env, const sockaddr_storage &addr) { case AF_INET6: { - LOGD("IPV6 Address"); + LOGV("IPV6 Address"); sockaddr_in6 *ipv6 = (sockaddr_in6*)&addr; port = ntohs(ipv6->sin6_port); - LOGD("Port %d", port); + LOGV("Port %d", port); } break; case AF_INET: { - LOGD("IPV4 Address"); + LOGV("IPV4 Address"); sockaddr_in *ipv4 = (sockaddr_in*)&addr; port = ntohs(ipv4->sin_port); - LOGD("Port: %d", port); + LOGV("Port: %d", port); } break; default: @@ -372,7 +363,7 @@ jobject newInetSocketAddress(JNIEnv *env, const sockaddr_storage &addr) return inetSocketAddressObject; } -jobject newMulticastGroup(JNIEnv *env, const ZT1_MulticastGroup &mc) +jobject newMulticastGroup(JNIEnv *env, const ZT_MulticastGroup &mc) { jclass multicastGroupClass = NULL; jmethodID multicastGroup_constructor = NULL; @@ -380,13 +371,13 @@ jobject newMulticastGroup(JNIEnv *env, const ZT1_MulticastGroup &mc) jfieldID macField = NULL; jfieldID adiField = NULL; - multicastGroupClass = cache.findClass("com/zerotier/sdk/MulticastGroup"); + multicastGroupClass = lookup.findClass("com/zerotier/sdk/MulticastGroup"); if(env->ExceptionCheck() || multicastGroupClass == NULL) { return NULL; } - multicastGroup_constructor = cache.findMethod( + multicastGroup_constructor = lookup.findMethod( multicastGroupClass, "<init>", "()V"); if(env->ExceptionCheck() || multicastGroup_constructor == NULL) { @@ -399,13 +390,13 @@ jobject newMulticastGroup(JNIEnv *env, const ZT1_MulticastGroup &mc) return NULL; } - macField = cache.findField(multicastGroupClass, "mac", "J"); + macField = lookup.findField(multicastGroupClass, "mac", "J"); if(env->ExceptionCheck() || macField == NULL) { return NULL; } - adiField = cache.findField(multicastGroupClass, "adi", "J"); + adiField = lookup.findField(multicastGroupClass, "adi", "J"); if(env->ExceptionCheck() || adiField == NULL) { return NULL; @@ -417,7 +408,7 @@ jobject newMulticastGroup(JNIEnv *env, const ZT1_MulticastGroup &mc) return multicastGroupObj; } -jobject newPeerPhysicalPath(JNIEnv *env, const ZT1_PeerPhysicalPath &ppp) +jobject newPeerPhysicalPath(JNIEnv *env, const ZT_PeerPhysicalPath &ppp) { LOGV("newPeerPhysicalPath Called"); jclass pppClass = NULL; @@ -425,62 +416,54 @@ jobject newPeerPhysicalPath(JNIEnv *env, const ZT1_PeerPhysicalPath &ppp) jfieldID addressField = NULL; jfieldID lastSendField = NULL; jfieldID lastReceiveField = NULL; - jfieldID fixedField = NULL; jfieldID activeField = NULL; jfieldID preferredField = NULL; jmethodID ppp_constructor = NULL; - pppClass = cache.findClass("com/zerotier/sdk/PeerPhysicalPath"); + pppClass = lookup.findClass("com/zerotier/sdk/PeerPhysicalPath"); if(env->ExceptionCheck() || pppClass == NULL) { LOGE("Error finding PeerPhysicalPath class"); return NULL; } - addressField = cache.findField(pppClass, "address", "Ljava/net/InetSocketAddress;"); + addressField = lookup.findField(pppClass, "address", "Ljava/net/InetSocketAddress;"); if(env->ExceptionCheck() || addressField == NULL) { LOGE("Error finding address field"); return NULL; } - lastSendField = cache.findField(pppClass, "lastSend", "J"); + lastSendField = lookup.findField(pppClass, "lastSend", "J"); if(env->ExceptionCheck() || lastSendField == NULL) { LOGE("Error finding lastSend field"); return NULL; } - lastReceiveField = cache.findField(pppClass, "lastReceive", "J"); + lastReceiveField = lookup.findField(pppClass, "lastReceive", "J"); if(env->ExceptionCheck() || lastReceiveField == NULL) { LOGE("Error finding lastReceive field"); return NULL; } - fixedField = cache.findField(pppClass, "fixed", "Z"); - if(env->ExceptionCheck() || fixedField == NULL) - { - LOGE("Error finding fixed field"); - return NULL; - } - - activeField = cache.findField(pppClass, "active", "Z"); + activeField = lookup.findField(pppClass, "active", "Z"); if(env->ExceptionCheck() || activeField == NULL) { LOGE("Error finding active field"); return NULL; } - preferredField = cache.findField(pppClass, "preferred", "Z"); + preferredField = lookup.findField(pppClass, "preferred", "Z"); if(env->ExceptionCheck() || preferredField == NULL) { LOGE("Error finding preferred field"); return NULL; } - ppp_constructor = cache.findMethod(pppClass, "<init>", "()V"); + ppp_constructor = lookup.findMethod(pppClass, "<init>", "()V"); if(env->ExceptionCheck() || ppp_constructor == NULL) { LOGE("Error finding PeerPhysicalPath constructor"); @@ -503,7 +486,6 @@ jobject newPeerPhysicalPath(JNIEnv *env, const ZT1_PeerPhysicalPath &ppp) env->SetObjectField(pppObject, addressField, addressObject); env->SetLongField(pppObject, lastSendField, ppp.lastSend); env->SetLongField(pppObject, lastReceiveField, ppp.lastReceive); - env->SetBooleanField(pppObject, fixedField, ppp.fixed); env->SetBooleanField(pppObject, activeField, ppp.active); env->SetBooleanField(pppObject, preferredField, ppp.preferred); @@ -514,7 +496,7 @@ jobject newPeerPhysicalPath(JNIEnv *env, const ZT1_PeerPhysicalPath &ppp) return pppObject; } -jobject newPeer(JNIEnv *env, const ZT1_Peer &peer) +jobject newPeer(JNIEnv *env, const ZT_Peer &peer) { LOGV("newPeer called"); @@ -532,77 +514,77 @@ jobject newPeer(JNIEnv *env, const ZT1_Peer &peer) jmethodID peer_constructor = NULL; - peerClass = cache.findClass("com/zerotier/sdk/Peer"); + peerClass = lookup.findClass("com/zerotier/sdk/Peer"); if(env->ExceptionCheck() || peerClass == NULL) { LOGE("Error finding Peer class"); return NULL; } - addressField = cache.findField(peerClass, "address", "J"); + addressField = lookup.findField(peerClass, "address", "J"); if(env->ExceptionCheck() || addressField == NULL) { LOGE("Error finding address field of Peer object"); return NULL; } - lastUnicastFrameField = cache.findField(peerClass, "lastUnicastFrame", "J"); + lastUnicastFrameField = lookup.findField(peerClass, "lastUnicastFrame", "J"); if(env->ExceptionCheck() || lastUnicastFrameField == NULL) { LOGE("Error finding lastUnicastFrame field of Peer object"); return NULL; } - lastMulticastFrameField = cache.findField(peerClass, "lastMulticastFrame", "J"); + lastMulticastFrameField = lookup.findField(peerClass, "lastMulticastFrame", "J"); if(env->ExceptionCheck() || lastMulticastFrameField == NULL) { LOGE("Error finding lastMulticastFrame field of Peer object"); return NULL; } - versionMajorField = cache.findField(peerClass, "versionMajor", "I"); + versionMajorField = lookup.findField(peerClass, "versionMajor", "I"); if(env->ExceptionCheck() || versionMajorField == NULL) { LOGE("Error finding versionMajor field of Peer object"); return NULL; } - versionMinorField = cache.findField(peerClass, "versionMinor", "I"); + versionMinorField = lookup.findField(peerClass, "versionMinor", "I"); if(env->ExceptionCheck() || versionMinorField == NULL) { LOGE("Error finding versionMinor field of Peer object"); return NULL; } - versionRevField = cache.findField(peerClass, "versionRev", "I"); + versionRevField = lookup.findField(peerClass, "versionRev", "I"); if(env->ExceptionCheck() || versionRevField == NULL) { LOGE("Error finding versionRev field of Peer object"); return NULL; } - latencyField = cache.findField(peerClass, "latency", "I"); + latencyField = lookup.findField(peerClass, "latency", "I"); if(env->ExceptionCheck() || latencyField == NULL) { LOGE("Error finding latency field of Peer object"); return NULL; } - roleField = cache.findField(peerClass, "role", "Lcom/zerotier/sdk/PeerRole;"); + roleField = lookup.findField(peerClass, "role", "Lcom/zerotier/sdk/PeerRole;"); if(env->ExceptionCheck() || roleField == NULL) { LOGE("Error finding role field of Peer object"); return NULL; } - pathsField = cache.findField(peerClass, "paths", "[Lcom/zerotier/sdk/PeerPhysicalPath;"); + pathsField = lookup.findField(peerClass, "paths", "[Lcom/zerotier/sdk/PeerPhysicalPath;"); if(env->ExceptionCheck() || pathsField == NULL) { LOGE("Error finding paths field of Peer object"); return NULL; } - peer_constructor = cache.findMethod(peerClass, "<init>", "()V"); + peer_constructor = lookup.findMethod(peerClass, "<init>", "()V"); if(env->ExceptionCheck() || peer_constructor == NULL) { LOGE("Error finding Peer constructor"); @@ -625,7 +607,7 @@ jobject newPeer(JNIEnv *env, const ZT1_Peer &peer) env->SetIntField(peerObject, latencyField, peer.latency); env->SetObjectField(peerObject, roleField, createPeerRole(env, peer.role)); - jclass peerPhysicalPathClass = cache.findClass("com/zerotier/sdk/PeerPhysicalPath"); + jclass peerPhysicalPathClass = lookup.findClass("com/zerotier/sdk/PeerPhysicalPath"); if(env->ExceptionCheck() || peerPhysicalPathClass == NULL) { LOGE("Error finding PeerPhysicalPath class"); @@ -656,7 +638,7 @@ jobject newPeer(JNIEnv *env, const ZT1_Peer &peer) return peerObject; } -jobject newNetworkConfig(JNIEnv *env, const ZT1_VirtualNetworkConfig &vnetConfig) +jobject newNetworkConfig(JNIEnv *env, const ZT_VirtualNetworkConfig &vnetConfig) { jclass vnetConfigClass = NULL; jmethodID vnetConfig_constructor = NULL; @@ -675,14 +657,14 @@ jobject newNetworkConfig(JNIEnv *env, const ZT1_VirtualNetworkConfig &vnetConfig jfieldID multicastSubscriptionsField = NULL; jfieldID assignedAddressesField = NULL; - vnetConfigClass = cache.findClass("com/zerotier/sdk/VirtualNetworkConfig"); + vnetConfigClass = lookup.findClass("com/zerotier/sdk/VirtualNetworkConfig"); if(vnetConfigClass == NULL) { LOGE("Couldn't find com.zerotier.sdk.VirtualNetworkConfig"); return NULL; } - vnetConfig_constructor = cache.findMethod( + vnetConfig_constructor = lookup.findMethod( vnetConfigClass, "<init>", "()V"); if(env->ExceptionCheck() || vnetConfig_constructor == NULL) { @@ -697,98 +679,98 @@ jobject newNetworkConfig(JNIEnv *env, const ZT1_VirtualNetworkConfig &vnetConfig return NULL; } - nwidField = cache.findField(vnetConfigClass, "nwid", "J"); + nwidField = lookup.findField(vnetConfigClass, "nwid", "J"); if(env->ExceptionCheck() || nwidField == NULL) { LOGE("Error getting nwid field"); return NULL; } - macField = cache.findField(vnetConfigClass, "mac", "J"); + macField = lookup.findField(vnetConfigClass, "mac", "J"); if(env->ExceptionCheck() || macField == NULL) { LOGE("Error getting mac field"); return NULL; } - nameField = cache.findField(vnetConfigClass, "name", "Ljava/lang/String;"); + nameField = lookup.findField(vnetConfigClass, "name", "Ljava/lang/String;"); if(env->ExceptionCheck() || nameField == NULL) { LOGE("Error getting name field"); return NULL; } - statusField = cache.findField(vnetConfigClass, "status", "Lcom/zerotier/sdk/VirtualNetworkStatus;"); + statusField = lookup.findField(vnetConfigClass, "status", "Lcom/zerotier/sdk/VirtualNetworkStatus;"); if(env->ExceptionCheck() || statusField == NULL) { LOGE("Error getting status field"); return NULL; } - typeField = cache.findField(vnetConfigClass, "type", "Lcom/zerotier/sdk/VirtualNetworkType;"); + typeField = lookup.findField(vnetConfigClass, "type", "Lcom/zerotier/sdk/VirtualNetworkType;"); if(env->ExceptionCheck() || typeField == NULL) { LOGE("Error getting type field"); return NULL; } - mtuField = cache.findField(vnetConfigClass, "mtu", "I"); + mtuField = lookup.findField(vnetConfigClass, "mtu", "I"); if(env->ExceptionCheck() || mtuField == NULL) { LOGE("Error getting mtu field"); return NULL; } - dhcpField = cache.findField(vnetConfigClass, "dhcp", "Z"); + dhcpField = lookup.findField(vnetConfigClass, "dhcp", "Z"); if(env->ExceptionCheck() || dhcpField == NULL) { LOGE("Error getting dhcp field"); return NULL; } - bridgeField = cache.findField(vnetConfigClass, "bridge", "Z"); + bridgeField = lookup.findField(vnetConfigClass, "bridge", "Z"); if(env->ExceptionCheck() || bridgeField == NULL) { LOGE("Error getting bridge field"); return NULL; } - broadcastEnabledField = cache.findField(vnetConfigClass, "broadcastEnabled", "Z"); + broadcastEnabledField = lookup.findField(vnetConfigClass, "broadcastEnabled", "Z"); if(env->ExceptionCheck() || broadcastEnabledField == NULL) { LOGE("Error getting broadcastEnabled field"); return NULL; } - portErrorField = cache.findField(vnetConfigClass, "portError", "I"); + portErrorField = lookup.findField(vnetConfigClass, "portError", "I"); if(env->ExceptionCheck() || portErrorField == NULL) { LOGE("Error getting portError field"); return NULL; } - enabledField = cache.findField(vnetConfigClass, "enabled", "Z"); + enabledField = lookup.findField(vnetConfigClass, "enabled", "Z"); if(env->ExceptionCheck() || enabledField == NULL) { LOGE("Error getting enabled field"); return NULL; } - netconfRevisionField = cache.findField(vnetConfigClass, "netconfRevision", "J"); + netconfRevisionField = lookup.findField(vnetConfigClass, "netconfRevision", "J"); if(env->ExceptionCheck() || netconfRevisionField == NULL) { LOGE("Error getting netconfRevision field"); return NULL; } - multicastSubscriptionsField = cache.findField(vnetConfigClass, "multicastSubscriptions", "[Lcom/zerotier/sdk/MulticastGroup;"); + multicastSubscriptionsField = lookup.findField(vnetConfigClass, "multicastSubscriptions", "[Lcom/zerotier/sdk/MulticastGroup;"); if(env->ExceptionCheck() || multicastSubscriptionsField == NULL) { LOGE("Error getting multicastSubscriptions field"); return NULL; } - assignedAddressesField = cache.findField(vnetConfigClass, "assignedAddresses", "[Ljava/net/InetSocketAddress;"); + assignedAddressesField = lookup.findField(vnetConfigClass, "assignedAddresses", "[Ljava/net/InetSocketAddress;"); if(env->ExceptionCheck() || assignedAddressesField == NULL) { LOGE("Error getting assignedAddresses field"); @@ -818,13 +800,14 @@ jobject newNetworkConfig(JNIEnv *env, const ZT1_VirtualNetworkConfig &vnetConfig } env->SetObjectField(vnetConfigObj, typeField, typeObject); - env->SetIntField(vnetConfigObj, mtuField, vnetConfig.mtu); + env->SetIntField(vnetConfigObj, mtuField, (int)vnetConfig.mtu); env->SetBooleanField(vnetConfigObj, dhcpField, vnetConfig.dhcp); env->SetBooleanField(vnetConfigObj, bridgeField, vnetConfig.bridge); env->SetBooleanField(vnetConfigObj, broadcastEnabledField, vnetConfig.broadcastEnabled); + env->SetBooleanField(vnetConfigObj, enabledField, vnetConfig.enabled); env->SetIntField(vnetConfigObj, portErrorField, vnetConfig.portError); - jclass multicastGroupClass = cache.findClass("com/zerotier/sdk/MulticastGroup"); + jclass multicastGroupClass = lookup.findClass("com/zerotier/sdk/MulticastGroup"); if(env->ExceptionCheck() || multicastGroupClass == NULL) { LOGE("Error finding MulticastGroup class"); @@ -849,7 +832,7 @@ jobject newNetworkConfig(JNIEnv *env, const ZT1_VirtualNetworkConfig &vnetConfig } env->SetObjectField(vnetConfigObj, multicastSubscriptionsField, mcastSubsArrayObj); - jclass inetSocketAddressClass = cache.findClass("java/net/InetSocketAddress"); + jclass inetSocketAddressClass = lookup.findClass("java/net/InetSocketAddress"); if(env->ExceptionCheck() || inetSocketAddressClass == NULL) { LOGE("Error finding InetSocketAddress class"); @@ -886,13 +869,13 @@ jobject newVersion(JNIEnv *env, int major, int minor, int rev, long featureFlags jclass versionClass = NULL; jmethodID versionConstructor = NULL; - versionClass = cache.findClass("com/zerotier/sdk/Version"); + versionClass = lookup.findClass("com/zerotier/sdk/Version"); if(env->ExceptionCheck() || versionClass == NULL) { return NULL; } - versionConstructor = cache.findMethod( + versionConstructor = lookup.findMethod( versionClass, "<init>", "()V"); if(env->ExceptionCheck() || versionConstructor == NULL) { @@ -911,25 +894,25 @@ jobject newVersion(JNIEnv *env, int major, int minor, int rev, long featureFlags jfieldID revisionField = NULL; jfieldID featureFlagsField = NULL; - majorField = cache.findField(versionClass, "major", "I"); + majorField = lookup.findField(versionClass, "major", "I"); if(env->ExceptionCheck() || majorField == NULL) { return NULL; } - minorField = cache.findField(versionClass, "minor", "I"); + minorField = lookup.findField(versionClass, "minor", "I"); if(env->ExceptionCheck() || minorField == NULL) { return NULL; } - revisionField = cache.findField(versionClass, "revision", "I"); + revisionField = lookup.findField(versionClass, "revision", "I"); if(env->ExceptionCheck() || revisionField == NULL) { return NULL; } - featureFlagsField = cache.findField(versionClass, "featureFlags", "J"); + featureFlagsField = lookup.findField(versionClass, "featureFlags", "J"); if(env->ExceptionCheck() || featureFlagsField == NULL) { return NULL; diff --git a/java/jni/ZT1_jniutils.h b/java/jni/ZT_jniutils.h index 880f67d7..b76a28c2 100644 --- a/java/jni/ZT1_jniutils.h +++ b/java/jni/ZT_jniutils.h @@ -1,5 +1,5 @@ -#ifndef ZT1_jniutils_h_ -#define ZT1_jniutils_h_ +#ifndef ZT_jniutils_h_ +#define ZT_jniutils_h_ #include <stdio.h> #include <jni.h> #include <ZeroTierOne.h> @@ -23,22 +23,22 @@ extern "C" { #define LOGE(...) fprintf(stdout, __VA_ARGS__) #endif -jobject createResultObject(JNIEnv *env, ZT1_ResultCode code); -jobject createVirtualNetworkStatus(JNIEnv *env, ZT1_VirtualNetworkStatus status); -jobject createVirtualNetworkType(JNIEnv *env, ZT1_VirtualNetworkType type); -jobject createEvent(JNIEnv *env, ZT1_Event event); -jobject createPeerRole(JNIEnv *env, ZT1_PeerRole role); -jobject createVirtualNetworkConfigOperation(JNIEnv *env, ZT1_VirtualNetworkConfigOperation op); +jobject createResultObject(JNIEnv *env, ZT_ResultCode code); +jobject createVirtualNetworkStatus(JNIEnv *env, ZT_VirtualNetworkStatus status); +jobject createVirtualNetworkType(JNIEnv *env, ZT_VirtualNetworkType type); +jobject createEvent(JNIEnv *env, ZT_Event event); +jobject createPeerRole(JNIEnv *env, ZT_PeerRole role); +jobject createVirtualNetworkConfigOperation(JNIEnv *env, ZT_VirtualNetworkConfigOperation op); jobject newInetSocketAddress(JNIEnv *env, const sockaddr_storage &addr); jobject newInetAddress(JNIEnv *env, const sockaddr_storage &addr); -jobject newMulticastGroup(JNIEnv *env, const ZT1_MulticastGroup &mc); +jobject newMulticastGroup(JNIEnv *env, const ZT_MulticastGroup &mc); -jobject newPeer(JNIEnv *env, const ZT1_Peer &peer); -jobject newPeerPhysicalPath(JNIEnv *env, const ZT1_PeerPhysicalPath &ppp); +jobject newPeer(JNIEnv *env, const ZT_Peer &peer); +jobject newPeerPhysicalPath(JNIEnv *env, const ZT_PeerPhysicalPath &ppp); -jobject newNetworkConfig(JNIEnv *env, const ZT1_VirtualNetworkConfig &config); +jobject newNetworkConfig(JNIEnv *env, const ZT_VirtualNetworkConfig &config); jobject newVersion(JNIEnv *env, int major, int minor, int rev, long featureFlags); diff --git a/java/jni/com_zerotierone_sdk_Node.cpp b/java/jni/com_zerotierone_sdk_Node.cpp index f0405813..2c1b6807 100644 --- a/java/jni/com_zerotierone_sdk_Node.cpp +++ b/java/jni/com_zerotierone_sdk_Node.cpp @@ -26,18 +26,19 @@ */ #include "com_zerotierone_sdk_Node.h" -#include "ZT1_jniutils.h" -#include "ZT1_jnicache.h" +#include "ZT_jniutils.h" +#include "ZT_jnilookup.h" #include <ZeroTierOne.h> +#include "Mutex.hpp" #include <map> #include <string> #include <assert.h> #include <string.h> -// global static JNI Cache Object -JniCache cache; +// global static JNI Lookup Object +JniLookup lookup; #ifdef __cplusplus extern "C" { @@ -74,7 +75,7 @@ namespace { JavaVM *jvm; - ZT1_Node *node; + ZT_Node *node; jobject dataStoreGetListener; jobject dataStorePutListener; @@ -86,13 +87,13 @@ namespace { int VirtualNetworkConfigFunctionCallback( - ZT1_Node *node, + ZT_Node *node, void *userData, uint64_t nwid, - enum ZT1_VirtualNetworkConfigOperation operation, - const ZT1_VirtualNetworkConfig *config) + enum ZT_VirtualNetworkConfigOperation operation, + const ZT_VirtualNetworkConfig *config) { - LOGD("VritualNetworkConfigFunctionCallback"); + LOGV("VritualNetworkConfigFunctionCallback"); JniRef *ref = (JniRef*)userData; JNIEnv *env = NULL; ref->jvm->GetEnv((void**)&env, JNI_VERSION_1_6); @@ -104,7 +105,7 @@ namespace { return -1; } - jmethodID configListenerCallbackMethod = cache.findMethod(configListenerClass, + jmethodID configListenerCallbackMethod = lookup.findMethod(configListenerClass, "onNetworkConfigurationUpdated", "(JLcom/zerotier/sdk/VirtualNetworkConfigOperation;Lcom/zerotier/sdk/VirtualNetworkConfig;)I"); if(configListenerCallbackMethod == NULL) @@ -133,7 +134,8 @@ namespace { (jlong)nwid, operationObject, networkConfigObject); } - void VirtualNetworkFrameFunctionCallback(ZT1_Node *node,void *userData, + void VirtualNetworkFrameFunctionCallback(ZT_Node *node, + void *userData, uint64_t nwid, uint64_t sourceMac, uint64_t destMac, @@ -142,7 +144,9 @@ namespace { const void *frameData, unsigned int frameLength) { - LOGD("VirtualNetworkFrameFunctionCallback"); + LOGV("VirtualNetworkFrameFunctionCallback"); + unsigned char* local = (unsigned char*)frameData; + LOGV("Type Bytes: 0x%02x%02x", local[12], local[13]); JniRef *ref = (JniRef*)userData; assert(ref->node == node); JNIEnv *env = NULL; @@ -156,7 +160,7 @@ namespace { return; } - jmethodID frameListenerCallbackMethod = cache.findMethod( + jmethodID frameListenerCallbackMethod = lookup.findMethod( frameListenerClass, "onVirtualNetworkFrame", "(JJJJJ[B)V"); if(env->ExceptionCheck() || frameListenerCallbackMethod == NULL) @@ -172,9 +176,9 @@ namespace { return; } - jbyte *data = env->GetByteArrayElements(dataArray, NULL); + void *data = env->GetPrimitiveArrayCritical(dataArray, NULL); memcpy(data, frameData, frameLength); - env->ReleaseByteArrayElements(dataArray, data, 0); + env->ReleasePrimitiveArrayCritical(dataArray, data, 0); if(env->ExceptionCheck()) { @@ -186,11 +190,18 @@ namespace { } - void EventCallback(ZT1_Node *node,void *userData,enum ZT1_Event event, const void *data) + void EventCallback(ZT_Node *node, + void *userData, + enum ZT_Event event, + const void *data) { - LOGD("EventCallback"); + LOGV("EventCallback"); JniRef *ref = (JniRef*)userData; - assert(ref->node == node); + 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); @@ -202,7 +213,7 @@ namespace { return; } - jmethodID onEventMethod = cache.findMethod(eventListenerClass, + jmethodID onEventMethod = lookup.findMethod(eventListenerClass, "onEvent", "(Lcom/zerotier/sdk/Event;)V"); if(onEventMethod == NULL) { @@ -210,26 +221,7 @@ namespace { return; } - - jmethodID onOutOfDateMethod = cache.findMethod(eventListenerClass, - "onOutOfDate", "(Lcom/zerotier/sdk/Version;)V"); - if(onOutOfDateMethod == NULL) - { - LOGE("Couldn't find onOutOfDate method"); - return; - } - - - jmethodID onNetworkErrorMethod = cache.findMethod(eventListenerClass, - "onNetworkError", "(Lcom/zerotier/sdk/Event;Ljava/net/InetSocketAddress;)V"); - if(onNetworkErrorMethod == NULL) - { - LOGE("Couldn't find onNetworkError method"); - return; - } - - - jmethodID onTraceMethod = cache.findMethod(eventListenerClass, + jmethodID onTraceMethod = lookup.findMethod(eventListenerClass, "onTrace", "(Ljava/lang/String;)V"); if(onTraceMethod == NULL) { @@ -245,43 +237,38 @@ namespace { switch(event) { - case ZT1_EVENT_UP: - case ZT1_EVENT_OFFLINE: - case ZT1_EVENT_ONLINE: - case ZT1_EVENT_DOWN: - case ZT1_EVENT_FATAL_ERROR_IDENTITY_COLLISION: + case ZT_EVENT_UP: { - LOGV("Regular Event"); - // call onEvent() + LOGD("Event Up"); env->CallVoidMethod(ref->eventListener, onEventMethod, eventObject); + break; } - break; - case ZT1_EVENT_SAW_MORE_RECENT_VERSION: + case ZT_EVENT_OFFLINE: { - LOGV("Version Event"); - // call onOutOfDate() - if(data != NULL) - { - int *version = (int*)data; - jobject verisonObj = newVersion(env, version[0], version[1], version[2], 0); - env->CallVoidMethod(ref->eventListener, onOutOfDateMethod, verisonObj); - } + LOGD("Event Offline"); + env->CallVoidMethod(ref->eventListener, onEventMethod, eventObject); + break; } - break; - case ZT1_EVENT_AUTHENTICATION_FAILURE: - case ZT1_EVENT_INVALID_PACKET: + case ZT_EVENT_ONLINE: { - LOGV("Network Error Event"); - // call onNetworkError() - if(data != NULL) - { - sockaddr_storage *addr = (sockaddr_storage*)data; - jobject addressObj = newInetSocketAddress(env, *addr); - env->CallVoidMethod(ref->eventListener, onNetworkErrorMethod, addressObj); - } + 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 ZT1_EVENT_TRACE: + case ZT_EVENT_TRACE: { LOGV("Trace Event"); // call onTrace() @@ -296,7 +283,8 @@ namespace { } } - long DataStoreGetFunction(ZT1_Node *node,void *userData, + long DataStoreGetFunction(ZT_Node *node, + void *userData, const char *objectName, void *buffer, unsigned long bufferSize, @@ -314,7 +302,7 @@ namespace { return -2; } - jmethodID dataStoreGetCallbackMethod = cache.findMethod( + jmethodID dataStoreGetCallbackMethod = lookup.findMethod( dataStoreGetClass, "onDataStoreGet", "(Ljava/lang/String;[BJ[J)J"); @@ -354,21 +342,22 @@ namespace { if(retval > 0) { - jbyte *data = env->GetByteArrayElements(bufferObj, NULL); + void *data = env->GetPrimitiveArrayCritical(bufferObj, NULL); memcpy(buffer, data, retval); - env->ReleaseByteArrayElements(bufferObj, data, JNI_ABORT); + env->ReleasePrimitiveArrayCritical(bufferObj, data, 0); - jlong *objSize = env->GetLongArrayElements(objectSizeObj, NULL); + jlong *objSize = (jlong*)env->GetPrimitiveArrayCritical(objectSizeObj, NULL); *out_objectSize = (unsigned long)objSize[0]; - env->ReleaseLongArrayElements(objectSizeObj, objSize, JNI_ABORT); + env->ReleasePrimitiveArrayCritical(objectSizeObj, objSize, 0); } - LOGI("Out Object Size: %lu", *out_objectSize); + LOGV("Out Object Size: %lu", *out_objectSize); return retval; } - int DataStorePutFunction(ZT1_Node *node,void *userData, + int DataStorePutFunction(ZT_Node *node, + void *userData, const char *objectName, const void *buffer, unsigned long bufferSize, @@ -386,7 +375,7 @@ namespace { return -1; } - jmethodID dataStorePutCallbackMethod = cache.findMethod( + jmethodID dataStorePutCallbackMethod = lookup.findMethod( dataStorePutClass, "onDataStorePut", "(Ljava/lang/String;[BZ)I"); @@ -396,7 +385,7 @@ namespace { return -2; } - jmethodID deleteMethod = cache.findMethod(dataStorePutClass, + jmethodID deleteMethod = lookup.findMethod(dataStorePutClass, "onDelete", "(Ljava/lang/String;)I"); if(deleteMethod == NULL) { @@ -408,30 +397,40 @@ namespace { 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); } } - int WirePacketSendFunction(ZT1_Node *node,void *userData,\ - const struct sockaddr_storage *address, + int WirePacketSendFunction(ZT_Node *node, + void *userData, + const struct sockaddr_storage *localAddress, + const struct sockaddr_storage *remoteAddress, const void *buffer, - unsigned int bufferSize) + unsigned int bufferSize, + unsigned int ttl) { - LOGD("WirePacketSendFunction(%p, %p, %d)", address, buffer, bufferSize); + LOGV("WirePacketSendFunction(%p, %p, %p, %d)", localAddress, remoteAddress, buffer, bufferSize); JniRef *ref = (JniRef*)userData; assert(ref->node == node); @@ -446,28 +445,36 @@ namespace { return -1; } - jmethodID packetSenderCallbackMethod = cache.findMethod(packetSenderClass, - "onSendPacketRequested", "(Ljava/net/InetSocketAddress;[B)I"); + jmethodID packetSenderCallbackMethod = lookup.findMethod(packetSenderClass, + "onSendPacketRequested", "(Ljava/net/InetSocketAddress;Ljava/net/InetSocketAddress;[BI)I"); if(packetSenderCallbackMethod == NULL) { LOGE("Couldn't find onSendPacketRequested method"); return -2; } - jobject addressObj = newInetSocketAddress(env, *address); + 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, addressObj, bufferObj); + int retval = env->CallIntMethod(ref->packetSender, packetSenderCallbackMethod, localAddressObj, remoteAddressObj, bufferObj); - LOGD("JNI Packet Sender returned: %d", retval); + LOGV("JNI Packet Sender returned: %d", retval); return retval; } typedef std::map<uint64_t, JniRef*> NodeMap; static NodeMap nodeMap; + ZeroTier::Mutex nodeMapMutex; - ZT1_Node* findNode(uint64_t nodeId) + ZT_Node* findNode(uint64_t nodeId) { + ZeroTier::Mutex::Lock lock(nodeMapMutex); NodeMap::iterator found = nodeMap.find(nodeId); if(found != nodeMap.end()) { @@ -480,13 +487,13 @@ namespace { JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) { - cache.setJavaVM(vm); + lookup.setJavaVM(vm); return JNI_VERSION_1_6; } JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *vm, void *reserved) { - cache.clearCache(); + } @@ -498,16 +505,16 @@ JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *vm, void *reserved) JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_node_1init( JNIEnv *env, jobject obj, jlong now) { - LOGV("Creating ZT1_Node struct"); - jobject resultObject = createResultObject(env, ZT1_RESULT_OK); + LOGV("Creating ZT_Node struct"); + jobject resultObject = createResultObject(env, ZT_RESULT_OK); - ZT1_Node *node; + ZT_Node *node; JniRef *ref = new JniRef; ref->id = (uint64_t)now; env->GetJavaVM(&ref->jvm); jclass cls = env->GetObjectClass(obj); - jfieldID fid = cache.findField( + jfieldID fid = lookup.findField( cls, "getListener", "Lcom/zerotier/sdk/DataStoreGetListener;"); if(fid == NULL) @@ -522,7 +529,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_node_1init( } ref->dataStoreGetListener = env->NewGlobalRef(tmp); - fid = cache.findField( + fid = lookup.findField( cls, "putListener", "Lcom/zerotier/sdk/DataStorePutListener;"); if(fid == NULL) @@ -537,7 +544,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_node_1init( } ref->dataStorePutListener = env->NewGlobalRef(tmp); - fid = cache.findField( + fid = lookup.findField( cls, "sender", "Lcom/zerotier/sdk/PacketSender;"); if(fid == NULL) { @@ -551,7 +558,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_node_1init( } ref->packetSender = env->NewGlobalRef(tmp); - fid = cache.findField( + fid = lookup.findField( cls, "frameListener", "Lcom/zerotier/sdk/VirtualNetworkFrameListener;"); if(fid == NULL) { @@ -565,7 +572,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_node_1init( } ref->frameListener = env->NewGlobalRef(tmp); - fid = cache.findField( + fid = lookup.findField( cls, "configListener", "Lcom/zerotier/sdk/VirtualNetworkConfigListener;"); if(fid == NULL) { @@ -579,7 +586,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_node_1init( } ref->configListener = env->NewGlobalRef(tmp); - fid = cache.findField( + fid = lookup.findField( cls, "eventListener", "Lcom/zerotier/sdk/EventListener;"); if(fid == NULL) { @@ -593,7 +600,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_node_1init( } ref->eventListener = env->NewGlobalRef(tmp); - ZT1_ResultCode rc = ZT1_Node_new( + ZT_ResultCode rc = ZT_Node_new( &node, ref, (uint64_t)now, @@ -604,13 +611,13 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_node_1init( &VirtualNetworkConfigFunctionCallback, &EventCallback); - if(rc != ZT1_RESULT_OK) + if(rc != ZT_RESULT_OK) { LOGE("Error creating Node: %d", rc); resultObject = createResultObject(env, rc); if(node) { - ZT1_Node_delete(node); + ZT_Node_delete(node); node = NULL; } delete ref; @@ -618,8 +625,10 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_node_1init( return resultObject; } + ZeroTier::Mutex::Lock lock(nodeMapMutex); ref->node = node; nodeMap.insert(std::make_pair(ref->id, ref)); + return resultObject; } @@ -632,16 +641,21 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_node_1init( JNIEXPORT void JNICALL Java_com_zerotier_sdk_Node_node_1delete( JNIEnv *env, jobject obj, jlong id) { - LOGV("Destroying ZT1_Node struct"); + LOGV("Destroying ZT_Node struct"); uint64_t nodeId = (uint64_t)id; - NodeMap::iterator found = nodeMap.find(nodeId); + NodeMap::iterator found; + { + ZeroTier::Mutex::Lock lock(nodeMapMutex); + found = nodeMap.find(nodeId); + } + if(found != nodeMap.end()) { JniRef *ref = found->second; nodeMap.erase(found); - ZT1_Node_delete(ref->node); + ZT_Node_delete(ref->node); delete ref; ref = NULL; @@ -671,18 +685,18 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processVirtualNetworkFrame( { uint64_t nodeId = (uint64_t) id; - ZT1_Node *node = findNode(nodeId); + ZT_Node *node = findNode(nodeId); if(node == NULL) { // cannot find valid node. We should never get here. - return createResultObject(env, ZT1_RESULT_FATAL_ERROR_INTERNAL); + return createResultObject(env, ZT_RESULT_FATAL_ERROR_INTERNAL); } unsigned int nbtd_len = env->GetArrayLength(out_nextBackgroundTaskDeadline); if(nbtd_len < 1) { // array for next background task length has 0 elements! - return createResultObject(env, ZT1_RESULT_FATAL_ERROR_INTERNAL); + return createResultObject(env, ZT_RESULT_FATAL_ERROR_INTERNAL); } uint64_t now = (uint64_t)in_now; @@ -693,11 +707,14 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processVirtualNetworkFrame( unsigned int vlanId = (unsigned int)in_vlanId; unsigned int frameLength = env->GetArrayLength(in_frameData); - jbyte *frameData =env->GetByteArrayElements(in_frameData, NULL); + void *frameData = env->GetPrimitiveArrayCritical(in_frameData, NULL); + void *localData = malloc(frameLength); + memcpy(localData, frameData, frameLength); + env->ReleasePrimitiveArrayCritical(in_frameData, frameData, 0); uint64_t nextBackgroundTaskDeadline = 0; - ZT1_ResultCode rc = ZT1_Node_processVirtualNetworkFrame( + ZT_ResultCode rc = ZT_Node_processVirtualNetworkFrame( node, now, nwid, @@ -705,15 +722,13 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processVirtualNetworkFrame( destMac, etherType, vlanId, - (const void*)frameData, + (const void*)localData, frameLength, &nextBackgroundTaskDeadline); - jlong *outDeadline = env->GetLongArrayElements(out_nextBackgroundTaskDeadline, NULL); + jlong *outDeadline = (jlong*)env->GetPrimitiveArrayCritical(out_nextBackgroundTaskDeadline, NULL); outDeadline[0] = (jlong)nextBackgroundTaskDeadline; - env->ReleaseLongArrayElements(out_nextBackgroundTaskDeadline, outDeadline, 0); - - env->ReleaseByteArrayElements(in_frameData, frameData, 0); + env->ReleasePrimitiveArrayCritical(out_nextBackgroundTaskDeadline, outDeadline, 0); return createResultObject(env, rc); } @@ -727,88 +742,140 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processWirePacket( JNIEnv *env, jobject obj, jlong id, jlong in_now, + jobject in_localAddress, jobject in_remoteAddress, jbyteArray in_packetData, jlongArray out_nextBackgroundTaskDeadline) { uint64_t nodeId = (uint64_t) id; - ZT1_Node *node = findNode(nodeId); + ZT_Node *node = findNode(nodeId); if(node == NULL) { // cannot find valid node. We should never get here. - return createResultObject(env, ZT1_RESULT_FATAL_ERROR_INTERNAL); + LOGE("Couldn't find a valid node!"); + return createResultObject(env, ZT_RESULT_FATAL_ERROR_INTERNAL); } unsigned int nbtd_len = env->GetArrayLength(out_nextBackgroundTaskDeadline); if(nbtd_len < 1) { - return createResultObject(env, ZT1_RESULT_FATAL_ERROR_INTERNAL); + LOGE("nbtd_len < 1"); + return createResultObject(env, ZT_RESULT_FATAL_ERROR_INTERNAL); } uint64_t now = (uint64_t)in_now; // get the java.net.InetSocketAddress class and getAddress() method - jclass inetAddressClass = cache.findClass("java/net/InetAddress"); + jclass inetAddressClass = lookup.findClass("java/net/InetAddress"); if(inetAddressClass == NULL) { + LOGE("Can't find InetAddress class"); // can't find java.net.InetAddress - return createResultObject(env, ZT1_RESULT_FATAL_ERROR_INTERNAL); + return createResultObject(env, ZT_RESULT_FATAL_ERROR_INTERNAL); } - jmethodID getAddressMethod = cache.findMethod( + jmethodID getAddressMethod = lookup.findMethod( inetAddressClass, "getAddress", "()[B"); if(getAddressMethod == NULL) { // cant find InetAddress.getAddres() - return createResultObject(env, ZT1_RESULT_FATAL_ERROR_INTERNAL); + return createResultObject(env, ZT_RESULT_FATAL_ERROR_INTERNAL); } - jclass InetSocketAddressClass = cache.findClass("java/net/InetSocketAddress"); + jclass InetSocketAddressClass = lookup.findClass("java/net/InetSocketAddress"); if(InetSocketAddressClass == NULL) { - return createResultObject(env, ZT1_RESULT_FATAL_ERROR_INTERNAL); + return createResultObject(env, ZT_RESULT_FATAL_ERROR_INTERNAL); } - jmethodID inetSockGetAddressMethod = cache.findMethod( + jmethodID inetSockGetAddressMethod = lookup.findMethod( InetSocketAddressClass, "getAddress", "()Ljava/net/InetAddress;"); - jobject addrObject = env->CallObjectMethod(in_remoteAddress, inetSockGetAddressMethod); + jobject localAddrObj = NULL; + if(in_localAddress != NULL) + { + localAddrObj = env->CallObjectMethod(in_localAddress, inetSockGetAddressMethod); + } + + jobject remoteAddrObject = env->CallObjectMethod(in_remoteAddress, inetSockGetAddressMethod); - if(addrObject == NULL) + if(remoteAddrObject == NULL) { - return createResultObject(env, ZT1_RESULT_FATAL_ERROR_INTERNAL); + return createResultObject(env, ZT_RESULT_FATAL_ERROR_INTERNAL); } - jmethodID inetSock_getPort = cache.findMethod( + jmethodID inetSock_getPort = lookup.findMethod( InetSocketAddressClass, "getPort", "()I"); if(env->ExceptionCheck() || inetSock_getPort == NULL) { LOGE("Couldn't find getPort method on InetSocketAddress"); - return createResultObject(env, ZT1_RESULT_FATAL_ERROR_INTERNAL); + return createResultObject(env, ZT_RESULT_FATAL_ERROR_INTERNAL); } // call InetSocketAddress.getPort() - int port = env->CallIntMethod(in_remoteAddress, inetSock_getPort); + int remotePort = env->CallIntMethod(in_remoteAddress, inetSock_getPort); if(env->ExceptionCheck()) { LOGE("Exception calling InetSocketAddress.getPort()"); - return createResultObject(env, ZT1_RESULT_FATAL_ERROR_INTERNAL); + return createResultObject(env, ZT_RESULT_FATAL_ERROR_INTERNAL); } // Call InetAddress.getAddress() - jbyteArray addressArray = (jbyteArray)env->CallObjectMethod(addrObject, getAddressMethod); - if(addressArray == NULL) + jbyteArray remoteAddressArray = (jbyteArray)env->CallObjectMethod(remoteAddrObject, getAddressMethod); + if(remoteAddressArray == NULL) { + LOGE("Unable to call getAddress()"); // unable to call getAddress() - return createResultObject(env, ZT1_RESULT_FATAL_ERROR_INTERNAL); + return createResultObject(env, ZT_RESULT_FATAL_ERROR_INTERNAL); } - unsigned int addrSize = env->GetArrayLength(addressArray); - // get the address bytes - jbyte *addr = env->GetByteArrayElements(addressArray, NULL); + 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 = {}; if(addrSize == 16) @@ -816,7 +883,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processWirePacket( // IPV6 address sockaddr_in6 ipv6 = {}; ipv6.sin6_family = AF_INET6; - ipv6.sin6_port = htons(port); + ipv6.sin6_port = htons(remotePort); memcpy(ipv6.sin6_addr.s6_addr, addr, 16); memcpy(&remoteAddress, &ipv6, sizeof(sockaddr_in6)); } @@ -825,37 +892,50 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processWirePacket( // IPV4 address sockaddr_in ipv4 = {}; ipv4.sin_family = AF_INET; - ipv4.sin_port = htons(port); + ipv4.sin_port = htons(remotePort); memcpy(&ipv4.sin_addr, addr, 4); memcpy(&remoteAddress, &ipv4, sizeof(sockaddr_in)); } else { + LOGE("Unknown IP version"); // unknown address type - env->ReleaseByteArrayElements(addressArray, addr, 0); - return createResultObject(env, ZT1_RESULT_FATAL_ERROR_INTERNAL); + env->ReleasePrimitiveArrayCritical(remoteAddressArray, addr, 0); + return createResultObject(env, ZT_RESULT_FATAL_ERROR_INTERNAL); } - + env->ReleasePrimitiveArrayCritical(remoteAddressArray, addr, 0); unsigned int packetLength = env->GetArrayLength(in_packetData); - jbyte *packetData = env->GetByteArrayElements(in_packetData, NULL); + if(packetLength == 0) + { + LOGE("Empty packet?!?"); + return createResultObject(env, ZT_RESULT_FATAL_ERROR_INTERNAL); + } + void *packetData = env->GetPrimitiveArrayCritical(in_packetData, NULL); + void *localData = malloc(packetLength); + memcpy(localData, packetData, packetLength); + env->ReleasePrimitiveArrayCritical(in_packetData, packetData, 0); uint64_t nextBackgroundTaskDeadline = 0; - ZT1_ResultCode rc = ZT1_Node_processWirePacket( + ZT_ResultCode rc = ZT_Node_processWirePacket( node, now, + &localAddress, &remoteAddress, - packetData, + localData, packetLength, &nextBackgroundTaskDeadline); + if(rc != ZT_RESULT_OK) + { + LOGE("ZT_Node_processWirePacket returned: %d", rc); + } - jlong *outDeadline = env->GetLongArrayElements(out_nextBackgroundTaskDeadline, NULL); - outDeadline[0] = (jlong)nextBackgroundTaskDeadline; - env->ReleaseLongArrayElements(out_nextBackgroundTaskDeadline, outDeadline, 0); + free(localData); - env->ReleaseByteArrayElements(addressArray, addr, 0); - env->ReleaseByteArrayElements(in_packetData, packetData, 0); + jlong *outDeadline = (jlong*)env->GetPrimitiveArrayCritical(out_nextBackgroundTaskDeadline, NULL); + outDeadline[0] = (jlong)nextBackgroundTaskDeadline; + env->ReleasePrimitiveArrayCritical(out_nextBackgroundTaskDeadline, outDeadline, 0); return createResultObject(env, rc); } @@ -872,27 +952,27 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processBackgroundTasks( jlongArray out_nextBackgroundTaskDeadline) { uint64_t nodeId = (uint64_t) id; - ZT1_Node *node = findNode(nodeId); + ZT_Node *node = findNode(nodeId); if(node == NULL) { // cannot find valid node. We should never get here. - return createResultObject(env, ZT1_RESULT_FATAL_ERROR_INTERNAL); + return createResultObject(env, ZT_RESULT_FATAL_ERROR_INTERNAL); } unsigned int nbtd_len = env->GetArrayLength(out_nextBackgroundTaskDeadline); if(nbtd_len < 1) { - return createResultObject(env, ZT1_RESULT_FATAL_ERROR_INTERNAL); + return createResultObject(env, ZT_RESULT_FATAL_ERROR_INTERNAL); } uint64_t now = (uint64_t)in_now; uint64_t nextBackgroundTaskDeadline = 0; - ZT1_ResultCode rc = ZT1_Node_processBackgroundTasks(node, now, &nextBackgroundTaskDeadline); + ZT_ResultCode rc = ZT_Node_processBackgroundTasks(node, now, &nextBackgroundTaskDeadline); - jlong *outDeadline = env->GetLongArrayElements(out_nextBackgroundTaskDeadline, NULL); + jlong *outDeadline = (jlong*)env->GetPrimitiveArrayCritical(out_nextBackgroundTaskDeadline, NULL); outDeadline[0] = (jlong)nextBackgroundTaskDeadline; - env->ReleaseLongArrayElements(out_nextBackgroundTaskDeadline, outDeadline, 0); + env->ReleasePrimitiveArrayCritical(out_nextBackgroundTaskDeadline, outDeadline, 0); return createResultObject(env, rc); } @@ -906,16 +986,16 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_join( JNIEnv *env, jobject obj, jlong id, jlong in_nwid) { uint64_t nodeId = (uint64_t) id; - ZT1_Node *node = findNode(nodeId); + ZT_Node *node = findNode(nodeId); if(node == NULL) { // cannot find valid node. We should never get here. - return createResultObject(env, ZT1_RESULT_FATAL_ERROR_INTERNAL); + return createResultObject(env, ZT_RESULT_FATAL_ERROR_INTERNAL); } uint64_t nwid = (uint64_t)in_nwid; - ZT1_ResultCode rc = ZT1_Node_join(node, nwid); + ZT_ResultCode rc = ZT_Node_join(node, nwid); return createResultObject(env, rc); } @@ -929,16 +1009,16 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_leave( JNIEnv *env, jobject obj, jlong id, jlong in_nwid) { uint64_t nodeId = (uint64_t) id; - ZT1_Node *node = findNode(nodeId); + ZT_Node *node = findNode(nodeId); if(node == NULL) { // cannot find valid node. We should never get here. - return createResultObject(env, ZT1_RESULT_FATAL_ERROR_INTERNAL); + return createResultObject(env, ZT_RESULT_FATAL_ERROR_INTERNAL); } uint64_t nwid = (uint64_t)in_nwid; - ZT1_ResultCode rc = ZT1_Node_leave(node, nwid); + ZT_ResultCode rc = ZT_Node_leave(node, nwid); return createResultObject(env, rc); } @@ -956,18 +1036,18 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_multicastSubscribe( jlong in_multicastAdi) { uint64_t nodeId = (uint64_t) id; - ZT1_Node *node = findNode(nodeId); + ZT_Node *node = findNode(nodeId); if(node == NULL) { // cannot find valid node. We should never get here. - return createResultObject(env, ZT1_RESULT_FATAL_ERROR_INTERNAL); + return createResultObject(env, ZT_RESULT_FATAL_ERROR_INTERNAL); } uint64_t nwid = (uint64_t)in_nwid; uint64_t multicastGroup = (uint64_t)in_multicastGroup; unsigned long multicastAdi = (unsigned long)in_multicastAdi; - ZT1_ResultCode rc = ZT1_Node_multicastSubscribe( + ZT_ResultCode rc = ZT_Node_multicastSubscribe( node, nwid, multicastGroup, multicastAdi); return createResultObject(env, rc); @@ -986,18 +1066,18 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_multicastUnsubscribe( jlong in_multicastAdi) { uint64_t nodeId = (uint64_t) id; - ZT1_Node *node = findNode(nodeId); + ZT_Node *node = findNode(nodeId); if(node == NULL) { // cannot find valid node. We should never get here. - return createResultObject(env, ZT1_RESULT_FATAL_ERROR_INTERNAL); + return createResultObject(env, ZT_RESULT_FATAL_ERROR_INTERNAL); } uint64_t nwid = (uint64_t)in_nwid; uint64_t multicastGroup = (uint64_t)in_multicastGroup; unsigned long multicastAdi = (unsigned long)in_multicastAdi; - ZT1_ResultCode rc = ZT1_Node_multicastUnsubscribe( + ZT_ResultCode rc = ZT_Node_multicastUnsubscribe( node, nwid, multicastGroup, multicastAdi); return createResultObject(env, rc); @@ -1012,14 +1092,14 @@ JNIEXPORT jlong JNICALL Java_com_zerotier_sdk_Node_address( JNIEnv *env , jobject obj, jlong id) { uint64_t nodeId = (uint64_t) id; - ZT1_Node *node = findNode(nodeId); + ZT_Node *node = findNode(nodeId); if(node == NULL) { // cannot find valid node. We should never get here. return 0; } - uint64_t address = ZT1_Node_address(node); + uint64_t address = ZT_Node_address(node); return (jlong)address; } @@ -1032,7 +1112,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_status (JNIEnv *env, jobject obj, jlong id) { uint64_t nodeId = (uint64_t) id; - ZT1_Node *node = findNode(nodeId); + ZT_Node *node = findNode(nodeId); if(node == NULL) { // cannot find valid node. We should never get here. @@ -1043,13 +1123,13 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_status jmethodID nodeStatusConstructor = NULL; // create a com.zerotier.sdk.NodeStatus object - nodeStatusClass = cache.findClass("com/zerotier/sdk/NodeStatus"); + nodeStatusClass = lookup.findClass("com/zerotier/sdk/NodeStatus"); if(nodeStatusClass == NULL) { return NULL; } - nodeStatusConstructor = cache.findMethod( + nodeStatusConstructor = lookup.findMethod( nodeStatusClass, "<init>", "()V"); if(nodeStatusConstructor == NULL) { @@ -1062,33 +1142,33 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_status return NULL; } - ZT1_NodeStatus nodeStatus; - ZT1_Node_status(node, &nodeStatus); + ZT_NodeStatus nodeStatus; + ZT_Node_status(node, &nodeStatus); jfieldID addressField = NULL; jfieldID publicIdentityField = NULL; jfieldID secretIdentityField = NULL; jfieldID onlineField = NULL; - addressField = cache.findField(nodeStatusClass, "address", "J"); + addressField = lookup.findField(nodeStatusClass, "address", "J"); if(addressField == NULL) { return NULL; } - publicIdentityField = cache.findField(nodeStatusClass, "publicIdentity", "Ljava/lang/String;"); + publicIdentityField = lookup.findField(nodeStatusClass, "publicIdentity", "Ljava/lang/String;"); if(publicIdentityField == NULL) { return NULL; } - secretIdentityField = cache.findField(nodeStatusClass, "secretIdentity", "Ljava/lang/String;"); + secretIdentityField = lookup.findField(nodeStatusClass, "secretIdentity", "Ljava/lang/String;"); if(secretIdentityField == NULL) { return NULL; } - onlineField = cache.findField(nodeStatusClass, "online", "Z"); + onlineField = lookup.findField(nodeStatusClass, "online", "Z"); if(onlineField == NULL) { return NULL; @@ -1124,18 +1204,18 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_networkConfig( JNIEnv *env, jobject obj, jlong id, jlong nwid) { uint64_t nodeId = (uint64_t) id; - ZT1_Node *node = findNode(nodeId); + ZT_Node *node = findNode(nodeId); if(node == NULL) { // cannot find valid node. We should never get here. return 0; } - ZT1_VirtualNetworkConfig *vnetConfig = ZT1_Node_networkConfig(node, nwid); + ZT_VirtualNetworkConfig *vnetConfig = ZT_Node_networkConfig(node, nwid); jobject vnetConfigObject = newNetworkConfig(env, *vnetConfig); - ZT1_Node_freeQueryResult(node, vnetConfig); + ZT_Node_freeQueryResult(node, vnetConfig); return vnetConfigObject; } @@ -1153,7 +1233,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_version( int revision = 0; unsigned long featureFlags = 0; - ZT1_version(&major, &minor, &revision, &featureFlags); + ZT_version(&major, &minor, &revision, &featureFlags); return newVersion(env, major, minor, revision, featureFlags); } @@ -1167,18 +1247,18 @@ JNIEXPORT jobjectArray JNICALL Java_com_zerotier_sdk_Node_peers( JNIEnv *env, jobject obj, jlong id) { uint64_t nodeId = (uint64_t) id; - ZT1_Node *node = findNode(nodeId); + ZT_Node *node = findNode(nodeId); if(node == NULL) { // cannot find valid node. We should never get here. return 0; } - ZT1_PeerList *peerList = ZT1_Node_peers(node); + ZT_PeerList *peerList = ZT_Node_peers(node); if(peerList == NULL) { - LOGE("ZT1_Node_peers returned NULL"); + LOGE("ZT_Node_peers returned NULL"); return NULL; } @@ -1187,15 +1267,15 @@ JNIEXPORT jobjectArray JNICALL Java_com_zerotier_sdk_Node_peers( if(env->EnsureLocalCapacity(peerCount)) { LOGE("EnsureLocalCapacity failed!!"); - ZT1_Node_freeQueryResult(node, peerList); + ZT_Node_freeQueryResult(node, peerList); return NULL; } - jclass peerClass = cache.findClass("com/zerotier/sdk/Peer"); + jclass peerClass = lookup.findClass("com/zerotier/sdk/Peer"); if(env->ExceptionCheck() || peerClass == NULL) { LOGE("Error finding Peer class"); - ZT1_Node_freeQueryResult(node, peerList); + ZT_Node_freeQueryResult(node, peerList); return NULL; } @@ -1205,7 +1285,7 @@ JNIEXPORT jobjectArray JNICALL Java_com_zerotier_sdk_Node_peers( if(env->ExceptionCheck() || peerArrayObj == NULL) { LOGE("Error creating Peer[] array"); - ZT1_Node_freeQueryResult(node, peerList); + ZT_Node_freeQueryResult(node, peerList); return NULL; } @@ -1221,7 +1301,7 @@ JNIEXPORT jobjectArray JNICALL Java_com_zerotier_sdk_Node_peers( } } - ZT1_Node_freeQueryResult(node, peerList); + ZT_Node_freeQueryResult(node, peerList); peerList = NULL; return peerArrayObj; @@ -1236,24 +1316,24 @@ JNIEXPORT jobjectArray JNICALL Java_com_zerotier_sdk_Node_networks( JNIEnv *env, jobject obj, jlong id) { uint64_t nodeId = (uint64_t) id; - ZT1_Node *node = findNode(nodeId); + ZT_Node *node = findNode(nodeId); if(node == NULL) { // cannot find valid node. We should never get here. return 0; } - ZT1_VirtualNetworkList *networkList = ZT1_Node_networks(node); + ZT_VirtualNetworkList *networkList = ZT_Node_networks(node); if(networkList == NULL) { return NULL; } - jclass vnetConfigClass = cache.findClass("com/zerotier/sdk/VirtualNetworkConfig"); + jclass vnetConfigClass = lookup.findClass("com/zerotier/sdk/VirtualNetworkConfig"); if(env->ExceptionCheck() || vnetConfigClass == NULL) { LOGE("Error finding VirtualNetworkConfig class"); - ZT1_Node_freeQueryResult(node, networkList); + ZT_Node_freeQueryResult(node, networkList); return NULL; } @@ -1262,7 +1342,7 @@ JNIEXPORT jobjectArray JNICALL Java_com_zerotier_sdk_Node_networks( if(env->ExceptionCheck() || networkListObject == NULL) { LOGE("Error creating VirtualNetworkConfig[] array"); - ZT1_Node_freeQueryResult(node, networkList); + ZT_Node_freeQueryResult(node, networkList); return NULL; } @@ -1277,7 +1357,7 @@ JNIEXPORT jobjectArray JNICALL Java_com_zerotier_sdk_Node_networks( } } - ZT1_Node_freeQueryResult(node, networkList); + ZT_Node_freeQueryResult(node, networkList); return networkListObject; } diff --git a/java/jni/com_zerotierone_sdk_Node.h b/java/jni/com_zerotierone_sdk_Node.h index b2e3ed2a..7c1011ab 100644 --- a/java/jni/com_zerotierone_sdk_Node.h +++ b/java/jni/com_zerotierone_sdk_Node.h @@ -34,10 +34,10 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processVirtualNetworkFrame /* * Class: com_zerotier_sdk_Node * Method: processWirePacket - * Signature: (JJLjava/net/InetSockAddress;[B[J)Lcom/zerotier/sdk/ResultCode; + * 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, jbyteArray, jlongArray); + (JNIEnv *, jobject, jlong, jlong, jobject, jobject, jbyteArray, jlongArray); /* * Class: com_zerotier_sdk_Node |