Loading core/java/android/net/BaseNetworkStateTracker.java +23 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; } } core/java/android/net/MobileDataStateTracker.java +42 −0 Original line number Diff line number Diff line Loading @@ -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. Loading core/java/android/net/NetworkStateTracker.java +24 −0 Original line number Diff line number Diff line Loading @@ -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 Loading services/java/com/android/server/ConnectivityService.java +124 −2 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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); Loading Loading @@ -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. Loading Loading @@ -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; } } Loading wifi/java/android/net/wifi/WifiStateTracker.java +18 −0 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading
core/java/android/net/BaseNetworkStateTracker.java +23 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; } }
core/java/android/net/MobileDataStateTracker.java +42 −0 Original line number Diff line number Diff line Loading @@ -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. Loading
core/java/android/net/NetworkStateTracker.java +24 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
services/java/com/android/server/ConnectivityService.java +124 −2 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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); Loading Loading @@ -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. Loading Loading @@ -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; } } Loading
wifi/java/android/net/wifi/WifiStateTracker.java +18 −0 Original line number Diff line number Diff line Loading @@ -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) { Loading