Updated Branches: refs/heads/master 68406ba29 -> cd6e6a4d3
CLOUDSTACK-1762 Fixed assigning network or broadcast ip to nic Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/cd6e6a4d Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/cd6e6a4d Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/cd6e6a4d Branch: refs/heads/master Commit: cd6e6a4d3cd7e210595a8f0624ff717d599d83e5 Parents: 68406ba Author: Jayapal <[email protected]> Authored: Mon Dec 2 10:53:51 2013 +0530 Committer: Jayapal <[email protected]> Committed: Mon Dec 2 11:05:41 2013 +0530 ---------------------------------------------------------------------- .../com/cloud/network/IpAddressManagerImpl.java | 7 +++++-- utils/src/com/cloud/utils/net/NetUtils.java | 22 ++++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/cd6e6a4d/server/src/com/cloud/network/IpAddressManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/network/IpAddressManagerImpl.java b/server/src/com/cloud/network/IpAddressManagerImpl.java index b350fe0..230f19d 100644 --- a/server/src/com/cloud/network/IpAddressManagerImpl.java +++ b/server/src/com/cloud/network/IpAddressManagerImpl.java @@ -1644,6 +1644,7 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage Set<Long> availableIps = _networkModel.getAvailableIps(network, requestedIp); if (availableIps == null || availableIps.isEmpty()) { + s_logger.debug("There are no free ips in the network " + network ); return null; } @@ -1656,9 +1657,11 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage if (!isSameCidr) { s_logger.warn("Requested ip address " + requestedIp + " doesn't belong to the network " + network + " cidr"); return null; - } else { - return requestedIp; + } else if (NetUtils.IsIpEqualToNetworkOrBroadCastIp(requestedIp, cidr[0], Integer.parseInt(cidr[1]))) { + s_logger.warn("Requested ip address " + requestedIp + " is equal to the to the network/broadcast ip of the network" + network); + return null; } + return requestedIp; } String result; http://git-wip-us.apache.org/repos/asf/cloudstack/blob/cd6e6a4d/utils/src/com/cloud/utils/net/NetUtils.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/net/NetUtils.java b/utils/src/com/cloud/utils/net/NetUtils.java index 46a048f..c0c792f 100755 --- a/utils/src/com/cloud/utils/net/NetUtils.java +++ b/utils/src/com/cloud/utils/net/NetUtils.java @@ -1427,4 +1427,26 @@ public class NetUtils { SubnetUtils subnetUtils = new SubnetUtils(cidr); return subnetUtils.getInfo().isInRange(ipAddress); } + + public static Boolean IsIpEqualToNetworkOrBroadCastIp(String requestedIp, String cidr, long size) { + assert (size < 32) : "You do know this is not for ipv6 right? Keep it smaller than 32 but you have " + size; + + long ip = ip2Long(cidr); + long startNetMask = ip2Long(getCidrNetmask(size)); + + long start = (ip & startNetMask); + long end = start; + + end = end >> (32 - size); + + end++; + end = (end << (32 - size)) - 1; + + long reqIp = ip2Long(requestedIp); + if (reqIp == start || reqIp == end) { + return true; + } + return false; + } + }
