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) {