diff options
| author | 2019-04-08 19:06:21 +0800 | |
|---|---|---|
| committer | 2019-04-10 02:37:57 +0000 | |
| commit | 2449e583d876ec78cd6371bd99a4cd0eef922b24 (patch) | |
| tree | 010ff624300fc7f9e113acb67567f512f5d86075 | |
| parent | 43b75cad9eed2d8d12375316a51ed31b3af01400 (diff) | |
Move data stall definitions out from Setting
From mainline perspective, we should use android flag api
instead of using Settings. Thus, move the definitions into
NetworkStack.
Bug:120013793
Test: atest NetworkStackTests SettingsBackupTest
Change-Id: I8e1fb5b47fff3bf624131ba1f5732daabd991e6d
Merged-In: I8e1fb5b47fff3bf624131ba1f5732daabd991e6d
Merged-In: I0a2a1e5d3de14ea86556ca471e26064df3481412
8 files changed, 155 insertions, 103 deletions
diff --git a/api/system-current.txt b/api/system-current.txt index cf55fbef1ff5..99bce130971d 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -4620,11 +4620,6 @@ package android.provider { field public static final String CAPTIVE_PORTAL_USE_HTTPS = "captive_portal_use_https"; field public static final String CARRIER_APP_NAMES = "carrier_app_names"; field public static final String CARRIER_APP_WHITELIST = "carrier_app_whitelist"; - field public static final String DATA_STALL_CONSECUTIVE_DNS_TIMEOUT_THRESHOLD = "data_stall_consecutive_dns_timeout_threshold"; - field public static final String DATA_STALL_EVALUATION_TYPE = "data_stall_evaluation_type"; - field public static final int DATA_STALL_EVALUATION_TYPE_DNS = 1; // 0x1 - field public static final String DATA_STALL_MIN_EVALUATE_INTERVAL = "data_stall_min_evaluate_interval"; - field public static final String DATA_STALL_VALID_DNS_TIME_THRESHOLD = "data_stall_valid_dns_time_threshold"; field public static final String DEFAULT_SM_DP_PLUS = "default_sm_dp_plus"; field public static final String EUICC_PROVISIONED = "euicc_provisioned"; field public static final String INSTALL_CARRIER_APP_NOTIFICATION_PERSISTENT = "install_carrier_app_notification_persistent"; diff --git a/api/test-current.txt b/api/test-current.txt index e813523f46a2..0477c8909fe6 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -1213,11 +1213,6 @@ package android.provider { field public static final String CAPTIVE_PORTAL_OTHER_FALLBACK_URLS = "captive_portal_other_fallback_urls"; field public static final String CAPTIVE_PORTAL_USER_AGENT = "captive_portal_user_agent"; field public static final String CAPTIVE_PORTAL_USE_HTTPS = "captive_portal_use_https"; - field public static final String DATA_STALL_CONSECUTIVE_DNS_TIMEOUT_THRESHOLD = "data_stall_consecutive_dns_timeout_threshold"; - field public static final String DATA_STALL_EVALUATION_TYPE = "data_stall_evaluation_type"; - field public static final int DATA_STALL_EVALUATION_TYPE_DNS = 1; // 0x1 - field public static final String DATA_STALL_MIN_EVALUATE_INTERVAL = "data_stall_min_evaluate_interval"; - field public static final String DATA_STALL_VALID_DNS_TIME_THRESHOLD = "data_stall_valid_dns_time_threshold"; field public static final String HIDDEN_API_BLACKLIST_EXEMPTIONS = "hidden_api_blacklist_exemptions"; field public static final String LOCATION_GLOBAL_KILL_SWITCH = "location_global_kill_switch"; field public static final String LOW_POWER_MODE = "low_power"; diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 8c4d9be0f7f5..34e9eb30721f 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -10465,62 +10465,6 @@ public final class Settings { public static final String CAPTIVE_PORTAL_USER_AGENT = "captive_portal_user_agent"; /** - * The threshold value for the number of consecutive dns timeout events received to be a - * signal of data stall. The number of consecutive timeouts needs to be {@code >=} this - * threshold to be considered a data stall. Set the value to {@code <= 0} to disable. Note - * that the value should be {@code > 0} if the DNS data stall detection is enabled. - * - * @hide - */ - @SystemApi - @TestApi - public static final String DATA_STALL_CONSECUTIVE_DNS_TIMEOUT_THRESHOLD = - "data_stall_consecutive_dns_timeout_threshold"; - - /** - * The minimal time interval in milliseconds for data stall reevaluation. - * - * @hide - */ - @SystemApi - @TestApi - public static final String DATA_STALL_MIN_EVALUATE_INTERVAL = - "data_stall_min_evaluate_interval"; - - /** - * DNS timeouts older than this timeout (in milliseconds) are not considered for detecting - * a data stall. - * - * @hide - */ - @SystemApi - @TestApi - public static final String DATA_STALL_VALID_DNS_TIME_THRESHOLD = - "data_stall_valid_dns_time_threshold"; - - /** - * Which data stall detection signal to use. This is a bitmask constructed by bitwise-or-ing - * (i.e. {@code |}) the DATA_STALL_EVALUATION_TYPE_* values. - * - * Type: int - * Valid values: - * {@link #DATA_STALL_EVALUATION_TYPE_DNS} : Use dns as a signal. - * @hide - */ - @SystemApi - @TestApi - public static final String DATA_STALL_EVALUATION_TYPE = "data_stall_evaluation_type"; - - /** - * Use dns timeout counts to detect data stall. - * - * @hide - */ - @SystemApi - @TestApi - public static final int DATA_STALL_EVALUATION_TYPE_DNS = 1; - - /** * Whether to try cellular data recovery when a bad network is reported. * * @hide diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java index 64dc17828aa5..8e383a56297d 100644 --- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java +++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java @@ -185,11 +185,7 @@ public class SettingsBackupTest { Settings.Global.DATA_ROAMING, Settings.Global.DATA_STALL_ALARM_AGGRESSIVE_DELAY_IN_MS, Settings.Global.DATA_STALL_ALARM_NON_AGGRESSIVE_DELAY_IN_MS, - Settings.Global.DATA_STALL_CONSECUTIVE_DNS_TIMEOUT_THRESHOLD, - Settings.Global.DATA_STALL_EVALUATION_TYPE, - Settings.Global.DATA_STALL_MIN_EVALUATE_INTERVAL, Settings.Global.DATA_STALL_RECOVERY_ON_BAD_NETWORK, - Settings.Global.DATA_STALL_VALID_DNS_TIME_THRESHOLD, Settings.Global.DEBUG_APP, Settings.Global.DEBUG_VIEW_ATTRIBUTES, Settings.Global.DEFAULT_DNS_SERVER, diff --git a/packages/NetworkStack/src/android/net/util/DataStallUtils.java b/packages/NetworkStack/src/android/net/util/DataStallUtils.java new file mode 100644 index 000000000000..b6dbeb19ad1d --- /dev/null +++ b/packages/NetworkStack/src/android/net/util/DataStallUtils.java @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.net.util; + +/** + * Collection of utilities for data stall. + */ +public class DataStallUtils { + /** + * Detect data stall via using dns timeout counts. + */ + public static final int DATA_STALL_EVALUATION_TYPE_DNS = 1; + // Default configuration values for data stall detection. + public static final int DEFAULT_CONSECUTIVE_DNS_TIMEOUT_THRESHOLD = 5; + public static final int DEFAULT_DATA_STALL_MIN_EVALUATE_TIME_MS = 60 * 1000; + public static final int DEFAULT_DATA_STALL_VALID_DNS_TIME_THRESHOLD_MS = 30 * 60 * 1000; + /** + * The threshold value for the number of consecutive dns timeout events received to be a + * signal of data stall. The number of consecutive timeouts needs to be {@code >=} this + * threshold to be considered a data stall. Set the value to {@code <= 0} to disable. Note + * that the value should be {@code > 0} if the DNS data stall detection is enabled. + * + */ + public static final String CONFIG_DATA_STALL_CONSECUTIVE_DNS_TIMEOUT_THRESHOLD = + "data_stall_consecutive_dns_timeout_threshold"; + + /** + * The minimal time interval in milliseconds for data stall reevaluation. + * + */ + public static final String CONFIG_DATA_STALL_MIN_EVALUATE_INTERVAL = + "data_stall_min_evaluate_interval"; + + /** + * DNS timeouts older than this timeout (in milliseconds) are not considered for detecting + * a data stall. + * + */ + public static final String CONFIG_DATA_STALL_VALID_DNS_TIME_THRESHOLD = + "data_stall_valid_dns_time_threshold"; + + /** + * Which data stall detection signal to use. This is a bitmask constructed by bitwise-or-ing + * (i.e. {@code |}) the DATA_STALL_EVALUATION_TYPE_* values. + * + * Type: int + * Valid values: + * {@link #DATA_STALL_EVALUATION_TYPE_DNS} : Use dns as a signal. + */ + public static final String CONFIG_DATA_STALL_EVALUATION_TYPE = "data_stall_evaluation_type"; + public static final int DEFAULT_DATA_STALL_EVALUATION_TYPES = DATA_STALL_EVALUATION_TYPE_DNS; + // The default number of DNS events kept of the log kept for dns signal evaluation. Each event + // is represented by a {@link com.android.server.connectivity.NetworkMonitor#DnsResult} objects. + // It's also the size of array of {@link com.android.server.connectivity.nano.DnsEvent} kept in + // metrics. Note that increasing the size may cause statsd log buffer bust. Need to check the + // design in statsd when you try to increase the size. + public static final int DEFAULT_DNS_LOG_SIZE = 20; +} diff --git a/packages/NetworkStack/src/android/net/util/NetworkStackUtils.java b/packages/NetworkStack/src/android/net/util/NetworkStackUtils.java index ee83a854aa29..fa8f65e1596e 100644 --- a/packages/NetworkStack/src/android/net/util/NetworkStackUtils.java +++ b/packages/NetworkStack/src/android/net/util/NetworkStackUtils.java @@ -31,6 +31,9 @@ import java.util.function.Predicate; * Collection of utilities for the network stack. */ public class NetworkStackUtils { + // TODO: Refer to DeviceConfig definition. + public static final String NAMESPACE_CONNECTIVITY = "connectivity"; + static { System.loadLibrary("networkstackutilsjni"); } @@ -103,6 +106,24 @@ public class NetworkStackUtils { } /** + * Look up the value of a property for a particular namespace from {@link DeviceConfig}. + * @param namespace The namespace containing the property to look up. + * @param name The name of the property to look up. + * @param defaultValue The value to return if the property does not exist or has no non-null + * value. + * @return the corresponding value, or defaultValue if none exists. + */ + public static int getDeviceConfigPropertyInt(@NonNull String namespace, @NonNull String name, + int defaultValue) { + String value = getDeviceConfigProperty(namespace, name, null /* defaultValue */); + try { + return (value != null) ? Integer.parseInt(value) : defaultValue; + } catch (NumberFormatException e) { + return defaultValue; + } + } + + /** * Attaches a socket filter that accepts DHCP packets to the given socket. */ public static native void attachDhcpFilter(FileDescriptor fd) throws SocketException; diff --git a/packages/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java b/packages/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java index 8f7d98876e4c..d34d526cb15d 100644 --- a/packages/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java +++ b/packages/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java @@ -32,8 +32,18 @@ import static android.net.metrics.ValidationProbeEvent.DNS_FAILURE; import static android.net.metrics.ValidationProbeEvent.DNS_SUCCESS; import static android.net.metrics.ValidationProbeEvent.PROBE_FALLBACK; import static android.net.metrics.ValidationProbeEvent.PROBE_PRIVDNS; +import static android.net.util.DataStallUtils.CONFIG_DATA_STALL_CONSECUTIVE_DNS_TIMEOUT_THRESHOLD; +import static android.net.util.DataStallUtils.CONFIG_DATA_STALL_EVALUATION_TYPE; +import static android.net.util.DataStallUtils.CONFIG_DATA_STALL_MIN_EVALUATE_INTERVAL; +import static android.net.util.DataStallUtils.CONFIG_DATA_STALL_VALID_DNS_TIME_THRESHOLD; +import static android.net.util.DataStallUtils.DATA_STALL_EVALUATION_TYPE_DNS; +import static android.net.util.DataStallUtils.DEFAULT_CONSECUTIVE_DNS_TIMEOUT_THRESHOLD; +import static android.net.util.DataStallUtils.DEFAULT_DATA_STALL_EVALUATION_TYPES; +import static android.net.util.DataStallUtils.DEFAULT_DATA_STALL_MIN_EVALUATE_TIME_MS; +import static android.net.util.DataStallUtils.DEFAULT_DATA_STALL_VALID_DNS_TIME_THRESHOLD_MS; +import static android.net.util.DataStallUtils.DEFAULT_DNS_LOG_SIZE; +import static android.net.util.NetworkStackUtils.NAMESPACE_CONNECTIVITY; import static android.net.util.NetworkStackUtils.isEmpty; -import static android.provider.Settings.Global.DATA_STALL_EVALUATION_TYPE_DNS; import android.annotation.NonNull; import android.annotation.Nullable; @@ -60,6 +70,7 @@ import android.net.metrics.NetworkEvent; import android.net.metrics.ValidationProbeEvent; import android.net.shared.NetworkMonitorUtils; import android.net.shared.PrivateDnsConfig; +import android.net.util.NetworkStackUtils; import android.net.util.SharedLog; import android.net.util.Stopwatch; import android.net.wifi.WifiInfo; @@ -126,18 +137,6 @@ public class NetworkMonitor extends StateMachine { private static final int SOCKET_TIMEOUT_MS = 10000; private static final int PROBE_TIMEOUT_MS = 3000; - - // Default configuration values for data stall detection. - private static final int DEFAULT_CONSECUTIVE_DNS_TIMEOUT_THRESHOLD = 5; - private static final int DEFAULT_DATA_STALL_MIN_EVALUATE_TIME_MS = 60 * 1000; - private static final int DEFAULT_DATA_STALL_VALID_DNS_TIME_THRESHOLD_MS = 30 * 60 * 1000; - - private static final int DEFAULT_DATA_STALL_EVALUATION_TYPES = - DATA_STALL_EVALUATION_TYPE_DNS; - // Reevaluate it as intending to increase the number. Larger log size may cause statsd - // log buffer bust and have stats log lost. - private static final int DEFAULT_DNS_LOG_SIZE = 20; - enum EvaluationResult { VALIDATED(true), CAPTIVE_PORTAL(false); @@ -388,7 +387,7 @@ public class NetworkMonitor extends StateMachine { mDnsStallDetector = new DnsStallDetector(mConsecutiveDnsTimeoutThreshold); mDataStallMinEvaluateTime = getDataStallMinEvaluateTime(); mDataStallValidDnsTimeThreshold = getDataStallValidDnsTimeThreshold(); - mDataStallEvaluationType = getDataStallEvalutionType(); + mDataStallEvaluationType = getDataStallEvaluationType(); // Provide empty LinkProperties and NetworkCapabilities to make sure they are never null, // even before notifyNetworkConnected. @@ -1185,25 +1184,26 @@ public class NetworkMonitor extends StateMachine { } private int getConsecutiveDnsTimeoutThreshold() { - return mDependencies.getSetting(mContext, - Settings.Global.DATA_STALL_CONSECUTIVE_DNS_TIMEOUT_THRESHOLD, + return mDependencies.getDeviceConfigPropertyInt(NAMESPACE_CONNECTIVITY, + CONFIG_DATA_STALL_CONSECUTIVE_DNS_TIMEOUT_THRESHOLD, DEFAULT_CONSECUTIVE_DNS_TIMEOUT_THRESHOLD); } private int getDataStallMinEvaluateTime() { - return mDependencies.getSetting(mContext, - Settings.Global.DATA_STALL_MIN_EVALUATE_INTERVAL, + return mDependencies.getDeviceConfigPropertyInt(NAMESPACE_CONNECTIVITY, + CONFIG_DATA_STALL_MIN_EVALUATE_INTERVAL, DEFAULT_DATA_STALL_MIN_EVALUATE_TIME_MS); } private int getDataStallValidDnsTimeThreshold() { - return mDependencies.getSetting(mContext, - Settings.Global.DATA_STALL_VALID_DNS_TIME_THRESHOLD, + return mDependencies.getDeviceConfigPropertyInt(NAMESPACE_CONNECTIVITY, + CONFIG_DATA_STALL_VALID_DNS_TIME_THRESHOLD, DEFAULT_DATA_STALL_VALID_DNS_TIME_THRESHOLD_MS); } - private int getDataStallEvalutionType() { - return mDependencies.getSetting(mContext, Settings.Global.DATA_STALL_EVALUATION_TYPE, + private int getDataStallEvaluationType() { + return mDependencies.getDeviceConfigPropertyInt(NAMESPACE_CONNECTIVITY, + CONFIG_DATA_STALL_EVALUATION_TYPE, DEFAULT_DATA_STALL_EVALUATION_TYPES); } @@ -1726,6 +1726,33 @@ public class NetworkMonitor extends StateMachine { return value != null ? value : defaultValue; } + /** + * Look up the value of a property in DeviceConfig. + * @param namespace The namespace containing the property to look up. + * @param name The name of the property to look up. + * @param defaultValue The value to return if the property does not exist or has no non-null + * value. + * @return the corresponding value, or defaultValue if none exists. + */ + @Nullable + public String getDeviceConfigProperty(@NonNull String namespace, @NonNull String name, + @Nullable String defaultValue) { + return NetworkStackUtils.getDeviceConfigProperty(namespace, name, defaultValue); + } + + /** + * Look up the value of a property in DeviceConfig. + * @param namespace The namespace containing the property to look up. + * @param name The name of the property to look up. + * @param defaultValue The value to return if the property does not exist or has no non-null + * value. + * @return the corresponding value, or defaultValue if none exists. + */ + public int getDeviceConfigPropertyInt(@NonNull String namespace, @NonNull String name, + int defaultValue) { + return NetworkStackUtils.getDeviceConfigPropertyInt(namespace, name, defaultValue); + } + public static final Dependencies DEFAULT = new Dependencies(); } diff --git a/packages/NetworkStack/tests/src/com/android/server/connectivity/NetworkMonitorTest.java b/packages/NetworkStack/tests/src/com/android/server/connectivity/NetworkMonitorTest.java index 6665aae65d90..9f6c7f89d71a 100644 --- a/packages/NetworkStack/tests/src/com/android/server/connectivity/NetworkMonitorTest.java +++ b/packages/NetworkStack/tests/src/com/android/server/connectivity/NetworkMonitorTest.java @@ -21,7 +21,11 @@ import static android.net.INetworkMonitor.NETWORK_TEST_RESULT_INVALID; import static android.net.INetworkMonitor.NETWORK_TEST_RESULT_PARTIAL_CONNECTIVITY; import static android.net.INetworkMonitor.NETWORK_TEST_RESULT_VALID; import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET; -import static android.provider.Settings.Global.DATA_STALL_EVALUATION_TYPE_DNS; +import static android.net.util.DataStallUtils.CONFIG_DATA_STALL_CONSECUTIVE_DNS_TIMEOUT_THRESHOLD; +import static android.net.util.DataStallUtils.CONFIG_DATA_STALL_EVALUATION_TYPE; +import static android.net.util.DataStallUtils.CONFIG_DATA_STALL_MIN_EVALUATE_INTERVAL; +import static android.net.util.DataStallUtils.CONFIG_DATA_STALL_VALID_DNS_TIME_THRESHOLD; +import static android.net.util.DataStallUtils.DATA_STALL_EVALUATION_TYPE_DNS; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; @@ -114,7 +118,6 @@ public class NetworkMonitorTest { private @Captor ArgumentCaptor<String> mNetworkTestedRedirectUrlCaptor; private static final int TEST_NETID = 4242; - private static final String TEST_HTTP_URL = "http://www.google.com/gen_204"; private static final String TEST_HTTPS_URL = "https://www.google.com/gen_204"; private static final String TEST_FALLBACK_URL = "http://fallback.google.com/gen_204"; @@ -593,24 +596,23 @@ public class NetworkMonitorTest { } private void setDataStallEvaluationType(int type) { - when(mDependencies.getSetting(any(), - eq(Settings.Global.DATA_STALL_EVALUATION_TYPE), anyInt())).thenReturn(type); + when(mDependencies.getDeviceConfigPropertyInt(any(), + eq(CONFIG_DATA_STALL_EVALUATION_TYPE), anyInt())).thenReturn(type); } private void setMinDataStallEvaluateInterval(int time) { - when(mDependencies.getSetting(any(), - eq(Settings.Global.DATA_STALL_MIN_EVALUATE_INTERVAL), anyInt())).thenReturn(time); + when(mDependencies.getDeviceConfigPropertyInt(any(), + eq(CONFIG_DATA_STALL_MIN_EVALUATE_INTERVAL), anyInt())).thenReturn(time); } private void setValidDataStallDnsTimeThreshold(int time) { - when(mDependencies.getSetting(any(), - eq(Settings.Global.DATA_STALL_VALID_DNS_TIME_THRESHOLD), anyInt())).thenReturn(time); + when(mDependencies.getDeviceConfigPropertyInt(any(), + eq(CONFIG_DATA_STALL_VALID_DNS_TIME_THRESHOLD), anyInt())).thenReturn(time); } private void setConsecutiveDnsTimeoutThreshold(int num) { - when(mDependencies.getSetting(any(), - eq(Settings.Global.DATA_STALL_CONSECUTIVE_DNS_TIMEOUT_THRESHOLD), anyInt())) - .thenReturn(num); + when(mDependencies.getDeviceConfigPropertyInt(any(), + eq(CONFIG_DATA_STALL_CONSECUTIVE_DNS_TIMEOUT_THRESHOLD), anyInt())).thenReturn(num); } private void setFallbackUrl(String url) { |