IPv6: Fix ip address in range check

Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/81a40611
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/81a40611
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/81a40611

Branch: refs/heads/network-refactor
Commit: 81a40611f1f759e0d779f3e9f71ae05af3e979db
Parents: c2e457c
Author: Sheng Yang <[email protected]>
Authored: Tue Feb 5 13:04:38 2013 -0800
Committer: Sheng Yang <[email protected]>
Committed: Tue Feb 5 14:32:31 2013 -0800

----------------------------------------------------------------------
 .../src/com/cloud/network/NetworkServiceImpl.java  |   12 ++++++------
 utils/src/com/cloud/utils/net/NetUtils.java        |   11 +++++++++++
 utils/test/com/cloud/utils/net/NetUtilsTest.java   |    9 +++++++++
 3 files changed, 26 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/81a40611/server/src/com/cloud/network/NetworkServiceImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkServiceImpl.java 
b/server/src/com/cloud/network/NetworkServiceImpl.java
index 7c8bab8..045a333 100755
--- a/server/src/com/cloud/network/NetworkServiceImpl.java
+++ b/server/src/com/cloud/network/NetworkServiceImpl.java
@@ -825,14 +825,14 @@ public class NetworkServiceImpl implements  
NetworkService, Manager {
                if (!NetUtils.isValidIp6Cidr(ip6Cidr)) {
                        throw new InvalidParameterValueException("Invalid 
ip6cidr");
                }
-               if (!NetUtils.isIp6InRange(startIPv6, ip6Cidr)) {
-                       throw new InvalidParameterValueException("startIPv6 is 
not in ip6cidr indicated network range!");
+               if (!NetUtils.isIp6InNetwork(startIPv6, ip6Cidr)) {
+                       throw new InvalidParameterValueException("startIPv6 is 
not in ip6cidr indicated network!");
                }
-               if (!NetUtils.isIp6InRange(endIPv6, ip6Cidr)) {
-                       throw new InvalidParameterValueException("endIPv6 is 
not in ip6cidr indicated network range!");
+               if (!NetUtils.isIp6InNetwork(endIPv6, ip6Cidr)) {
+                       throw new InvalidParameterValueException("endIPv6 is 
not in ip6cidr indicated network!");
                }
-               if (!NetUtils.isIp6InRange(ip6Gateway, ip6Cidr)) {
-                       throw new InvalidParameterValueException("ip6Gateway is 
not in ip6cidr indicated network range!");
+               if (!NetUtils.isIp6InNetwork(ip6Gateway, ip6Cidr)) {
+                       throw new InvalidParameterValueException("ip6Gateway is 
not in ip6cidr indicated network!");
                }
                
                int cidrSize = NetUtils.getIp6CidrSize(ip6Cidr);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/81a40611/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 fdda5b8..da67fc1 100755
--- a/utils/src/com/cloud/utils/net/NetUtils.java
+++ b/utils/src/com/cloud/utils/net/NetUtils.java
@@ -1235,6 +1235,17 @@ public class NetUtils {
                return false;
        }
        
+       public static boolean isIp6InNetwork(String ip6, String ip6Cidr) {
+               IPv6Network network = null;
+               try {
+                       network = IPv6Network.fromString(ip6Cidr);
+               } catch (IllegalArgumentException ex) {
+                       return false;
+               }
+       IPv6Address ip = IPv6Address.fromString(ip6);
+               return network.contains(ip);
+       }
+       
        public static boolean isIp6RangeOverlap(String ipRange1, String 
ipRange2) {
                String[] ips = ipRange1.split("-");
        String startIp1 = ips[0];

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/81a40611/utils/test/com/cloud/utils/net/NetUtilsTest.java
----------------------------------------------------------------------
diff --git a/utils/test/com/cloud/utils/net/NetUtilsTest.java 
b/utils/test/com/cloud/utils/net/NetUtilsTest.java
index 5336d93..9ff8c5e 100644
--- a/utils/test/com/cloud/utils/net/NetUtilsTest.java
+++ b/utils/test/com/cloud/utils/net/NetUtilsTest.java
@@ -101,5 +101,14 @@ public class NetUtilsTest extends TestCase {
        assertTrue(NetUtils.isIp6RangeOverlap("1234:5678::f-1234:5678::ffff", 
"1234:5678::2-1234:5678::f"));
        assertFalse(NetUtils.isIp6RangeOverlap("1234:5678::f-1234:5678::ffff", 
"1234:5678::2-1234:5678::e"));
        assertFalse(NetUtils.isIp6RangeOverlap("1234:5678::f-1234:5678::f", 
"1234:5678::2-1234:5678::e"));
+       //Test getNextIp6InRange
+       assertEquals(NetUtils.getNextIp6InRange("1234:5678::8000:0000", range), 
"1234:5678::1");
+       assertEquals(NetUtils.getNextIp6InRange("1234:5678::7fff:ffff", range), 
"1234:5678::8000:0");
+       assertEquals(NetUtils.getNextIp6InRange("1234:5678::1", range), 
"1234:5678::2");
+       //Test isIp6InNetwork
+       assertFalse(NetUtils.isIp6InNetwork("1234:5678:abcd::1", 
"1234:5678::/64"));
+       assertTrue(NetUtils.isIp6InNetwork("1234:5678::1", "1234:5678::/64"));
+       assertTrue(NetUtils.isIp6InNetwork("1234:5678::ffff:ffff:ffff:ffff", 
"1234:5678::/64"));
+       assertTrue(NetUtils.isIp6InNetwork("1234:5678::", "1234:5678::/64"));
     }
 }

Reply via email to