diff --git a/framework/src/android/net/LinkProperties.java b/framework/src/android/net/LinkProperties.java index a8f707ebba..76ca0613e5 100644 --- a/framework/src/android/net/LinkProperties.java +++ b/framework/src/android/net/LinkProperties.java @@ -29,6 +29,8 @@ import android.os.Parcelable; import android.text.TextUtils; import com.android.internal.annotations.VisibleForTesting; +import com.android.modules.utils.build.SdkLevel; +import com.android.net.module.util.CollectionUtils; import com.android.net.module.util.LinkPropertiesUtils; import java.net.Inet4Address; @@ -42,7 +44,6 @@ import java.util.Hashtable; import java.util.List; import java.util.Objects; import java.util.StringJoiner; -import java.util.stream.Collectors; /** * Describes the properties of a network link. @@ -759,20 +760,25 @@ public final class LinkProperties implements Parcelable { * @return An unmodifiable {@link List} of {@link RouteInfo} for this link. */ public @NonNull List getRoutes() { - if (CompatChanges.isChangeEnabled(EXCLUDED_ROUTES)) { + // Before T, there's no throw routes because VpnService is not updatable, so no need to + // filter them out. + if (CompatChanges.isChangeEnabled(EXCLUDED_ROUTES) || !SdkLevel.isAtLeastT()) { return Collections.unmodifiableList(mRoutes); } else { - return Collections.unmodifiableList(getUnicastRoutes()); + // Apps that added a throw route themselves (not obtaining LinkProperties from the + // system) will not see it in getRoutes on T+ if they do not have the compat change + // enabled (target SDK < T); but this is expected to be rare and typically only affect + // tests creating LinkProperties themselves (like CTS v12, which is only running on S). + return Collections.unmodifiableList(getNonThrowRoutes()); } } /** - * Returns all the {@link RouteInfo} of type {@link RouteInfo#RTN_UNICAST} set on this link. + * Returns all the {@link RouteInfo} that are not of type {@link RouteInfo#RTN_THROW} set on + * this link. */ - private @NonNull List getUnicastRoutes() { - return mRoutes.stream() - .filter(route -> route.getType() == RouteInfo.RTN_UNICAST) - .collect(Collectors.toList()); + private @NonNull List getNonThrowRoutes() { + return CollectionUtils.filter(mRoutes, route -> route.getType() != RouteInfo.RTN_THROW); } /** diff --git a/tests/common/java/android/net/LinkPropertiesTest.java b/tests/common/java/android/net/LinkPropertiesTest.java index 9ed2bb3b86..319dbf420c 100644 --- a/tests/common/java/android/net/LinkPropertiesTest.java +++ b/tests/common/java/android/net/LinkPropertiesTest.java @@ -1312,7 +1312,26 @@ public class LinkPropertiesTest { assertEquals(3, lp.getRoutes().size()); } - @Test @IgnoreUpTo(Build.VERSION_CODES.R) + @Test @IgnoreUpTo(Build.VERSION_CODES.R) @IgnoreAfter(Build.VERSION_CODES.S_V2) + @CtsNetTestCasesMaxTargetSdk31(reason = "Compat change cannot be overridden when targeting T+") + @DisableCompatChanges({LinkProperties.EXCLUDED_ROUTES}) + public void testExcludedRoutesDisabled_S() { + final LinkProperties lp = new LinkProperties(); + assertEquals(0, lp.getRoutes().size()); + + lp.addRoute(new RouteInfo(new IpPrefix(ADDRV4, 0), RTN_UNREACHABLE)); + assertEquals(1, lp.getRoutes().size()); + + lp.addRoute(new RouteInfo(new IpPrefix(ADDRV6, 5), RTN_THROW)); + // RTN_THROW routes are visible on S when added by the caller (but they are not added by + // the system). This is uncommon usage but was tested by CTSv12. + assertEquals(2, lp.getRoutes().size()); + + lp.addRoute(new RouteInfo(new IpPrefix(ADDRV6, 2), RTN_UNICAST)); + assertEquals(3, lp.getRoutes().size()); + } + + @Test @IgnoreUpTo(Build.VERSION_CODES.S_V2) @CtsNetTestCasesMaxTargetSdk31(reason = "Compat change cannot be overridden when targeting T+") @DisableCompatChanges({LinkProperties.EXCLUDED_ROUTES}) public void testExcludedRoutesDisabled() { @@ -1320,12 +1339,12 @@ public class LinkPropertiesTest { assertEquals(0, lp.getRoutes().size()); lp.addRoute(new RouteInfo(new IpPrefix(ADDRV4, 0), RTN_UNREACHABLE)); - assertEquals(0, lp.getRoutes().size()); + assertEquals(1, lp.getRoutes().size()); lp.addRoute(new RouteInfo(new IpPrefix(ADDRV6, 5), RTN_THROW)); - assertEquals(0, lp.getRoutes().size()); + assertEquals(1, lp.getRoutes().size()); lp.addRoute(new RouteInfo(new IpPrefix(ADDRV6, 2), RTN_UNICAST)); - assertEquals(1, lp.getRoutes().size()); + assertEquals(2, lp.getRoutes().size()); } }