Loading services/core/java/com/android/server/connectivity/NetworkMonitor.java +50 −29 Original line number Diff line number Diff line Loading @@ -126,21 +126,21 @@ public class NetworkMonitor extends StateMachine { private static final int DEFAULT_DATA_STALL_EVALUATION_TYPES = (1 << DATA_STALL_EVALUATION_TYPE_DNS); static enum EvaluationResult { enum EvaluationResult { VALIDATED(true), CAPTIVE_PORTAL(false); final boolean isValidated; final boolean mIsValidated; EvaluationResult(boolean isValidated) { this.isValidated = isValidated; this.mIsValidated = isValidated; } } static enum ValidationStage { enum ValidationStage { FIRST_VALIDATION(true), REVALIDATION(false); final boolean isFirstValidation; final boolean mIsFirstValidation; ValidationStage(boolean isFirstValidation) { this.isFirstValidation = isFirstValidation; this.mIsFirstValidation = isFirstValidation; } } Loading Loading @@ -393,10 +393,17 @@ public class NetworkMonitor extends StateMachine { start(); } /** * Request the NetworkMonitor to reevaluate the network. */ public void forceReevaluation(int responsibleUid) { sendMessage(CMD_FORCE_REEVALUATION, responsibleUid, 0); } /** * Send a notification to NetworkMonitor indicating that private DNS settings have changed. * @param newCfg The new private DNS configuration. */ public void notifyPrivateDnsSettingsChanged(PrivateDnsConfig newCfg) { // Cancel any outstanding resolutions. removeMessages(CMD_PRIVATE_DNS_SETTINGS_CHANGED); Loading Loading @@ -655,8 +662,9 @@ public class NetworkMonitor extends StateMachine { public boolean processMessage(Message message) { switch (message.what) { case CMD_REEVALUATE: if (message.arg1 != mReevaluateToken || mUserDoesNotWant) if (message.arg1 != mReevaluateToken || mUserDoesNotWant) { return HANDLED; } // Don't bother validating networks that don't satisfy the default request. // This includes: // - VPNs which can be considered explicitly desired by the user and the Loading Loading @@ -813,9 +821,9 @@ public class NetworkMonitor extends StateMachine { } private boolean isStrictModeHostnameResolved() { return (mPrivateDnsConfig != null) && mPrivateDnsConfig.hostname.equals(mPrivateDnsProviderHostname) && (mPrivateDnsConfig.ips.length > 0); return (mPrivateDnsConfig != null) && mPrivateDnsConfig.hostname.equals(mPrivateDnsProviderHostname) && (mPrivateDnsConfig.ips.length > 0); } private void resolveStrictModeHostname() { Loading Loading @@ -852,9 +860,9 @@ public class NetworkMonitor extends StateMachine { private boolean sendPrivateDnsProbe() { // q.v. system/netd/server/dns/DnsTlsTransport.cpp final String ONE_TIME_HOSTNAME_SUFFIX = "-dnsotls-ds.metric.gstatic.com"; final String host = UUID.randomUUID().toString().substring(0, 8) + ONE_TIME_HOSTNAME_SUFFIX; final String oneTimeHostnameSuffix = "-dnsotls-ds.metric.gstatic.com"; final String host = UUID.randomUUID().toString().substring(0, 8) + oneTimeHostnameSuffix; final Stopwatch watch = new Stopwatch().start(); try { final InetAddress[] ips = mNetworkAgentInfo.network().getAllByName(host); Loading Loading @@ -966,7 +974,7 @@ public class NetworkMonitor extends StateMachine { // most one per address family. This ensures we only wait up to 20 seconds for TCP connections // to complete, regardless of how many IP addresses a host has. private static class OneAddressPerFamilyNetwork extends Network { public OneAddressPerFamilyNetwork(Network network) { OneAddressPerFamilyNetwork(Network network) { // Always bypass Private DNS. super(network.getPrivateDnsBypassingCopy()); } Loading Loading @@ -1000,7 +1008,8 @@ public class NetworkMonitor extends StateMachine { } public boolean getWifiScansAlwaysAvailableDisabled() { return mDependencies.getSetting(mContext, Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0) == 0; return mDependencies.getSetting( mContext, Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0) == 0; } private String getCaptivePortalServerHttpsUrl() { Loading Loading @@ -1246,10 +1255,10 @@ public class NetworkMonitor extends StateMachine { // Time how long it takes to get a response to our request long responseTimestamp = SystemClock.elapsedRealtime(); validationLog(probeType, url, "time=" + (responseTimestamp - requestTimestamp) + "ms" + " ret=" + httpResponseCode + " request=" + requestHeader + " headers=" + urlConnection.getHeaderFields()); validationLog(probeType, url, "time=" + (responseTimestamp - requestTimestamp) + "ms" + " ret=" + httpResponseCode + " request=" + requestHeader + " headers=" + urlConnection.getHeaderFields()); // NOTE: We may want to consider an "HTTP/1.0 204" response to be a captive // portal. The only example of this seen so far was a captive portal. For // the time being go with prior behavior of assuming it's not a captive Loading Loading @@ -1309,7 +1318,7 @@ public class NetworkMonitor extends StateMachine { private final boolean mIsHttps; private volatile CaptivePortalProbeResult mResult = CaptivePortalProbeResult.FAILED; public ProbeThread(boolean isHttps) { ProbeThread(boolean isHttps) { mIsHttps = isHttps; } Loading Loading @@ -1443,8 +1452,10 @@ public class NetworkMonitor extends StateMachine { if (cellInfo.isRegistered()) { numRegisteredCellInfo++; if (numRegisteredCellInfo > 1) { if (VDBG) logw("more than one registered CellInfo." + " Can't tell which is active. Bailing."); if (VDBG) { logw("more than one registered CellInfo." + " Can't tell which is active. Bailing."); } return; } if (cellInfo instanceof CellInfoCdma) { Loading Loading @@ -1492,14 +1503,14 @@ public class NetworkMonitor extends StateMachine { } private int networkEventType(ValidationStage s, EvaluationResult r) { if (s.isFirstValidation) { if (r.isValidated) { if (s.mIsFirstValidation) { if (r.mIsValidated) { return NetworkEvent.NETWORK_FIRST_VALIDATION_SUCCESS; } else { return NetworkEvent.NETWORK_FIRST_VALIDATION_PORTAL_FOUND; } } else { if (r.isValidated) { if (r.mIsValidated) { return NetworkEvent.NETWORK_REVALIDATION_SUCCESS; } else { return NetworkEvent.NETWORK_REVALIDATION_PORTAL_FOUND; Loading @@ -1517,7 +1528,7 @@ public class NetworkMonitor extends StateMachine { private void logValidationProbe(long durationMs, int probeType, int probeResult) { int[] transports = mNetworkAgentInfo.networkCapabilities.getTransportTypes(); boolean isFirstValidation = validationStage().isFirstValidation; boolean isFirstValidation = validationStage().mIsFirstValidation; ValidationProbeEvent ev = new ValidationProbeEvent(); ev.probeType = ValidationProbeEvent.makeProbeType(probeType, isFirstValidation); ev.returnCode = probeResult; Loading @@ -1535,10 +1546,20 @@ public class NetworkMonitor extends StateMachine { return new Random(); } /** * Get the value of a global integer setting. * @param symbol Name of the setting * @param defaultValue Value to return if the setting is not defined. */ public int getSetting(Context context, String symbol, int defaultValue) { return Settings.Global.getInt(context.getContentResolver(), symbol, defaultValue); } /** * Get the value of a global String setting. * @param symbol Name of the setting * @param defaultValue Value to return if the setting is not defined. */ public String getSetting(Context context, String symbol, String defaultValue) { final String value = Settings.Global.getString(context.getContentResolver(), symbol); return value != null ? value : defaultValue; Loading Loading
services/core/java/com/android/server/connectivity/NetworkMonitor.java +50 −29 Original line number Diff line number Diff line Loading @@ -126,21 +126,21 @@ public class NetworkMonitor extends StateMachine { private static final int DEFAULT_DATA_STALL_EVALUATION_TYPES = (1 << DATA_STALL_EVALUATION_TYPE_DNS); static enum EvaluationResult { enum EvaluationResult { VALIDATED(true), CAPTIVE_PORTAL(false); final boolean isValidated; final boolean mIsValidated; EvaluationResult(boolean isValidated) { this.isValidated = isValidated; this.mIsValidated = isValidated; } } static enum ValidationStage { enum ValidationStage { FIRST_VALIDATION(true), REVALIDATION(false); final boolean isFirstValidation; final boolean mIsFirstValidation; ValidationStage(boolean isFirstValidation) { this.isFirstValidation = isFirstValidation; this.mIsFirstValidation = isFirstValidation; } } Loading Loading @@ -393,10 +393,17 @@ public class NetworkMonitor extends StateMachine { start(); } /** * Request the NetworkMonitor to reevaluate the network. */ public void forceReevaluation(int responsibleUid) { sendMessage(CMD_FORCE_REEVALUATION, responsibleUid, 0); } /** * Send a notification to NetworkMonitor indicating that private DNS settings have changed. * @param newCfg The new private DNS configuration. */ public void notifyPrivateDnsSettingsChanged(PrivateDnsConfig newCfg) { // Cancel any outstanding resolutions. removeMessages(CMD_PRIVATE_DNS_SETTINGS_CHANGED); Loading Loading @@ -655,8 +662,9 @@ public class NetworkMonitor extends StateMachine { public boolean processMessage(Message message) { switch (message.what) { case CMD_REEVALUATE: if (message.arg1 != mReevaluateToken || mUserDoesNotWant) if (message.arg1 != mReevaluateToken || mUserDoesNotWant) { return HANDLED; } // Don't bother validating networks that don't satisfy the default request. // This includes: // - VPNs which can be considered explicitly desired by the user and the Loading Loading @@ -813,9 +821,9 @@ public class NetworkMonitor extends StateMachine { } private boolean isStrictModeHostnameResolved() { return (mPrivateDnsConfig != null) && mPrivateDnsConfig.hostname.equals(mPrivateDnsProviderHostname) && (mPrivateDnsConfig.ips.length > 0); return (mPrivateDnsConfig != null) && mPrivateDnsConfig.hostname.equals(mPrivateDnsProviderHostname) && (mPrivateDnsConfig.ips.length > 0); } private void resolveStrictModeHostname() { Loading Loading @@ -852,9 +860,9 @@ public class NetworkMonitor extends StateMachine { private boolean sendPrivateDnsProbe() { // q.v. system/netd/server/dns/DnsTlsTransport.cpp final String ONE_TIME_HOSTNAME_SUFFIX = "-dnsotls-ds.metric.gstatic.com"; final String host = UUID.randomUUID().toString().substring(0, 8) + ONE_TIME_HOSTNAME_SUFFIX; final String oneTimeHostnameSuffix = "-dnsotls-ds.metric.gstatic.com"; final String host = UUID.randomUUID().toString().substring(0, 8) + oneTimeHostnameSuffix; final Stopwatch watch = new Stopwatch().start(); try { final InetAddress[] ips = mNetworkAgentInfo.network().getAllByName(host); Loading Loading @@ -966,7 +974,7 @@ public class NetworkMonitor extends StateMachine { // most one per address family. This ensures we only wait up to 20 seconds for TCP connections // to complete, regardless of how many IP addresses a host has. private static class OneAddressPerFamilyNetwork extends Network { public OneAddressPerFamilyNetwork(Network network) { OneAddressPerFamilyNetwork(Network network) { // Always bypass Private DNS. super(network.getPrivateDnsBypassingCopy()); } Loading Loading @@ -1000,7 +1008,8 @@ public class NetworkMonitor extends StateMachine { } public boolean getWifiScansAlwaysAvailableDisabled() { return mDependencies.getSetting(mContext, Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0) == 0; return mDependencies.getSetting( mContext, Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0) == 0; } private String getCaptivePortalServerHttpsUrl() { Loading Loading @@ -1246,10 +1255,10 @@ public class NetworkMonitor extends StateMachine { // Time how long it takes to get a response to our request long responseTimestamp = SystemClock.elapsedRealtime(); validationLog(probeType, url, "time=" + (responseTimestamp - requestTimestamp) + "ms" + " ret=" + httpResponseCode + " request=" + requestHeader + " headers=" + urlConnection.getHeaderFields()); validationLog(probeType, url, "time=" + (responseTimestamp - requestTimestamp) + "ms" + " ret=" + httpResponseCode + " request=" + requestHeader + " headers=" + urlConnection.getHeaderFields()); // NOTE: We may want to consider an "HTTP/1.0 204" response to be a captive // portal. The only example of this seen so far was a captive portal. For // the time being go with prior behavior of assuming it's not a captive Loading Loading @@ -1309,7 +1318,7 @@ public class NetworkMonitor extends StateMachine { private final boolean mIsHttps; private volatile CaptivePortalProbeResult mResult = CaptivePortalProbeResult.FAILED; public ProbeThread(boolean isHttps) { ProbeThread(boolean isHttps) { mIsHttps = isHttps; } Loading Loading @@ -1443,8 +1452,10 @@ public class NetworkMonitor extends StateMachine { if (cellInfo.isRegistered()) { numRegisteredCellInfo++; if (numRegisteredCellInfo > 1) { if (VDBG) logw("more than one registered CellInfo." + " Can't tell which is active. Bailing."); if (VDBG) { logw("more than one registered CellInfo." + " Can't tell which is active. Bailing."); } return; } if (cellInfo instanceof CellInfoCdma) { Loading Loading @@ -1492,14 +1503,14 @@ public class NetworkMonitor extends StateMachine { } private int networkEventType(ValidationStage s, EvaluationResult r) { if (s.isFirstValidation) { if (r.isValidated) { if (s.mIsFirstValidation) { if (r.mIsValidated) { return NetworkEvent.NETWORK_FIRST_VALIDATION_SUCCESS; } else { return NetworkEvent.NETWORK_FIRST_VALIDATION_PORTAL_FOUND; } } else { if (r.isValidated) { if (r.mIsValidated) { return NetworkEvent.NETWORK_REVALIDATION_SUCCESS; } else { return NetworkEvent.NETWORK_REVALIDATION_PORTAL_FOUND; Loading @@ -1517,7 +1528,7 @@ public class NetworkMonitor extends StateMachine { private void logValidationProbe(long durationMs, int probeType, int probeResult) { int[] transports = mNetworkAgentInfo.networkCapabilities.getTransportTypes(); boolean isFirstValidation = validationStage().isFirstValidation; boolean isFirstValidation = validationStage().mIsFirstValidation; ValidationProbeEvent ev = new ValidationProbeEvent(); ev.probeType = ValidationProbeEvent.makeProbeType(probeType, isFirstValidation); ev.returnCode = probeResult; Loading @@ -1535,10 +1546,20 @@ public class NetworkMonitor extends StateMachine { return new Random(); } /** * Get the value of a global integer setting. * @param symbol Name of the setting * @param defaultValue Value to return if the setting is not defined. */ public int getSetting(Context context, String symbol, int defaultValue) { return Settings.Global.getInt(context.getContentResolver(), symbol, defaultValue); } /** * Get the value of a global String setting. * @param symbol Name of the setting * @param defaultValue Value to return if the setting is not defined. */ public String getSetting(Context context, String symbol, String defaultValue) { final String value = Settings.Global.getString(context.getContentResolver(), symbol); return value != null ? value : defaultValue; Loading