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

Commit 87de5efd authored by Ravi Joshi's avatar Ravi Joshi Committed by Steve Kondik
Browse files

Connectivity: Set TCP delayed ACK and User Configuration Flag

Provide a Mechanism to set tcp delayed ack settings from
Connectivity Service. The tcp_use_userconfig flag is set to
override the default tcp delayed ack configuration in tcp stack.
tcp_use_userconfig flag is reset when the TCP stack is required
to use default delayed ack settings. Currently the delayed ack
settings are overridden for Wifi and LTE networks only. Other
network types continue to use default delayed ack settings

Change-Id: I282ef0f6b6278b6efcef3870242974f7ee93e508
CRs-Fixed: 628139
parent 08a1faa2
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
@@ -493,6 +493,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 −1
Original line number Diff line number Diff line
@@ -2084,6 +2084,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
@@ -2380,6 +2383,9 @@ public class ConnectivityService extends IConnectivityManager.Stub {
            mInetConditionChangeInFlight = false;
            // Don't do this - if we never sign in stay, grey
            //reportNetworkCondition(mActiveDefaultNetwork, 100);

            // Update TCP delayed ACK settings
            updateTcpDelayedAckSettings(thisNet);
        }
        thisNet.setTeardownRequested(false);
        updateNetworkSettings(thisNet);
@@ -2796,6 +2802,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.
@@ -3109,7 +3229,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]);
                        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) {