summaryrefslogtreecommitdiff
path: root/service
diff options
context:
space:
mode:
authorRoshan Pius <rpius@google.com>2017-06-21 18:57:33 +0000
committerandroid-build-merger <android-build-merger@google.com>2017-06-21 18:57:33 +0000
commit4ab2a8ac0bd91f40c1175f89aee9074e619c1da8 (patch)
tree575e041bd60979b98e28e16ad70163dc4e882e27 /service
parent4856e98ed4d75bf8bb6b1bee7376d6966cf5351a (diff)
parentcebe986861bc1405afd7f333dbc6996107deb14b (diff)
WifiScanningService: Cache only results of full single scans am: 23216ca333 am: a2f60dca3a
am: cebe986861 Change-Id: I99b51435731977c0a80d6e2204cbdcdf210d8ec8
Diffstat (limited to 'service')
-rw-r--r--service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java43
-rw-r--r--service/java/com/android/server/wifi/scanner/WificondScannerImpl.java13
2 files changed, 48 insertions, 8 deletions
diff --git a/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java b/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java
index 08c9e1359..af874b9e2 100644
--- a/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java
+++ b/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java
@@ -438,6 +438,15 @@ public class WifiScanningServiceImpl extends IWifiScanner.Stub {
* executed after transitioning back to IdleState.
*/
class WifiSingleScanStateMachine extends StateMachine implements WifiNative.ScanEventHandler {
+ /**
+ * Maximum age of results that we return from our cache via
+ * {@link WifiScanner#getScanResults()}.
+ * This is currently set to 3 minutes to restore parity with the wpa_supplicant's scan
+ * result cache expiration policy. (See b/62253332 for details)
+ */
+ @VisibleForTesting
+ public static final int CACHED_SCAN_RESULTS_MAX_AGE_IN_MILLIS = 180 * 1000;
+
private final DefaultState mDefaultState = new DefaultState();
private final DriverStartedState mDriverStartedState = new DriverStartedState();
private final IdleState mIdleState = new IdleState();
@@ -447,7 +456,8 @@ public class WifiScanningServiceImpl extends IWifiScanner.Stub {
private RequestList<ScanSettings> mActiveScans = new RequestList<>();
private RequestList<ScanSettings> mPendingScans = new RequestList<>();
- private ScanResult[] mCachedScanResults = new ScanResult[0];
+ // Scan results cached from the last full single scan request.
+ private final List<ScanResult> mCachedScanResults = new ArrayList<>();
WifiSingleScanStateMachine(Looper looper) {
super("WifiSingleScanStateMachine", looper);
@@ -534,13 +544,30 @@ public class WifiScanningServiceImpl extends IWifiScanner.Stub {
if (DBG) localLog("ignored full scan result event");
return HANDLED;
case WifiScanner.CMD_GET_SINGLE_SCAN_RESULTS:
- msg.obj = new WifiScanner.ParcelableScanResults(mCachedScanResults.clone());
+ msg.obj = new WifiScanner.ParcelableScanResults(
+ filterCachedScanResultsByAge());
replySucceeded(msg);
return HANDLED;
default:
return NOT_HANDLED;
}
+ }
+ /**
+ * Filter out any scan results that are older than
+ * {@link #CACHED_SCAN_RESULTS_MAX_AGE_IN_MILLIS}.
+ *
+ * @return Filtered list of scan results.
+ */
+ private ScanResult[] filterCachedScanResultsByAge() {
+ // Using ScanResult.timestamp here to ensure that we use the same fields as
+ // WificondScannerImpl for filtering stale results.
+ long currentTimeInMillis = mClock.getElapsedSinceBootMillis();
+ return mCachedScanResults.stream()
+ .filter(scanResult
+ -> ((currentTimeInMillis - (scanResult.timestamp / 1000))
+ < CACHED_SCAN_RESULTS_MAX_AGE_IN_MILLIS))
+ .toArray(ScanResult[]::new);
}
}
@@ -553,7 +580,7 @@ public class WifiScanningServiceImpl extends IWifiScanner.Stub {
@Override
public void exit() {
// clear scan results when scan mode is not active
- mCachedScanResults = new ScanResult[0];
+ mCachedScanResults.clear();
mWifiMetrics.incrementScanReturnEntry(
WifiMetricsProto.WifiLog.SCAN_FAILURE_INTERRUPTED,
@@ -879,13 +906,15 @@ public class WifiScanningServiceImpl extends IWifiScanner.Stub {
entry.reportEvent(WifiScanner.CMD_SCAN_RESULT, 0, parcelableAllResults);
}
- // Cache the results here so that apps can retrieve them.
- mCachedScanResults = results.getResults();
- sendScanResultBroadcast(true);
+ if (results.isAllChannelsScanned()) {
+ mCachedScanResults.clear();
+ mCachedScanResults.addAll(Arrays.asList(results.getResults()));
+ sendScanResultBroadcast(true);
+ }
}
List<ScanResult> getCachedScanResultsAsList() {
- return Arrays.asList(mCachedScanResults);
+ return mCachedScanResults;
}
}
diff --git a/service/java/com/android/server/wifi/scanner/WificondScannerImpl.java b/service/java/com/android/server/wifi/scanner/WificondScannerImpl.java
index 4aa9bc972..fd7fddb73 100644
--- a/service/java/com/android/server/wifi/scanner/WificondScannerImpl.java
+++ b/service/java/com/android/server/wifi/scanner/WificondScannerImpl.java
@@ -579,6 +579,17 @@ public class WificondScannerImpl extends WifiScannerImpl implements Handler.Call
}
}
+ /**
+ * Check if the provided channel collection contains all the channels.
+ */
+ private static boolean isAllChannelsScanned(ChannelCollection channelCollection) {
+ // TODO(b/62253332): Get rid of this hack.
+ // We're treating 2g + 5g and 2g + 5g + dfs as all channels scanned to work around
+ // the lack of a proper cache.
+ return (channelCollection.containsBand(WifiScanner.WIFI_BAND_24_GHZ)
+ && channelCollection.containsBand(WifiScanner.WIFI_BAND_5_GHZ));
+ }
+
private void pollLatestScanData() {
synchronized (mSettingsLock) {
if (mLastScanSettings == null) {
@@ -665,7 +676,7 @@ public class WificondScannerImpl extends WifiScannerImpl implements Handler.Call
}
Collections.sort(singleScanResults, SCAN_RESULT_SORT_COMPARATOR);
mLatestSingleScanResult = new WifiScanner.ScanData(mLastScanSettings.scanId, 0, 0,
- mLastScanSettings.singleScanFreqs.isAllChannels(),
+ isAllChannelsScanned(mLastScanSettings.singleScanFreqs),
singleScanResults.toArray(new ScanResult[singleScanResults.size()]));
mLastScanSettings.singleScanEventHandler
.onScanStatus(WifiNative.WIFI_SCAN_RESULTS_AVAILABLE);