From b7a2ac3a1ceb38d40f4409acb38d909bbdbce8f5 Mon Sep 17 00:00:00 2001 From: Jonathan Hart Date: Fri, 19 Sep 2014 10:42:27 -0700 Subject: [PATCH] Added a contains method to IpAddress --- .../main/java/org/onlab/packet/IpAddress.java | 24 +++++++++++++++++++ .../java/org/onlab/packet/IPAddressTest.java | 23 ++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/utils/misc/src/main/java/org/onlab/packet/IpAddress.java b/utils/misc/src/main/java/org/onlab/packet/IpAddress.java index a10e710c30..73bb9c9194 100644 --- a/utils/misc/src/main/java/org/onlab/packet/IpAddress.java +++ b/utils/misc/src/main/java/org/onlab/packet/IpAddress.java @@ -234,6 +234,30 @@ public final class IpAddress { return mask() != 0; } + /** + * Determines whether a given address is contained within this IpAddress' + * network. + * + * @param other another IP address that could be contained in this network + * @return true if the other IP address is contained in this address' + * network, otherwise false + */ + public boolean contains(IpAddress other) { + if (this.netmask <= other.netmask) { + // Special case where they're both /32 addresses + if (this.netmask == MAX_INET_MASK) { + return Arrays.equals(octets, other.octets); + } + + // Mask the other address with our network mask + IpAddress otherMasked = + IpAddress.valueOf(other.octets, netmask).network(); + + return network().equals(otherMasked); + } + return false; + } + @Override public int hashCode() { final int prime = 31; diff --git a/utils/misc/src/test/java/org/onlab/packet/IPAddressTest.java b/utils/misc/src/test/java/org/onlab/packet/IPAddressTest.java index f1a7b0d8e2..d503229d67 100644 --- a/utils/misc/src/test/java/org/onlab/packet/IPAddressTest.java +++ b/utils/misc/src/test/java/org/onlab/packet/IPAddressTest.java @@ -1,6 +1,7 @@ package org.onlab.packet; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.util.Arrays; @@ -73,4 +74,26 @@ public class IPAddressTest { assertTrue("incorrect netmask", Arrays.equals(IpAddress.ANY, ip2.netmask().toOctets())); } + + @Test + public void testContains() { + IpAddress slash31 = IpAddress.valueOf(BYTES1, 31); + IpAddress slash32 = IpAddress.valueOf(BYTES1, 32); + IpAddress differentSlash32 = IpAddress.valueOf(BYTES2, 32); + + assertTrue(slash31.contains(differentSlash32)); + assertFalse(differentSlash32.contains(slash31)); + + assertTrue(slash31.contains(slash32)); + assertFalse(slash32.contains(differentSlash32)); + assertFalse(differentSlash32.contains(slash32)); + + IpAddress zero = IpAddress.valueOf("0.0.0.0/0"); + assertTrue(zero.contains(differentSlash32)); + assertFalse(differentSlash32.contains(zero)); + + IpAddress slash8 = IpAddress.valueOf("10.0.0.0/8"); + assertTrue(slash8.contains(slash31)); + assertFalse(slash31.contains(slash8)); + } }