diff --git a/java/jni/ZT_jnicache.cpp b/java/jni/ZT_jnicache.cpp
index 2465d9c51..9c3b82456 100644
--- a/java/jni/ZT_jnicache.cpp
+++ b/java/jni/ZT_jnicache.cpp
@@ -114,20 +114,6 @@ jmethodID VirtualNetworkType_fromInt_method;
// Instance fields
//
-jfieldID VirtualNetworkConfig_assignedAddresses_field;
-jfieldID VirtualNetworkConfig_bridge_field;
-jfieldID VirtualNetworkConfig_broadcastEnabled_field;
-jfieldID VirtualNetworkConfig_dhcp_field;
-jfieldID VirtualNetworkConfig_dns_field;
-jfieldID VirtualNetworkConfig_enabled_field;
-jfieldID VirtualNetworkConfig_mac_field;
-jfieldID VirtualNetworkConfig_mtu_field;
-jfieldID VirtualNetworkConfig_name_field;
-jfieldID VirtualNetworkConfig_nwid_field;
-jfieldID VirtualNetworkConfig_portError_field;
-jfieldID VirtualNetworkConfig_routes_field;
-jfieldID VirtualNetworkConfig_status_field;
-jfieldID VirtualNetworkConfig_type_field;
jfieldID VirtualNetworkDNS_domain_field;
jfieldID VirtualNetworkDNS_servers_field;
jfieldID VirtualNetworkRoute_flags_field;
@@ -201,7 +187,7 @@ void setupJNICache(JavaVM *vm) {
EXCEPTIONANDNULLCHECK(Peer_ctor = env->GetMethodID(Peer_class, "", "(JIIIILcom/zerotier/sdk/PeerRole;[Lcom/zerotier/sdk/PeerPhysicalPath;)V"));
EXCEPTIONANDNULLCHECK(Version_ctor = env->GetMethodID(Version_class, "", "(III)V"));
EXCEPTIONANDNULLCHECK(VirtualNetworkConfigListener_onNetworkConfigurationUpdated_method = env->GetMethodID(VirtualNetworkConfigListener_class, "onNetworkConfigurationUpdated", "(JLcom/zerotier/sdk/VirtualNetworkConfigOperation;Lcom/zerotier/sdk/VirtualNetworkConfig;)I"));
- EXCEPTIONANDNULLCHECK(VirtualNetworkConfig_ctor = env->GetMethodID(VirtualNetworkConfig_class, "", "()V"));
+ EXCEPTIONANDNULLCHECK(VirtualNetworkConfig_ctor = env->GetMethodID(VirtualNetworkConfig_class, "", "(JJLjava/lang/String;Lcom/zerotier/sdk/VirtualNetworkStatus;Lcom/zerotier/sdk/VirtualNetworkType;IZZZIZJ[Ljava/net/InetSocketAddress;[Lcom/zerotier/sdk/VirtualNetworkRoute;Lcom/zerotier/sdk/VirtualNetworkDNS;)V"));
EXCEPTIONANDNULLCHECK(VirtualNetworkDNS_ctor = env->GetMethodID(VirtualNetworkDNS_class, "", "()V"));
EXCEPTIONANDNULLCHECK(VirtualNetworkFrameListener_onVirtualNetworkFrame_method = env->GetMethodID(VirtualNetworkFrameListener_class, "onVirtualNetworkFrame", "(JJJJJ[B)V"));
EXCEPTIONANDNULLCHECK(VirtualNetworkRoute_ctor = env->GetMethodID(VirtualNetworkRoute_class, "", "()V"));
@@ -222,20 +208,6 @@ void setupJNICache(JavaVM *vm) {
// Instance fields
//
- EXCEPTIONANDNULLCHECK(VirtualNetworkConfig_assignedAddresses_field = env->GetFieldID(VirtualNetworkConfig_class, "assignedAddresses", "[Ljava/net/InetSocketAddress;"));
- EXCEPTIONANDNULLCHECK(VirtualNetworkConfig_bridge_field = env->GetFieldID(VirtualNetworkConfig_class, "bridge", "Z"));
- EXCEPTIONANDNULLCHECK(VirtualNetworkConfig_broadcastEnabled_field = env->GetFieldID(VirtualNetworkConfig_class, "broadcastEnabled", "Z"));
- EXCEPTIONANDNULLCHECK(VirtualNetworkConfig_dhcp_field = env->GetFieldID(VirtualNetworkConfig_class, "dhcp", "Z"));
- EXCEPTIONANDNULLCHECK(VirtualNetworkConfig_dns_field = env->GetFieldID(VirtualNetworkConfig_class, "dns", "Lcom/zerotier/sdk/VirtualNetworkDNS;"));
- EXCEPTIONANDNULLCHECK(VirtualNetworkConfig_enabled_field = env->GetFieldID(VirtualNetworkConfig_class, "enabled", "Z"));
- EXCEPTIONANDNULLCHECK(VirtualNetworkConfig_mac_field = env->GetFieldID(VirtualNetworkConfig_class, "mac", "J"));
- EXCEPTIONANDNULLCHECK(VirtualNetworkConfig_mtu_field = env->GetFieldID(VirtualNetworkConfig_class, "mtu", "I"));
- EXCEPTIONANDNULLCHECK(VirtualNetworkConfig_name_field = env->GetFieldID(VirtualNetworkConfig_class, "name", "Ljava/lang/String;"));
- EXCEPTIONANDNULLCHECK(VirtualNetworkConfig_nwid_field = env->GetFieldID(VirtualNetworkConfig_class, "nwid", "J"));
- EXCEPTIONANDNULLCHECK(VirtualNetworkConfig_portError_field = env->GetFieldID(VirtualNetworkConfig_class, "portError", "I"));
- EXCEPTIONANDNULLCHECK(VirtualNetworkConfig_routes_field = env->GetFieldID(VirtualNetworkConfig_class, "routes", "[Lcom/zerotier/sdk/VirtualNetworkRoute;"));
- EXCEPTIONANDNULLCHECK(VirtualNetworkConfig_status_field = env->GetFieldID(VirtualNetworkConfig_class, "status", "Lcom/zerotier/sdk/VirtualNetworkStatus;"));
- EXCEPTIONANDNULLCHECK(VirtualNetworkConfig_type_field = env->GetFieldID(VirtualNetworkConfig_class, "type", "Lcom/zerotier/sdk/VirtualNetworkType;"));
EXCEPTIONANDNULLCHECK(VirtualNetworkDNS_domain_field = env->GetFieldID(VirtualNetworkDNS_class, "domain", "Ljava/lang/String;"));
EXCEPTIONANDNULLCHECK(VirtualNetworkDNS_servers_field = env->GetFieldID(VirtualNetworkDNS_class, "servers", "Ljava/util/ArrayList;"));
EXCEPTIONANDNULLCHECK(VirtualNetworkRoute_flags_field = env->GetFieldID(VirtualNetworkRoute_class, "flags", "I"));
diff --git a/java/jni/ZT_jnicache.h b/java/jni/ZT_jnicache.h
index 730b8d89f..d230ad6cd 100644
--- a/java/jni/ZT_jnicache.h
+++ b/java/jni/ZT_jnicache.h
@@ -83,20 +83,6 @@ extern jmethodID VirtualNetworkType_fromInt_method;
// Instance fields
//
-extern jfieldID VirtualNetworkConfig_assignedAddresses_field;
-extern jfieldID VirtualNetworkConfig_bridge_field;
-extern jfieldID VirtualNetworkConfig_broadcastEnabled_field;
-extern jfieldID VirtualNetworkConfig_dhcp_field;
-extern jfieldID VirtualNetworkConfig_dns_field;
-extern jfieldID VirtualNetworkConfig_enabled_field;
-extern jfieldID VirtualNetworkConfig_mac_field;
-extern jfieldID VirtualNetworkConfig_mtu_field;
-extern jfieldID VirtualNetworkConfig_name_field;
-extern jfieldID VirtualNetworkConfig_nwid_field;
-extern jfieldID VirtualNetworkConfig_portError_field;
-extern jfieldID VirtualNetworkConfig_routes_field;
-extern jfieldID VirtualNetworkConfig_status_field;
-extern jfieldID VirtualNetworkConfig_type_field;
extern jfieldID VirtualNetworkDNS_domain_field;
extern jfieldID VirtualNetworkDNS_servers_field;
extern jfieldID VirtualNetworkRoute_flags_field;
diff --git a/java/jni/ZT_jniutils.cpp b/java/jni/ZT_jniutils.cpp
index 2ef8a4b26..a7ca7e10b 100644
--- a/java/jni/ZT_jniutils.cpp
+++ b/java/jni/ZT_jniutils.cpp
@@ -258,54 +258,66 @@ jobject newPeer(JNIEnv *env, const ZT_Peer &peer)
jobject newNetworkConfig(JNIEnv *env, const ZT_VirtualNetworkConfig &vnetConfig)
{
- jobject vnetConfigObj = env->NewObject(VirtualNetworkConfig_class, VirtualNetworkConfig_ctor);
- if(env->ExceptionCheck() || vnetConfigObj == NULL)
- {
- LOGE("Error creating new VirtualNetworkConfig object");
- return NULL;
- }
-
- env->SetLongField(vnetConfigObj, VirtualNetworkConfig_nwid_field, vnetConfig.nwid);
- env->SetLongField(vnetConfigObj, VirtualNetworkConfig_mac_field, vnetConfig.mac);
jstring nameStr = env->NewStringUTF(vnetConfig.name);
if(env->ExceptionCheck() || nameStr == NULL)
{
+ LOGE("Exception creating new string");
return NULL; // out of memory
}
- env->SetObjectField(vnetConfigObj, VirtualNetworkConfig_name_field, nameStr);
jobject statusObject = createVirtualNetworkStatus(env, vnetConfig.status);
if(env->ExceptionCheck() || statusObject == NULL)
{
return NULL;
}
- env->SetObjectField(vnetConfigObj, VirtualNetworkConfig_status_field, statusObject);
jobject typeObject = createVirtualNetworkType(env, vnetConfig.type);
if(env->ExceptionCheck() || typeObject == NULL)
{
return NULL;
}
- env->SetObjectField(vnetConfigObj, VirtualNetworkConfig_type_field, typeObject);
-
- env->SetIntField(vnetConfigObj, VirtualNetworkConfig_mtu_field, (int)vnetConfig.mtu);
- env->SetBooleanField(vnetConfigObj, VirtualNetworkConfig_dhcp_field, vnetConfig.dhcp);
- env->SetBooleanField(vnetConfigObj, VirtualNetworkConfig_bridge_field, vnetConfig.bridge);
- env->SetBooleanField(vnetConfigObj, VirtualNetworkConfig_broadcastEnabled_field, vnetConfig.broadcastEnabled);
- env->SetIntField(vnetConfigObj, VirtualNetworkConfig_portError_field, vnetConfig.portError);
jobjectArray assignedAddrArrayObj = newInetSocketAddressArray(env, vnetConfig.assignedAddresses, vnetConfig.assignedAddressCount);
-
- env->SetObjectField(vnetConfigObj, VirtualNetworkConfig_assignedAddresses_field, assignedAddrArrayObj);
+ if (env->ExceptionCheck() || assignedAddrArrayObj == NULL) {
+ return NULL;
+ }
jobjectArray routesArrayObj = newVirtualNetworkRouteArray(env, vnetConfig.routes, vnetConfig.routeCount);
-
- env->SetObjectField(vnetConfigObj, VirtualNetworkConfig_routes_field, routesArrayObj);
-
- jobject dnsObj = newVirtualNetworkDNS(env, vnetConfig.dns);
- if (dnsObj != NULL) {
- env->SetObjectField(vnetConfigObj, VirtualNetworkConfig_dns_field, dnsObj);
+ if (env->ExceptionCheck() || routesArrayObj == NULL) {
+ return NULL;
}
+
+ //
+ // may be NULL
+ //
+ jobject dnsObj = newVirtualNetworkDNS(env, vnetConfig.dns);
+ if(env->ExceptionCheck()) {
+ return NULL;
+ }
+
+ jobject vnetConfigObj = env->NewObject(
+ VirtualNetworkConfig_class,
+ VirtualNetworkConfig_ctor,
+ vnetConfig.nwid,
+ vnetConfig.mac,
+ nameStr,
+ statusObject,
+ typeObject,
+ vnetConfig.mtu,
+ vnetConfig.dhcp,
+ vnetConfig.bridge,
+ vnetConfig.broadcastEnabled,
+ vnetConfig.portError,
+ vnetConfig.netconfRevision,
+ assignedAddrArrayObj,
+ routesArrayObj,
+ dnsObj);
+ if(env->ExceptionCheck() || vnetConfigObj == NULL)
+ {
+ LOGE("Error creating new VirtualNetworkConfig object");
+ return NULL;
+ }
+
return vnetConfigObj;
}
diff --git a/java/jni/com_zerotierone_sdk_Node.cpp b/java/jni/com_zerotierone_sdk_Node.cpp
index 557a887be..a143d9210 100644
--- a/java/jni/com_zerotierone_sdk_Node.cpp
+++ b/java/jni/com_zerotierone_sdk_Node.cpp
@@ -124,13 +124,17 @@ namespace {
return -101;
}
- jobject networkConfigObject = newNetworkConfig(env, *config);
- if(networkConfigObject == NULL)
- {
- LOGE("Error creating VirtualNetworkConfig object");
+ if (config == NULL) {
+ LOGE("Config is NULL");
return -102;
}
+ jobject networkConfigObject = newNetworkConfig(env, *config);
+ if(env->ExceptionCheck() || networkConfigObject == NULL)
+ {
+ return -103;
+ }
+
return env->CallIntMethod(
ref->configListener,
VirtualNetworkConfigListener_onNetworkConfigurationUpdated_method,
diff --git a/java/src/com/zerotier/sdk/VirtualNetworkConfig.java b/java/src/com/zerotier/sdk/VirtualNetworkConfig.java
index 8793a9657..51e8e8555 100644
--- a/java/src/com/zerotier/sdk/VirtualNetworkConfig.java
+++ b/java/src/com/zerotier/sdk/VirtualNetworkConfig.java
@@ -36,30 +36,75 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
-public final class VirtualNetworkConfig implements Comparable {
+/**
+ * Virtual network configuration
+ *
+ * Defined in ZeroTierOne.h as ZT_VirtualNetworkConfig
+ */
+public class VirtualNetworkConfig implements Comparable {
+
private final static String TAG = "VirtualNetworkConfig";
public static final int MAX_MULTICAST_SUBSCRIPTIONS = 4096;
public static final int ZT_MAX_ZT_ASSIGNED_ADDRESSES = 16;
- private long nwid;
- private long mac;
- private String name;
- private VirtualNetworkStatus status;
- private VirtualNetworkType type;
- private int mtu;
- private boolean dhcp;
- private boolean bridge;
- private boolean broadcastEnabled;
- private int portError;
- private boolean enabled;
- private long netconfRevision;
- private InetSocketAddress[] assignedAddresses;
- private VirtualNetworkRoute[] routes;
- private VirtualNetworkDNS dns;
+ private final long nwid;
- private VirtualNetworkConfig() {
+ private final long mac;
+ private final String name;
+
+ private final VirtualNetworkStatus status;
+
+ private final VirtualNetworkType type;
+
+ private final int mtu;
+
+ private final boolean dhcp;
+
+ private final boolean bridge;
+
+ private final boolean broadcastEnabled;
+
+ private final int portError;
+
+ private final boolean enabled;
+
+ private final long netconfRevision;
+
+ private final InetSocketAddress[] assignedAddresses;
+
+ private final VirtualNetworkRoute[] routes;
+
+ private final VirtualNetworkDNS dns;
+
+ public VirtualNetworkConfig(long nwid, long mac, String name, VirtualNetworkStatus status, VirtualNetworkType type, int mtu, boolean dhcp, boolean bridge, boolean broadcastEnabled, int portError, boolean enabled, long netconfRevision, InetSocketAddress[] assignedAddresses, VirtualNetworkRoute[] routes, VirtualNetworkDNS dns) {
+ this.nwid = nwid;
+ this.mac = mac;
+ this.name = name;
+ this.status = status;
+ this.type = type;
+ if (mtu < 0) {
+ throw new RuntimeException("mtu < 0: " + mtu);
+ }
+ this.mtu = mtu;
+ this.dhcp = dhcp;
+ this.bridge = bridge;
+ this.broadcastEnabled = broadcastEnabled;
+ this.portError = portError;
+ if (netconfRevision < 0) {
+ throw new RuntimeException("netconfRevision < 0: " + netconfRevision);
+ }
+ this.enabled = enabled;
+ this.netconfRevision = netconfRevision;
+ this.assignedAddresses = assignedAddresses;
+ this.routes = routes;
+ this.dns = dns;
+ }
+
+ @Override
+ public String toString() {
+ return "VirtualNetworkConfig(" + StringUtils.networkIdToString(nwid) + ", " + StringUtils.macAddressToString(mac) + ", " + name + ", " + status + ", " + type + ", " + mtu + ", " + dhcp + ", " + bridge + ", " + broadcastEnabled + ", " + portError + ", " + enabled + ", " + netconfRevision + ", " + Arrays.toString(assignedAddresses) + ", " + Arrays.toString(routes) + ", " + dns + ")";
}
@Override
@@ -254,42 +299,42 @@ public final class VirtualNetworkConfig implements Comparable
*/
- public final boolean isDhcpAvailable() {
+ public boolean isDhcp() {
return dhcp;
}
@@ -310,21 +355,21 @@ public final class VirtualNetworkConfig implements ComparableThis is informational. If this is false, bridged packets will simply
* be dropped and bridging won't work.
*/
- public final boolean isBridgeEnabled() {
+ public boolean isBridge() {
return bridge;
}
/**
* If true, this network supports and allows broadcast (ff:ff:ff:ff:ff:ff) traffic
*/
- public final boolean broadcastEnabled() {
+ public boolean isBroadcastEnabled() {
return broadcastEnabled;
}
/**
* If the network is in PORT_ERROR state, this is the error most recently returned by the port config callback
*/
- public final int portError() {
+ public int getPortError() {
return portError;
}
@@ -333,7 +378,7 @@ public final class VirtualNetworkConfig implements ComparableIf this is zero, it means we're still waiting for our netconf.
*/
- public final long netconfRevision() {
+ public long getNetconfRevision() {
return netconfRevision;
}
@@ -347,7 +392,7 @@ public final class VirtualNetworkConfig implements Comparable