summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoshan Pius <rpius@google.com>2020-12-10 09:24:55 -0800
committerRoshan Pius <rpius@google.com>2020-12-15 02:01:24 +0000
commitb7e1c120a9b2d277da76b6c90a7636c958e85a8e (patch)
tree7fdbbb71f6043d11a1c3530a8eb53087309eac8d
parentfac849a294e75ceb831502de63e655f4e08fffe9 (diff)
downloadwifi-b7e1c120a9b2d277da76b6c90a7636c958e85a8e.tar.gz
WifiNetworkSelector: Include secondary STA in sufficiency checks
Include the secondary STA state (either if it already exists or if there is a request to create one on a supported device) while performing network sufficiency checks. This will ensure that we perform network selection for the second STA (otherwise if we're connected to a good quality connection on the primary STA, we will never perform network selection and hence never create/connect on the second STA). Note: This only modifies the network sufficiency conditions. We don't plan to modify the scan schedule for the second STA (since that could lead to significant power impact which in most cases may not find a viable candidate to connect on the second STA). So, the scan schedule will just use the primary STA state. However, if some scans do happen (triggered internally or externally) when connected on the primary STA, this change will ensure that we perform network selection for the second STA. Bug: 169413079 Test: atest com.android.server.wifi Test: Manual steps: i. Enable "config_wifiMultiStaRestrictedConcurrencyEnabled" overlay ii. adb shell cmd wifi connect-network <ssid1> open iii. adb shell cmd wifi status <-- Connected to <ssid1> iv. adb shell cmd wifi add-suggestion <ssid2> open -p v. adb shell cmd wifi start-scan vi. abd shell cmd wifi status <-- Connected to <ssid1> & <ssid2> Change-Id: Iabdf881c3068b38bcfb9292bff4e71a13615a1e6
-rw-r--r--service/java/com/android/server/wifi/BssidBlocklistMonitor.java23
-rw-r--r--service/java/com/android/server/wifi/ClientModeImpl.java2
-rw-r--r--service/java/com/android/server/wifi/WifiChannelUtilization.java1
-rw-r--r--service/java/com/android/server/wifi/WifiConnectivityManager.java65
-rw-r--r--service/java/com/android/server/wifi/WifiNetworkSelector.java28
-rw-r--r--tests/wifitests/src/com/android/server/wifi/BssidBlocklistMonitorTest.java14
-rw-r--r--tests/wifitests/src/com/android/server/wifi/ClientModeImplTest.java14
-rw-r--r--tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java79
8 files changed, 180 insertions, 46 deletions
diff --git a/service/java/com/android/server/wifi/BssidBlocklistMonitor.java b/service/java/com/android/server/wifi/BssidBlocklistMonitor.java
index 126627bbd..9b0409b97 100644
--- a/service/java/com/android/server/wifi/BssidBlocklistMonitor.java
+++ b/service/java/com/android/server/wifi/BssidBlocklistMonitor.java
@@ -18,7 +18,6 @@ package com.android.server.wifi;
import android.annotation.IntDef;
import android.annotation.NonNull;
-import android.annotation.Nullable;
import android.content.Context;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager;
@@ -560,12 +559,12 @@ public class BssidBlocklistMonitor {
.filter(entry -> ssid.equals(entry.ssid)).count();
}
- private int getNumBlockedBssidsForSsid(@Nullable String ssid) {
- if (ssid == null) {
+ private int getNumBlockedBssidsForSsids(@NonNull Set<String> ssids) {
+ if (ssids.isEmpty()) {
return 0;
}
return (int) mBssidStatusMap.values().stream()
- .filter(entry -> entry.isInBlocklist && ssid.equals(entry.ssid))
+ .filter(entry -> entry.isInBlocklist && ssids.contains(entry.ssid))
.count();
}
@@ -573,14 +572,14 @@ public class BssidBlocklistMonitor {
* Overloaded version of updateAndGetBssidBlocklist.
* Accepts a @Nullable String ssid as input, and updates the firmware roaming
* configuration if the blocklist for the input ssid has been changed.
- * @param ssid to update firmware roaming configuration for.
+ * @param ssids set of ssids to update firmware roaming configuration for.
* @return Set of BSSIDs currently in the blocklist
*/
- public Set<String> updateAndGetBssidBlocklistForSsid(@Nullable String ssid) {
- int numBefore = getNumBlockedBssidsForSsid(ssid);
+ public Set<String> updateAndGetBssidBlocklistForSsids(@NonNull Set<String> ssids) {
+ int numBefore = getNumBlockedBssidsForSsids(ssids);
Set<String> bssidBlocklist = updateAndGetBssidBlocklist();
- if (getNumBlockedBssidsForSsid(ssid) != numBefore) {
- updateFirmwareRoamingConfiguration(ssid);
+ if (getNumBlockedBssidsForSsids(ssids) != numBefore) {
+ updateFirmwareRoamingConfiguration(ssids);
}
return bssidBlocklist;
}
@@ -665,14 +664,14 @@ public class BssidBlocklistMonitor {
/**
* Sends the BSSIDs belonging to the input SSID down to the firmware to prevent auto-roaming
* to those BSSIDs.
- * @param ssid
+ * @param ssids
*/
- public void updateFirmwareRoamingConfiguration(@NonNull String ssid) {
+ public void updateFirmwareRoamingConfiguration(@NonNull Set<String> ssids) {
if (!mConnectivityHelper.isFirmwareRoamingSupported()) {
return;
}
ArrayList<String> bssidBlocklist = updateAndGetBssidBlocklistInternal()
- .filter(entry -> ssid.equals(entry.ssid))
+ .filter(entry -> ssids.contains(entry.ssid))
.sorted((o1, o2) -> (int) (o2.blocklistEndTimeMs - o1.blocklistEndTimeMs))
.map(entry -> entry.bssid)
.collect(Collectors.toCollection(ArrayList::new));
diff --git a/service/java/com/android/server/wifi/ClientModeImpl.java b/service/java/com/android/server/wifi/ClientModeImpl.java
index e79f88bbd..638a7004c 100644
--- a/service/java/com/android/server/wifi/ClientModeImpl.java
+++ b/service/java/com/android/server/wifi/ClientModeImpl.java
@@ -3357,7 +3357,7 @@ public class ClientModeImpl extends StateMachine implements ClientMode {
mLastScanRssi = mWifiConfigManager.findScanRssi(netId,
mWifiHealthMonitor.getScanRssiValidTimeMs());
mWifiScoreCard.noteConnectionAttempt(mWifiInfo, mLastScanRssi, config.SSID);
- mBssidBlocklistMonitor.updateFirmwareRoamingConfiguration(config.SSID);
+ mBssidBlocklistMonitor.updateFirmwareRoamingConfiguration(Set.of(config.SSID));
updateWifiConfigOnStartConnection(config, bssid);
reportConnectionAttemptStart(config, mTargetBssid,
diff --git a/service/java/com/android/server/wifi/WifiChannelUtilization.java b/service/java/com/android/server/wifi/WifiChannelUtilization.java
index 87d60aa7a..4ed0961c3 100644
--- a/service/java/com/android/server/wifi/WifiChannelUtilization.java
+++ b/service/java/com/android/server/wifi/WifiChannelUtilization.java
@@ -41,6 +41,7 @@ import java.util.Iterator;
* The cache is updated when a new stats arrives and it has been a long while since the last update.
* To get more statistically sound channel utilization, for these devices which support
* mobility state report, the cache update is stopped when the device stays in the stationary state.
+ * TODO(b/159052883): This may need to be reworked for STA + STA.
*/
public class WifiChannelUtilization {
private static final String TAG = "WifiChannelUtilization";
diff --git a/service/java/com/android/server/wifi/WifiConnectivityManager.java b/service/java/com/android/server/wifi/WifiConnectivityManager.java
index 2efd8e32c..81d66ce82 100644
--- a/service/java/com/android/server/wifi/WifiConnectivityManager.java
+++ b/service/java/com/android/server/wifi/WifiConnectivityManager.java
@@ -341,31 +341,52 @@ public class WifiConnectivityManager {
@NonNull String listenerName,
boolean isFullScan,
@NonNull HandleScanResultsListener handleScanResultsListener) {
- ClientModeManager clientModeManager = getPrimaryClientModeManager();
- // TODO (b/169413079): Include long lived secondary cmm here.
- mWifiChannelUtilization.refreshChannelStatsAndChannelUtilization(
- clientModeManager.getWifiLinkLayerStats(),
- WifiChannelUtilization.UNKNOWN_FREQ);
-
- updateUserDisabledList(scanDetails);
-
+ List<WifiNetworkSelector.ClientModeManagerState> cmmStates = new ArrayList<>();
+ Set<String> connectedSsids = new HashSet<>();
+ boolean hasExistingSecondaryCmm = false;
+ for (ClientModeManager clientModeManager :
+ mActiveModeWarden.getInternetConnectivityClientModeManagers()) {
+ if (clientModeManager.getRole() == ROLE_CLIENT_SECONDARY_LONG_LIVED) {
+ hasExistingSecondaryCmm = true;
+ }
+ mWifiChannelUtilization.refreshChannelStatsAndChannelUtilization(
+ clientModeManager.getWifiLinkLayerStats(),
+ WifiChannelUtilization.UNKNOWN_FREQ);
+ WifiInfo wifiInfo = clientModeManager.syncRequestConnectionInfo();
+ if (clientModeManager.isConnected()) {
+ connectedSsids.add(wifiInfo.getSSID());
+ }
+ cmmStates.add(new WifiNetworkSelector.ClientModeManagerState(clientModeManager));
+ }
+ // We don't have any existing secondary CMM, but are we allowed to create a secondary CMM
+ // and do we have a request for OEM_PAID/OEM_PRIVATE request? If yes, we need to perform
+ // network selection to check if we have any potential candidate for the secondary CMM
+ // creation.
+ if (!hasExistingSecondaryCmm
+ && (mOemPaidConnectionAllowed || mOemPrivateConnectionAllowed)) {
+ // prefer OEM PAID requestor if it exists.
+ WorkSource oemPaidOrOemPrivateRequestorWs =
+ mOemPaidConnectionRequestorWs != null
+ ? mOemPaidConnectionRequestorWs
+ : mOemPrivateConnectionRequestorWs;
+ if (mActiveModeWarden.canRequestMoreClientModeManagersInRole(
+ oemPaidOrOemPrivateRequestorWs,
+ ROLE_CLIENT_SECONDARY_LONG_LIVED)) {
+ // Add a placeholder CMM state to ensure network selection is performed for a
+ // potential second STA creation.
+ cmmStates.add(new WifiNetworkSelector.ClientModeManagerState());
+ }
+ }
// Check if any blocklisted BSSIDs can be freed.
mBssidBlocklistMonitor.tryEnablingBlockedBssids(scanDetails);
- WifiInfo wifiInfo = getPrimaryWifiInfo();
- // TODO (b/169413079): Include long lived secondary cmm here.
- Set<String> bssidBlocklist = mBssidBlocklistMonitor.updateAndGetBssidBlocklistForSsid(
- wifiInfo.getSSID());
-
+ Set<String> bssidBlocklist = mBssidBlocklistMonitor.updateAndGetBssidBlocklistForSsids(
+ connectedSsids);
+ updateUserDisabledList(scanDetails);
// Clear expired recent failure statuses
mConfigManager.cleanupExpiredRecentFailureReasons();
localLog(listenerName + " onResults: start network selection");
- WifiNetworkSelector.ClientModeManagerState primaryCmmState =
- new WifiNetworkSelector.ClientModeManagerState(clientModeManager);
- // TODO (b/169413079): Add long lived secondary cmm state here.
- List<WifiNetworkSelector.ClientModeManagerState> cmmStates = Arrays.asList(primaryCmmState);
-
List<WifiCandidates.Candidate> candidates = mNetworkSelector.getCandidatesFromScan(
scanDetails, bssidBlocklist, cmmStates, mUntrustedConnectionAllowed,
mOemPaidConnectionAllowed, mOemPrivateConnectionAllowed);
@@ -2136,9 +2157,9 @@ public class WifiConnectivityManager {
* Handler for WiFi state (connected/disconnected) changes
*/
public void handleConnectionStateChanged(ActiveModeManager activeModeManager, int state) {
- List<ClientModeManager> primaryManagers =
+ List<ClientModeManager> internetConnectivityCmms =
mActiveModeWarden.getInternetConnectivityClientModeManagers();
- if (!(primaryManagers.contains(activeModeManager))) {
+ if (!(internetConnectivityCmms.contains(activeModeManager))) {
Log.w(TAG, "Ignoring call from non primary Mode Manager " + activeModeManager,
new Throwable());
return;
@@ -2194,9 +2215,9 @@ public class WifiConnectivityManager {
*/
public void handleConnectionAttemptEnded(@NonNull ActiveModeManager activeModeManager,
int failureCode, @NonNull String bssid, @NonNull String ssid) {
- List<ClientModeManager> primaryManagers =
+ List<ClientModeManager> internetConnectivityCmms =
mActiveModeWarden.getInternetConnectivityClientModeManagers();
- if (!(primaryManagers.contains(activeModeManager))) {
+ if (!(internetConnectivityCmms.contains(activeModeManager))) {
Log.w(TAG, "Ignoring call from non primary Mode Manager " + activeModeManager,
new Throwable());
return;
diff --git a/service/java/com/android/server/wifi/WifiNetworkSelector.java b/service/java/com/android/server/wifi/WifiNetworkSelector.java
index 9863644a6..509f53f7b 100644
--- a/service/java/com/android/server/wifi/WifiNetworkSelector.java
+++ b/service/java/com/android/server/wifi/WifiNetworkSelector.java
@@ -49,6 +49,7 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@@ -759,6 +760,33 @@ public class WifiNetworkSelector {
this.disconnected = disconnected;
this.wifiInfo = wifiInfo;
}
+
+ @Override
+ public boolean equals(Object that) {
+ if (this == that) return true;
+ if (!(that instanceof ClientModeManagerState)) return false;
+ ClientModeManagerState thatCmmState = (ClientModeManagerState) that;
+ return Objects.equals(ifaceName, thatCmmState.ifaceName)
+ && connected == thatCmmState.connected
+ && disconnected == thatCmmState.disconnected
+ // Since wifiinfo does not have equals currently.
+ && Objects.equals(wifiInfo.getSSID(), thatCmmState.wifiInfo.getSSID())
+ && Objects.equals(wifiInfo.getBSSID(), thatCmmState.wifiInfo.getBSSID());
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(ifaceName, connected, disconnected,
+ wifiInfo.getSSID(), wifiInfo.getBSSID());
+ }
+
+ @Override
+ public String toString() {
+ return "ClientModeManagerState: " + ifaceName
+ + ", connection state: "
+ + (connected ? " connected" : (disconnected ? " disconnected" : "unknown"))
+ + ", WifiInfo: " + wifiInfo;
+ }
}
/**
diff --git a/tests/wifitests/src/com/android/server/wifi/BssidBlocklistMonitorTest.java b/tests/wifitests/src/com/android/server/wifi/BssidBlocklistMonitorTest.java
index db25e698e..564c80fdb 100644
--- a/tests/wifitests/src/com/android/server/wifi/BssidBlocklistMonitorTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/BssidBlocklistMonitorTest.java
@@ -233,7 +233,7 @@ public class BssidBlocklistMonitorTest {
verifyAddTestBssidToBlocklist();
when(mClock.getWallClockMillis()).thenReturn(BASE_BLOCKLIST_DURATION + 1);
assertEquals(0, mBssidBlocklistMonitor
- .updateAndGetBssidBlocklistForSsid(TEST_SSID_1).size());
+ .updateAndGetBssidBlocklistForSsids(Set.of(TEST_SSID_1)).size());
verify(mWifiConnectivityHelper).setFirmwareRoamingConfiguration(eq(new ArrayList<>()),
eq(new ArrayList<>()));
}
@@ -247,7 +247,7 @@ public class BssidBlocklistMonitorTest {
verifyAddTestBssidToBlocklist();
when(mClock.getWallClockMillis()).thenReturn(BASE_BLOCKLIST_DURATION + 1);
assertEquals(0, mBssidBlocklistMonitor
- .updateAndGetBssidBlocklistForSsid(TEST_SSID_2).size());
+ .updateAndGetBssidBlocklistForSsids(Set.of(TEST_SSID_2)).size());
verify(mWifiConnectivityHelper, never()).setFirmwareRoamingConfiguration(
eq(new ArrayList<>()), eq(new ArrayList<>()));
}
@@ -660,20 +660,20 @@ public class BssidBlocklistMonitorTest {
ArrayList<String> blocklist1 = new ArrayList<>();
blocklist1.add(TEST_BSSID_2);
blocklist1.add(TEST_BSSID_1);
- mBssidBlocklistMonitor.updateFirmwareRoamingConfiguration(TEST_SSID_1);
+ mBssidBlocklistMonitor.updateFirmwareRoamingConfiguration(Set.of(TEST_SSID_1));
verify(mWifiConnectivityHelper).setFirmwareRoamingConfiguration(eq(blocklist1),
eq(new ArrayList<>()));
// Verify we are sending 1 BSSID down to the firmware for SSID_2.
ArrayList<String> blocklist2 = new ArrayList<>();
blocklist2.add(TEST_BSSID_3);
- mBssidBlocklistMonitor.updateFirmwareRoamingConfiguration(TEST_SSID_2);
+ mBssidBlocklistMonitor.updateFirmwareRoamingConfiguration(Set.of(TEST_SSID_2));
verify(mWifiConnectivityHelper).setFirmwareRoamingConfiguration(eq(blocklist2),
eq(new ArrayList<>()));
// Verify we are not sending any BSSIDs down to the firmware since there does not
// exists any BSSIDs for TEST_SSID_3 in the blocklist.
- mBssidBlocklistMonitor.updateFirmwareRoamingConfiguration(TEST_SSID_3);
+ mBssidBlocklistMonitor.updateFirmwareRoamingConfiguration(Set.of(TEST_SSID_3));
verify(mWifiConnectivityHelper).setFirmwareRoamingConfiguration(eq(new ArrayList<>()),
eq(new ArrayList<>()));
}
@@ -704,7 +704,7 @@ public class BssidBlocklistMonitorTest {
}
blocklist.add(bssid + j);
}
- mBssidBlocklistMonitor.updateFirmwareRoamingConfiguration(TEST_SSID_1);
+ mBssidBlocklistMonitor.updateFirmwareRoamingConfiguration(Set.of(TEST_SSID_1));
verify(mWifiConnectivityHelper).setFirmwareRoamingConfiguration(eq(blocklist),
eq(new ArrayList<>()));
}
@@ -720,7 +720,7 @@ public class BssidBlocklistMonitorTest {
when(mWifiConnectivityHelper.isFirmwareRoamingSupported()).thenReturn(false);
verifyAddTestBssidToBlocklist();
- mBssidBlocklistMonitor.updateFirmwareRoamingConfiguration(TEST_SSID_1);
+ mBssidBlocklistMonitor.updateFirmwareRoamingConfiguration(Set.of(TEST_SSID_1));
verify(mWifiConnectivityHelper, never()).setFirmwareRoamingConfiguration(any(), any());
}
diff --git a/tests/wifitests/src/com/android/server/wifi/ClientModeImplTest.java b/tests/wifitests/src/com/android/server/wifi/ClientModeImplTest.java
index 0d5c9fe4f..30f312184 100644
--- a/tests/wifitests/src/com/android/server/wifi/ClientModeImplTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/ClientModeImplTest.java
@@ -160,6 +160,7 @@ import java.util.Arrays;
import java.util.BitSet;
import java.util.Collections;
import java.util.List;
+import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.function.Consumer;
@@ -2787,6 +2788,7 @@ public class ClientModeImplTest extends WifiBaseTest {
.thenReturn(TEST_LOCAL_MAC_ADDRESS.toString());
WifiConfiguration config = new WifiConfiguration();
+ config.SSID = sSSID;
config.macRandomizationSetting = WifiConfiguration.RANDOMIZATION_NONE;
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
when(mWifiConfigManager.getConfiguredNetworkWithoutMasking(0)).thenReturn(config);
@@ -2813,6 +2815,7 @@ public class ClientModeImplTest extends WifiBaseTest {
initializeAndAddNetworkAndVerifySuccess();
WifiConfiguration config = new WifiConfiguration();
+ config.SSID = sSSID;
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
config.macRandomizationSetting = WifiConfiguration.RANDOMIZATION_NONE;
when(mWifiConfigManager.getConfiguredNetworkWithoutMasking(0)).thenReturn(config);
@@ -2857,6 +2860,7 @@ public class ClientModeImplTest extends WifiBaseTest {
initializeAndAddNetworkAndVerifySuccess();
WifiConfiguration config = new WifiConfiguration();
+ config.SSID = sSSID;
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
config.macRandomizationSetting = WifiConfiguration.RANDOMIZATION_AUTO;
config.setRandomizedMacAddress(MacAddress.fromString(WifiInfo.DEFAULT_MAC_ADDRESS));
@@ -3306,9 +3310,9 @@ public class ClientModeImplTest extends WifiBaseTest {
public void testBssidBlocklistSentToFirmwareAfterCmdStartConnect() throws Exception {
initializeAndAddNetworkAndVerifySuccess();
mCmi.sendMessage(ClientModeImpl.CMD_START_CONNECT, 0, 0, sBSSID);
- verify(mBssidBlocklistMonitor, never()).updateFirmwareRoamingConfiguration(sSSID);
+ verify(mBssidBlocklistMonitor, never()).updateFirmwareRoamingConfiguration(Set.of(sSSID));
mLooper.dispatchAll();
- verify(mBssidBlocklistMonitor).updateFirmwareRoamingConfiguration(sSSID);
+ verify(mBssidBlocklistMonitor).updateFirmwareRoamingConfiguration(Set.of(sSSID));
// But don't expect to see connection success yet
verify(mWifiScoreCard, never()).noteIpConfiguration(any());
// And certainly not validation success
@@ -4405,6 +4409,7 @@ public class ClientModeImplTest extends WifiBaseTest {
initializeAndAddNetworkAndVerifySuccess();
WifiConfiguration config = mock(WifiConfiguration.class);
+ config.SSID = sSSID;
BitSet allowedKeyManagement = mock(BitSet.class);
config.allowedKeyManagement = allowedKeyManagement;
when(config.allowedKeyManagement.get(eq(WifiConfiguration.KeyMgmt.WPA_PSK))).thenReturn(
@@ -4432,6 +4437,7 @@ public class ClientModeImplTest extends WifiBaseTest {
initializeAndAddNetworkAndVerifySuccess();
WifiConfiguration config = mock(WifiConfiguration.class);
+ config.SSID = sSSID;
BitSet allowedKeyManagement = mock(BitSet.class);
BitSet allowedAuthAlgorithms = mock(BitSet.class);
config.allowedKeyManagement = allowedKeyManagement;
@@ -4462,6 +4468,7 @@ public class ClientModeImplTest extends WifiBaseTest {
initializeAndAddNetworkAndVerifySuccess();
WifiConfiguration config = mock(WifiConfiguration.class);
+ config.SSID = sSSID;
BitSet allowedKeyManagement = mock(BitSet.class);
config.allowedKeyManagement = allowedKeyManagement;
when(config.allowedKeyManagement.get(eq(WifiConfiguration.KeyMgmt.WPA_PSK)))
@@ -4501,6 +4508,7 @@ public class ClientModeImplTest extends WifiBaseTest {
initializeAndAddNetworkAndVerifySuccess();
WifiConfiguration config = mock(WifiConfiguration.class);
+ config.SSID = sSSID;
BitSet allowedKeyManagement = mock(BitSet.class);
BitSet allowedAuthAlgorithms = mock(BitSet.class);
BitSet allowedProtocols = mock(BitSet.class);
@@ -4549,6 +4557,7 @@ public class ClientModeImplTest extends WifiBaseTest {
initializeAndAddNetworkAndVerifySuccess();
WifiConfiguration config = mock(WifiConfiguration.class);
+ config.SSID = sSSID;
BitSet allowedKeyManagement = mock(BitSet.class);
BitSet allowedAuthAlgorithms = mock(BitSet.class);
BitSet allowedProtocols = mock(BitSet.class);
@@ -4621,6 +4630,7 @@ public class ClientModeImplTest extends WifiBaseTest {
initializeAndAddNetworkAndVerifySuccess();
WifiConfiguration config = mock(WifiConfiguration.class);
+ config.SSID = sSSID;
BitSet allowedKeyManagement = mock(BitSet.class);
BitSet allowedAuthAlgorithms = mock(BitSet.class);
BitSet allowedProtocols = mock(BitSet.class);
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java b/tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java
index 1f990701a..d42261662 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java
@@ -19,6 +19,7 @@ package com.android.server.wifi;
import static android.content.Intent.ACTION_SCREEN_OFF;
import static android.content.Intent.ACTION_SCREEN_ON;
+import static com.android.server.wifi.ActiveModeManager.ROLE_CLIENT_PRIMARY;
import static com.android.server.wifi.ActiveModeManager.ROLE_CLIENT_SECONDARY_LONG_LIVED;
import static com.android.server.wifi.ActiveModeManager.ROLE_CLIENT_SECONDARY_TRANSIENT;
import static com.android.server.wifi.ClientModeImpl.WIFI_WORK_SOURCE;
@@ -2888,11 +2889,11 @@ public class WifiConnectivityManagerTest extends WifiBaseTest {
InOrder inOrder = inOrder(mBssidBlocklistMonitor);
// Force a connectivity scan
inOrder.verify(mBssidBlocklistMonitor, never())
- .updateAndGetBssidBlocklistForSsid(anyString());
+ .updateAndGetBssidBlocklistForSsids(anySet());
mWifiConnectivityManager.forceConnectivityScan(WIFI_WORK_SOURCE);
inOrder.verify(mBssidBlocklistMonitor).tryEnablingBlockedBssids(any());
- inOrder.verify(mBssidBlocklistMonitor).updateAndGetBssidBlocklistForSsid(anyString());
+ inOrder.verify(mBssidBlocklistMonitor).updateAndGetBssidBlocklistForSsids(anySet());
}
/**
@@ -3974,6 +3975,80 @@ public class WifiConnectivityManagerTest extends WifiBaseTest {
inOrder.verify(mWifiScanner).startDisconnectedPnoScan(any(), any(), any(), any());
}
+ @Test
+ public void includeSecondaryStaWhenPresentInGetCandidatesFromScan() {
+ // Set screen to on
+ setScreenState(true);
+
+ ClientModeManager primaryCmm = mock(ClientModeManager.class);
+ WifiInfo wifiInfo1 = mock(WifiInfo.class);
+ when(primaryCmm.getInterfaceName()).thenReturn("wlan0");
+ when(primaryCmm.getRole()).thenReturn(ROLE_CLIENT_PRIMARY);
+ when(primaryCmm.isConnected()).thenReturn(false);
+ when(primaryCmm.isDisconnected()).thenReturn(true);
+ when(primaryCmm.syncRequestConnectionInfo()).thenReturn(wifiInfo1);
+
+ ClientModeManager secondaryCmm = mock(ClientModeManager.class);
+ WifiInfo wifiInfo2 = mock(WifiInfo.class);
+ when(secondaryCmm.getInterfaceName()).thenReturn("wlan1");
+ when(secondaryCmm.getRole()).thenReturn(ROLE_CLIENT_SECONDARY_LONG_LIVED);
+ when(secondaryCmm.isConnected()).thenReturn(false);
+ when(secondaryCmm.isDisconnected()).thenReturn(true);
+ when(secondaryCmm.syncRequestConnectionInfo()).thenReturn(wifiInfo2);
+
+ when(mActiveModeWarden.getInternetConnectivityClientModeManagers())
+ .thenReturn(Arrays.asList(primaryCmm, secondaryCmm));
+
+ // Set WiFi to disconnected state to trigger scan
+ mWifiConnectivityManager.handleConnectionStateChanged(
+ primaryCmm,
+ WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
+
+ List<WifiNetworkSelector.ClientModeManagerState> expectedCmmStates =
+ Arrays.asList(new WifiNetworkSelector.ClientModeManagerState(
+ "wlan0", false, true, wifiInfo1),
+ new WifiNetworkSelector.ClientModeManagerState(
+ "wlan1", false, true, wifiInfo2));
+ verify(mWifiNS).getCandidatesFromScan(any(), any(),
+ eq(expectedCmmStates), anyBoolean(), anyBoolean(), anyBoolean());
+ }
+
+ @Test
+ public void includeSecondaryStaWhenNotPresentButAvailableInGetCandidatesFromScan() {
+ // Set screen to on
+ setScreenState(true);
+ // set OEM paid connection allowed.
+ WorkSource oemPaidWs = new WorkSource();
+ mWifiConnectivityManager.setOemPaidConnectionAllowed(true, oemPaidWs);
+
+ ClientModeManager primaryCmm = mock(ClientModeManager.class);
+ WifiInfo wifiInfo1 = mock(WifiInfo.class);
+ when(primaryCmm.getInterfaceName()).thenReturn("wlan0");
+ when(primaryCmm.getRole()).thenReturn(ROLE_CLIENT_PRIMARY);
+ when(primaryCmm.isConnected()).thenReturn(false);
+ when(primaryCmm.isDisconnected()).thenReturn(true);
+ when(primaryCmm.syncRequestConnectionInfo()).thenReturn(wifiInfo1);
+
+ when(mActiveModeWarden.getInternetConnectivityClientModeManagers())
+ .thenReturn(Arrays.asList(primaryCmm));
+ // Second STA creation is allowed.
+ when(mActiveModeWarden.canRequestMoreClientModeManagersInRole(
+ eq(oemPaidWs), eq(ROLE_CLIENT_SECONDARY_LONG_LIVED))).thenReturn(true);
+
+ // Set WiFi to disconnected state to trigger scan
+ mWifiConnectivityManager.handleConnectionStateChanged(
+ primaryCmm,
+ WifiConnectivityManager.WIFI_STATE_DISCONNECTED);
+
+ List<WifiNetworkSelector.ClientModeManagerState> expectedCmmStates =
+ Arrays.asList(new WifiNetworkSelector.ClientModeManagerState(
+ "wlan0", false, true, wifiInfo1),
+ new WifiNetworkSelector.ClientModeManagerState(
+ "unknown", false, true, new WifiInfo()));
+ verify(mWifiNS).getCandidatesFromScan(any(), any(),
+ eq(expectedCmmStates), anyBoolean(), anyBoolean(), anyBoolean());
+ }
+
private void setWifiEnabled(boolean enable) {
ActiveModeWarden.ModeChangeCallback modeChangeCallback =
mModeChangeCallbackCaptor.getValue();