Browse Source

make VirtualNetworkConfig a plain data class

Brenton Bostick 2 years ago
parent
commit
54fd7c7e9a

+ 1 - 29
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, "<init>", "(JIIIILcom/zerotier/sdk/PeerRole;[Lcom/zerotier/sdk/PeerPhysicalPath;)V"));
     EXCEPTIONANDNULLCHECK(Version_ctor = env->GetMethodID(Version_class, "<init>", "(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, "<init>", "()V"));
+    EXCEPTIONANDNULLCHECK(VirtualNetworkConfig_ctor = env->GetMethodID(VirtualNetworkConfig_class, "<init>", "(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, "<init>", "()V"));
     EXCEPTIONANDNULLCHECK(VirtualNetworkFrameListener_onVirtualNetworkFrame_method = env->GetMethodID(VirtualNetworkFrameListener_class, "onVirtualNetworkFrame", "(JJJJJ[B)V"));
     EXCEPTIONANDNULLCHECK(VirtualNetworkRoute_ctor = env->GetMethodID(VirtualNetworkRoute_class, "<init>", "()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"));

+ 0 - 14
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;

+ 36 - 24
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);
+    if (env->ExceptionCheck() || routesArrayObj == NULL) {
+        return NULL;
+    }
 
-    env->SetObjectField(vnetConfigObj, VirtualNetworkConfig_routes_field, routesArrayObj);
-
+    //
+    // may be NULL
+    //
     jobject dnsObj = newVirtualNetworkDNS(env, vnetConfig.dns);
-    if (dnsObj != NULL) {
-        env->SetObjectField(vnetConfigObj, VirtualNetworkConfig_dns_field, dnsObj);
+    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;
 }
 

+ 7 - 3
java/jni/com_zerotierone_sdk_Node.cpp

@@ -124,11 +124,15 @@ namespace {
             return -101;
         }
 
+        if (config == NULL) {
+            LOGE("Config is NULL");
+            return -102;
+        }
+
         jobject networkConfigObject = newNetworkConfig(env, *config);
-        if(networkConfigObject == NULL)
+        if(env->ExceptionCheck() || networkConfigObject == NULL)
         {
-            LOGE("Error creating VirtualNetworkConfig object");
-            return -102;
+            return -103;
         }
 
         return env->CallIntMethod(

+ 84 - 32
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<VirtualNetworkConfig> {
+/**
+ * Virtual network configuration
+ *
+ * Defined in ZeroTierOne.h as ZT_VirtualNetworkConfig
+ */
+public class VirtualNetworkConfig implements Comparable<VirtualNetworkConfig> {
+
     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 VirtualNetworkConfig() {
+    private final long nwid;
+
+    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<VirtualNetworkConf
     /**
      * 64-bit ZeroTier network ID
      */
-    public final long networkId() {
+    public long getNwid() {
         return nwid;
     }
 
     /**
      * Ethernet MAC (48 bits) that should be assigned to port
      */
-    public final long macAddress() {
+    public long getMac() {
         return mac;
     }
 
     /**
      * Network name (from network configuration master)
      */
-    public final String name() {
+    public String getName() {
         return name;
     }
 
     /**
      * Network configuration request status
      */
-    public final VirtualNetworkStatus networkStatus() {
+    public VirtualNetworkStatus getStatus() {
         return status;
     }
 
     /**
      * Network type
      */
-    public final VirtualNetworkType networkType() {
+    public VirtualNetworkType getType() {
         return type;
     }
 
     /**
      * Maximum interface MTU
      */
-    public final int mtu() {
+    public int getMtu() {
         return mtu;
     }
 
@@ -300,7 +345,7 @@ public final class VirtualNetworkConfig implements Comparable<VirtualNetworkConf
      * for security or other reasons. This is simply a netconf parameter that
      * means 'DHCP is available on this network.'</p>
      */
-    public final boolean isDhcpAvailable() {
+    public boolean isDhcp() {
         return dhcp;
     }
 
@@ -310,21 +355,21 @@ public final class VirtualNetworkConfig implements Comparable<VirtualNetworkConf
      * <p>This is informational. If this is false, bridged packets will simply
      * be dropped and bridging won't work.</p>
      */
-    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 Comparable<VirtualNetworkConf
      *
      * <p>If this is zero, it means we're still waiting for our netconf.</p>
      */
-    public final long netconfRevision() {
+    public long getNetconfRevision() {
         return netconfRevision;
     }
 
@@ -347,7 +392,7 @@ public final class VirtualNetworkConfig implements Comparable<VirtualNetworkConf
      * This is only used for ZeroTier-managed address assignments sent by the
      * virtual network's configuration master.
      */
-    public final InetSocketAddress[] assignedAddresses() {
+    public InetSocketAddress[] getAssignedAddresses() {
         return assignedAddresses;
     }
 
@@ -356,7 +401,14 @@ public final class VirtualNetworkConfig implements Comparable<VirtualNetworkConf
      *
      * @return
      */
-    public final VirtualNetworkRoute[] routes() { return routes; }
+    public VirtualNetworkRoute[] getRoutes() {
+        return routes;
+    }
 
-    public final VirtualNetworkDNS dns() { return dns; }
+    /**
+     * Network specific DNS configuration
+     */
+    public VirtualNetworkDNS getDns() {
+        return dns;
+    }
 }