summaryrefslogtreecommitdiff
path: root/java/jni
diff options
context:
space:
mode:
authorGrant Limberg <grant.limberg@red.com>2015-06-01 20:03:28 -0700
committerGrant Limberg <grant.limberg@red.com>2015-06-01 20:03:28 -0700
commitfb0bf52b1b840c870ad26375eac79a0fc5691a4b (patch)
tree1a0d58b99170d3988886e012eeb6c64ec64a4265 /java/jni
parent74f7d5377d26c721b17b5a5380793c26df81b2e3 (diff)
downloadinfinitytier-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.cpp13
-rw-r--r--java/jni/com_zerotierone_sdk_Node.cpp45
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));
}