diff options
author | Roger Wang <wangroger@google.com> | 2019-04-19 17:12:13 +0800 |
---|---|---|
committer | Roger Wang <wangroger@google.com> | 2019-04-26 07:59:41 +0800 |
commit | c8fe6fcfb89325ca1a685acc3ba4f2dd859402cd (patch) | |
tree | 50cff14915f17da216acd53f87dd93a42f91d51b /service | |
parent | 84e590ea26498f9a1baa1ec1ee711dd31952fc74 (diff) |
LRWD: Restrict LRWD auto bug report notification
1. Avoid LRWD from triggering a bugreport unnecessarily.
Bugreport triggered only if device connected to same
SSID after LRWD recovery.
2. Add locallog mechanism
Bug: 130148428
Bug: 119887816
Test: Manual test
Test: ./frameworks/opt/net/wifi/tests/wifitests/runtests.sh
OK (3689 tests)
Change-Id: I206ba630297b9e5cbfaf48fd1f9489ee2849db52
Diffstat (limited to 'service')
-rw-r--r-- | service/java/com/android/server/wifi/ClientModeImpl.java | 1 | ||||
-rw-r--r-- | service/java/com/android/server/wifi/WifiLastResortWatchdog.java | 76 |
2 files changed, 65 insertions, 12 deletions
diff --git a/service/java/com/android/server/wifi/ClientModeImpl.java b/service/java/com/android/server/wifi/ClientModeImpl.java index 0bdd37b1a..3cdc2ef74 100644 --- a/service/java/com/android/server/wifi/ClientModeImpl.java +++ b/service/java/com/android/server/wifi/ClientModeImpl.java @@ -2042,6 +2042,7 @@ public class ClientModeImpl extends StateMachine { mWifiConnectivityManager.dump(fd, pw, args); mWifiInjector.getWakeupController().dump(fd, pw, args); mLinkProbeManager.dump(fd, pw, args); + mWifiInjector.getWifiLastResortWatchdog().dump(fd, pw, args); } /** diff --git a/service/java/com/android/server/wifi/WifiLastResortWatchdog.java b/service/java/com/android/server/wifi/WifiLastResortWatchdog.java index 8ebd938b3..6889b5016 100644 --- a/service/java/com/android/server/wifi/WifiLastResortWatchdog.java +++ b/service/java/com/android/server/wifi/WifiLastResortWatchdog.java @@ -20,11 +20,15 @@ import android.net.wifi.ScanResult; import android.net.wifi.WifiConfiguration; import android.os.Handler; import android.os.Looper; +import android.text.TextUtils; +import android.util.LocalLog; import android.util.Log; import android.util.Pair; import com.android.internal.annotations.VisibleForTesting; +import java.io.FileDescriptor; +import java.io.PrintWriter; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -90,6 +94,7 @@ public class WifiLastResortWatchdog { // successfully connecting or a new network (SSID) becomes available to connect to. private boolean mWatchdogAllowedToTrigger = true; private long mTimeLastTrigger = 0; + private String mSsidLastTrigger = null; private WifiInjector mWifiInjector; private WifiMetrics mWifiMetrics; @@ -101,6 +106,11 @@ public class WifiLastResortWatchdog { // did not fix the problem private boolean mWatchdogFixedWifi = true; + /** + * Local log used for debugging any WifiLastResortWatchdog issues. + */ + private final LocalLog mLocalLog = new LocalLog(100); + WifiLastResortWatchdog(WifiInjector wifiInjector, Clock clock, WifiMetrics wifiMetrics, ClientModeImpl clientModeImpl, Looper clientModeImplLooper) { mWifiInjector = wifiInjector; @@ -154,6 +164,7 @@ public class WifiLastResortWatchdog { if (mTimeLastTrigger == 0 || (mClock.getElapsedSinceBootMillis() - mTimeLastTrigger) >= LAST_TRIGGER_TIMEOUT_MILLIS) { + localLog("updateAvailableNetworks: setWatchdogTriggerEnabled to true"); setWatchdogTriggerEnabled(true); } } else { @@ -231,10 +242,13 @@ public class WifiLastResortWatchdog { } if (isRestartNeeded) { // Stop the watchdog from triggering until re-enabled + localLog("noteConnectionFailureAndTriggerIfNeeded: setWatchdogTriggerEnabled to false"); setWatchdogTriggerEnabled(false); mWatchdogFixedWifi = true; - Log.e(TAG, "Watchdog triggering recovery"); + loge("Watchdog triggering recovery"); + mSsidLastTrigger = ssid; mTimeLastTrigger = mClock.getElapsedSinceBootMillis(); + localLog(toString()); mWifiInjector.getSelfRecovery().trigger(SelfRecovery.REASON_LAST_RESORT_WATCHDOG); incrementWifiMetricsTriggerCounts(); clearAllFailureCounts(); @@ -248,15 +262,15 @@ public class WifiLastResortWatchdog { * @param isEntering true if called from ConnectedState.enter(), false for exit() */ public void connectedStateTransition(boolean isEntering) { - if (mVerboseLoggingEnabled) { - Log.v(TAG, "connectedStateTransition: isEntering = " + isEntering); - } + logv("connectedStateTransition: isEntering = " + isEntering); + mWifiIsConnected = isEntering; if (!isEntering) { return; } if (!mWatchdogAllowedToTrigger && mWatchdogFixedWifi - && checkIfAtleastOneNetworkHasEverConnected()) { + && checkIfAtleastOneNetworkHasEverConnected() + && checkIfConnectedBackToSameSsid()) { takeBugReportWithCurrentProbability("Wifi fixed after restart"); // WiFi has connected after a Watchdog trigger, without any new networks becoming // available, log a Watchdog success in wifi metrics @@ -268,10 +282,23 @@ public class WifiLastResortWatchdog { clearAllFailureCounts(); // If the watchdog trigger was disabled (it triggered), connecting means we did // something right, re-enable it so it can fire again. + localLog("connectedStateTransition: setWatchdogTriggerEnabled to true"); setWatchdogTriggerEnabled(true); } /** + * Helper function to check if device connect back to same + * SSID after watchdog trigger + */ + private boolean checkIfConnectedBackToSameSsid() { + if (TextUtils.equals(mSsidLastTrigger, mClientModeImpl.getWifiInfo().getSSID())) { + return true; + } + localLog("checkIfConnectedBackToSameSsid: different SSID be connected"); + return false; + } + + /** * Triggers a wifi specific bugreport with a based on the current trigger probability. * @param bugDetail description of the bug */ @@ -294,10 +321,8 @@ public class WifiLastResortWatchdog { * @param reason Message id from ClientModeImpl for this failure */ private void updateFailureCountForNetwork(String ssid, String bssid, int reason) { - if (mVerboseLoggingEnabled) { - Log.v(TAG, "updateFailureCountForNetwork: [" + ssid + ", " + bssid + ", " - + reason + "]"); - } + logv("updateFailureCountForNetwork: [" + ssid + ", " + bssid + ", " + + reason + "]"); if (BSSID_ANY.equals(bssid)) { incrementSsidFailureCount(ssid, reason); } else { @@ -428,9 +453,7 @@ public class WifiLastResortWatchdog { // We have met the failure count for every available network. // Trigger restart if there exists at-least one network that we have previously connected. boolean atleastOneNetworkHasEverConnected = checkIfAtleastOneNetworkHasEverConnected(); - if (mVerboseLoggingEnabled) { - Log.v(TAG, "checkTriggerCondition: return = " + atleastOneNetworkHasEverConnected); - } + logv("checkTriggerCondition: return = " + atleastOneNetworkHasEverConnected); return checkIfAtleastOneNetworkHasEverConnected(); } @@ -664,4 +687,33 @@ public class WifiLastResortWatchdog { + "}"; } } + + /** + * Helper function for logging into local log buffer. + */ + private void localLog(String s) { + mLocalLog.log(s); + } + + private void logv(String s) { + mLocalLog.log(s); + if (mVerboseLoggingEnabled) { + Log.v(TAG, s); + } + } + + private void loge(String s) { + mLocalLog.log(s); + Log.e(TAG, s); + } + + /** + * Dump the local log buffer and other internal state of WifiLastResortWatchdog. + */ + public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + pw.println("Dump of WifiLastResortWatchdog"); + pw.println("WifiLastResortWatchdog - Log Begin ----"); + mLocalLog.dump(fd, pw, args); + pw.println("WifiLastResortWatchdog - Log End ----"); + } } |