diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index bb3b9f72d5..14503f9d73 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; @@ -2090,7 +2091,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. @@ -2116,15 +2118,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 17bcea05b2..71529fdffd 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); + } }