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
This commit is contained in:
Chenbo Feng
2018-11-08 17:36:21 -08:00
parent 822d2b5991
commit 1541629a3f
2 changed files with 40 additions and 12 deletions

View File

@@ -274,7 +274,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
private int mDefaultInetConditionPublished = 0; private int mDefaultInetConditionPublished = 0;
private INetworkManagementService mNMS; private INetworkManagementService mNMS;
private INetd mNetd; @VisibleForTesting
protected INetd mNetd;
private INetworkStatsService mStatsService; private INetworkStatsService mStatsService;
private INetworkPolicyManager mPolicyManager; private INetworkPolicyManager mPolicyManager;
private NetworkPolicyManagerInternal mPolicyManagerInternal; 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"; private static final String DEFAULT_TCP_RWND_KEY = "net.tcp.default_init_rwnd";
// Overridden for testing purposes to avoid writing to SystemProperties. // Overridden for testing purposes to avoid writing to SystemProperties.
@@ -2095,15 +2097,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
try { try {
if (VDBG || DDBG) Slog.d(TAG, "Setting tx/rx TCP buffers to " + tcpBufferSizes); if (VDBG || DDBG) Slog.d(TAG, "Setting tx/rx TCP buffers to " + tcpBufferSizes);
final String prefix = "/sys/kernel/ipv4/tcp_"; String rmemValues = String.join(" ", values[0], values[1], values[2]);
FileUtils.stringToFile(prefix + "rmem_min", values[0]); String wmemValues = String.join(" ", values[3], values[4], values[5]);
FileUtils.stringToFile(prefix + "rmem_def", values[1]); mNetd.setTcpRWmemorySize(rmemValues, wmemValues);
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]);
mCurrentTcpBufferSizes = tcpBufferSizes; mCurrentTcpBufferSizes = tcpBufferSizes;
} catch (IOException e) { } catch (RemoteException | ServiceSpecificException e) {
loge("Can't set TCP buffer sizes:" + e); loge("Can't set TCP buffer sizes:" + e);
} }

View File

@@ -96,6 +96,7 @@ import android.net.ConnectivityManager.PacketKeepalive;
import android.net.ConnectivityManager.PacketKeepaliveCallback; import android.net.ConnectivityManager.PacketKeepaliveCallback;
import android.net.ConnectivityManager.TooManyRequestsException; import android.net.ConnectivityManager.TooManyRequestsException;
import android.net.ConnectivityThread; import android.net.ConnectivityThread;
import android.net.INetd;
import android.net.INetworkPolicyListener; import android.net.INetworkPolicyListener;
import android.net.INetworkPolicyManager; import android.net.INetworkPolicyManager;
import android.net.INetworkStatsService; import android.net.INetworkStatsService;
@@ -228,6 +229,7 @@ public class ConnectivityServiceTest {
@Mock INetworkManagementService mNetworkManagementService; @Mock INetworkManagementService mNetworkManagementService;
@Mock INetworkStatsService mStatsService; @Mock INetworkStatsService mStatsService;
@Mock INetworkPolicyManager mNpm; @Mock INetworkPolicyManager mNpm;
@Mock INetd mMockNetd;
private ArgumentCaptor<String[]> mStringArrayCaptor = ArgumentCaptor.forClass(String[].class); private ArgumentCaptor<String[]> mStringArrayCaptor = ArgumentCaptor.forClass(String[].class);
@@ -926,8 +928,9 @@ public class ConnectivityServiceTest {
public WrappedConnectivityService(Context context, INetworkManagementService netManager, public WrappedConnectivityService(Context context, INetworkManagementService netManager,
INetworkStatsService statsService, INetworkPolicyManager policyManager, INetworkStatsService statsService, INetworkPolicyManager policyManager,
IpConnectivityLog log) { IpConnectivityLog log, INetd netd) {
super(context, netManager, statsService, policyManager, log); super(context, netManager, statsService, policyManager, log);
mNetd = netd;
mLingerDelayMs = TEST_LINGER_DELAY_MS; mLingerDelayMs = TEST_LINGER_DELAY_MS;
} }
@@ -1087,7 +1090,8 @@ public class ConnectivityServiceTest {
mNetworkManagementService, mNetworkManagementService,
mStatsService, mStatsService,
mNpm, mNpm,
mock(IpConnectivityLog.class)); mock(IpConnectivityLog.class),
mMockNetd);
final ArgumentCaptor<INetworkPolicyListener> policyListenerCaptor = final ArgumentCaptor<INetworkPolicyListener> policyListenerCaptor =
ArgumentCaptor.forClass(INetworkPolicyListener.class); ArgumentCaptor.forClass(INetworkPolicyListener.class);
@@ -4766,4 +4770,30 @@ public class ConnectivityServiceTest {
// Clean up // Clean up
mCm.unregisterNetworkCallback(networkCallback); 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);
}
} }