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 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'java/jni/Android.mk') 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 \ -- 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/jni/Android.mk') 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/jni/Android.mk') 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 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/jni/Android.mk') 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/jni/Android.mk') 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 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/jni/Android.mk') 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 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/jni/Android.mk') 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 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/jni/Android.mk') 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