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")); } }
