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

Commit 43225e21 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "Connectivity: Set TCP delayed ACK and User Configuration Flag.."

parents 62e01e4e bc913b5a
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -38,6 +38,12 @@ public abstract class BaseNetworkStateTracker implements NetworkStateTracker {

    public static final String PROP_TCP_BUFFER_UNKNOWN = "net.tcp.buffersize.unknown";
    public static final String PROP_TCP_BUFFER_WIFI = "net.tcp.buffersize.wifi";
    public static final String PROP_TCP_DELACK_DEFAULT = "net.tcp.delack.default";
    public static final String PROP_TCP_USERCFG_DEFAULT = "net.tcp.usercfg.default";
    public static final String PROP_TCP_DELACK_WIFI = "net.tcp.delack.wifi";
    public static final String PROP_TCP_USERCFG_WIFI = "net.tcp.usercfg.wifi";
    public static final String PROP_TCP_DELACK_LTE = "net.tcp.delack.lte";
    public static final String PROP_TCP_USERCFG_LTE = "net.tcp.usercfg.lte";

    protected Context mContext;
    private Handler mTarget;
@@ -206,4 +212,21 @@ public abstract class BaseNetworkStateTracker implements NetworkStateTracker {
    public void stopSampling(SamplingDataTracker.SamplingSnapshot s) {
        // nothing to do
    }

    // TCP delayed ack settings
    public String getTcpDelayedAckPropName() {
        return PROP_TCP_DELACK_DEFAULT;
    }

    public String getTcpUserConfigPropName() {
        return PROP_TCP_USERCFG_DEFAULT;
    }

    public String getDefaultTcpDelayedAckPropName() {
        return PROP_TCP_DELACK_DEFAULT;
    }

    public String getDefaultTcpUserConfigPropName() {
        return PROP_TCP_USERCFG_DEFAULT;
    }
}
+42 −0
Original line number Diff line number Diff line
@@ -500,6 +500,48 @@ public class MobileDataStateTracker extends BaseNetworkStateTracker {
        return "net.tcp.buffersize." + networkTypeStr;
    }

    /**
     * Return the system properties name associated with the tcp delayed ack settings
     * for this network.
     */
    @Override
    public String getTcpDelayedAckPropName() {
        String networkTypeStr = "default";
        TelephonyManager tm = (TelephonyManager) mContext.getSystemService(
                         Context.TELEPHONY_SERVICE);
        if (tm != null) {
            switch(tm.getNetworkType()) {
                case TelephonyManager.NETWORK_TYPE_LTE:
                    networkTypeStr = "lte";
                    break;
                default:
                    break;
            }
        }
        return "net.tcp.delack." + networkTypeStr;
    }

    /**
     * Return the system properties name associated with the tcp user config flag
     * for this network.
     */
    @Override
    public String getTcpUserConfigPropName() {
        String networkTypeStr = "default";
        TelephonyManager tm = (TelephonyManager) mContext.getSystemService(
                         Context.TELEPHONY_SERVICE);
        if (tm != null) {
            switch(tm.getNetworkType()) {
                case TelephonyManager.NETWORK_TYPE_LTE:
                    networkTypeStr = "lte";
                    break;
                default:
                    break;
            }
        }
        return "net.tcp.usercfg." + networkTypeStr;
    }

    /**
     * Tear down mobile data connectivity, i.e., disable the ability to create
     * mobile data connections.
+24 −0
Original line number Diff line number Diff line
@@ -130,6 +130,30 @@ public interface NetworkStateTracker {
     */
    public String getTcpBufferSizesPropName();

    /**
     * Return the system properties name associated with the tcp delayed ack settings
     * for this network.
     */
    public String getTcpDelayedAckPropName();

    /**
     * Return the system properties name associated with the tcp user config flag
     * for this network.
     */
    public String getTcpUserConfigPropName();

    /**
      * Return the default system properties name associated with the tcp delayed ack settings
      * for this network.
      */
    public String getDefaultTcpDelayedAckPropName();

    /**
     * Return the default system properties name associated with the tcp user config flag
     * for this network.
     */
    public String getDefaultTcpUserConfigPropName();

    /**
     * Disable connectivity to a network
     * @return {@code true} if a teardown occurred, {@code false} if the
+124 −2
Original line number Diff line number Diff line
@@ -2089,6 +2089,9 @@ public class ConnectivityService extends IConnectivityManager.Stub {
                    log("tryFailover: set mActiveDefaultNetwork=-1, prevNetType=" + prevNetType);
                }
                mActiveDefaultNetwork = -1;

                // If there is no active connection then tcp delayed ack params are reset
                resetTcpDelayedAckSettings(mNetTrackers[prevNetType]);
            }

            // don't signal a reconnect for anything lower or equal priority than our
@@ -2385,7 +2388,9 @@ public class ConnectivityService extends IConnectivityManager.Stub {
            mInetConditionChangeInFlight = false;
            // Don't do this - if we never sign in stay, grey
            //reportNetworkCondition(mActiveDefaultNetwork, 100);
            updateNetworkSettings(thisNet);

            // Update TCP delayed ACK settings
            updateTcpDelayedAckSettings(thisNet);
        }
        thisNet.setTeardownRequested(false);
        updateMtuSizeSettings(thisNet);
@@ -2810,6 +2815,120 @@ public class ConnectivityService extends IConnectivityManager.Stub {
        }
    }

    /**
     * [net.tcp.delack.wifi] and set them for system
     * wide use
     */
    private void resetTcpDelayedAckSettings(NetworkStateTracker nt) {
        String key1 = nt.getDefaultTcpUserConfigPropName();
        String key2 = nt.getDefaultTcpDelayedAckPropName();

        String defUserCfg = SystemProperties.get(key1);
        String defDelAck = SystemProperties.get(key2);

        if (TextUtils.isEmpty(defUserCfg) || defUserCfg.length() == 0) {
            if (DBG) loge(key1+ " not found in system default properties");

            // Setting to default values so we won't be stuck to previous values
            // Disable user-overridden values to default
            defUserCfg = "0";
        }
        setUserConfig(defUserCfg);

        if(TextUtils.isEmpty(defDelAck) || defDelAck.length() == 0) {
            if (DBG) loge(key2 + " not found in system default properties");

            // Setting to default values so we won't be stuck to previous values
            // Disable user-overridden values to default
            defDelAck= "1";
        }
        setDelAckSize(defDelAck);
    }

    /**
     * [net.tcp.delack.default] and set them for system
     * wide use
     */
    private void updateTcpDelayedAckSettings(NetworkStateTracker nt) {
        String key1 = nt.getTcpUserConfigPropName();
        String key2 = nt.getTcpDelayedAckPropName();

        String userCfg = SystemProperties.get(key1);
        String delAck = SystemProperties.get(key2);

        if (TextUtils.isEmpty(userCfg)) {
            if (DBG) loge(key1 + " not found in system properties. Using defaults");

            // Setting to default values so we won't be stuck to previous values
            key1 = nt.getDefaultTcpUserConfigPropName();
            userCfg = SystemProperties.get(key1);
        }

        if (TextUtils.isEmpty(delAck)) {
            if (DBG) loge(key2 + " not found in system properties. Using defaults");

            // Setting to default values so we won't be stuck to previous values
            key2 = nt.getDefaultTcpDelayedAckPropName();
            delAck = SystemProperties.get(key2);
        }

        // Set values in kernel
        if (userCfg.length() != 0) {
            if (DBG) {
                log("Setting TCP values: [" + userCfg
                        + "] which comes from [" + key1 + "]");
            }
            setUserConfig(userCfg);
        }

        if (delAck.length() != 0) {
            if (DBG) {
                log("Setting TCP values: [" + delAck
                        + "] which comes from [" + key2 + "]");
            }
            setDelAckSize(delAck);
        }
    }

    /**
     * Writes TCP delayed ACK sizes to /sys/net/ipv4/tcp_delack_seg]
     *
     */
    private void setDelAckSize(String delAckSize) {
        try {
            final String mProcFile = "/sys/kernel/ipv4/tcp_delack_seg";
            int delAck = Integer.parseInt(delAckSize);

            if (delAck <= 0 || delAck > 60) {
               if (DBG) loge(" delAck size is out of range, configuring to default");
               delAck = 1;
            }

            FileUtils.stringToFile(mProcFile, delAckSize);
        } catch (IOException e) {
            loge("Can't set delayed ACK size:" + e);
        }
    }

    /**
     * Writes TCP user configuration flag to /sys/net/ipv4/tcp_use_usercfg]
     *
     */
    private void setUserConfig(String userConfig) {
        try {
            int userCfg = Integer.parseInt(userConfig);
            final String mProcFile = "/sys/kernel/ipv4/tcp_use_userconfig";

            if (userCfg == 0 || userCfg == 1) {
                FileUtils.stringToFile(mProcFile, userConfig);
            } else {
                loge("Invalid buffersize string: " + userConfig);
            }
        } catch (IOException e) {
            loge("Can't set delayed ACK size:" + e);
        }
    }

    /**
     * Adjust the per-process dns entries (net.dns<x>.<pid>) based
     * on the highest priority active net which this process requested.
@@ -3123,7 +3242,10 @@ public class ConnectivityService extends IConnectivityManager.Stub {
                case NetworkStateTracker.EVENT_NETWORK_SUBTYPE_CHANGED: {
                    info = (NetworkInfo) msg.obj;
                    int type = info.getType();
                    if (mNetConfigs[type].isDefault()) updateNetworkSettings(mNetTrackers[type]);
                    if (mNetConfigs[type].isDefault()) {
                        updateNetworkSettings(mNetTrackers[type]);
                        updateTcpDelayedAckSettings(mNetTrackers[type]);
                    }
                    break;
                }
            }
+18 −0
Original line number Diff line number Diff line
@@ -259,6 +259,24 @@ public class WifiStateTracker extends BaseNetworkStateTracker {
        return "net.tcp.buffersize.wifi";
    }

    /**
     * Return the system properties name associated with the tcp delayed ack settings
     * for this network.
     */
    @Override
    public String getTcpDelayedAckPropName() {
        return "net.tcp.delack.wifi";
    }

    /**
     * Return the system properties name associated with the tcp user config flag
     * for this network.
     */
    @Override
    public String getTcpUserConfigPropName() {
        return "net.tcp.usercfg.wifi";
    }

    private class WifiStateReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {