Fixing ONOS-4875

Change-Id: I2b4fec44f623cc6df90c45c1cabc8c40601bf4b6
(cherry picked from commit 1a5491ecaf6e648a547ea1265796835f7a24d300)
diff --git a/core/api/src/main/java/org/onosproject/net/host/InterfaceIpAddress.java b/core/api/src/main/java/org/onosproject/net/host/InterfaceIpAddress.java
index 1ceb784..4bf196d 100644
--- a/core/api/src/main/java/org/onosproject/net/host/InterfaceIpAddress.java
+++ b/core/api/src/main/java/org/onosproject/net/host/InterfaceIpAddress.java
@@ -60,11 +60,11 @@
      * @param subnetAddress the IP subnet address
      */
     public InterfaceIpAddress(IpAddress ipAddress, IpPrefix subnetAddress) {
-        this.ipAddress = checkNotNull(ipAddress);
-        this.subnetAddress = checkNotNull(subnetAddress);
-        // TODO: Recompute the default broadcast address from the subnet
-        // address
-        this.broadcastAddress = null;
+        checkArgument(checkNotNull(ipAddress).version() == checkNotNull(subnetAddress).version(),
+            "IP and subnet version mismatch");
+        this.ipAddress = ipAddress;
+        this.subnetAddress = subnetAddress;
+        this.broadcastAddress = computeBroadcastAddress(ipAddress, subnetAddress);
         this.peerAddress = null;
     }
 
@@ -78,8 +78,10 @@
      */
     public InterfaceIpAddress(IpAddress ipAddress, IpPrefix subnetAddress,
                               IpAddress broadcastAddress) {
-        this.ipAddress = checkNotNull(ipAddress);
-        this.subnetAddress = checkNotNull(subnetAddress);
+        checkArgument(checkNotNull(ipAddress).version() == checkNotNull(subnetAddress).version(),
+            "IP and subnet version mismatch");
+        this.ipAddress = ipAddress;
+        this.subnetAddress = subnetAddress;
         this.broadcastAddress = broadcastAddress;
         this.peerAddress = null;
     }
@@ -97,8 +99,10 @@
     public InterfaceIpAddress(IpAddress ipAddress, IpPrefix subnetAddress,
                               IpAddress broadcastAddress,
                               IpAddress peerAddress) {
-        this.ipAddress = checkNotNull(ipAddress);
-        this.subnetAddress = checkNotNull(subnetAddress);
+        checkArgument(checkNotNull(ipAddress).version() == checkNotNull(subnetAddress).version(),
+            "IP and subnet version mismatch");
+        this.ipAddress = ipAddress;
+        this.subnetAddress = subnetAddress;
         this.broadcastAddress = broadcastAddress;
         this.peerAddress = peerAddress;
     }
@@ -157,6 +161,21 @@
         return new InterfaceIpAddress(addr, subnet);
     }
 
+    /**
+     * Compute the IP broadcast address.
+     *
+     * @return the IP broadcast address
+     */
+    public static IpAddress computeBroadcastAddress(IpAddress ipAddress, IpPrefix subnetAddress) {
+        if (ipAddress.isIp6()) {
+            return null;
+        } else {
+            IpAddress maskedIP = IpAddress.makeMaskedAddress(ipAddress, subnetAddress.prefixLength());
+            int ipB = maskedIP.getIp4Address().toInt() | ((1 << (32 - subnetAddress.prefixLength())) - 1);
+            return IpAddress.valueOf(ipB);
+        }
+    }
+
     @Override
     public boolean equals(Object other) {
         if (other == this) {