Merge "Test updating underlying network of IpSecTunnelInterface" into sc-dev

This commit is contained in:
Yan Yan
2021-06-24 01:05:26 +00:00
committed by Android (Google) Code Review

View File

@@ -43,6 +43,7 @@ import android.content.Context;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.IpSecAlgorithm; import android.net.IpSecAlgorithm;
import android.net.IpSecManager; import android.net.IpSecManager;
import android.net.IpSecManager.IpSecTunnelInterface;
import android.net.IpSecTransform; import android.net.IpSecTransform;
import android.net.LinkAddress; import android.net.LinkAddress;
import android.net.Network; import android.net.Network;
@@ -50,25 +51,33 @@ import android.net.TestNetworkInterface;
import android.net.TestNetworkManager; import android.net.TestNetworkManager;
import android.net.cts.PacketUtils.Payload; import android.net.cts.PacketUtils.Payload;
import android.net.cts.util.CtsNetUtils; import android.net.cts.util.CtsNetUtils;
import android.os.Build;
import android.os.ParcelFileDescriptor; import android.os.ParcelFileDescriptor;
import android.platform.test.annotations.AppModeFull; import android.platform.test.annotations.AppModeFull;
import androidx.test.InstrumentationRegistry; import androidx.test.InstrumentationRegistry;
import androidx.test.runner.AndroidJUnit4; import androidx.test.runner.AndroidJUnit4;
import java.net.Inet6Address; import com.android.testutils.DevSdkIgnoreRule;
import java.net.InetAddress; import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo;
import java.net.NetworkInterface;
import org.junit.AfterClass; import org.junit.AfterClass;
import org.junit.Before; import org.junit.Before;
import org.junit.BeforeClass; import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
@RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class)
@AppModeFull(reason = "MANAGE_TEST_NETWORKS permission can't be granted to instant apps") @AppModeFull(reason = "MANAGE_TEST_NETWORKS permission can't be granted to instant apps")
public class IpSecManagerTunnelTest extends IpSecBaseTest { public class IpSecManagerTunnelTest extends IpSecBaseTest {
@Rule public final DevSdkIgnoreRule ignoreRule = new DevSdkIgnoreRule();
private static final String TAG = IpSecManagerTunnelTest.class.getSimpleName(); private static final String TAG = IpSecManagerTunnelTest.class.getSimpleName();
private static final InetAddress LOCAL_OUTER_4 = InetAddress.parseNumericAddress("192.0.2.1"); private static final InetAddress LOCAL_OUTER_4 = InetAddress.parseNumericAddress("192.0.2.1");
@@ -78,6 +87,15 @@ public class IpSecManagerTunnelTest extends IpSecBaseTest {
private static final InetAddress REMOTE_OUTER_6 = private static final InetAddress REMOTE_OUTER_6 =
InetAddress.parseNumericAddress("2001:db8:1::2"); InetAddress.parseNumericAddress("2001:db8:1::2");
private static final InetAddress LOCAL_OUTER_4_NEW =
InetAddress.parseNumericAddress("192.0.2.101");
private static final InetAddress REMOTE_OUTER_4_NEW =
InetAddress.parseNumericAddress("192.0.2.102");
private static final InetAddress LOCAL_OUTER_6_NEW =
InetAddress.parseNumericAddress("2001:db8:1::101");
private static final InetAddress REMOTE_OUTER_6_NEW =
InetAddress.parseNumericAddress("2001:db8:1::102");
private static final InetAddress LOCAL_INNER_4 = private static final InetAddress LOCAL_INNER_4 =
InetAddress.parseNumericAddress("198.51.100.1"); InetAddress.parseNumericAddress("198.51.100.1");
private static final InetAddress REMOTE_INNER_4 = private static final InetAddress REMOTE_INNER_4 =
@@ -95,10 +113,9 @@ public class IpSecManagerTunnelTest extends IpSecBaseTest {
// Static state to reduce setup/teardown // Static state to reduce setup/teardown
private static ConnectivityManager sCM; private static ConnectivityManager sCM;
private static TestNetworkManager sTNM; private static TestNetworkManager sTNM;
private static ParcelFileDescriptor sTunFd;
private static TestNetworkCallback sTunNetworkCallback; private static TunNetworkWrapper sTunWrapper;
private static Network sTunNetwork; private static TunNetworkWrapper sTunWrapperNew;
private static TunUtils sTunUtils;
private static Context sContext = InstrumentationRegistry.getContext(); private static Context sContext = InstrumentationRegistry.getContext();
private static final CtsNetUtils mCtsNetUtils = new CtsNetUtils(sContext); private static final CtsNetUtils mCtsNetUtils = new CtsNetUtils(sContext);
@@ -116,19 +133,8 @@ public class IpSecManagerTunnelTest extends IpSecBaseTest {
// right appop permissions. // right appop permissions.
mCtsNetUtils.setAppopPrivileged(OP_MANAGE_IPSEC_TUNNELS, true); mCtsNetUtils.setAppopPrivileged(OP_MANAGE_IPSEC_TUNNELS, true);
TestNetworkInterface testIface = sTunWrapper = new TunNetworkWrapper(LOCAL_OUTER_4, LOCAL_OUTER_6);
sTNM.createTunInterface( sTunWrapperNew = new TunNetworkWrapper(LOCAL_OUTER_4_NEW, LOCAL_OUTER_6_NEW);
new LinkAddress[] {
new LinkAddress(LOCAL_OUTER_4, IP4_PREFIX_LEN),
new LinkAddress(LOCAL_OUTER_6, IP6_PREFIX_LEN)
});
sTunFd = testIface.getFileDescriptor();
sTunNetworkCallback = mCtsNetUtils.setupAndGetTestNetwork(testIface.getInterfaceName());
sTunNetworkCallback.waitForAvailable();
sTunNetwork = sTunNetworkCallback.currentNetwork;
sTunUtils = new TunUtils(sTunFd);
} }
@Before @Before
@@ -139,24 +145,76 @@ public class IpSecManagerTunnelTest extends IpSecBaseTest {
// Set to true before every run; some tests flip this. // Set to true before every run; some tests flip this.
mCtsNetUtils.setAppopPrivileged(OP_MANAGE_IPSEC_TUNNELS, true); mCtsNetUtils.setAppopPrivileged(OP_MANAGE_IPSEC_TUNNELS, true);
// Clear sTunUtils state // Clear TunUtils state
sTunUtils.reset(); sTunWrapper.utils.reset();
sTunWrapperNew.utils.reset();
}
private static void tearDownTunWrapperIfNotNull(TunNetworkWrapper tunWrapper) throws Exception {
if (tunWrapper != null) {
tunWrapper.tearDown();
}
} }
@AfterClass @AfterClass
public static void tearDownAfterClass() throws Exception { public static void tearDownAfterClass() throws Exception {
mCtsNetUtils.setAppopPrivileged(OP_MANAGE_IPSEC_TUNNELS, false); mCtsNetUtils.setAppopPrivileged(OP_MANAGE_IPSEC_TUNNELS, false);
sCM.unregisterNetworkCallback(sTunNetworkCallback); tearDownTunWrapperIfNotNull(sTunWrapper);
tearDownTunWrapperIfNotNull(sTunWrapperNew);
sTNM.teardownTestNetwork(sTunNetwork);
sTunFd.close();
InstrumentationRegistry.getInstrumentation() InstrumentationRegistry.getInstrumentation()
.getUiAutomation() .getUiAutomation()
.dropShellPermissionIdentity(); .dropShellPermissionIdentity();
} }
private static class TunNetworkWrapper {
public final ParcelFileDescriptor fd;
public final TestNetworkCallback networkCallback;
public final Network network;
public final TunUtils utils;
TunNetworkWrapper(InetAddress... addresses) throws Exception {
final LinkAddress[] linkAddresses = new LinkAddress[addresses.length];
for (int i = 0; i < linkAddresses.length; i++) {
InetAddress addr = addresses[i];
if (addr instanceof Inet4Address) {
linkAddresses[i] = new LinkAddress(addr, IP4_PREFIX_LEN);
} else {
linkAddresses[i] = new LinkAddress(addr, IP6_PREFIX_LEN);
}
}
try {
final TestNetworkInterface testIface = sTNM.createTunInterface(linkAddresses);
fd = testIface.getFileDescriptor();
networkCallback = mCtsNetUtils.setupAndGetTestNetwork(testIface.getInterfaceName());
networkCallback.waitForAvailable();
network = networkCallback.currentNetwork;
} catch (Exception e) {
tearDown();
throw e;
}
utils = new TunUtils(fd);
}
public void tearDown() throws Exception {
if (networkCallback != null) {
sCM.unregisterNetworkCallback(networkCallback);
}
if (network != null) {
sTNM.teardownTestNetwork(network);
}
if (fd != null) {
fd.close();
}
}
}
@Test @Test
public void testSecurityExceptionCreateTunnelInterfaceWithoutAppop() throws Exception { public void testSecurityExceptionCreateTunnelInterfaceWithoutAppop() throws Exception {
assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature()); assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
@@ -166,7 +224,7 @@ public class IpSecManagerTunnelTest extends IpSecBaseTest {
// Security exceptions are thrown regardless of IPv4/IPv6. Just test one // Security exceptions are thrown regardless of IPv4/IPv6. Just test one
try { try {
mISM.createIpSecTunnelInterface(LOCAL_INNER_6, REMOTE_INNER_6, sTunNetwork); mISM.createIpSecTunnelInterface(LOCAL_INNER_6, REMOTE_INNER_6, sTunWrapper.network);
fail("Did not throw SecurityException for Tunnel creation without appop"); fail("Did not throw SecurityException for Tunnel creation without appop");
} catch (SecurityException expected) { } catch (SecurityException expected) {
} }
@@ -196,11 +254,16 @@ public class IpSecManagerTunnelTest extends IpSecBaseTest {
* Runs the test code, and returns the inner socket port, if any. * Runs the test code, and returns the inner socket port, if any.
* *
* @param ipsecNetwork The IPsec Interface based Network for binding sockets on * @param ipsecNetwork The IPsec Interface based Network for binding sockets on
* @param tunnelIface The IPsec tunnel interface that will be tested
* @param underlyingTunUtils The utility of the IPsec tunnel interface's underlying TUN
* network
* @return the integer port of the inner socket if outbound, or 0 if inbound * @return the integer port of the inner socket if outbound, or 0 if inbound
* IpSecTunnelTestRunnable * IpSecTunnelTestRunnable
* @throws Exception if any part of the test failed. * @throws Exception if any part of the test failed.
*/ */
public abstract int run(Network ipsecNetwork) throws Exception; public abstract int run(
Network ipsecNetwork, IpSecTunnelInterface tunnelIface, TunUtils underlyingTunUtils)
throws Exception;
} }
private int getPacketSize( private int getPacketSize(
@@ -265,7 +328,9 @@ public class IpSecManagerTunnelTest extends IpSecBaseTest {
int expectedPacketSize) { int expectedPacketSize) {
return new IpSecTunnelTestRunnable() { return new IpSecTunnelTestRunnable() {
@Override @Override
public int run(Network ipsecNetwork) throws Exception { public int run(
Network ipsecNetwork, IpSecTunnelInterface tunnelIface, TunUtils tunUtils)
throws Exception {
// Build a socket and send traffic // Build a socket and send traffic
JavaUdpSocket socket = new JavaUdpSocket(localInner); JavaUdpSocket socket = new JavaUdpSocket(localInner);
ipsecNetwork.bindSocket(socket.mSocket); ipsecNetwork.bindSocket(socket.mSocket);
@@ -284,7 +349,7 @@ public class IpSecManagerTunnelTest extends IpSecBaseTest {
// Verify that an encrypted packet is sent. As of right now, checking encrypted // Verify that an encrypted packet is sent. As of right now, checking encrypted
// body is not possible, due to the test not knowing some of the fields of the // body is not possible, due to the test not knowing some of the fields of the
// inner IP header (flow label, flags, etc) // inner IP header (flow label, flags, etc)
sTunUtils.awaitEspPacketNoPlaintext( tunUtils.awaitEspPacketNoPlaintext(
spi, TEST_DATA, encapPort != 0, expectedPacketSize); spi, TEST_DATA, encapPort != 0, expectedPacketSize);
socket.close(); socket.close();
@@ -312,7 +377,9 @@ public class IpSecManagerTunnelTest extends IpSecBaseTest {
throws Exception { throws Exception {
return new IpSecTunnelTestRunnable() { return new IpSecTunnelTestRunnable() {
@Override @Override
public int run(Network ipsecNetwork) throws Exception { public int run(
Network ipsecNetwork, IpSecTunnelInterface tunnelIface, TunUtils tunUtils)
throws Exception {
// Build a socket and receive traffic // Build a socket and receive traffic
JavaUdpSocket socket = new JavaUdpSocket(localInner, innerSocketPort); JavaUdpSocket socket = new JavaUdpSocket(localInner, innerSocketPort);
ipsecNetwork.bindSocket(socket.mSocket); ipsecNetwork.bindSocket(socket.mSocket);
@@ -325,7 +392,7 @@ public class IpSecManagerTunnelTest extends IpSecBaseTest {
socket.mSocket, IpSecManager.DIRECTION_OUT, inTransportTransform); socket.mSocket, IpSecManager.DIRECTION_OUT, inTransportTransform);
} }
sTunUtils.reflectPackets(); tunUtils.reflectPackets();
// Receive packet from socket, and validate that the payload is correct // Receive packet from socket, and validate that the payload is correct
receiveAndValidatePacket(socket); receiveAndValidatePacket(socket);
@@ -355,7 +422,9 @@ public class IpSecManagerTunnelTest extends IpSecBaseTest {
throws Exception { throws Exception {
return new IpSecTunnelTestRunnable() { return new IpSecTunnelTestRunnable() {
@Override @Override
public int run(Network ipsecNetwork) throws Exception { public int run(
Network ipsecNetwork, IpSecTunnelInterface tunnelIface, TunUtils tunUtils)
throws Exception {
// Build a socket and receive traffic // Build a socket and receive traffic
JavaUdpSocket socket = new JavaUdpSocket(localInner); JavaUdpSocket socket = new JavaUdpSocket(localInner);
ipsecNetwork.bindSocket(socket.mSocket); ipsecNetwork.bindSocket(socket.mSocket);
@@ -391,7 +460,7 @@ public class IpSecManagerTunnelTest extends IpSecBaseTest {
socket.getPort(), socket.getPort(),
encapPort); encapPort);
} }
sTunUtils.injectPacket(pkt); tunUtils.injectPacket(pkt);
// Receive packet from socket, and validate // Receive packet from socket, and validate
receiveAndValidatePacket(socket); receiveAndValidatePacket(socket);
@@ -404,6 +473,161 @@ public class IpSecManagerTunnelTest extends IpSecBaseTest {
} }
} }
private class MigrateIpSecTunnelTestRunnableFactory implements IpSecTunnelTestRunnableFactory {
private final IpSecTunnelTestRunnableFactory mTestRunnableFactory;
MigrateIpSecTunnelTestRunnableFactory(boolean isOutputTest) {
if (isOutputTest) {
mTestRunnableFactory = new OutputIpSecTunnelTestRunnableFactory();
} else {
mTestRunnableFactory = new InputPacketGeneratorIpSecTunnelTestRunnableFactory();
}
}
@Override
public IpSecTunnelTestRunnable getIpSecTunnelTestRunnable(
boolean transportInTunnelMode,
int spi,
InetAddress localInner,
InetAddress remoteInner,
InetAddress localOuter,
InetAddress remoteOuter,
IpSecTransform inTransportTransform,
IpSecTransform outTransportTransform,
int encapPort,
int unusedInnerSocketPort,
int expectedPacketSize) {
return new IpSecTunnelTestRunnable() {
@Override
public int run(
Network ipsecNetwork, IpSecTunnelInterface tunnelIface, TunUtils tunUtils)
throws Exception {
mTestRunnableFactory
.getIpSecTunnelTestRunnable(
transportInTunnelMode,
spi,
localInner,
remoteInner,
localOuter,
remoteOuter,
inTransportTransform,
outTransportTransform,
encapPort,
unusedInnerSocketPort,
expectedPacketSize)
.run(ipsecNetwork, tunnelIface, sTunWrapper.utils);
tunnelIface.setUnderlyingNetwork(sTunWrapperNew.network);
// Verify migrating to IPv4 and IPv6 addresses. It ensures that not only
// can IPsec tunnel migrate across interfaces, IPsec tunnel can also migrate to
// a different address on the same interface.
checkMigratedTunnel(
localInner,
remoteInner,
LOCAL_OUTER_4_NEW,
REMOTE_OUTER_4_NEW,
encapPort != 0,
transportInTunnelMode,
sTunWrapperNew.utils,
tunnelIface,
ipsecNetwork);
checkMigratedTunnel(
localInner,
remoteInner,
LOCAL_OUTER_6_NEW,
REMOTE_OUTER_6_NEW,
false, // IPv6 does not support UDP encapsulation
transportInTunnelMode,
sTunWrapperNew.utils,
tunnelIface,
ipsecNetwork);
return 0;
}
};
}
private void checkMigratedTunnel(
InetAddress localInner,
InetAddress remoteInner,
InetAddress localOuter,
InetAddress remoteOuter,
boolean useEncap,
boolean transportInTunnelMode,
TunUtils tunUtils,
IpSecTunnelInterface tunnelIface,
Network ipsecNetwork)
throws Exception {
// Preselect both SPI and encap port, to be used for both inbound and outbound tunnels.
// Re-uses the same SPI to ensure that even in cases of symmetric SPIs shared across
// tunnel and transport mode, packets are encrypted/decrypted properly based on the
// src/dst.
int spi = getRandomSpi(localOuter, remoteOuter);
int innerFamily = localInner instanceof Inet4Address ? AF_INET : AF_INET6;
int outerFamily = localOuter instanceof Inet4Address ? AF_INET : AF_INET6;
int expectedPacketSize =
getPacketSize(innerFamily, outerFamily, useEncap, transportInTunnelMode);
// Build transport mode transforms and encapsulation socket for verifying
// transport-in-tunnel case and encapsulation case.
try (IpSecManager.SecurityParameterIndex inTransportSpi =
mISM.allocateSecurityParameterIndex(localInner, spi);
IpSecManager.SecurityParameterIndex outTransportSpi =
mISM.allocateSecurityParameterIndex(remoteInner, spi);
IpSecTransform inTransportTransform =
buildIpSecTransform(sContext, inTransportSpi, null, remoteInner);
IpSecTransform outTransportTransform =
buildIpSecTransform(sContext, outTransportSpi, null, localInner);
UdpEncapsulationSocket encapSocket = mISM.openUdpEncapsulationSocket()) {
// Configure tunnel mode Transform parameters
IpSecTransform.Builder transformBuilder = new IpSecTransform.Builder(sContext);
transformBuilder.setEncryption(
new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY));
transformBuilder.setAuthentication(
new IpSecAlgorithm(
IpSecAlgorithm.AUTH_HMAC_SHA256, AUTH_KEY, AUTH_KEY.length * 4));
if (useEncap) {
transformBuilder.setIpv4Encapsulation(encapSocket, encapSocket.getPort());
}
// Apply transform and check that traffic is properly encrypted
try (IpSecManager.SecurityParameterIndex inSpi =
mISM.allocateSecurityParameterIndex(localOuter, spi);
IpSecManager.SecurityParameterIndex outSpi =
mISM.allocateSecurityParameterIndex(remoteOuter, spi);
IpSecTransform inTransform =
transformBuilder.buildTunnelModeTransform(remoteOuter, inSpi);
IpSecTransform outTransform =
transformBuilder.buildTunnelModeTransform(localOuter, outSpi)) {
mISM.applyTunnelModeTransform(
tunnelIface, IpSecManager.DIRECTION_IN, inTransform);
mISM.applyTunnelModeTransform(
tunnelIface, IpSecManager.DIRECTION_OUT, outTransform);
mTestRunnableFactory
.getIpSecTunnelTestRunnable(
transportInTunnelMode,
spi,
localInner,
remoteInner,
localOuter,
remoteOuter,
inTransportTransform,
outTransportTransform,
useEncap ? encapSocket.getPort() : 0,
0,
expectedPacketSize)
.run(ipsecNetwork, tunnelIface, tunUtils);
}
}
}
}
private void checkTunnelOutput( private void checkTunnelOutput(
int innerFamily, int outerFamily, boolean useEncap, boolean transportInTunnelMode) int innerFamily, int outerFamily, boolean useEncap, boolean transportInTunnelMode)
throws Exception { throws Exception {
@@ -426,6 +650,28 @@ public class IpSecManagerTunnelTest extends IpSecBaseTest {
new InputPacketGeneratorIpSecTunnelTestRunnableFactory()); new InputPacketGeneratorIpSecTunnelTestRunnableFactory());
} }
private void checkMigrateTunnelOutput(
int innerFamily, int outerFamily, boolean useEncap, boolean transportInTunnelMode)
throws Exception {
checkTunnel(
innerFamily,
outerFamily,
useEncap,
transportInTunnelMode,
new MigrateIpSecTunnelTestRunnableFactory(true));
}
private void checkMigrateTunnelInput(
int innerFamily, int outerFamily, boolean useEncap, boolean transportInTunnelMode)
throws Exception {
checkTunnel(
innerFamily,
outerFamily,
useEncap,
transportInTunnelMode,
new MigrateIpSecTunnelTestRunnableFactory(false));
}
/** /**
* Validates that the kernel can talk to itself. * Validates that the kernel can talk to itself.
* *
@@ -579,7 +825,8 @@ public class IpSecManagerTunnelTest extends IpSecBaseTest {
IpSecManager.SecurityParameterIndex outSpi = IpSecManager.SecurityParameterIndex outSpi =
mISM.allocateSecurityParameterIndex(remoteOuter, spi); mISM.allocateSecurityParameterIndex(remoteOuter, spi);
IpSecManager.IpSecTunnelInterface tunnelIface = IpSecManager.IpSecTunnelInterface tunnelIface =
mISM.createIpSecTunnelInterface(localOuter, remoteOuter, sTunNetwork)) { mISM.createIpSecTunnelInterface(
localOuter, remoteOuter, sTunWrapper.network)) {
// Build the test network // Build the test network
tunnelIface.addAddress(localInner, innerPrefixLen); tunnelIface.addAddress(localInner, innerPrefixLen);
testNetworkCb = mCtsNetUtils.setupAndGetTestNetwork(tunnelIface.getInterfaceName()); testNetworkCb = mCtsNetUtils.setupAndGetTestNetwork(tunnelIface.getInterfaceName());
@@ -615,7 +862,7 @@ public class IpSecManagerTunnelTest extends IpSecBaseTest {
mISM.applyTunnelModeTransform( mISM.applyTunnelModeTransform(
tunnelIface, IpSecManager.DIRECTION_OUT, outTransform); tunnelIface, IpSecManager.DIRECTION_OUT, outTransform);
innerSocketPort = test.run(testNetwork); innerSocketPort = test.run(testNetwork, tunnelIface, sTunWrapper.utils);
} }
// Teardown the test network // Teardown the test network
@@ -739,6 +986,14 @@ public class IpSecManagerTunnelTest extends IpSecBaseTest {
return maybeEncapPacket(srcOuter, dstOuter, encapPort, espPayload).getPacketBytes(); return maybeEncapPacket(srcOuter, dstOuter, encapPort, espPayload).getPacketBytes();
} }
private void doTestMigrateTunnel(
int innerFamily, int outerFamily, boolean useEncap, boolean transportInTunnelMode)
throws Exception {
assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
checkTunnelOutput(innerFamily, outerFamily, useEncap, transportInTunnelMode);
checkTunnelInput(innerFamily, outerFamily, useEncap, transportInTunnelMode);
}
// Transport-in-Tunnel mode tests // Transport-in-Tunnel mode tests
@Test @Test
public void testTransportInTunnelModeV4InV4() throws Exception { public void testTransportInTunnelModeV4InV4() throws Exception {
@@ -747,6 +1002,12 @@ public class IpSecManagerTunnelTest extends IpSecBaseTest {
checkTunnelInput(AF_INET, AF_INET, false, true); checkTunnelInput(AF_INET, AF_INET, false, true);
} }
@IgnoreUpTo(Build.VERSION_CODES.R)
@Test
public void testMigrateTransportInTunnelModeV4InV4() throws Exception {
doTestMigrateTunnel(AF_INET, AF_INET, false, true);
}
@Test @Test
public void testTransportInTunnelModeV4InV4Reflected() throws Exception { public void testTransportInTunnelModeV4InV4Reflected() throws Exception {
assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature()); assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
@@ -760,6 +1021,12 @@ public class IpSecManagerTunnelTest extends IpSecBaseTest {
checkTunnelInput(AF_INET, AF_INET, true, true); checkTunnelInput(AF_INET, AF_INET, true, true);
} }
@IgnoreUpTo(Build.VERSION_CODES.R)
@Test
public void testMigrateTransportInTunnelModeV4InV4UdpEncap() throws Exception {
doTestMigrateTunnel(AF_INET, AF_INET, true, true);
}
@Test @Test
public void testTransportInTunnelModeV4InV4UdpEncapReflected() throws Exception { public void testTransportInTunnelModeV4InV4UdpEncapReflected() throws Exception {
assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature()); assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
@@ -773,6 +1040,12 @@ public class IpSecManagerTunnelTest extends IpSecBaseTest {
checkTunnelInput(AF_INET, AF_INET6, false, true); checkTunnelInput(AF_INET, AF_INET6, false, true);
} }
@IgnoreUpTo(Build.VERSION_CODES.R)
@Test
public void testMigrateTransportInTunnelModeV4InV6() throws Exception {
doTestMigrateTunnel(AF_INET, AF_INET6, false, true);
}
@Test @Test
public void testTransportInTunnelModeV4InV6Reflected() throws Exception { public void testTransportInTunnelModeV4InV6Reflected() throws Exception {
assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature()); assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
@@ -786,6 +1059,12 @@ public class IpSecManagerTunnelTest extends IpSecBaseTest {
checkTunnelInput(AF_INET6, AF_INET, false, true); checkTunnelInput(AF_INET6, AF_INET, false, true);
} }
@IgnoreUpTo(Build.VERSION_CODES.R)
@Test
public void testMigrateTransportInTunnelModeV6InV4() throws Exception {
doTestMigrateTunnel(AF_INET6, AF_INET, false, true);
}
@Test @Test
public void testTransportInTunnelModeV6InV4Reflected() throws Exception { public void testTransportInTunnelModeV6InV4Reflected() throws Exception {
assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature()); assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
@@ -799,6 +1078,12 @@ public class IpSecManagerTunnelTest extends IpSecBaseTest {
checkTunnelInput(AF_INET6, AF_INET, true, true); checkTunnelInput(AF_INET6, AF_INET, true, true);
} }
@IgnoreUpTo(Build.VERSION_CODES.R)
@Test
public void testMigrateTransportInTunnelModeV6InV4UdpEncap() throws Exception {
doTestMigrateTunnel(AF_INET6, AF_INET, true, true);
}
@Test @Test
public void testTransportInTunnelModeV6InV4UdpEncapReflected() throws Exception { public void testTransportInTunnelModeV6InV4UdpEncapReflected() throws Exception {
assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature()); assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
@@ -812,6 +1097,12 @@ public class IpSecManagerTunnelTest extends IpSecBaseTest {
checkTunnelInput(AF_INET, AF_INET6, false, true); checkTunnelInput(AF_INET, AF_INET6, false, true);
} }
@IgnoreUpTo(Build.VERSION_CODES.R)
@Test
public void testMigrateTransportInTunnelModeV6InV6() throws Exception {
doTestMigrateTunnel(AF_INET, AF_INET6, false, true);
}
@Test @Test
public void testTransportInTunnelModeV6InV6Reflected() throws Exception { public void testTransportInTunnelModeV6InV6Reflected() throws Exception {
assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature()); assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
@@ -826,6 +1117,12 @@ public class IpSecManagerTunnelTest extends IpSecBaseTest {
checkTunnelInput(AF_INET, AF_INET, false, false); checkTunnelInput(AF_INET, AF_INET, false, false);
} }
@IgnoreUpTo(Build.VERSION_CODES.R)
@Test
public void testMigrateTunnelV4InV4() throws Exception {
doTestMigrateTunnel(AF_INET, AF_INET, false, false);
}
@Test @Test
public void testTunnelV4InV4Reflected() throws Exception { public void testTunnelV4InV4Reflected() throws Exception {
assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature()); assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
@@ -839,6 +1136,12 @@ public class IpSecManagerTunnelTest extends IpSecBaseTest {
checkTunnelInput(AF_INET, AF_INET, true, false); checkTunnelInput(AF_INET, AF_INET, true, false);
} }
@IgnoreUpTo(Build.VERSION_CODES.R)
@Test
public void testMigrateTunnelV4InV4UdpEncap() throws Exception {
doTestMigrateTunnel(AF_INET, AF_INET, true, false);
}
@Test @Test
public void testTunnelV4InV4UdpEncapReflected() throws Exception { public void testTunnelV4InV4UdpEncapReflected() throws Exception {
assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature()); assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
@@ -852,6 +1155,12 @@ public class IpSecManagerTunnelTest extends IpSecBaseTest {
checkTunnelInput(AF_INET, AF_INET6, false, false); checkTunnelInput(AF_INET, AF_INET6, false, false);
} }
@IgnoreUpTo(Build.VERSION_CODES.R)
@Test
public void testMigrateTunnelV4InV6() throws Exception {
doTestMigrateTunnel(AF_INET, AF_INET6, false, false);
}
@Test @Test
public void testTunnelV4InV6Reflected() throws Exception { public void testTunnelV4InV6Reflected() throws Exception {
assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature()); assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
@@ -865,6 +1174,12 @@ public class IpSecManagerTunnelTest extends IpSecBaseTest {
checkTunnelInput(AF_INET6, AF_INET, false, false); checkTunnelInput(AF_INET6, AF_INET, false, false);
} }
@IgnoreUpTo(Build.VERSION_CODES.R)
@Test
public void testMigrateTunnelV6InV4() throws Exception {
doTestMigrateTunnel(AF_INET6, AF_INET, false, false);
}
@Test @Test
public void testTunnelV6InV4Reflected() throws Exception { public void testTunnelV6InV4Reflected() throws Exception {
assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature()); assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
@@ -878,6 +1193,12 @@ public class IpSecManagerTunnelTest extends IpSecBaseTest {
checkTunnelInput(AF_INET6, AF_INET, true, false); checkTunnelInput(AF_INET6, AF_INET, true, false);
} }
@IgnoreUpTo(Build.VERSION_CODES.R)
@Test
public void testMigrateTunnelV6InV4UdpEncap() throws Exception {
doTestMigrateTunnel(AF_INET6, AF_INET, true, false);
}
@Test @Test
public void testTunnelV6InV4UdpEncapReflected() throws Exception { public void testTunnelV6InV4UdpEncapReflected() throws Exception {
assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature()); assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
@@ -891,6 +1212,12 @@ public class IpSecManagerTunnelTest extends IpSecBaseTest {
checkTunnelInput(AF_INET6, AF_INET6, false, false); checkTunnelInput(AF_INET6, AF_INET6, false, false);
} }
@IgnoreUpTo(Build.VERSION_CODES.R)
@Test
public void testMigrateTunnelV6InV6() throws Exception {
doTestMigrateTunnel(AF_INET6, AF_INET6, false, false);
}
@Test @Test
public void testTunnelV6InV6Reflected() throws Exception { public void testTunnelV6InV6Reflected() throws Exception {
assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature()); assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());