diff --git a/core/java/android/net/NetworkUtils.java b/core/java/android/net/NetworkUtils.java index d0f54b4c7f..341e3ddf83 100644 --- a/core/java/android/net/NetworkUtils.java +++ b/core/java/android/net/NetworkUtils.java @@ -29,7 +29,6 @@ import android.util.Log; import android.util.Pair; import java.io.FileDescriptor; -import java.math.BigInteger; import java.net.Inet4Address; import java.net.Inet6Address; import java.net.InetAddress; @@ -37,7 +36,6 @@ import java.net.SocketException; import java.net.UnknownHostException; import java.util.Collection; import java.util.Locale; -import java.util.TreeSet; /** * Native methods for managing network interfaces. @@ -392,74 +390,6 @@ public class NetworkUtils { return result; } - /** - * Returns a prefix set without overlaps. - * - * This expects the src set to be sorted from shorter to longer. Results are undefined - * failing this condition. The returned prefix set is sorted in the same order as the - * passed set, with the same comparator. - */ - private static TreeSet deduplicatePrefixSet(final TreeSet src) { - final TreeSet dst = new TreeSet<>(src.comparator()); - // Prefixes match addresses that share their upper part up to their length, therefore - // the only kind of possible overlap in two prefixes is strict inclusion of the longer - // (more restrictive) in the shorter (including equivalence if they have the same - // length). - // Because prefixes in the src set are sorted from shorter to longer, deduplicating - // is done by simply iterating in order, and not adding any longer prefix that is - // already covered by a shorter one. - newPrefixes: - for (IpPrefix newPrefix : src) { - for (IpPrefix existingPrefix : dst) { - if (existingPrefix.containsPrefix(newPrefix)) { - continue newPrefixes; - } - } - dst.add(newPrefix); - } - return dst; - } - - /** - * Returns how many IPv4 addresses match any of the prefixes in the passed ordered set. - * - * Obviously this returns an integral value between 0 and 2**32. - * The behavior is undefined if any of the prefixes is not an IPv4 prefix or if the - * set is not ordered smallest prefix to longer prefix. - * - * @param prefixes the set of prefixes, ordered by length - */ - public static long routedIPv4AddressCount(final TreeSet prefixes) { - long routedIPCount = 0; - for (final IpPrefix prefix : deduplicatePrefixSet(prefixes)) { - if (!prefix.isIPv4()) { - Log.wtf(TAG, "Non-IPv4 prefix in routedIPv4AddressCount"); - } - int rank = 32 - prefix.getPrefixLength(); - routedIPCount += 1L << rank; - } - return routedIPCount; - } - - /** - * Returns how many IPv6 addresses match any of the prefixes in the passed ordered set. - * - * This returns a BigInteger between 0 and 2**128. - * The behavior is undefined if any of the prefixes is not an IPv6 prefix or if the - * set is not ordered smallest prefix to longer prefix. - */ - public static BigInteger routedIPv6AddressCount(final TreeSet prefixes) { - BigInteger routedIPCount = BigInteger.ZERO; - for (final IpPrefix prefix : deduplicatePrefixSet(prefixes)) { - if (!prefix.isIPv6()) { - Log.wtf(TAG, "Non-IPv6 prefix in routedIPv6AddressCount"); - } - int rank = 128 - prefix.getPrefixLength(); - routedIPCount = routedIPCount.add(BigInteger.ONE.shiftLeft(rank)); - } - return routedIPCount; - } - private static final int[] ADDRESS_FAMILIES = new int[] {AF_INET, AF_INET6}; /** diff --git a/tests/net/java/android/net/NetworkUtilsTest.java b/tests/net/java/android/net/NetworkUtilsTest.java deleted file mode 100644 index 7748288aeb..0000000000 --- a/tests/net/java/android/net/NetworkUtilsTest.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.net; - -import static junit.framework.Assert.assertEquals; - -import androidx.test.runner.AndroidJUnit4; - -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.math.BigInteger; -import java.util.TreeSet; - -@RunWith(AndroidJUnit4.class) -@androidx.test.filters.SmallTest -public class NetworkUtilsTest { - @Test - public void testRoutedIPv4AddressCount() { - final TreeSet set = new TreeSet<>(IpPrefix.lengthComparator()); - // No routes routes to no addresses. - assertEquals(0, NetworkUtils.routedIPv4AddressCount(set)); - - set.add(new IpPrefix("0.0.0.0/0")); - assertEquals(1l << 32, NetworkUtils.routedIPv4AddressCount(set)); - - set.add(new IpPrefix("20.18.0.0/16")); - set.add(new IpPrefix("20.18.0.0/24")); - set.add(new IpPrefix("20.18.0.0/8")); - // There is a default route, still covers everything - assertEquals(1l << 32, NetworkUtils.routedIPv4AddressCount(set)); - - set.clear(); - set.add(new IpPrefix("20.18.0.0/24")); - set.add(new IpPrefix("20.18.0.0/8")); - // The 8-length includes the 24-length prefix - assertEquals(1l << 24, NetworkUtils.routedIPv4AddressCount(set)); - - set.add(new IpPrefix("10.10.10.126/25")); - // The 8-length does not include this 25-length prefix - assertEquals((1l << 24) + (1 << 7), NetworkUtils.routedIPv4AddressCount(set)); - - set.clear(); - set.add(new IpPrefix("1.2.3.4/32")); - set.add(new IpPrefix("1.2.3.4/32")); - set.add(new IpPrefix("1.2.3.4/32")); - set.add(new IpPrefix("1.2.3.4/32")); - assertEquals(1l, NetworkUtils.routedIPv4AddressCount(set)); - - set.add(new IpPrefix("1.2.3.5/32")); - set.add(new IpPrefix("1.2.3.6/32")); - - set.add(new IpPrefix("1.2.3.7/32")); - set.add(new IpPrefix("1.2.3.8/32")); - set.add(new IpPrefix("1.2.3.9/32")); - set.add(new IpPrefix("1.2.3.0/32")); - assertEquals(7l, NetworkUtils.routedIPv4AddressCount(set)); - - // 1.2.3.4/30 eats 1.2.3.{4-7}/32 - set.add(new IpPrefix("1.2.3.4/30")); - set.add(new IpPrefix("6.2.3.4/28")); - set.add(new IpPrefix("120.2.3.4/16")); - assertEquals(7l - 4 + 4 + 16 + 65536, NetworkUtils.routedIPv4AddressCount(set)); - } - - @Test - public void testRoutedIPv6AddressCount() { - final TreeSet set = new TreeSet<>(IpPrefix.lengthComparator()); - // No routes routes to no addresses. - assertEquals(BigInteger.ZERO, NetworkUtils.routedIPv6AddressCount(set)); - - set.add(new IpPrefix("::/0")); - assertEquals(BigInteger.ONE.shiftLeft(128), NetworkUtils.routedIPv6AddressCount(set)); - - set.add(new IpPrefix("1234:622a::18/64")); - set.add(new IpPrefix("add4:f00:80:f7:1111::6adb/96")); - set.add(new IpPrefix("add4:f00:80:f7:1111::6adb/8")); - // There is a default route, still covers everything - assertEquals(BigInteger.ONE.shiftLeft(128), NetworkUtils.routedIPv6AddressCount(set)); - - set.clear(); - set.add(new IpPrefix("add4:f00:80:f7:1111::6adb/96")); - set.add(new IpPrefix("add4:f00:80:f7:1111::6adb/8")); - // The 8-length includes the 96-length prefix - assertEquals(BigInteger.ONE.shiftLeft(120), NetworkUtils.routedIPv6AddressCount(set)); - - set.add(new IpPrefix("10::26/64")); - // The 8-length does not include this 64-length prefix - assertEquals(BigInteger.ONE.shiftLeft(120).add(BigInteger.ONE.shiftLeft(64)), - NetworkUtils.routedIPv6AddressCount(set)); - - set.clear(); - set.add(new IpPrefix("add4:f00:80:f7:1111::6ad4/128")); - set.add(new IpPrefix("add4:f00:80:f7:1111::6ad4/128")); - set.add(new IpPrefix("add4:f00:80:f7:1111::6ad4/128")); - set.add(new IpPrefix("add4:f00:80:f7:1111::6ad4/128")); - assertEquals(BigInteger.ONE, NetworkUtils.routedIPv6AddressCount(set)); - - set.add(new IpPrefix("add4:f00:80:f7:1111::6ad5/128")); - set.add(new IpPrefix("add4:f00:80:f7:1111::6ad6/128")); - set.add(new IpPrefix("add4:f00:80:f7:1111::6ad7/128")); - set.add(new IpPrefix("add4:f00:80:f7:1111::6ad8/128")); - set.add(new IpPrefix("add4:f00:80:f7:1111::6ad9/128")); - set.add(new IpPrefix("add4:f00:80:f7:1111::6ad0/128")); - assertEquals(BigInteger.valueOf(7), NetworkUtils.routedIPv6AddressCount(set)); - - // add4:f00:80:f7:1111::6ad4/126 eats add4:f00:8[:f7:1111::6ad{4-7}/128 - set.add(new IpPrefix("add4:f00:80:f7:1111::6ad4/126")); - set.add(new IpPrefix("d00d:f00:80:f7:1111::6ade/124")); - set.add(new IpPrefix("f00b:a33::/112")); - assertEquals(BigInteger.valueOf(7l - 4 + 4 + 16 + 65536), - NetworkUtils.routedIPv6AddressCount(set)); - } -}