Browse Source

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
Grant Limberg 10 years ago
parent
commit
fb0bf52b1b
2 changed files with 52 additions and 6 deletions
  1. 11 2
      java/jni/ZT1_jniutils.cpp
  2. 41 4
      java/jni/com_zerotierone_sdk_Node.cpp

+ 11 - 2
java/jni/ZT1_jniutils.cpp

@@ -343,18 +343,28 @@ jobject newInetSocketAddress(JNIEnv *env, const sockaddr_storage &addr)
     {
     {
         case AF_INET6:
         case AF_INET6:
         {
         {
+            LOGD("IPV6 Address");
             sockaddr_in6 *ipv6 = (sockaddr_in6*)&addr;
             sockaddr_in6 *ipv6 = (sockaddr_in6*)&addr;
             port = ntohs(ipv6->sin6_port);
             port = ntohs(ipv6->sin6_port);
+            LOGD("Port %d", port);
         }
         }
         break;
         break;
         case AF_INET:
         case AF_INET:
         {
         {
+            LOGD("IPV4 Address");
             sockaddr_in *ipv4 = (sockaddr_in*)&addr;
             sockaddr_in *ipv4 = (sockaddr_in*)&addr;
             port = ntohs(ipv4->sin_port);
             port = ntohs(ipv4->sin_port);
+            LOGD("Port: %d", port);
         }
         }
         break;
         break;
+        default:
+        {
+            LOGE("ERROR:  addr.ss_family is not set or unknown");
+            break;
+        }
     };
     };
 
 
+
     jobject inetSocketAddressObject = env->NewObject(inetSocketAddressClass, inetSocketAddress_constructor, inetAddressObject, port);
     jobject inetSocketAddressObject = env->NewObject(inetSocketAddressClass, inetSocketAddress_constructor, inetAddressObject, port);
     if(env->ExceptionCheck() || inetSocketAddressObject == NULL) {
     if(env->ExceptionCheck() || inetSocketAddressObject == NULL) {
         LOGE("Error creating InetSocketAddress object");
         LOGE("Error creating InetSocketAddress object");
@@ -606,7 +616,6 @@ jobject newPeer(JNIEnv *env, const ZT1_Peer &peer)
         return NULL; // out of memory
         return NULL; // out of memory
     }
     }
 
 
-    LOGD("JNI Peer Latency: %d", peer.latency);
     env->SetLongField(peerObject, addressField, (jlong)peer.address);
     env->SetLongField(peerObject, addressField, (jlong)peer.address);
     env->SetLongField(peerObject, lastUnicastFrameField, (jlong)peer.lastUnicastFrame);
     env->SetLongField(peerObject, lastUnicastFrameField, (jlong)peer.lastUnicastFrame);
     env->SetLongField(peerObject, lastMulticastFrameField, (jlong)peer.lastMulticastFrame);
     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)
     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);
         env->SetObjectArrayElement(assignedAddrArrayObj, i, inetAddrObj);
         if(env->ExceptionCheck())
         if(env->ExceptionCheck())
         {
         {

+ 41 - 4
java/jni/com_zerotierone_sdk_Node.cpp

@@ -150,7 +150,7 @@ namespace {
 
 
 
 
         jclass frameListenerClass = env->GetObjectClass(ref->frameListener);
         jclass frameListenerClass = env->GetObjectClass(ref->frameListener);
-        if(frameListenerClass == NULL)
+        if(env->ExceptionCheck() || frameListenerClass == NULL)
         {
         {
             LOGE("Couldn't find class for VirtualNetworkFrameListener instance");
             LOGE("Couldn't find class for VirtualNetworkFrameListener instance");
             return;
             return;
@@ -159,16 +159,30 @@ namespace {
         jmethodID frameListenerCallbackMethod = cache.findMethod(
         jmethodID frameListenerCallbackMethod = cache.findMethod(
             frameListenerClass,
             frameListenerClass,
             "onVirtualNetworkFrame", "(JJJJJ[B)V");
             "onVirtualNetworkFrame", "(JJJJJ[B)V");
-        if(frameListenerCallbackMethod == NULL)
+        if(env->ExceptionCheck() || frameListenerCallbackMethod == NULL)
         {
         {
             LOGE("Couldn't find onVirtualNetworkFrame() method");
             LOGE("Couldn't find onVirtualNetworkFrame() method");
             return;
             return;
         }
         }
 
 
         jbyteArray dataArray = env->NewByteArray(frameLength);
         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_DOWN:
         case ZT1_EVENT_FATAL_ERROR_IDENTITY_COLLISION:
         case ZT1_EVENT_FATAL_ERROR_IDENTITY_COLLISION:
         {
         {
+            LOGV("Regular Event");
             // call onEvent()
             // call onEvent()
             env->CallVoidMethod(ref->eventListener, onEventMethod, eventObject);
             env->CallVoidMethod(ref->eventListener, onEventMethod, eventObject);
         }
         }
         break;
         break;
         case ZT1_EVENT_SAW_MORE_RECENT_VERSION:
         case ZT1_EVENT_SAW_MORE_RECENT_VERSION:
         {
         {
+            LOGV("Version Event");
             // call onOutOfDate()
             // call onOutOfDate()
             if(data != NULL)
             if(data != NULL)
             {
             {
@@ -255,6 +271,7 @@ namespace {
         case ZT1_EVENT_AUTHENTICATION_FAILURE:
         case ZT1_EVENT_AUTHENTICATION_FAILURE:
         case ZT1_EVENT_INVALID_PACKET:
         case ZT1_EVENT_INVALID_PACKET:
         {
         {
+            LOGV("Network Error Event");
             // call onNetworkError()
             // call onNetworkError()
             if(data != NULL)
             if(data != NULL)
             {
             {
@@ -266,6 +283,7 @@ namespace {
         break;
         break;
         case ZT1_EVENT_TRACE:
         case ZT1_EVENT_TRACE:
         {
         {
+            LOGV("Trace Event");
             // call onTrace()
             // call onTrace()
             if(data != NULL)
             if(data != NULL)
             {
             {
@@ -761,6 +779,23 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processWirePacket(
         return createResultObject(env, ZT1_RESULT_FATAL_ERROR_INTERNAL);
         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()
     // Call InetAddress.getAddress()
     jbyteArray addressArray = (jbyteArray)env->CallObjectMethod(addrObject, getAddressMethod);
     jbyteArray addressArray = (jbyteArray)env->CallObjectMethod(addrObject, getAddressMethod);
     if(addressArray == NULL)
     if(addressArray == NULL)
@@ -781,6 +816,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processWirePacket(
         // IPV6 address
         // IPV6 address
         sockaddr_in6 ipv6 = {};
         sockaddr_in6 ipv6 = {};
         ipv6.sin6_family = AF_INET6;
         ipv6.sin6_family = AF_INET6;
+        ipv6.sin6_port = htons(port);
         memcpy(ipv6.sin6_addr.s6_addr, addr, 16);
         memcpy(ipv6.sin6_addr.s6_addr, addr, 16);
         memcpy(&remoteAddress, &ipv6, sizeof(sockaddr_in6));
         memcpy(&remoteAddress, &ipv6, sizeof(sockaddr_in6));
     }
     }
@@ -789,6 +825,7 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_processWirePacket(
         // IPV4 address
         // IPV4 address
         sockaddr_in ipv4 = {};
         sockaddr_in ipv4 = {};
         ipv4.sin_family = AF_INET;
         ipv4.sin_family = AF_INET;
+        ipv4.sin_port = htons(port);
         memcpy(&ipv4.sin_addr, addr, 4);
         memcpy(&ipv4.sin_addr, addr, 4);
         memcpy(&remoteAddress, &ipv4, sizeof(sockaddr_in));
         memcpy(&remoteAddress, &ipv4, sizeof(sockaddr_in));
     }
     }