diff --git a/server/src/com/cloud/network/NetworkModelImpl.java b/server/src/com/cloud/network/NetworkModelImpl.java index bd62886674f..7b712ea9781 100755 --- a/server/src/com/cloud/network/NetworkModelImpl.java +++ b/server/src/com/cloud/network/NetworkModelImpl.java @@ -1666,20 +1666,17 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel { List ips = _nicDao.listIpAddressInNetwork(network.getId()); List secondaryIps = _nicSecondaryIpDao.listSecondaryIpAddressInNetwork(network.getId()); ips.addAll(secondaryIps); - Set allPossibleIps = NetUtils.getAllIpsFromCidr(cidr[0], Integer.parseInt(cidr[1])); Set usedIps = new TreeSet(); - + for (String ip : ips) { if (requestedIp != null && requestedIp.equals(ip)) { s_logger.warn("Requested ip address " + requestedIp + " is already in use in network" + network); return null; } - + usedIps.add(NetUtils.ip2Long(ip)); } - if (usedIps.size() != 0) { - allPossibleIps.removeAll(usedIps); - } + Set allPossibleIps = NetUtils.getAllIpsFromCidr(cidr[0], Integer.parseInt(cidr[1]), usedIps); String gateway = network.getGateway(); if ((gateway != null) && (allPossibleIps.contains(NetUtils.ip2Long(gateway)))) diff --git a/server/src/com/cloud/network/NetworkServiceImpl.java b/server/src/com/cloud/network/NetworkServiceImpl.java index 2dcb47d0cd8..ae0e4212efe 100755 --- a/server/src/com/cloud/network/NetworkServiceImpl.java +++ b/server/src/com/cloud/network/NetworkServiceImpl.java @@ -2066,9 +2066,8 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { protected Set getAvailableIps(Network network, String requestedIp) { String[] cidr = network.getCidr().split("/"); List ips = _nicDao.listIpAddressInNetwork(network.getId()); - Set allPossibleIps = NetUtils.getAllIpsFromCidr(cidr[0], Integer.parseInt(cidr[1])); Set usedIps = new TreeSet(); - + for (String ip : ips) { if (requestedIp != null && requestedIp.equals(ip)) { s_logger.warn("Requested ip address " + requestedIp + " is already in use in network" + network); @@ -2077,9 +2076,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { usedIps.add(NetUtils.ip2Long(ip)); } - if (usedIps.size() != 0) { - allPossibleIps.removeAll(usedIps); - } + Set allPossibleIps = NetUtils.getAllIpsFromCidr(cidr[0], Integer.parseInt(cidr[1]), usedIps); String gateway = network.getGateway(); if ((gateway != null) && (allPossibleIps.contains(NetUtils.ip2Long(gateway)))) diff --git a/utils/src/com/cloud/utils/net/NetUtils.java b/utils/src/com/cloud/utils/net/NetUtils.java index 5988dd5f337..9f28d5b36b2 100755 --- a/utils/src/com/cloud/utils/net/NetUtils.java +++ b/utils/src/com/cloud/utils/net/NetUtils.java @@ -627,7 +627,7 @@ public class NetUtils { return result; } - public static Set getAllIpsFromCidr(String cidr, long size) { + public static Set getAllIpsFromCidr(String cidr, long size, Set usedIps) { assert (size < 32) : "You do know this is not for ipv6 right? Keep it smaller than 32 but you have " + size; Set result = new TreeSet(); long ip = ip2Long(cidr); @@ -639,8 +639,12 @@ public class NetUtils { end++; end = (end << (32 - size)) - 2; - while (start <= end) { - result.add(start); + int maxIps = 255; // get 255 ips as maximum + while (start <= end && maxIps > 0) { + if (!usedIps.contains(start)){ + result.add(start); + maxIps--; + } start++; }