From 1e806a7aac77f6f65ba299329e1fc452e0148b8d Mon Sep 17 00:00:00 2001 From: Mitchell Wills Date: Fri, 11 Mar 2016 17:16:50 -0800 Subject: Fix WifiScanner not recovering after Wifi is turned off WifiScanner implementations could previously get in an inconsistent state where they had not cleaned up from a previous scan that was interrupted by turning Wifi off. Bug: 27620477 Change-Id: I042e35d1aa8ee65e6ebfeb6f62a54c071a7be4ef --- .../com/android/server/wifi/HalWifiScannerImpl.java | 7 +++++++ .../server/wifi/SupplicantWifiScannerImpl.java | 19 ++++++++++++++++++- .../java/com/android/server/wifi/WifiScannerImpl.java | 6 ++++++ .../android/server/wifi/WifiScanningServiceImpl.java | 1 + 4 files changed, 32 insertions(+), 1 deletion(-) (limited to 'service') diff --git a/service/java/com/android/server/wifi/HalWifiScannerImpl.java b/service/java/com/android/server/wifi/HalWifiScannerImpl.java index c678c7302..ebb5f36ed 100644 --- a/service/java/com/android/server/wifi/HalWifiScannerImpl.java +++ b/service/java/com/android/server/wifi/HalWifiScannerImpl.java @@ -75,6 +75,7 @@ public class HalWifiScannerImpl extends WifiScannerImpl implements Handler.Callb } else { Log.w(TAG, "Got single scan failed event without an active scan request"); } + mWifiNative.resumeBackgroundScan(); break; case WifiMonitor.SCAN_RESULTS_EVENT: pollLatestSingleScanData(); @@ -173,6 +174,12 @@ public class HalWifiScannerImpl extends WifiScannerImpl implements Handler.Callb } } + @Override + public void cleanup() { + mSingleScanEventHandler = null; + mWifiNative.resumeBackgroundScan(); + } + @Override public boolean getScanCapabilities(WifiNative.ScanCapabilities capabilities) { return mWifiNative.getScanCapabilities(capabilities); diff --git a/service/java/com/android/server/wifi/SupplicantWifiScannerImpl.java b/service/java/com/android/server/wifi/SupplicantWifiScannerImpl.java index 05f602090..91747808a 100644 --- a/service/java/com/android/server/wifi/SupplicantWifiScannerImpl.java +++ b/service/java/com/android/server/wifi/SupplicantWifiScannerImpl.java @@ -114,6 +114,19 @@ public class SupplicantWifiScannerImpl extends WifiScannerImpl implements Handle WifiMonitor.SCAN_RESULTS_EVENT, mEventHandler); } + @Override + public void cleanup() { + synchronized (mSettingsLock) { + mPendingSingleScanSettings = null; + mPendingSingleScanEventHandler = null; + stopPnoScan(); + stopBatchedScan(); + resetHotlist(); + untrackSignificantWifiChange(); + mLastScanSettings = null; // finally clear any active scan + } + } + @Override public boolean getScanCapabilities(WifiNative.ScanCapabilities capabilities) { capabilities.max_scan_cache_size = Integer.MAX_VALUE; @@ -213,6 +226,7 @@ public class SupplicantWifiScannerImpl extends WifiScannerImpl implements Handle mBackgroundScanPeriodPending = false; unscheduleScansLocked(); } + processPendingScans(); } @Override @@ -236,6 +250,7 @@ public class SupplicantWifiScannerImpl extends WifiScannerImpl implements Handle mPendingBackgroundScanEventHandler.onScanPaused(results); } } + processPendingScans(); } @Override @@ -312,7 +327,9 @@ public class SupplicantWifiScannerImpl extends WifiScannerImpl implements Handle private void unscheduleScansLocked() { mAlarmManager.cancel(mScanPeriodListener); - mLastScanSettings = null; // make sure that a running scan is marked as ended + if (mLastScanSettings != null) { + mLastScanSettings.backgroundScanActive = false; + } } private void handleScanPeriod() { diff --git a/service/java/com/android/server/wifi/WifiScannerImpl.java b/service/java/com/android/server/wifi/WifiScannerImpl.java index 41c356c29..c8d80fde5 100644 --- a/service/java/com/android/server/wifi/WifiScannerImpl.java +++ b/service/java/com/android/server/wifi/WifiScannerImpl.java @@ -62,6 +62,12 @@ public abstract class WifiScannerImpl { } }; + /** + * Cleanup any ongoing operations. This may be called when the driver is unloaded. + * There is no expectation that failure events are returned for ongoing operations. + */ + public abstract void cleanup(); + /** * Get the supported scan capabilities. * diff --git a/service/java/com/android/server/wifi/WifiScanningServiceImpl.java b/service/java/com/android/server/wifi/WifiScanningServiceImpl.java index 8de44f72f..58ddd579f 100644 --- a/service/java/com/android/server/wifi/WifiScanningServiceImpl.java +++ b/service/java/com/android/server/wifi/WifiScanningServiceImpl.java @@ -802,6 +802,7 @@ public class WifiScanningServiceImpl extends IWifiScanner.Stub { public void exit() { sendPnoScanFailedToAllAndClear( WifiScanner.REASON_UNSPECIFIED, "Scan was interrupted"); + mScannerImpl.cleanup(); } @Override -- cgit v1.2.3