From 7f14dbc33f639f558fae5806e20e406c00493a03 Mon Sep 17 00:00:00 2001 From: Chenbo Feng Date: Thu, 8 Nov 2018 17:36:21 -0800 Subject: [PATCH] Call netd to update the tcp buffer size The system server is controlling the tcp buffer now by writing to /sys/kernel/ipv4/tcp_{rmem,wmem}_{min,def,max}. Those files are basically the same as /proc/sys/net/ipv4/tcp_{rmem,wmem} except those latter ones contain all three values in one file. Netd can directly write to those files so we no longer need to depend on these android specific files. Test: netd_integration_test Bug: 118572798 Change-Id: I588b48be29ecf61fd5bbf94f97f63738be4eae25 --- .../android/server/ConnectivityService.java | 18 +++++----- .../server/ConnectivityServiceTest.java | 34 +++++++++++++++++-- 2 files changed, 40 insertions(+), 12 deletions(-) diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 74c80237d7211..7a63a3a3bc150 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -274,7 +274,8 @@ public class ConnectivityService extends IConnectivityManager.Stub private int mDefaultInetConditionPublished = 0; private INetworkManagementService mNMS; - private INetd mNetd; + @VisibleForTesting + protected INetd mNetd; private INetworkStatsService mStatsService; private INetworkPolicyManager mPolicyManager; private NetworkPolicyManagerInternal mPolicyManagerInternal; @@ -2064,7 +2065,8 @@ public class ConnectivityService extends IConnectivityManager.Stub } } - private static final String DEFAULT_TCP_BUFFER_SIZES = "4096,87380,110208,4096,16384,110208"; + @VisibleForTesting + protected static final String DEFAULT_TCP_BUFFER_SIZES = "4096,87380,110208,4096,16384,110208"; private static final String DEFAULT_TCP_RWND_KEY = "net.tcp.default_init_rwnd"; // Overridden for testing purposes to avoid writing to SystemProperties. @@ -2095,15 +2097,11 @@ public class ConnectivityService extends IConnectivityManager.Stub try { if (VDBG || DDBG) Slog.d(TAG, "Setting tx/rx TCP buffers to " + tcpBufferSizes); - final String prefix = "/sys/kernel/ipv4/tcp_"; - FileUtils.stringToFile(prefix + "rmem_min", values[0]); - FileUtils.stringToFile(prefix + "rmem_def", values[1]); - FileUtils.stringToFile(prefix + "rmem_max", values[2]); - FileUtils.stringToFile(prefix + "wmem_min", values[3]); - FileUtils.stringToFile(prefix + "wmem_def", values[4]); - FileUtils.stringToFile(prefix + "wmem_max", values[5]); + String rmemValues = String.join(" ", values[0], values[1], values[2]); + String wmemValues = String.join(" ", values[3], values[4], values[5]); + mNetd.setTcpRWmemorySize(rmemValues, wmemValues); mCurrentTcpBufferSizes = tcpBufferSizes; - } catch (IOException e) { + } catch (RemoteException | ServiceSpecificException e) { loge("Can't set TCP buffer sizes:" + e); } diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 17bcea05b2940..71529fdffd5ff 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -96,6 +96,7 @@ import android.net.ConnectivityManager.PacketKeepalive; import android.net.ConnectivityManager.PacketKeepaliveCallback; import android.net.ConnectivityManager.TooManyRequestsException; import android.net.ConnectivityThread; +import android.net.INetd; import android.net.INetworkPolicyListener; import android.net.INetworkPolicyManager; import android.net.INetworkStatsService; @@ -228,6 +229,7 @@ public class ConnectivityServiceTest { @Mock INetworkManagementService mNetworkManagementService; @Mock INetworkStatsService mStatsService; @Mock INetworkPolicyManager mNpm; + @Mock INetd mMockNetd; private ArgumentCaptor mStringArrayCaptor = ArgumentCaptor.forClass(String[].class); @@ -926,8 +928,9 @@ public class ConnectivityServiceTest { public WrappedConnectivityService(Context context, INetworkManagementService netManager, INetworkStatsService statsService, INetworkPolicyManager policyManager, - IpConnectivityLog log) { + IpConnectivityLog log, INetd netd) { super(context, netManager, statsService, policyManager, log); + mNetd = netd; mLingerDelayMs = TEST_LINGER_DELAY_MS; } @@ -1087,7 +1090,8 @@ public class ConnectivityServiceTest { mNetworkManagementService, mStatsService, mNpm, - mock(IpConnectivityLog.class)); + mock(IpConnectivityLog.class), + mMockNetd); final ArgumentCaptor policyListenerCaptor = ArgumentCaptor.forClass(INetworkPolicyListener.class); @@ -4766,4 +4770,30 @@ public class ConnectivityServiceTest { // Clean up mCm.unregisterNetworkCallback(networkCallback); } + + private static final String TEST_TCP_BUFFER_SIZES = "1,2,3,4,5,6"; + + private void verifyTcpBufferSizeChange(String tcpBufferSizes) throws Exception { + String[] values = tcpBufferSizes.split(","); + String rmemValues = String.join(" ", values[0], values[1], values[2]); + String wmemValues = String.join(" ", values[3], values[4], values[5]); + waitForIdle(); + verify(mMockNetd, atLeastOnce()).setTcpRWmemorySize(rmemValues, wmemValues); + reset(mMockNetd); + } + + @Test + public void testTcpBufferReset() throws Exception { + mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); + reset(mMockNetd); + // Simple connection should have updated tcp buffer size. + mCellNetworkAgent.connect(false); + verifyTcpBufferSizeChange(ConnectivityService.DEFAULT_TCP_BUFFER_SIZES); + + // Change link Properties should have updated tcp buffer size. + LinkProperties lp = new LinkProperties(); + lp.setTcpBufferSizes(TEST_TCP_BUFFER_SIZES); + mCellNetworkAgent.sendLinkProperties(lp); + verifyTcpBufferSizeChange(TEST_TCP_BUFFER_SIZES); + } }