Merge "Maximize VCN MTU when using IPv6" am: 6d70c7f36a am: 8f8e80779a am: 30ac2c94d3

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/2063435

Change-Id: I0de762eeadbb7218f1b41c18d2475b459c722a85
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Yan Yan
2022-04-20 04:36:30 +00:00
committed by Automerger Merge Worker
6 changed files with 236 additions and 38 deletions

View File

@@ -56,6 +56,7 @@ import android.net.LinkProperties;
import android.net.NetworkAgent;
import android.net.NetworkCapabilities;
import android.net.ipsec.ike.ChildSaProposal;
import android.net.ipsec.ike.IkeSessionConnectionInfo;
import android.net.ipsec.ike.exceptions.IkeException;
import android.net.ipsec.ike.exceptions.IkeInternalException;
import android.net.ipsec.ike.exceptions.IkeProtocolException;
@@ -216,14 +217,23 @@ public class VcnGatewayConnectionConnectedStateTest extends VcnGatewayConnection
@Test
public void testMigration() throws Exception {
triggerChildOpened();
mTestLooper.dispatchAll();
assertEquals(mIkeConnectionInfo, mGatewayConnection.getIkeConnectionInfo());
mGatewayConnection
.getUnderlyingNetworkControllerCallback()
.onSelectedUnderlyingNetworkChanged(TEST_UNDERLYING_NETWORK_RECORD_2);
final IkeSessionConnectionInfo newIkeConnectionInfo =
new IkeSessionConnectionInfo(
TEST_ADDR_V4, TEST_ADDR_V4_2, TEST_UNDERLYING_NETWORK_RECORD_2.network);
getIkeSessionCallback().onIkeSessionConnectionInfoChanged(newIkeConnectionInfo);
getChildSessionCallback()
.onIpSecTransformsMigrated(makeDummyIpSecTransform(), makeDummyIpSecTransform());
mTestLooper.dispatchAll();
assertEquals(newIkeConnectionInfo, mGatewayConnection.getIkeConnectionInfo());
verify(mIpSecSvc, times(2))
.setNetworkForTunnelInterface(
eq(TEST_IPSEC_TUNNEL_RESOURCE_ID),
@@ -246,7 +256,8 @@ public class VcnGatewayConnectionConnectedStateTest extends VcnGatewayConnection
MtuUtils.getMtu(
saProposals,
mConfig.getMaxMtu(),
TEST_UNDERLYING_NETWORK_RECORD_2.linkProperties.getMtu());
TEST_UNDERLYING_NETWORK_RECORD_2.linkProperties.getMtu(),
true /* isIpv4 */);
verify(mNetworkAgent).sendLinkProperties(
argThat(lp -> expectedMtu == lp.getMtu()
&& TEST_TCP_BUFFER_SIZES_2.equals(lp.getTcpBufferSizes())));
@@ -269,6 +280,7 @@ public class VcnGatewayConnectionConnectedStateTest extends VcnGatewayConnection
.when(mMockChildSessionConfig)
.getInternalDnsServers();
getIkeSessionCallback().onOpened(mIkeSessionConfiguration);
getChildSessionCallback().onOpened(mMockChildSessionConfig);
}
@@ -298,6 +310,7 @@ public class VcnGatewayConnectionConnectedStateTest extends VcnGatewayConnection
mTestLooper.dispatchAll();
assertEquals(mGatewayConnection.mConnectedState, mGatewayConnection.getCurrentState());
assertEquals(mIkeConnectionInfo, mGatewayConnection.getIkeConnectionInfo());
final ArgumentCaptor<LinkProperties> lpCaptor =
ArgumentCaptor.forClass(LinkProperties.class);

View File

@@ -213,7 +213,8 @@ public class VcnGatewayConnectionTest extends VcnGatewayConnectionTestBase {
VcnGatewayConnectionConfigTest.buildTestConfig(),
tunnelIface,
childSessionConfig,
record);
record,
mIkeConnectionInfo);
verify(mDeps).getUnderlyingIfaceMtu(LOOPBACK_IFACE);
@@ -226,7 +227,8 @@ public class VcnGatewayConnectionTest extends VcnGatewayConnectionTestBase {
VcnGatewayConnectionConfigTest.buildTestConfig(),
tunnelIface,
childSessionConfig,
record);
record,
mIkeConnectionInfo);
verify(mDeps, times(2)).getUnderlyingIfaceMtu(LOOPBACK_IFACE);

View File

@@ -47,6 +47,8 @@ import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.ipsec.ike.ChildSessionCallback;
import android.net.ipsec.ike.IkeSessionCallback;
import android.net.ipsec.ike.IkeSessionConfiguration;
import android.net.ipsec.ike.IkeSessionConnectionInfo;
import android.net.vcn.VcnGatewayConnectionConfig;
import android.net.vcn.VcnGatewayConnectionConfigTest;
import android.os.ParcelUuid;
@@ -80,6 +82,13 @@ public class VcnGatewayConnectionTestBase {
doReturn(TEST_SUB_GRP).when(TEST_SUB_INFO).getGroupUuid();
}
protected static final InetAddress TEST_ADDR = InetAddresses.parseNumericAddress("2001:db8::1");
protected static final InetAddress TEST_ADDR_2 =
InetAddresses.parseNumericAddress("2001:db8::2");
protected static final InetAddress TEST_ADDR_V4 =
InetAddresses.parseNumericAddress("192.0.2.1");
protected static final InetAddress TEST_ADDR_V4_2 =
InetAddresses.parseNumericAddress("192.0.2.2");
protected static final InetAddress TEST_DNS_ADDR =
InetAddresses.parseNumericAddress("2001:DB8:0:1::");
protected static final InetAddress TEST_DNS_ADDR_2 =
@@ -148,6 +157,9 @@ public class VcnGatewayConnectionTestBase {
@NonNull protected final IpSecService mIpSecSvc;
@NonNull protected final ConnectivityManager mConnMgr;
@NonNull protected final IkeSessionConnectionInfo mIkeConnectionInfo;
@NonNull protected final IkeSessionConfiguration mIkeSessionConfiguration;
protected VcnIkeSession mMockIkeSession;
protected VcnGatewayConnection mGatewayConnection;
@@ -173,6 +185,10 @@ public class VcnGatewayConnectionTestBase {
VcnTestUtils.setupSystemService(
mContext, mConnMgr, Context.CONNECTIVITY_SERVICE, ConnectivityManager.class);
mIkeConnectionInfo =
new IkeSessionConnectionInfo(TEST_ADDR, TEST_ADDR_2, mock(Network.class));
mIkeSessionConfiguration = new IkeSessionConfiguration.Builder(mIkeConnectionInfo).build();
doReturn(mContext).when(mVcnContext).getContext();
doReturn(mTestLooper.getLooper()).when(mVcnContext).getLooper();
doReturn(mVcnNetworkProvider).when(mVcnContext).getVcnNetworkProvider();

View File

@@ -46,34 +46,85 @@ import java.util.List;
@RunWith(AndroidJUnit4.class)
@SmallTest
public class MtuUtilsTest {
@Test
public void testUnderlyingMtuZero() {
private void verifyUnderlyingMtuZero(boolean isIpv4) {
assertEquals(
IPV6_MIN_MTU, getMtu(emptyList(), ETHER_MTU /* maxMtu */, 0 /* underlyingMtu */));
IPV6_MIN_MTU,
getMtu(emptyList(), ETHER_MTU /* maxMtu */, 0 /* underlyingMtu */, isIpv4));
}
@Test
public void testClampsToMaxMtu() {
assertEquals(0, getMtu(emptyList(), 0 /* maxMtu */, IPV6_MIN_MTU /* underlyingMtu */));
public void testUnderlyingMtuZeroV4() {
verifyUnderlyingMtuZero(true /* isIpv4 */);
}
@Test
public void testNormalModeAlgorithmLessThanUnderlyingMtu() {
final List<ChildSaProposal> saProposals =
Arrays.asList(
new ChildSaProposal.Builder()
.addEncryptionAlgorithm(
ENCRYPTION_ALGORITHM_AES_CBC, KEY_LEN_AES_256)
.addIntegrityAlgorithm(INTEGRITY_ALGORITHM_HMAC_SHA2_256_128)
.build());
public void testUnderlyingMtuZeroV6() {
verifyUnderlyingMtuZero(false /* isIpv4 */);
}
private void verifyClampsToMaxMtu(boolean isIpv4) {
assertEquals(
0, getMtu(emptyList(), 0 /* maxMtu */, IPV6_MIN_MTU /* underlyingMtu */, isIpv4));
}
@Test
public void testClampsToMaxMtuV4() {
verifyClampsToMaxMtu(true /* isIpv4 */);
}
@Test
public void testClampsToMaxMtuV6() {
verifyClampsToMaxMtu(false /* isIpv4 */);
}
private List<ChildSaProposal> buildChildSaProposalsWithNormalModeAlgo() {
return Arrays.asList(
new ChildSaProposal.Builder()
.addEncryptionAlgorithm(ENCRYPTION_ALGORITHM_AES_CBC, KEY_LEN_AES_256)
.addIntegrityAlgorithm(INTEGRITY_ALGORITHM_HMAC_SHA2_256_128)
.build());
}
private void verifyNormalModeAlgorithmLessThanUnderlyingMtu(boolean isIpv4) {
final int actualMtu =
getMtu(saProposals, ETHER_MTU /* maxMtu */, ETHER_MTU /* underlyingMtu */);
getMtu(
buildChildSaProposalsWithNormalModeAlgo(),
ETHER_MTU /* maxMtu */,
ETHER_MTU /* underlyingMtu */,
isIpv4);
assertTrue(ETHER_MTU > actualMtu);
}
@Test
public void testCombinedModeAlgorithmLessThanUnderlyingMtu() {
public void testNormalModeAlgorithmLessThanUnderlyingMtuV4() {
verifyNormalModeAlgorithmLessThanUnderlyingMtu(true /* isIpv4 */);
}
@Test
public void testNormalModeAlgorithmLessThanUnderlyingMtuV6() {
verifyNormalModeAlgorithmLessThanUnderlyingMtu(false /* isIpv4 */);
}
@Test
public void testMtuIpv4LessThanMtuIpv6() {
final int actualMtuV4 =
getMtu(
buildChildSaProposalsWithNormalModeAlgo(),
ETHER_MTU /* maxMtu */,
ETHER_MTU /* underlyingMtu */,
true /* isIpv4 */);
final int actualMtuV6 =
getMtu(
buildChildSaProposalsWithNormalModeAlgo(),
ETHER_MTU /* maxMtu */,
ETHER_MTU /* underlyingMtu */,
false /* isIpv4 */);
assertTrue(actualMtuV4 < actualMtuV6);
}
private void verifyCombinedModeAlgorithmLessThanUnderlyingMtu(boolean isIpv4) {
final List<ChildSaProposal> saProposals =
Arrays.asList(
new ChildSaProposal.Builder()
@@ -86,7 +137,17 @@ public class MtuUtilsTest {
.build());
final int actualMtu =
getMtu(saProposals, ETHER_MTU /* maxMtu */, ETHER_MTU /* underlyingMtu */);
getMtu(saProposals, ETHER_MTU /* maxMtu */, ETHER_MTU /* underlyingMtu */, isIpv4);
assertTrue(ETHER_MTU > actualMtu);
}
@Test
public void testCombinedModeAlgorithmLessThanUnderlyingMtuV4() {
verifyCombinedModeAlgorithmLessThanUnderlyingMtu(true /* isIpv4 */);
}
@Test
public void testCombinedModeAlgorithmLessThanUnderlyingMtuV6() {
verifyCombinedModeAlgorithmLessThanUnderlyingMtu(false /* isIpv4 */);
}
}