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