diff options
author | Chiachang Wang <chiachangwang@google.com> | 2019-10-23 21:23:36 +0800 |
---|---|---|
committer | Chiachang Wang <chiachangwang@google.com> | 2019-10-23 21:25:03 +0800 |
commit | ed5f519883cd4257881ca8f46961e8d4189feed8 (patch) | |
tree | 1dfb10b345581fca32b443b43f5c12dac98e29f1 | |
parent | 8714a70f652664b3b1540568f3f269deddda678e (diff) |
Keep only one CMD_EVALUATE_PRIVATE_DNS in the queue
If a user changes the private DNS setting while NetworkMonitor
are in EvaluatingPrivateDnsState, new failure caused by
recongiguration will put into the message queue. State machine
will get multiple CMD_EVALUATE_PRIVATE_DNS events with different
delay timer which may not work as expected.
Test: atest NetworkStackTests:\
com.android.server.connectivity.NetworkMonitorTest
Bug: 139797781
Change-Id: I7f4e5642b9734daddfefc9c5ef25890aa8d3d64b
-rw-r--r-- | src/com/android/server/connectivity/NetworkMonitor.java | 11 | ||||
-rw-r--r-- | tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java | 12 |
2 files changed, 11 insertions, 12 deletions
diff --git a/src/com/android/server/connectivity/NetworkMonitor.java b/src/com/android/server/connectivity/NetworkMonitor.java index 7cabb1e..e08170a 100644 --- a/src/com/android/server/connectivity/NetworkMonitor.java +++ b/src/com/android/server/connectivity/NetworkMonitor.java @@ -681,6 +681,8 @@ public class NetworkMonitor extends StateMachine { // no resolved IP addresses, IPs unreachable, // port 853 unreachable, port 853 is not running a // DNS-over-TLS server, et cetera). + // Cancel any outstanding CMD_EVALUATE_PRIVATE_DNS. + removeMessages(CMD_EVALUATE_PRIVATE_DNS); sendMessage(CMD_EVALUATE_PRIVATE_DNS); break; } @@ -1042,6 +1044,11 @@ public class NetworkMonitor extends StateMachine { // All good! transitionTo(mValidatedState); break; + case CMD_PRIVATE_DNS_SETTINGS_CHANGED: + // When settings change the reevaluation timer must be reset. + mPrivateDnsReevalDelayMs = INITIAL_REEVALUATE_DELAY_MS; + // Let the message bubble up and be handled by parent states as usual. + return NOT_HANDLED; default: return NOT_HANDLED; } @@ -1094,10 +1101,6 @@ public class NetworkMonitor extends StateMachine { // transitioning back to EvaluatingState, to perhaps give ourselves // the opportunity to (re)detect a captive portal or something. // - // TODO: distinguish between CMD_EVALUATE_PRIVATE_DNS messages that are caused by server - // lookup failures (which should continue to do exponential backoff) and - // CMD_EVALUATE_PRIVATE_DNS messages that are caused by user reconfiguration (which - // should be processed immediately. sendMessageDelayed(CMD_EVALUATE_PRIVATE_DNS, mPrivateDnsReevalDelayMs); mPrivateDnsReevalDelayMs *= 2; if (mPrivateDnsReevalDelayMs > MAX_REEVALUATE_DELAY_MS) { diff --git a/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java b/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java index 6eeadf5..49a2ce3 100644 --- a/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java +++ b/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java @@ -868,10 +868,8 @@ public class NetworkMonitorTest { WrappedNetworkMonitor wnm = makeNotMeteredNetworkMonitor(); wnm.notifyPrivateDnsSettingsChanged(new PrivateDnsConfig("dns.google", new InetAddress[0])); wnm.notifyNetworkConnected(TEST_LINK_PROPERTIES, NOT_METERED_CAPABILITIES); - verify(mCallbacks, timeout(HANDLER_TIMEOUT_MS).atLeastOnce()) - .notifyNetworkTested( - eq(NETWORK_VALIDATION_PROBE_DNS | NETWORK_VALIDATION_PROBE_HTTPS), - eq(null)); + verify(mCallbacks, timeout(HANDLER_TIMEOUT_MS)).notifyNetworkTested( + eq(NETWORK_VALIDATION_PROBE_DNS | NETWORK_VALIDATION_PROBE_HTTPS), eq(null)); verify(mCallbacks, timeout(HANDLER_TIMEOUT_MS).times(1)).notifyProbeStatusChanged( eq(VALIDATION_RESULT_PRIVDNS_VALID), eq(NETWORK_VALIDATION_PROBE_DNS | NETWORK_VALIDATION_PROBE_HTTPS)); @@ -907,10 +905,8 @@ public class NetworkMonitorTest { mFakeDns.setNonBypassPrivateDnsWorking(false); wnm.notifyPrivateDnsSettingsChanged(new PrivateDnsConfig("dns.google", new InetAddress[0])); - verify(mCallbacks, timeout(HANDLER_TIMEOUT_MS).atLeastOnce()) - .notifyNetworkTested( - eq(NETWORK_VALIDATION_PROBE_DNS | NETWORK_VALIDATION_PROBE_HTTPS), - eq(null)); + verify(mCallbacks, timeout(HANDLER_TIMEOUT_MS)).notifyNetworkTested( + eq(NETWORK_VALIDATION_PROBE_DNS | NETWORK_VALIDATION_PROBE_HTTPS), eq(null)); // NetworkMonitor will check if the probes has changed or not, if the probes has not // changed, the callback won't be fired. verify(mCallbacks, never()).notifyProbeStatusChanged( |