Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7abbfadd authored by Chenbo Feng's avatar Chenbo Feng Committed by android-build-merger
Browse files

Merge "Call netd to update the tcp buffer size"

am: 51b1e458

Change-Id: I217b1cc4afd886b449e532a7bde26bc9a5167277
parents 79f93feb 51b1e458
Loading
Loading
Loading
Loading
+8 −10
Original line number Diff line number Diff line
@@ -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);
        }

+32 −2
Original line number Diff line number Diff line
@@ -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<String[]> 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<INetworkPolicyListener> 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);
    }
}