From abd1740f753ac14e9dec8fced8d3de5059122c2a Mon Sep 17 00:00:00 2001 From: vandwalle Date: Thu, 4 Dec 2014 23:26:03 -0800 Subject: reenable disabled config after a few minutes This change also loose stale user selection which prevents device to re-join potentially reenabled configs Bug:18571727 Change-Id: I0acacd3fb1fbb64a48d0407d7b9e4e5403a93726 --- .../server/wifi/WifiAutoJoinController.java | 34 ++++++++++++++++++++++ .../com/android/server/wifi/WifiConfigStore.java | 3 ++ .../com/android/server/wifi/WifiStateMachine.java | 10 +++++-- 3 files changed, 45 insertions(+), 2 deletions(-) (limited to 'service') diff --git a/service/java/com/android/server/wifi/WifiAutoJoinController.java b/service/java/com/android/server/wifi/WifiAutoJoinController.java index a971dcd56..b8f68a1c8 100644 --- a/service/java/com/android/server/wifi/WifiAutoJoinController.java +++ b/service/java/com/android/server/wifi/WifiAutoJoinController.java @@ -1261,6 +1261,40 @@ public class WifiAutoJoinController { if (config.autoJoinStatus >= WifiConfiguration.AUTO_JOIN_DISABLED_ON_AUTH_FAILURE) { + // Wait for 5 minutes before reenabling config that have known, + // repeated connection or DHCP failures + if (config.disableReason == WifiConfiguration.DISABLED_DHCP_FAILURE + || config.disableReason + == WifiConfiguration.DISABLED_ASSOCIATION_REJECT + || config.disableReason + == WifiConfiguration.DISABLED_AUTH_FAILURE) { + if (config.blackListTimestamp == 0 + || (config.blackListTimestamp > now)) { + // Sanitize the timestamp + config.blackListTimestamp = now; + } + if ((now - config.blackListTimestamp) > + mWifiConfigStore.wifiConfigBlacklistMinTimeMilli) { + // Re-enable the WifiConfiguration + config.status = WifiConfiguration.Status.ENABLED; + + // Reset the blacklist condition + config.numConnectionFailures = 0; + config.numIpConfigFailures = 0; + config.numAuthFailures = 0; + config.setAutoJoinStatus(WifiConfiguration.AUTO_JOIN_ENABLED); + + config.dirty = true; + } else { + if (VDBG) { + long delay = mWifiConfigStore.wifiConfigBlacklistMinTimeMilli + - (now - config.blackListTimestamp); + logDbg("attemptautoJoin " + config.configKey() + + " dont unblacklist yet, waiting for " + + delay + " ms"); + } + } + } // Avoid networks disabled because of AUTH failure altogether if (DBG) { logDbg("attemptAutoJoin skip candidate due to auto join status " diff --git a/service/java/com/android/server/wifi/WifiConfigStore.java b/service/java/com/android/server/wifi/WifiConfigStore.java index c7b8ab301..ffa4a9f50 100644 --- a/service/java/com/android/server/wifi/WifiConfigStore.java +++ b/service/java/com/android/server/wifi/WifiConfigStore.java @@ -346,6 +346,9 @@ public class WifiConfigStore extends IpConfigStore { public int maxConnectionErrorsToBlacklist = 4; public int wifiConfigBlacklistMinTimeMilli = 1000 * 60 * 5; + // How long a disconnected config remain considered as the last user selection + public int wifiConfigLastSelectionHysteresis = 1000 * 60 * 3; + // Boost RSSI values of associated networks public int associatedHysteresisHigh = +14; public int associatedHysteresisLow = +8; diff --git a/service/java/com/android/server/wifi/WifiStateMachine.java b/service/java/com/android/server/wifi/WifiStateMachine.java index 09920f5d1..7b554dc67 100644 --- a/service/java/com/android/server/wifi/WifiStateMachine.java +++ b/service/java/com/android/server/wifi/WifiStateMachine.java @@ -3389,8 +3389,8 @@ public class WifiStateMachine extends StateMachine { if (attemptAutoJoin) { messageHandlingStatus = MESSAGE_HANDLING_STATUS_PROCESSED; } - // Loose last selected configuration if we have been disconnected for 30 minutes - if (getDisconnectedTimeMilli() > 1000 * 60 * 30) { + // Loose last selected configuration if we have been disconnected for 5 minutes + if (getDisconnectedTimeMilli() > mWifiConfigStore.wifiConfigLastSelectionHysteresis) { mWifiConfigStore.setLastSelectedConfiguration(WifiConfiguration.INVALID_NETWORK_ID); } @@ -5057,6 +5057,8 @@ public class WifiStateMachine extends StateMachine { break; case CMD_SET_OPERATIONAL_MODE: mOperationalMode = message.arg1; + mWifiConfigStore. + setLastSelectedConfiguration(WifiConfiguration.INVALID_NETWORK_ID); break; case CMD_TARGET_BSSID: // Trying to associate to this BSSID @@ -5643,6 +5645,10 @@ public class WifiStateMachine extends StateMachine { startScan(ENABLE_WIFI, 0, null, null); } + // Loose last selection choice since user toggled WiFi + mWifiConfigStore. + setLastSelectedConfiguration(WifiConfiguration.INVALID_NETWORK_ID); + mOperationalMode = CONNECT_MODE; transitionTo(mDisconnectedState); } else { -- cgit v1.2.3