diff options
author | Grant Limberg <grant.limberg@red.com> | 2015-06-01 20:03:28 -0700 |
---|---|---|
committer | Grant Limberg <grant.limberg@red.com> | 2015-06-01 20:03:28 -0700 |
commit | fb0bf52b1b840c870ad26375eac79a0fc5691a4b (patch) | |
tree | 1a0d58b99170d3988886e012eeb6c64ec64a4265 /java/jni | |
parent | 74f7d5377d26c721b17b5a5380793c26df81b2e3 (diff) | |
download | infinitytier-fb0bf52b1b840c870ad26375eac79a0fc5691a4b.tar.gz infinitytier-fb0bf52b1b840c870ad26375eac79a0fc5691a4b.zip |
Fixed sending a port number of 0 to ZT1.
Fixed VirtualNetworkConfigFunction (creating array to send to Java)
Fixed the creating InetAddress instead of InetSocketAddress in virtual network config callback
Diffstat (limited to 'java/jni')
-rw-r--r-- | java/jni/ZT1_jniutils.cpp | 13 | ||||
-rw-r--r-- | java/jni/com_zerotierone_sdk_Node.cpp | 45 |
2 files changed, 52 insertions, 6 deletions
diff --git a/java/jni/ZT1_jniutils.cpp b/java/jni/ZT1_jniutils.cpp index 377594f8..e6404e87 100644 --- a/java/jni/ZT1_jniutils.cpp +++ b/java/jni/ZT1_jniutils.cpp @@ -343,18 +343,28 @@ jobject newInetSocketAddress(JNIEnv *env, const sockaddr_storage &addr) { case AF_INET6: { + LOGD("IPV6 Address"); sockaddr_in6 *ipv6 = (sockaddr_in6*)&addr; port = ntohs(ipv6->sin6_port); + LOGD("Port %d", port); } break; case AF_INET: { + LOGD("IPV4 Address"); sockaddr_in *ipv4 = (sockaddr_in*)&addr; port = ntohs(ipv4->sin_port); + LOGD("Port: %d", port); } break; + default: + { + LOGE("ERROR: addr.ss_family is not set or unknown"); + break; + } }; + jobject inetSocketAddressObject = env->NewObject(inetSocketAddressClass, inetSocketAddress_constructor, inetAddressObject, port); if(env->ExceptionCheck() || inetSocketAddressObject == NULL) { LOGE("Error creating InetSocketAddress object"); @@ -606,7 +616,6 @@ jobject newPeer(JNIEnv *env, const ZT1_Peer &peer) return NULL; // out of memory } - LOGD("JNI Peer Latency: %d", peer.latency); env->SetLongField(peerObject, addressField, (jlong)peer.address); env->SetLongField(peerObject, lastUnicastFrameField, (jlong)peer.lastUnicastFrame); env->SetLongField(peerObject, lastMulticastFrameField, (jlong)peer.lastMulticastFrame); @@ -857,7 +866,7 @@ jobject newNetworkConfig(JNIEnv *env, const ZT1_VirtualNetworkConfig &vnetConfig for(unsigned int i = 0; i < vnetConfig.assignedAddressCount; ++i) { - jobject inetAddrObj = newInetAddress(env, vnetConfig.assignedAddresses[i]); + jobject inetAddrObj = newInetSocketAddress(env, vnetConfig.assignedAddresses[i]); env->SetObjectArrayElement(assignedAddrArrayObj, i, inetAddrObj); if(env->ExceptionCheck()) { diff --git a/java/jni/com_zerotierone_sdk_Node.cpp b/java/jni/com_zerotierone_sdk_Node.cpp index 13743d01..f0405813 100644 --- a/java/jni/com_zerotierone_sdk_Node.cpp +++ b/java/jni/com_zerotierone_sdk_Node.cpp @@ -150,7 +150,7 @@ namespace { jclass frameListenerClass = env->GetObjectClass(ref->frameListener); - if(frameListenerClass == NULL) + if(env->ExceptionCheck() || frameListenerClass == NULL) { LOGE("Couldn't find class for VirtualNetworkFrameListener instance"); return; @@ -159,16 +159,30 @@ namespace { jmethodID frameListenerCallbackMethod = cache.findMethod( frameListenerClass, "onVirtualNetworkFrame", "(JJJJJ[B)V"); - if(frameListenerCallbackMethod == NULL) + if(env->ExceptionCheck() || frameListenerCallbackMethod == NULL) { LOGE("Couldn't find onVirtualNetworkFrame() method"); return; } jbyteArray dataArray = env->NewByteArray(frameLength); - env->SetByteArrayRegion(dataArray, 0, frameLength, (jbyte*)frameData); + if(env->ExceptionCheck() || dataArray == NULL) + { + LOGE("Couldn't create frame data array"); + return; + } + + jbyte *data = env->GetByteArrayElements(dataArray, NULL); + memcpy(data, frameData, frameLength); + env->ReleaseByteArrayElements(dataArray, data, 0); + + if(env->ExceptionCheck()) + { + LOGE("Error setting frame data to array"); + return; + } - env->CallVoidMethod(ref->frameListener, frameListenerCallbackMethod, nwid, sourceMac, destMac, etherType, vlanid, dataArray); + env->CallVoidMethod(ref->frameListener, frameListenerCallbackMethod, (jlong)nwid, (jlong)sourceMac, (jlong)destMac, (jlong)etherType, (jlong)vlanid, dataArray); } @@ -237,12 +251,14 @@ namespace { case ZT1_EVENT_DOWN: case ZT1_EVENT_FATAL_ERROR_IDENTITY_COLLISION: { + LOGV("Regular Event"); // call onEvent() env->CallVoidMethod(ref->eventListener, onEventMethod, eventObject); } break; case ZT1_EVENT_SAW_MORE_RECENT_VERSION: { + LOGV("Version Event"); // call onOutOfDate() if(data != NULL) { @@ -255,6 +271,7 @@ namespace { case ZT1_EVENT_AUTHENTICATION_FAILURE: case ZT1_EVENT_INVALID_PACKET: { + LOGV("Network Error Event"); // call onNetworkError() if(data != NULL) { @@ -266,6 +283,7 @@ namespace { break; case ZT1_EVENT_TRACE: { + LOGV("Trace Event"); // call onTrace() if(data != NULL) { @@ -761,6 +779,23 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processWirePacket( return createResultObject(env, ZT1_RESULT_FATAL_ERROR_INTERNAL); } + jmethodID inetSock_getPort = cache.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); + } + + // call InetSocketAddress.getPort() + int port = env->CallIntMethod(in_remoteAddress, inetSock_getPort); + if(env->ExceptionCheck()) + { + LOGE("Exception calling InetSocketAddress.getPort()"); + return createResultObject(env, ZT1_RESULT_FATAL_ERROR_INTERNAL); + } + // Call InetAddress.getAddress() jbyteArray addressArray = (jbyteArray)env->CallObjectMethod(addrObject, getAddressMethod); if(addressArray == NULL) @@ -781,6 +816,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); memcpy(ipv6.sin6_addr.s6_addr, addr, 16); memcpy(&remoteAddress, &ipv6, sizeof(sockaddr_in6)); } @@ -789,6 +825,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processWirePacket( // IPV4 address sockaddr_in ipv4 = {}; ipv4.sin_family = AF_INET; + ipv4.sin_port = htons(port); memcpy(&ipv4.sin_addr, addr, 4); memcpy(&remoteAddress, &ipv4, sizeof(sockaddr_in)); } |