mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-06-05 03:53:44 +02:00
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
This commit is contained in:
parent
74f7d5377d
commit
fb0bf52b1b
2 changed files with 52 additions and 6 deletions
|
@ -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())
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
env->CallVoidMethod(ref->frameListener, frameListenerCallbackMethod, nwid, sourceMac, destMac, etherType, vlanid, dataArray);
|
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, (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));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue