diff options
-rw-r--r-- | api/current.txt | 1 | ||||
-rw-r--r-- | api/system-current.txt | 1 | ||||
-rw-r--r-- | core/java/android/net/IpPrefix.java | 15 | ||||
-rw-r--r-- | core/java/android/net/RouteInfo.java | 8 | ||||
-rw-r--r-- | core/tests/coretests/src/android/net/IpPrefixTest.java | 32 | ||||
-rw-r--r-- | core/tests/coretests/src/android/net/RouteInfoTest.java | 1 |
6 files changed, 51 insertions, 7 deletions
diff --git a/api/current.txt b/api/current.txt index ed80e38..c21fa0a 100644 --- a/api/current.txt +++ b/api/current.txt @@ -16998,6 +16998,7 @@ package android.net { } public final class IpPrefix implements android.os.Parcelable { + method public boolean contains(java.net.InetAddress); method public int describeContents(); method public java.net.InetAddress getAddress(); method public int getPrefixLength(); diff --git a/api/system-current.txt b/api/system-current.txt index 8f1b8b2..6732a09 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -18261,6 +18261,7 @@ package android.net { } public final class IpPrefix implements android.os.Parcelable { + method public boolean contains(java.net.InetAddress); method public int describeContents(); method public java.net.InetAddress getAddress(); method public int getPrefixLength(); diff --git a/core/java/android/net/IpPrefix.java b/core/java/android/net/IpPrefix.java index b268986..6b4f2d5 100644 --- a/core/java/android/net/IpPrefix.java +++ b/core/java/android/net/IpPrefix.java @@ -170,6 +170,21 @@ public final class IpPrefix implements Parcelable { } /** + * Determines whether the prefix contains the specified address. + * + * @param address An {@link InetAddress} to test. + * @return {@code true} if the prefix covers the given address. + */ + public boolean contains(InetAddress address) { + byte[] addrBytes = (address == null) ? null : address.getAddress(); + if (addrBytes == null || addrBytes.length != this.address.length) { + return false; + } + NetworkUtils.maskRawAddress(addrBytes, prefixLength); + return Arrays.equals(this.address, addrBytes); + } + + /** * Returns a string representation of this {@code IpPrefix}. * * @return a string such as {@code "192.0.2.0/24"} or {@code "2001:db8:1:2::/64"}. diff --git a/core/java/android/net/RouteInfo.java b/core/java/android/net/RouteInfo.java index cfd20a0..90a2460 100644 --- a/core/java/android/net/RouteInfo.java +++ b/core/java/android/net/RouteInfo.java @@ -367,13 +367,7 @@ public final class RouteInfo implements Parcelable { * @return {@code true} if the destination and prefix length cover the given address. */ public boolean matches(InetAddress destination) { - if (destination == null) return false; - - // match the route destination and destination with prefix length - InetAddress dstNet = NetworkUtils.getNetworkPart(destination, - mDestination.getPrefixLength()); - - return mDestination.getAddress().equals(dstNet); + return mDestination.contains(destination); } /** diff --git a/core/tests/coretests/src/android/net/IpPrefixTest.java b/core/tests/coretests/src/android/net/IpPrefixTest.java index cf278fb..fcc6389 100644 --- a/core/tests/coretests/src/android/net/IpPrefixTest.java +++ b/core/tests/coretests/src/android/net/IpPrefixTest.java @@ -29,6 +29,10 @@ import junit.framework.TestCase; public class IpPrefixTest extends TestCase { + private static InetAddress Address(String addr) { + return InetAddress.parseNumericAddress(addr); + } + // Explicitly cast everything to byte because "error: possible loss of precision". private static final byte[] IPV4_BYTES = { (byte) 192, (byte) 0, (byte) 2, (byte) 4}; private static final byte[] IPV6_BYTES = { @@ -209,6 +213,34 @@ public class IpPrefixTest extends TestCase { } @SmallTest + public void testContains() { + IpPrefix p = new IpPrefix("2001:db8:f00::ace:d00d/127"); + assertTrue(p.contains(Address("2001:db8:f00::ace:d00c"))); + assertTrue(p.contains(Address("2001:db8:f00::ace:d00d"))); + assertFalse(p.contains(Address("2001:db8:f00::ace:d00e"))); + assertFalse(p.contains(Address("2001:db8:f00::bad:d00d"))); + assertFalse(p.contains(Address("2001:4868:4860::8888"))); + assertFalse(p.contains(null)); + assertFalse(p.contains(Address("8.8.8.8"))); + + p = new IpPrefix("192.0.2.0/23"); + assertTrue(p.contains(Address("192.0.2.43"))); + assertTrue(p.contains(Address("192.0.3.21"))); + assertFalse(p.contains(Address("192.0.0.21"))); + assertFalse(p.contains(Address("8.8.8.8"))); + assertFalse(p.contains(Address("2001:4868:4860::8888"))); + + IpPrefix ipv6Default = new IpPrefix("::/0"); + assertTrue(ipv6Default.contains(Address("2001:db8::f00"))); + assertFalse(ipv6Default.contains(Address("192.0.2.1"))); + + IpPrefix ipv4Default = new IpPrefix("0.0.0.0/0"); + assertTrue(ipv4Default.contains(Address("255.255.255.255"))); + assertTrue(ipv4Default.contains(Address("192.0.2.1"))); + assertFalse(ipv4Default.contains(Address("2001:db8::f00"))); + } + + @SmallTest public void testHashCode() { IpPrefix p; int oldCode = -1; diff --git a/core/tests/coretests/src/android/net/RouteInfoTest.java b/core/tests/coretests/src/android/net/RouteInfoTest.java index 0b88bc7..831fefd 100644 --- a/core/tests/coretests/src/android/net/RouteInfoTest.java +++ b/core/tests/coretests/src/android/net/RouteInfoTest.java @@ -90,6 +90,7 @@ public class RouteInfoTest extends TestCase { assertFalse(r.matches(Address("2001:db8:f00::ace:d00e"))); assertFalse(r.matches(Address("2001:db8:f00::bad:d00d"))); assertFalse(r.matches(Address("2001:4868:4860::8888"))); + assertFalse(r.matches(Address("8.8.8.8"))); r = new PatchedRouteInfo(Prefix("192.0.2.0/23"), null, "wlan0"); assertTrue(r.matches(Address("192.0.2.43"))); |