Fix: correctly calculate the broadcast address for DHCP ACK
Change-Id: I240b370304c52c71cdeeeee7a6d1272788bc8390
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingDhcpHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingDhcpHandler.java
index cab32d2..922d1b5 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingDhcpHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingDhcpHandler.java
@@ -91,6 +91,7 @@
import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_DHCP_RULE;
import static org.onosproject.openstacknetworking.impl.OsgiPropertyConstants.DHCP_SERVER_MAC;
import static org.onosproject.openstacknetworking.impl.OsgiPropertyConstants.DHCP_SERVER_MAC_DEFAULT;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getBroadcastAddr;
import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.COMPUTE;
import static org.slf4j.LoggerFactory.getLogger;
@@ -389,8 +390,7 @@
options.add(doSubnetMask(subnetPrefixLen));
// broadcast address
- // do not specify broadcast address, let host use default value
- // options.add(doBroadcastAddr(yourIp, subnetPrefixLen));
+ options.add(doBroadcastAddr(yourIp, subnetPrefixLen));
// domain server
options.add(doDomainServer(osSubnet));
@@ -452,11 +452,13 @@
}
private DhcpOption doBroadcastAddr(Ip4Address yourIp, int subnetPrefixLen) {
- Ip4Address broadcast = Ip4Address.makeMaskedAddress(yourIp, subnetPrefixLen);
+ String broadcast = getBroadcastAddr(yourIp.toString(), subnetPrefixLen);
+
DhcpOption option = new DhcpOption();
option.setCode(OptionCode_BroadcastAddress.getValue());
option.setLength(DHCP_OPTION_DATA_LENGTH);
- option.setData(broadcast.toOctets());
+ option.setData(IpAddress.valueOf(broadcast).toOctets());
+
return option;
}
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/util/OpenstackNetworkingUtil.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/util/OpenstackNetworkingUtil.java
index 16dcc21..0a35e34 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/util/OpenstackNetworkingUtil.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/util/OpenstackNetworkingUtil.java
@@ -26,6 +26,7 @@
import com.google.common.collect.Lists;
import org.apache.commons.codec.binary.Hex;
import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.net.util.SubnetUtils;
import org.apache.http.HttpException;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
@@ -1486,6 +1487,19 @@
}
/**
+ * Calculate the broadcast address from given IP address and subnet prefix length.
+ *
+ * @param ipAddr IP address
+ * @param prefixLength subnet prefix length
+ * @return broadcast address
+ */
+ public static String getBroadcastAddr(String ipAddr, int prefixLength) {
+ String subnet = ipAddr + "/" + prefixLength;
+ SubnetUtils utils = new SubnetUtils(subnet);
+ return utils.getInfo().getBroadcastAddress();
+ }
+
+ /**
* Builds up and a complete endpoint URL from gateway node.
*
* @param node gateway node