From 3b2b8fc14306f55703088b2abcea42c03b84fce8 Mon Sep 17 00:00:00 2001 From: anthony Date: Mon, 18 Jun 2012 11:40:35 -0700 Subject: [PATCH] VPC: fix VPC cidr check --- .../src/com/cloud/network/NetworkManagerImpl.java | 13 +------------ .../src/com/cloud/network/vpc/VpcManagerImpl.java | 3 +-- utils/src/com/cloud/utils/net/NetUtils.java | 10 ++++++++++ 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index f2f870c054a..1326d5b5ea6 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -2503,20 +2503,9 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag return; } - String currCidrAddress = getCidrAddress(cidr); - int currCidrSize = getCidrSize(cidr); - for (long networkId : networkToCidr.keySet()) { String ntwkCidr = networkToCidr.get(networkId); - String ntwkCidrAddress = getCidrAddress(ntwkCidr); - int ntwkCidrSize = getCidrSize(ntwkCidr); - - long cidrSizeToUse = currCidrSize < ntwkCidrSize ? currCidrSize : ntwkCidrSize; - - String ntwkCidrSubnet = NetUtils.getCidrSubNet(ntwkCidrAddress, cidrSizeToUse); - String cidrSubnet = NetUtils.getCidrSubNet(currCidrAddress, cidrSizeToUse); - - if (cidrSubnet.equals(ntwkCidrSubnet)) { + if (NetUtils.isNetworksOverlap(ntwkCidr, cidr)) { InvalidParameterValueException ex = new InvalidParameterValueException("Warning: The specified existing network has conflict CIDR subnets with new network!"); ex.addProxyObject("networks", networkId, "networkId"); throw ex; diff --git a/server/src/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/com/cloud/network/vpc/VpcManagerImpl.java index 55e95be2480..53811aff483 100644 --- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java +++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java @@ -795,8 +795,7 @@ public class VpcManagerImpl implements VpcManager, Manager{ for (Network ntwk : ntwks) { assert (cidr != null) : "Why the network cidr is null when it belongs to vpc?"; - if (NetUtils.isNetworkAWithinNetworkB(ntwk.getCidr(), vpc.getCidr()) - || NetUtils.isNetworkAWithinNetworkB(vpc.getCidr(), ntwk.getCidr())) { + if (NetUtils.isNetworksOverlap(ntwk.getCidr(), cidr)) { throw new InvalidParameterValueException("Network cidr " + cidr + " crosses other network cidr " + ntwk + " belonging to the same vpc " + vpc); } diff --git a/utils/src/com/cloud/utils/net/NetUtils.java b/utils/src/com/cloud/utils/net/NetUtils.java index 5a5a52ac31f..4a266bc583e 100755 --- a/utils/src/com/cloud/utils/net/NetUtils.java +++ b/utils/src/com/cloud/utils/net/NetUtils.java @@ -780,6 +780,16 @@ public class NetUtils { long shift = 32 - cidrBLong[1]; return ((cidrALong[0] >> shift) == (cidrBLong[0] >> shift)); } + + public static boolean isNetworksOverlap(String cidrA, String cidrB) { + Long[] cidrALong = cidrToLong(cidrA); + Long[] cidrBLong = cidrToLong(cidrB); + if (cidrALong == null || cidrBLong == null) { + return false; + } + long shift = 32 - (cidrALong[1] > cidrBLong[1] ? cidrBLong[1] : cidrALong[1]); + return ((cidrALong[0] >> shift) == (cidrBLong[0] >> shift)); + } public static Long[] cidrToLong(String cidr) { if (cidr == null || cidr.isEmpty()) {