From b33a1d5b8d8583628ca94b3df7ed5ededca1191d Mon Sep 17 00:00:00 2001 From: Roshan Pius Date: Thu, 28 May 2020 22:18:16 -0700 Subject: ConfigurationMap: Don't cache specifier ScanResultMatchInfo WifiConfiguration's created from WifiNetworkSpecifier requests should not be cached in the internal ScanResultMatchInfo cache maintained by WifiConfigManager. This WifiConfiguration is truly ephemeral in nature and is deleted after every connnection. Also, WifiNetworkSpecifier WifiConfiguration is the only case today where we can have multiple WifiConfiguration for the same network (because we WifiConfiguration.shared = false for WifiNetworkSpecifier networks) Note: A more generic fix for this will be done in b/142035508. Since not storing cache entries for suggestions or WFA networks may cause other side effects and too risky for R at this stage. Bug: 157609789 Test: atest com.android.server.wifi Test: atest ConnectedNetworkScorerTest WifiNetworkSpecifierTest Test: act.py -c wifi_manager_cross.config -tb dut-name -tc WifiNetworkRequestTest Change-Id: I85cc20bd910cf3e974746653737a8fda54a27e09 --- .../com/android/server/wifi/ConfigurationMapTest.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'tests') diff --git a/tests/wifitests/src/com/android/server/wifi/ConfigurationMapTest.java b/tests/wifitests/src/com/android/server/wifi/ConfigurationMapTest.java index b433d94cf..02994ecad 100644 --- a/tests/wifitests/src/com/android/server/wifi/ConfigurationMapTest.java +++ b/tests/wifitests/src/com/android/server/wifi/ConfigurationMapTest.java @@ -333,4 +333,23 @@ public class ConfigurationMapTest extends WifiBaseTest { mConfigs.clear(); assertNull(mConfigs.getByScanResultForCurrentUser(scanResult)); } + + @Test + public void testScanResultDoesNotMatchForWifiNetworkSpecifier() { + // Add regular saved network, this should create a scan result match info cache entry. + WifiConfiguration config = WifiConfigurationTestUtil.createOpenNetwork(); + ScanResult scanResult = createScanResultForNetwork(config); + config.networkId = 5; + mConfigs.put(config); + assertNotNull(mConfigs.getByScanResultForCurrentUser(scanResult)); + + mConfigs.clear(); + + // Create WifiNetworkSpecifier network, this should not create a scan result match info + // cache entry. + config.ephemeral = true; + config.fromWifiNetworkSpecifier = true; + mConfigs.put(config); + assertNull(mConfigs.getByScanResultForCurrentUser(scanResult)); + } } -- cgit v1.2.3 From ec1025373054e637e3b0e4e25ecafb18a4086e29 Mon Sep 17 00:00:00 2001 From: Roshan Pius Date: Fri, 29 May 2020 10:24:30 -0700 Subject: WifiNetworkFactory: Stop scanning once user selects a network Once the user selects one of the matched networks (or was pre-approved), there is no need to continue scanning. Scanning while connecting could lead to disruption in the connection (because the chip needs to go off-channel when connecting/DHCP). Previously, we were cancelling periodic scans only after the connection is established. Also, reset |IsTimerSet| boolean when the corresponding timers fire. Bug: 157603386 Test: atest com.android.server.wifi Test: act.py -c wifi_manager_cross.config -tb dut-name -tc WifiNetworkRequestTest Test: Manually verified that scans are stopped after user selection. Change-Id: I88af4e2d3f2331ba41bacea6fb6b9936e8db88a8 --- .../server/wifi/WifiNetworkFactoryTest.java | 47 ++++++++++++++++++---- 1 file changed, 39 insertions(+), 8 deletions(-) (limited to 'tests') diff --git a/tests/wifitests/src/com/android/server/wifi/WifiNetworkFactoryTest.java b/tests/wifitests/src/com/android/server/wifi/WifiNetworkFactoryTest.java index 25aaeffd6..5f9e0333e 100644 --- a/tests/wifitests/src/com/android/server/wifi/WifiNetworkFactoryTest.java +++ b/tests/wifitests/src/com/android/server/wifi/WifiNetworkFactoryTest.java @@ -643,6 +643,35 @@ public class WifiNetworkFactoryTest extends WifiBaseTest { verify(mAlarmManager).cancel(any(OnAlarmListener.class)); } + /** + * Verify the periodic scan back off to find a network matching the network specifier + * is cancelled when the user selects a network. + */ + @Test + public void testPeriodicScanCancelOnUserSelectNetwork() throws Exception { + attachDefaultWifiNetworkSpecifierAndAppInfo(TEST_UID_1, false); + mWifiNetworkFactory.needNetworkFor(mNetworkRequest, 0); + + mWifiNetworkFactory.addCallback(mAppBinder, mNetworkRequestMatchCallback, + TEST_CALLBACK_IDENTIFIER); + verify(mNetworkRequestMatchCallback).onUserSelectionCallbackRegistration( + mNetworkRequestUserSelectionCallback.capture()); + + verifyPeriodicScans(0, + PERIODIC_SCAN_INTERVAL_MS, // 10s + PERIODIC_SCAN_INTERVAL_MS); // 10s + + // Now trigger user selection to one of the network. + mSelectedNetwork = WifiConfigurationTestUtil.createPskNetwork(); + mSelectedNetwork.SSID = "\"" + TEST_SSID_1 + "\""; + sendUserSelectionSelect(mNetworkRequestUserSelectionCallback.getValue(), mSelectedNetwork); + mLooper.dispatchAll(); + + // Cancel the alarm set for the next scan. + verify(mAlarmManager).cancel(mPeriodicScanListenerArgumentCaptor.getValue()); + } + + /** * Verify callback registration/unregistration. */ @@ -1345,7 +1374,7 @@ public class WifiNetworkFactoryTest extends WifiBaseTest { } mInOrder = inOrder(mAlarmManager, mClientModeImpl); - validateConnectionRetryAttempts(); + validateConnectionRetryAttempts(true); // Fail the request after all the retries are exhausted. verify(mNetworkRequestMatchCallback).onAbort(); @@ -1373,7 +1402,7 @@ public class WifiNetworkFactoryTest extends WifiBaseTest { mLooper.dispatchAll(); mInOrder = inOrder(mAlarmManager, mClientModeImpl); - validateConnectionRetryAttempts(); + validateConnectionRetryAttempts(false); // Fail the request after all the retries are exhausted. verify(mNetworkRequestMatchCallback).onAbort(); @@ -1407,7 +1436,7 @@ public class WifiNetworkFactoryTest extends WifiBaseTest { } mInOrder = inOrder(mAlarmManager, mClientModeImpl); - validateConnectionRetryAttempts(); + validateConnectionRetryAttempts(false); verify(mNetworkRequestMatchCallback).onAbort(); // Verify that we sent the connection failure callback. @@ -1453,7 +1482,7 @@ public class WifiNetworkFactoryTest extends WifiBaseTest { } mInOrder = inOrder(mAlarmManager, mClientModeImpl); - validateConnectionRetryAttempts(); + validateConnectionRetryAttempts(false); // Verify that we sent the connection failure callback. verify(mNetworkRequestMatchCallback).onUserSelectionConnectFailure( @@ -2783,11 +2812,13 @@ public class WifiNetworkFactoryTest extends WifiBaseTest { } } - private void validateConnectionRetryAttempts() { + private void validateConnectionRetryAttempts(boolean onTimeout) { for (int i = 0; i < WifiNetworkFactory.USER_SELECTED_NETWORK_CONNECT_RETRY_MAX; i++) { - // Cancel the existing connection timeout. - mInOrder.verify(mAlarmManager).cancel( - mConnectionTimeoutAlarmListenerArgumentCaptor.getValue()); + if (!onTimeout) { + // Cancel the existing connection timeout. + mInOrder.verify(mAlarmManager).cancel( + mConnectionTimeoutAlarmListenerArgumentCaptor.getValue()); + } // Trigger new connection. mInOrder.verify(mClientModeImpl).connect(eq(null), eq(TEST_NETWORK_ID_1), -- cgit v1.2.3