diff options
3 files changed, 58 insertions, 49 deletions
diff --git a/service/java/com/android/server/wifi/WifiScanningServiceImpl.java b/service/java/com/android/server/wifi/WifiScanningServiceImpl.java index 6f488886c..015730569 100644 --- a/service/java/com/android/server/wifi/WifiScanningServiceImpl.java +++ b/service/java/com/android/server/wifi/WifiScanningServiceImpl.java @@ -465,7 +465,13 @@ public class WifiScanningServiceImpl extends IWifiScanner.Stub { // Determine the system state (Wifi enabled/disabled/associated...etc) and // screenOn/Off, use it to increment the Metrics SystemScanState count // mWifiMetrics.incrementWifiSystemScanStateCount(???, ???); - if (validateAndAddToScanQueue(ci, msg.arg2, (ScanSettings) msg.obj)) { + + Bundle scanParams = (Bundle) msg.obj; + ScanSettings scanSettings = + scanParams.getParcelable(WifiScanner.SCAN_PARAMS_SCAN_SETTINGS_KEY); + WorkSource workSource = + scanParams.getParcelable(WifiScanner.SCAN_PARAMS_WORK_SOURCE_KEY); + if (validateAndAddToScanQueue(ci, msg.arg2, scanSettings, workSource)) { replySucceeded(msg); // If were not currently scanning then try to start a scan. Otherwise // this scan will be scheduled when transitioning back to IdleState @@ -539,7 +545,8 @@ public class WifiScanningServiceImpl extends IWifiScanner.Stub { } } - boolean validateAndAddToScanQueue(ClientInfo ci, int handler, ScanSettings settings) { + boolean validateAndAddToScanQueue(ClientInfo ci, int handler, ScanSettings settings, + WorkSource workSource) { if (ci == null) { Log.d(TAG, "Failing single scan request ClientInfo not found " + handler); return false; @@ -551,6 +558,7 @@ public class WifiScanningServiceImpl extends IWifiScanner.Stub { } } logScanRequest("addSingleScanRequest", ci, handler, settings, null); + // TODO(b/27903217): Blame scan on provided work source mPendingScans.put(ci, handler, settings); return true; } @@ -893,18 +901,24 @@ public class WifiScanningServiceImpl extends IWifiScanner.Stub { return NOT_HANDLED; case CMD_DRIVER_UNLOADED: return NOT_HANDLED; - case WifiScanner.CMD_START_BACKGROUND_SCAN: + case WifiScanner.CMD_START_BACKGROUND_SCAN: { mWifiMetrics.incrementBackgroundScanCount(); - if (addBackgroundScanRequest(ci, msg.arg2, (ScanSettings) msg.obj)) { + Bundle scanParams = (Bundle) msg.obj; + ScanSettings scanSettings = + scanParams.getParcelable(WifiScanner.SCAN_PARAMS_SCAN_SETTINGS_KEY); + WorkSource workSource = + scanParams.getParcelable(WifiScanner.SCAN_PARAMS_WORK_SOURCE_KEY); + if (addBackgroundScanRequest(ci, msg.arg2, scanSettings, workSource)) { replySucceeded(msg); } else { replyFailed(msg, WifiScanner.REASON_INVALID_REQUEST, "bad request"); } break; + } case WifiScanner.CMD_STOP_BACKGROUND_SCAN: removeBackgroundScanRequest(ci, msg.arg2); break; - case WifiScanner.CMD_START_PNO_SCAN: + case WifiScanner.CMD_START_PNO_SCAN: { mWifiMetrics.incrementBackgroundScanCount(); Bundle pnoParams = (Bundle) msg.obj; PnoSettings pnoSettings = @@ -917,6 +931,7 @@ public class WifiScanningServiceImpl extends IWifiScanner.Stub { replyFailed(msg, WifiScanner.REASON_INVALID_REQUEST, "bad request"); } break; + } case WifiScanner.CMD_STOP_PNO_SCAN: removeScanRequestForPno(ci, msg.arg2); break; @@ -1022,7 +1037,7 @@ public class WifiScanningServiceImpl extends IWifiScanner.Stub { } private boolean addBackgroundScanRequest(ClientInfo ci, int handler, - ScanSettings settings) { + ScanSettings settings, WorkSource workSource) { // sanity check the input if (ci == null) { Log.d(TAG, "Failing scan request ClientInfo not found " + handler); @@ -1073,6 +1088,7 @@ public class WifiScanningServiceImpl extends IWifiScanner.Stub { } logScanRequest("addBackgroundScanRequest", ci, handler, settings, null); + // TODO(b/27903217): Blame scan on provided work source mActiveBackgroundScans.put(ci, handler, settings); if (updateSchedule()) { @@ -1203,7 +1219,7 @@ public class WifiScanningServiceImpl extends IWifiScanner.Stub { // We need to schedule a background scan either because HW PNO requires background // scan or if there is no HW PNO scan support. if (shouldScheduleBackgroundScan) { - if(!addBackgroundScanRequest(ci, handler, scanSettings)) { + if (!addBackgroundScanRequest(ci, handler, scanSettings, null)) { loge("Background scan request for PNO failed."); return false; } @@ -2010,7 +2026,7 @@ public class WifiScanningServiceImpl extends IWifiScanner.Stub { Message msg = Message.obtain(); msg.what = WifiScanner.CMD_START_BACKGROUND_SCAN; msg.arg2 = SCAN_COMMAND_ID; - msg.obj = settings; + msg.getData().putParcelable(WifiScanner.SCAN_PARAMS_SCAN_SETTINGS_KEY, settings); mClientHandler.sendMessage(msg); } diff --git a/service/java/com/android/server/wifi/WifiStateMachine.java b/service/java/com/android/server/wifi/WifiStateMachine.java index 6a1217e7d..5b579d5ae 100644 --- a/service/java/com/android/server/wifi/WifiStateMachine.java +++ b/service/java/com/android/server/wifi/WifiStateMachine.java @@ -2003,7 +2003,7 @@ public class WifiStateMachine extends StateMachine implements WifiNative.PnoEven Set<Integer> hiddenNetworkIds = mWifiConfigManager.getHiddenConfiguredNetworkIds(); // call wifi native to start the scan - if (startScanNative(freqs, hiddenNetworkIds)) { + if (startScanNative(freqs, hiddenNetworkIds, workSource)) { // only count battery consumption if scan request is accepted noteScanStart(message.arg1, workSource); // a full scan covers everything, clearing scan request buffer @@ -2059,7 +2059,8 @@ public class WifiStateMachine extends StateMachine implements WifiNative.PnoEven /** * return true iff scan request is accepted */ - private boolean startScanNative(final Set<Integer> freqs, Set<Integer> hiddenNetworkIds) { + private boolean startScanNative(final Set<Integer> freqs, Set<Integer> hiddenNetworkIds, + WorkSource workSource) { WifiScanner.ScanSettings settings = new WifiScanner.ScanSettings(); if (freqs == null) { settings.band = WifiScanner.WIFI_BAND_BOTH_WITH_DFS; @@ -2095,7 +2096,7 @@ public class WifiStateMachine extends StateMachine implements WifiNative.PnoEven public void onPeriodChanged(int periodInMs) { } }; - mWifiScanner.startScan(settings, nativeScanListener); + mWifiScanner.startScan(settings, nativeScanListener, workSource); mIsScanOngoing = true; mIsFullScanOngoing = (freqs == null); lastScanFreqs = freqs; @@ -7236,7 +7237,7 @@ public class WifiStateMachine extends StateMachine implements WifiNative.PnoEven hiddenNetworkIds.add(config.networkId); } // Call wifi native to start the scan - if (startScanNative(freqs, hiddenNetworkIds)) { + if (startScanNative(freqs, hiddenNetworkIds, null)) { // Only count battery consumption if scan request is accepted noteScanStart(SCAN_ALARM_SOURCE, null); messageHandlingStatus = MESSAGE_HANDLING_STATUS_OK; diff --git a/tests/wifitests/src/com/android/server/wifi/WifiScanningServiceTest.java b/tests/wifitests/src/com/android/server/wifi/WifiScanningServiceTest.java index 88733d0c5..27c17b0c0 100644 --- a/tests/wifitests/src/com/android/server/wifi/WifiScanningServiceTest.java +++ b/tests/wifitests/src/com/android/server/wifi/WifiScanningServiceTest.java @@ -16,35 +16,21 @@ package com.android.server.wifi; -import static com.android.server.wifi.ScanTestUtil.NativeScanSettingsBuilder; -import static com.android.server.wifi.ScanTestUtil.assertNativeScanSettingsEquals; -import static com.android.server.wifi.ScanTestUtil.assertScanDatasEquals; -import static com.android.server.wifi.ScanTestUtil.channelsToSpec; -import static com.android.server.wifi.ScanTestUtil.computeSingleScanNativeSettings; -import static com.android.server.wifi.ScanTestUtil.createRequest; -import static com.android.server.wifi.ScanTestUtil.createSingleScanNativeSettingsForChannels; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; -import static org.mockito.Mockito.any; -import static org.mockito.Mockito.argThat; -import static org.mockito.Mockito.inOrder; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.validateMockitoUsage; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoMoreInteractions; -import static org.mockito.Mockito.when; +import static com.android.server.wifi.ScanTestUtil.*; + +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; import android.content.BroadcastReceiver; import android.content.Context; import android.content.IntentFilter; import android.net.wifi.WifiManager; import android.net.wifi.WifiScanner; +import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; +import android.os.WorkSource; import android.test.suitebuilder.annotation.SmallTest; import com.android.internal.app.IBatteryStats; @@ -174,15 +160,21 @@ public class WifiScanningServiceTest { } private void sendBackgroundScanRequest(BidirectionalAsyncChannel controlChannel, - int scanRequestId, WifiScanner.ScanSettings settings) { + int scanRequestId, WifiScanner.ScanSettings settings, WorkSource workSource) { + Bundle scanParams = new Bundle(); + scanParams.putParcelable(WifiScanner.SCAN_PARAMS_SCAN_SETTINGS_KEY, settings); + scanParams.putParcelable(WifiScanner.SCAN_PARAMS_WORK_SOURCE_KEY, workSource); controlChannel.sendMessage(Message.obtain(null, WifiScanner.CMD_START_BACKGROUND_SCAN, 0, - scanRequestId, settings)); + scanRequestId, scanParams)); } private void sendSingleScanRequest(BidirectionalAsyncChannel controlChannel, - int scanRequestId, WifiScanner.ScanSettings settings) { + int scanRequestId, WifiScanner.ScanSettings settings, WorkSource workSource) { + Bundle scanParams = new Bundle(); + scanParams.putParcelable(WifiScanner.SCAN_PARAMS_SCAN_SETTINGS_KEY, settings); + scanParams.putParcelable(WifiScanner.SCAN_PARAMS_WORK_SOURCE_KEY, workSource); controlChannel.sendMessage(Message.obtain(null, WifiScanner.CMD_START_SINGLE_SCAN, 0, - scanRequestId, settings)); + scanRequestId, scanParams)); } private void verifySuccessfulResponse(InOrder order, Handler handler, int arg2) { @@ -282,7 +274,7 @@ public class WifiScanningServiceTest { Handler handler = mock(Handler.class); BidirectionalAsyncChannel controlChannel = connectChannel(handler); InOrder order = inOrder(handler); - sendBackgroundScanRequest(controlChannel, 122, generateValidScanSettings()); + sendBackgroundScanRequest(controlChannel, 122, generateValidScanSettings(), null); mLooper.dispatchAll(); verifyFailedResponse(order, handler, 122, WifiScanner.REASON_UNSPECIFIED, "not available"); } @@ -297,7 +289,7 @@ public class WifiScanningServiceTest { InOrder order = inOrder(handler); when(mWifiScannerImpl.startBatchedScan(any(WifiNative.ScanSettings.class), any(WifiNative.ScanEventHandler.class))).thenReturn(true); - sendBackgroundScanRequest(controlChannel, 192, generateValidScanSettings()); + sendBackgroundScanRequest(controlChannel, 192, generateValidScanSettings(), null); mLooper.dispatchAll(); verifySuccessfulResponse(order, handler, 192); } @@ -327,7 +319,7 @@ public class WifiScanningServiceTest { when(mWifiScannerImpl.startSingleScan(any(WifiNative.ScanSettings.class), any(WifiNative.ScanEventHandler.class))).thenReturn(true); - sendSingleScanRequest(controlChannel, requestId, requestSettings); + sendSingleScanRequest(controlChannel, requestId, requestSettings, null); mLooper.dispatchAll(); WifiNative.ScanEventHandler eventHandler = verifyStartSingleScan(order, nativeSettings); @@ -385,7 +377,7 @@ public class WifiScanningServiceTest { when(mWifiScannerImpl.startSingleScan(any(WifiNative.ScanSettings.class), any(WifiNative.ScanEventHandler.class))).thenReturn(false); - sendSingleScanRequest(controlChannel, requestId, requestSettings); + sendSingleScanRequest(controlChannel, requestId, requestSettings, null); mLooper.dispatchAll(); // Scan is successfully queue, but then fails to execute @@ -419,7 +411,7 @@ public class WifiScanningServiceTest { when(mWifiScannerImpl.startSingleScan(any(WifiNative.ScanSettings.class), any(WifiNative.ScanEventHandler.class))).thenReturn(true); - sendSingleScanRequest(controlChannel, requestId, requestSettings); + sendSingleScanRequest(controlChannel, requestId, requestSettings, null); // Scan is successfully queue mLooper.dispatchAll(); @@ -467,7 +459,7 @@ public class WifiScanningServiceTest { InOrder order = inOrder(handler, mWifiScannerImpl); // Run scan 1 - sendSingleScanRequest(controlChannel, requestId1, requestSettings1); + sendSingleScanRequest(controlChannel, requestId1, requestSettings1, null); mLooper.dispatchAll(); WifiNative.ScanEventHandler eventHandler1 = verifyStartSingleScan(order, @@ -484,7 +476,7 @@ public class WifiScanningServiceTest { verifySingleScanCompletedRecieved(order, handler, requestId1); // Run scan 2 - sendSingleScanRequest(controlChannel, requestId2, requestSettings2); + sendSingleScanRequest(controlChannel, requestId2, requestSettings2, null); mLooper.dispatchAll(); WifiNative.ScanEventHandler eventHandler2 = verifyStartSingleScan(order, @@ -529,7 +521,7 @@ public class WifiScanningServiceTest { InOrder nativeOrder = inOrder(mWifiScannerImpl); // Run scan 1 - sendSingleScanRequest(controlChannel, requestId1, requestSettings1); + sendSingleScanRequest(controlChannel, requestId1, requestSettings1, null); mLooper.dispatchAll(); WifiNative.ScanEventHandler eventHandler1 = verifyStartSingleScan(nativeOrder, @@ -537,7 +529,7 @@ public class WifiScanningServiceTest { verifySuccessfulResponse(handlerOrder, handler, requestId1); // Queue scan 2 (will not run because previous is in progress) - sendSingleScanRequest(controlChannel, requestId2, requestSettings2); + sendSingleScanRequest(controlChannel, requestId2, requestSettings2, null); mLooper.dispatchAll(); verifySuccessfulResponse(handlerOrder, handler, requestId2); @@ -604,7 +596,7 @@ public class WifiScanningServiceTest { InOrder nativeOrder = inOrder(mWifiScannerImpl); // Run scan 1 - sendSingleScanRequest(controlChannel, requestId1, requestSettings1); + sendSingleScanRequest(controlChannel, requestId1, requestSettings1, null); mLooper.dispatchAll(); WifiNative.ScanEventHandler eventHandler1 = verifyStartSingleScan(nativeOrder, @@ -612,12 +604,12 @@ public class WifiScanningServiceTest { verifySuccessfulResponse(handlerOrder, handler, requestId1); // Queue scan 2 (will not run because previous is in progress) - sendSingleScanRequest(controlChannel, requestId2, requestSettings2); + sendSingleScanRequest(controlChannel, requestId2, requestSettings2, null); mLooper.dispatchAll(); verifySuccessfulResponse(handlerOrder, handler, requestId2); // Queue scan 3 (will not run because previous is in progress) - sendSingleScanRequest(controlChannel, requestId3, requestSettings3); + sendSingleScanRequest(controlChannel, requestId3, requestSettings3, null); mLooper.dispatchAll(); verifySuccessfulResponse(handlerOrder, handler, requestId3); @@ -682,7 +674,7 @@ public class WifiScanningServiceTest { when(mWifiScannerImpl.startBatchedScan(any(WifiNative.ScanSettings.class), any(WifiNative.ScanEventHandler.class))).thenReturn(true); - sendBackgroundScanRequest(controlChannel, 12, requestSettings); + sendBackgroundScanRequest(controlChannel, 12, requestSettings, null); mLooper.dispatchAll(); verifyStartBackgroundScan(order, nativeSettings); verifySuccessfulResponse(order, handler, 12); |