Only apply VPN isolation if it's fully routed
VPN is considered fully routed if both IPv4 and IPv6 have either a default route or a prohibit route. Bug: 145332510 Test: atest FrameworksNetTests Change-Id: I59cf48552bca98092d1212e3d718fd420add5458
This commit is contained in:
@@ -16,6 +16,8 @@
|
||||
|
||||
package android.net;
|
||||
|
||||
import static android.net.RouteInfo.RTN_UNREACHABLE;
|
||||
|
||||
import static com.android.testutils.ParcelUtilsKt.assertParcelSane;
|
||||
import static com.android.testutils.ParcelUtilsKt.assertParcelingIsLossless;
|
||||
import static com.android.testutils.ParcelUtilsKt.parcelingRoundTrip;
|
||||
@@ -46,6 +48,7 @@ import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import java.net.Inet4Address;
|
||||
import java.net.Inet6Address;
|
||||
import java.net.InetAddress;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
@@ -1257,4 +1260,26 @@ public class LinkPropertiesTest {
|
||||
final LinkProperties Ipv6 = makeIpv6LinkProperties();
|
||||
assertTrue(Ipv6.hasIpv6DnsServer());
|
||||
}
|
||||
|
||||
@Test @IgnoreUpTo(Build.VERSION_CODES.Q)
|
||||
public void testHasIpv4UnreachableDefaultRoute() {
|
||||
final LinkProperties lp = makeTestObject();
|
||||
assertFalse(lp.hasIpv4UnreachableDefaultRoute());
|
||||
assertFalse(lp.hasIpv6UnreachableDefaultRoute());
|
||||
|
||||
lp.addRoute(new RouteInfo(new IpPrefix(Inet4Address.ANY, 0), RTN_UNREACHABLE));
|
||||
assertTrue(lp.hasIpv4UnreachableDefaultRoute());
|
||||
assertFalse(lp.hasIpv6UnreachableDefaultRoute());
|
||||
}
|
||||
|
||||
@Test @IgnoreUpTo(Build.VERSION_CODES.Q)
|
||||
public void testHasIpv6UnreachableDefaultRoute() {
|
||||
final LinkProperties lp = makeTestObject();
|
||||
assertFalse(lp.hasIpv6UnreachableDefaultRoute());
|
||||
assertFalse(lp.hasIpv4UnreachableDefaultRoute());
|
||||
|
||||
lp.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), RTN_UNREACHABLE));
|
||||
assertTrue(lp.hasIpv6UnreachableDefaultRoute());
|
||||
assertFalse(lp.hasIpv4UnreachableDefaultRoute());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,6 +31,7 @@ import static org.junit.Assert.fail;
|
||||
|
||||
import android.os.Build;
|
||||
|
||||
import androidx.core.os.BuildCompat;
|
||||
import androidx.test.filters.SmallTest;
|
||||
import androidx.test.runner.AndroidJUnit4;
|
||||
|
||||
@@ -62,6 +63,11 @@ public class RouteInfoTest {
|
||||
return new IpPrefix(prefix);
|
||||
}
|
||||
|
||||
private static boolean isAtLeastR() {
|
||||
// BuildCompat.isAtLeastR is documented to return false on release SDKs (including R)
|
||||
return Build.VERSION.SDK_INT > Build.VERSION_CODES.Q || BuildCompat.isAtLeastR();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testConstructor() {
|
||||
RouteInfo r;
|
||||
@@ -195,78 +201,130 @@ public class RouteInfoTest {
|
||||
assertTrue(r.isDefaultRoute());
|
||||
assertTrue(r.isIPv4Default());
|
||||
assertFalse(r.isIPv6Default());
|
||||
if (isAtLeastR()) {
|
||||
assertFalse(r.isIPv4UnreachableDefault());
|
||||
assertFalse(r.isIPv6UnreachableDefault());
|
||||
}
|
||||
|
||||
r = new RouteInfo(Prefix("::/0"), Address("::"), "wlan0");
|
||||
assertFalse(r.isHostRoute());
|
||||
assertTrue(r.isDefaultRoute());
|
||||
assertFalse(r.isIPv4Default());
|
||||
assertTrue(r.isIPv6Default());
|
||||
if (isAtLeastR()) {
|
||||
assertFalse(r.isIPv4UnreachableDefault());
|
||||
assertFalse(r.isIPv6UnreachableDefault());
|
||||
}
|
||||
|
||||
r = new RouteInfo(Prefix("192.0.2.0/24"), null, "wlan0");
|
||||
assertFalse(r.isHostRoute());
|
||||
assertFalse(r.isDefaultRoute());
|
||||
assertFalse(r.isIPv4Default());
|
||||
assertFalse(r.isIPv6Default());
|
||||
if (isAtLeastR()) {
|
||||
assertFalse(r.isIPv4UnreachableDefault());
|
||||
assertFalse(r.isIPv6UnreachableDefault());
|
||||
}
|
||||
|
||||
r = new RouteInfo(Prefix("2001:db8::/48"), null, "wlan0");
|
||||
assertFalse(r.isHostRoute());
|
||||
assertFalse(r.isDefaultRoute());
|
||||
assertFalse(r.isIPv4Default());
|
||||
assertFalse(r.isIPv6Default());
|
||||
if (isAtLeastR()) {
|
||||
assertFalse(r.isIPv4UnreachableDefault());
|
||||
assertFalse(r.isIPv6UnreachableDefault());
|
||||
}
|
||||
|
||||
r = new RouteInfo(Prefix("192.0.2.0/32"), Address("0.0.0.0"), "wlan0");
|
||||
assertTrue(r.isHostRoute());
|
||||
assertFalse(r.isDefaultRoute());
|
||||
assertFalse(r.isIPv4Default());
|
||||
assertFalse(r.isIPv6Default());
|
||||
if (isAtLeastR()) {
|
||||
assertFalse(r.isIPv4UnreachableDefault());
|
||||
assertFalse(r.isIPv6UnreachableDefault());
|
||||
}
|
||||
|
||||
r = new RouteInfo(Prefix("2001:db8::/128"), Address("::"), "wlan0");
|
||||
assertTrue(r.isHostRoute());
|
||||
assertFalse(r.isDefaultRoute());
|
||||
assertFalse(r.isIPv4Default());
|
||||
assertFalse(r.isIPv6Default());
|
||||
if (isAtLeastR()) {
|
||||
assertFalse(r.isIPv4UnreachableDefault());
|
||||
assertFalse(r.isIPv6UnreachableDefault());
|
||||
}
|
||||
|
||||
r = new RouteInfo(Prefix("192.0.2.0/32"), null, "wlan0");
|
||||
assertTrue(r.isHostRoute());
|
||||
assertFalse(r.isDefaultRoute());
|
||||
assertFalse(r.isIPv4Default());
|
||||
assertFalse(r.isIPv6Default());
|
||||
if (isAtLeastR()) {
|
||||
assertFalse(r.isIPv4UnreachableDefault());
|
||||
assertFalse(r.isIPv6UnreachableDefault());
|
||||
}
|
||||
|
||||
r = new RouteInfo(Prefix("2001:db8::/128"), null, "wlan0");
|
||||
assertTrue(r.isHostRoute());
|
||||
assertFalse(r.isDefaultRoute());
|
||||
assertFalse(r.isIPv4Default());
|
||||
assertFalse(r.isIPv6Default());
|
||||
if (isAtLeastR()) {
|
||||
assertFalse(r.isIPv4UnreachableDefault());
|
||||
assertFalse(r.isIPv6UnreachableDefault());
|
||||
}
|
||||
|
||||
r = new RouteInfo(Prefix("::/128"), Address("fe80::"), "wlan0");
|
||||
assertTrue(r.isHostRoute());
|
||||
assertFalse(r.isDefaultRoute());
|
||||
assertFalse(r.isIPv4Default());
|
||||
assertFalse(r.isIPv6Default());
|
||||
if (isAtLeastR()) {
|
||||
assertFalse(r.isIPv4UnreachableDefault());
|
||||
assertFalse(r.isIPv6UnreachableDefault());
|
||||
}
|
||||
|
||||
r = new RouteInfo(Prefix("0.0.0.0/32"), Address("192.0.2.1"), "wlan0");
|
||||
assertTrue(r.isHostRoute());
|
||||
assertFalse(r.isDefaultRoute());
|
||||
assertFalse(r.isIPv4Default());
|
||||
assertFalse(r.isIPv6Default());
|
||||
if (isAtLeastR()) {
|
||||
assertFalse(r.isIPv4UnreachableDefault());
|
||||
assertFalse(r.isIPv6UnreachableDefault());
|
||||
}
|
||||
|
||||
r = new RouteInfo(Prefix("0.0.0.0/32"), Address("192.0.2.1"), "wlan0");
|
||||
assertTrue(r.isHostRoute());
|
||||
assertFalse(r.isDefaultRoute());
|
||||
assertFalse(r.isIPv4Default());
|
||||
assertFalse(r.isIPv6Default());
|
||||
if (isAtLeastR()) {
|
||||
assertFalse(r.isIPv4UnreachableDefault());
|
||||
assertFalse(r.isIPv6UnreachableDefault());
|
||||
}
|
||||
|
||||
r = new RouteInfo(new IpPrefix(Inet4Address.ANY, 0), RTN_UNREACHABLE);
|
||||
assertFalse(r.isHostRoute());
|
||||
assertFalse(r.isDefaultRoute());
|
||||
assertFalse(r.isIPv4Default());
|
||||
assertFalse(r.isIPv6Default());
|
||||
if (isAtLeastR()) {
|
||||
assertTrue(r.isIPv4UnreachableDefault());
|
||||
assertFalse(r.isIPv6UnreachableDefault());
|
||||
}
|
||||
|
||||
r = new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), RTN_UNREACHABLE);
|
||||
assertFalse(r.isHostRoute());
|
||||
assertFalse(r.isDefaultRoute());
|
||||
assertFalse(r.isIPv4Default());
|
||||
assertFalse(r.isIPv6Default());
|
||||
if (isAtLeastR()) {
|
||||
assertFalse(r.isIPv4UnreachableDefault());
|
||||
assertTrue(r.isIPv6UnreachableDefault());
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
Reference in New Issue
Block a user