diff options
Diffstat (limited to 'service')
-rw-r--r-- | service/java/com/android/server/wifi/WifiLastResortWatchdog.java | 50 | ||||
-rw-r--r-- | service/java/com/android/server/wifi/WifiShellCommand.java | 27 |
2 files changed, 66 insertions, 11 deletions
diff --git a/service/java/com/android/server/wifi/WifiLastResortWatchdog.java b/service/java/com/android/server/wifi/WifiLastResortWatchdog.java index be45921a7..18f447aac 100644 --- a/service/java/com/android/server/wifi/WifiLastResortWatchdog.java +++ b/service/java/com/android/server/wifi/WifiLastResortWatchdog.java @@ -119,6 +119,8 @@ public class WifiLastResortWatchdog { private Handler mHandler; private final WifiThreadRunner mWifiThreadRunner; + private boolean mWatchdogFeatureEnabled = true; + /** * Local log used for debugging any WifiLastResortWatchdog issues. */ @@ -308,16 +310,23 @@ public class WifiLastResortWatchdog { Log.v(TAG, "isRestartNeeded = " + isRestartNeeded); } if (isRestartNeeded) { - // Stop the watchdog from triggering until re-enabled - localLog("noteConnectionFailureAndTriggerIfNeeded: setWatchdogTriggerEnabled to false"); - setWatchdogTriggerEnabled(false); - mWatchdogFixedWifi = true; - loge("Watchdog triggering recovery"); - mSsidLastTrigger = ssid; - mTimeLastTrigger = mClock.getElapsedSinceBootMillis(); - localLog(toString()); - mWifiInjector.getSelfRecovery().trigger(SelfRecovery.REASON_LAST_RESORT_WATCHDOG); - incrementWifiMetricsTriggerCounts(); + if (mWatchdogFeatureEnabled) { + // Stop the watchdog from triggering until re-enabled + localLog("Trigger recovery: setWatchdogTriggerEnabled to false"); + setWatchdogTriggerEnabled(false); + mWatchdogFixedWifi = true; + loge("Watchdog triggering recovery"); + mSsidLastTrigger = ssid; + mTimeLastTrigger = mClock.getElapsedSinceBootMillis(); + localLog(toString()); + mWifiInjector.getSelfRecovery().trigger(SelfRecovery.REASON_LAST_RESORT_WATCHDOG); + incrementWifiMetricsTriggerCounts(); + } else { + // auto bugreport if issue happens + loge("bugreport notification"); + setWatchdogTriggerEnabled(false); + takeBugReportWithCurrentProbability("Wifi Watchdog bite"); + } } return isRestartNeeded; } @@ -335,6 +344,7 @@ public class WifiLastResortWatchdog { return; } if (!mWatchdogAllowedToTrigger && mWatchdogFixedWifi + && mWatchdogFeatureEnabled && checkIfAtleastOneNetworkHasEverConnected() && checkIfConnectedBackToSameSsid() && checkIfConnectedBssidHasEverFailed()) { @@ -623,7 +633,8 @@ public class WifiLastResortWatchdog { */ public String toString() { StringBuilder sb = new StringBuilder(); - sb.append("mWatchdogAllowedToTrigger: ").append(mWatchdogAllowedToTrigger); + sb.append("mWatchdogFeatureEnabled: ").append(mWatchdogFeatureEnabled); + sb.append("\nmWatchdogAllowedToTrigger: ").append(mWatchdogAllowedToTrigger); sb.append("\nmWifiIsConnected: ").append(mWifiIsConnected); sb.append("\nmRecentAvailableNetworks: ").append(mRecentAvailableNetworks.size()); for (Map.Entry<String, AvailableNetworkFailureCount> entry @@ -682,6 +693,23 @@ public class WifiLastResortWatchdog { } } + /** + * Sets whether wifi watchdog should trigger recovery + */ + public void setWifiWatchdogFeature(boolean enable) { + logv("setWifiWatchdogFeature: " + enable); + mWatchdogFeatureEnabled = enable; + // for debugging purpose, reset mWatchdogAllowedToTrigger as well + setWatchdogTriggerEnabled(true); + } + + /** + * Returns whether wifi watchdog should trigger recovery. + */ + public boolean getWifiWatchdogFeature() { + return mWatchdogFeatureEnabled; + } + protected void enableVerboseLogging(int verbose) { if (verbose > 0) { mVerboseLoggingEnabled = true; diff --git a/service/java/com/android/server/wifi/WifiShellCommand.java b/service/java/com/android/server/wifi/WifiShellCommand.java index b2289a832..76fa4407b 100644 --- a/service/java/com/android/server/wifi/WifiShellCommand.java +++ b/service/java/com/android/server/wifi/WifiShellCommand.java @@ -54,6 +54,7 @@ public class WifiShellCommand extends ShellCommand { private final WifiNative mWifiNative; private final HostapdHal mHostapdHal; private final WifiCountryCode mWifiCountryCode; + private final WifiLastResortWatchdog mWifiLastResortWatchdog; WifiShellCommand(WifiInjector wifiInjector) { mClientModeImpl = wifiInjector.getClientModeImpl(); @@ -64,6 +65,7 @@ public class WifiShellCommand extends ShellCommand { mHostapdHal = wifiInjector.getHostapdHal(); mWifiNative = wifiInjector.getWifiNative(); mWifiCountryCode = wifiInjector.getWifiCountryCode(); + mWifiLastResortWatchdog = wifiInjector.getWifiLastResortWatchdog(); } @Override @@ -245,6 +247,27 @@ public class WifiShellCommand extends ShellCommand { + mWifiCountryCode.getCountryCode()); return 0; } + case "set-wifi-watchdog": { + boolean enabled; + String nextArg = getNextArgRequired(); + if ("enabled".equals(nextArg)) { + enabled = true; + } else if ("disabled".equals(nextArg)) { + enabled = false; + } else { + pw.println( + "Invalid argument to 'set-wifi-watchdog' - must be 'enabled'" + + " or 'disabled'"); + return -1; + } + mWifiLastResortWatchdog.setWifiWatchdogFeature(enabled); + return 0; + } + case "get-wifi-watchdog": { + pw.println("wifi watchdog state is " + + mWifiLastResortWatchdog.getWifiWatchdogFeature()); + return 0; + } default: return handleDefaultCommands(cmd); } @@ -344,6 +367,10 @@ public class WifiShellCommand extends ShellCommand { pw.println(" Sets country code to <two-letter code> or left for normal value"); pw.println(" get-country-code"); pw.println(" Gets country code as a two-letter string"); + pw.println(" set-wifi-watchdog enabled|disabled"); + pw.println(" Sets whether wifi watchdog should trigger recovery"); + pw.println(" get-wifi-watchdog"); + pw.println(" Gets setting of wifi watchdog trigger recovery."); pw.println(); } } |