diff --git a/server/src/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/com/cloud/network/vpc/VpcManagerImpl.java index e88c3bd2297..9185f20bbd3 100644 --- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java +++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java @@ -1011,6 +1011,11 @@ public class VpcManagerImpl implements VpcManager, Manager{ if (NetUtils.getCidrSubNet(cidr).equalsIgnoreCase(gateway)) { throw new InvalidParameterValueException("Invalid gateway specified. It should never be equal to the cidr subnet value"); } + //7) gateway should never be equal to the cidr broadcast ip + if (NetUtils.getCidrBroadcastIp(cidr).equalsIgnoreCase(gateway)) { + throw new InvalidParameterValueException("Invalid gateway specified. It should never be equal to the cidr broadcast ip"); + } + } finally { s_logger.debug("Releasing lock for " + locked); diff --git a/utils/src/com/cloud/utils/net/NetUtils.java b/utils/src/com/cloud/utils/net/NetUtils.java index 11b53dc333f..a19dc85355c 100755 --- a/utils/src/com/cloud/utils/net/NetUtils.java +++ b/utils/src/com/cloud/utils/net/NetUtils.java @@ -728,6 +728,13 @@ public class NetUtils { return long2Ip(result); } + public static String getBroadcastIp(String ip, String netmask) { + long ipAddr = ip2Long(ip); + long subnet = ip2Long(netmask); + long result = ipAddr | (~subnet); + return long2Ip(result); + } + public static String getCidrSubNet(String ip, long cidrSize) { long numericNetmask = (0xffffffff >> (32 - cidrSize)) << (32 - cidrSize); String netmask = NetUtils.long2Ip(numericNetmask); @@ -841,6 +848,31 @@ public class NetUtils { String netmask = NetUtils.long2Ip(numericNetmask); return getSubNet(cidrAddress, netmask); } + + public static String getCidrBroadcastIp(String cidr) { + if (cidr == null || cidr.isEmpty()) { + return null; + } + String[] cidrPair = cidr.split("\\/"); + if (cidrPair.length != 2) { + return null; + } + String cidrAddress = cidrPair[0]; + String cidrSize = cidrPair[1]; + if (!isValidIp(cidrAddress)) { + return null; + } + int cidrSizeNum = -1; + + try { + cidrSizeNum = Integer.parseInt(cidrSize); + } catch (Exception e) { + return null; + } + long numericNetmask = (0xffffffff >> (32 - cidrSizeNum)) << (32 - cidrSizeNum); + String netmask = NetUtils.long2Ip(numericNetmask); + return getBroadcastIp(cidrAddress, netmask); + } public static String getCidrNetmask(long cidrSize) { long numericNetmask = (0xffffffff >> (32 - cidrSize)) << (32 - cidrSize);