summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--service/java/com/android/server/wifi/WifiConfigManager.java13
-rw-r--r--service/java/com/android/server/wifi/hotspot2/PasspointNetworkEvaluator.java12
-rw-r--r--tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java34
-rw-r--r--tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointNetworkEvaluatorTest.java25
4 files changed, 74 insertions, 10 deletions
diff --git a/service/java/com/android/server/wifi/WifiConfigManager.java b/service/java/com/android/server/wifi/WifiConfigManager.java
index 9332c5979..48e7e713a 100644
--- a/service/java/com/android/server/wifi/WifiConfigManager.java
+++ b/service/java/com/android/server/wifi/WifiConfigManager.java
@@ -2737,7 +2737,7 @@ public class WifiConfigManager {
}
/**
- * Disable an ephemeral SSID for the purpose of network selection.
+ * Disable an ephemeral or Passpoint SSID for the purpose of network selection.
*
* The network will be re-enabled when:
* a) The user creates a network for that SSID and then forgets.
@@ -2754,7 +2754,7 @@ public class WifiConfigManager {
}
WifiConfiguration foundConfig = null;
for (WifiConfiguration config : getInternalConfiguredNetworks()) {
- if (config.ephemeral && TextUtils.equals(config.SSID, ssid)) {
+ if ((config.ephemeral || config.isPasspoint()) && TextUtils.equals(config.SSID, ssid)) {
foundConfig = config;
break;
}
@@ -2764,8 +2764,13 @@ public class WifiConfigManager {
Log.d(TAG, "Forget ephemeral SSID " + ssid + " num="
+ mDeletedEphemeralSsidsToTimeMap.size());
if (foundConfig != null) {
- Log.d(TAG, "Found ephemeral config in disableEphemeralNetwork: "
- + foundConfig.networkId);
+ if (foundConfig.ephemeral) {
+ Log.d(TAG, "Found ephemeral config in disableEphemeralNetwork: "
+ + foundConfig.networkId);
+ } else if (foundConfig.isPasspoint()) {
+ Log.d(TAG, "Found Passpoint config in disableEphemeralNetwork: "
+ + foundConfig.networkId + ", FQDN: " + foundConfig.FQDN);
+ }
}
return foundConfig;
}
diff --git a/service/java/com/android/server/wifi/hotspot2/PasspointNetworkEvaluator.java b/service/java/com/android/server/wifi/hotspot2/PasspointNetworkEvaluator.java
index 58c51486d..b39743530 100644
--- a/service/java/com/android/server/wifi/hotspot2/PasspointNetworkEvaluator.java
+++ b/service/java/com/android/server/wifi/hotspot2/PasspointNetworkEvaluator.java
@@ -19,6 +19,7 @@ package com.android.server.wifi.hotspot2;
import static com.android.server.wifi.hotspot2.Utils.isCarrierEapMethod;
import android.annotation.NonNull;
+import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.hotspot2.PasspointConfiguration;
import android.os.Process;
@@ -131,10 +132,19 @@ public class PasspointNetworkEvaluator implements WifiNetworkSelector.NetworkEva
if (!scanDetail.getNetworkDetail().isInterworking()) {
continue;
}
+ ScanResult scanResult = scanDetail.getScanResult();
+
+ // If the user previously disconnects this network, don't select it.
+ if (mWifiConfigManager.wasEphemeralNetworkDeleted(
+ ScanResultUtil.createQuotedSSID(scanResult.SSID))) {
+ mLocalLog.log("Ignoring disabled the SSID of Passpoint AP: "
+ + WifiNetworkSelector.toScanId(scanResult));
+ continue;
+ }
// Find the best provider for this ScanDetail.
Pair<PasspointProvider, PasspointMatch> bestProvider =
- mPasspointManager.matchProvider(scanDetail.getScanResult());
+ mPasspointManager.matchProvider(scanResult);
if (bestProvider != null) {
if (bestProvider.first.isSimCredential() && !mWifiConfigManager.isSimPresent()) {
// Skip providers backed by SIM credential when SIM is not present.
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java b/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java
index d21808981..2f73ca7f0 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java
@@ -4415,8 +4415,7 @@ public class WifiConfigManagerTest {
*/
@Test
public void testDisableEphemeralNetwork() throws Exception {
- WifiConfiguration ephemeralNetwork = WifiConfigurationTestUtil.createOpenNetwork();
- ephemeralNetwork.ephemeral = true;
+ WifiConfiguration ephemeralNetwork = WifiConfigurationTestUtil.createEphemeralNetwork();
List<WifiConfiguration> networks = new ArrayList<>();
networks.add(ephemeralNetwork);
@@ -4427,21 +4426,46 @@ public class WifiConfigManagerTest {
WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
networks, retrievedNetworks);
+ verifyExpiryOfTimeout(ephemeralNetwork);
+ }
+
+ /**
+ * Verifies the disconnection of Passpoint network using
+ * {@link WifiConfigManager#disableEphemeralNetwork(String)}.
+ */
+ @Test
+ public void testDisablePasspointNetwork() throws Exception {
+ WifiConfiguration passpointNetwork = WifiConfigurationTestUtil.createPasspointNetwork();
+
+ verifyAddPasspointNetworkToWifiConfigManager(passpointNetwork);
+
+ List<WifiConfiguration> networks = new ArrayList<>();
+ networks.add(passpointNetwork);
+
+ List<WifiConfiguration> retrievedNetworks =
+ mWifiConfigManager.getConfiguredNetworksWithPasswords();
+ WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
+ networks, retrievedNetworks);
+
+ verifyExpiryOfTimeout(passpointNetwork);
+ }
+
+ private void verifyExpiryOfTimeout(WifiConfiguration config) {
// Disable the ephemeral network.
long disableTimeMs = 546643L;
long currentTimeMs = disableTimeMs;
when(mClock.getWallClockMillis()).thenReturn(currentTimeMs);
- mWifiConfigManager.disableEphemeralNetwork(ephemeralNetwork.SSID);
+ mWifiConfigManager.disableEphemeralNetwork(config.SSID);
// Before the expiry of timeout.
currentTimeMs = disableTimeMs + WifiConfigManager.DELETED_EPHEMERAL_SSID_EXPIRY_MS - 1;
when(mClock.getWallClockMillis()).thenReturn(currentTimeMs);
- assertTrue(mWifiConfigManager.wasEphemeralNetworkDeleted(ephemeralNetwork.SSID));
+ assertTrue(mWifiConfigManager.wasEphemeralNetworkDeleted(config.SSID));
// After the expiry of timeout.
currentTimeMs = disableTimeMs + WifiConfigManager.DELETED_EPHEMERAL_SSID_EXPIRY_MS + 1;
when(mClock.getWallClockMillis()).thenReturn(currentTimeMs);
- assertFalse(mWifiConfigManager.wasEphemeralNetworkDeleted(ephemeralNetwork.SSID));
+ assertFalse(mWifiConfigManager.wasEphemeralNetworkDeleted(config.SSID));
}
private NetworkUpdateResult verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
diff --git a/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointNetworkEvaluatorTest.java b/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointNetworkEvaluatorTest.java
index a396d4d93..6cbd84864 100644
--- a/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointNetworkEvaluatorTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointNetworkEvaluatorTest.java
@@ -636,4 +636,29 @@ public class PasspointNetworkEvaluatorTest {
anyInt());
verify(mOnConnectableListener, never()).onConnectable(any(), any(), anyInt());
}
+
+ /**
+ * Verify that when a network matching a home provider is found, but the network was
+ * disconnected previously by user, it returns {@code null} for candidate.
+ */
+ @Test
+ public void evaluateScanResultWithHomeMatchButPreviouslyUserDisconnected() {
+ List<ScanDetail> scanDetails = Arrays.asList(new ScanDetail[]{
+ generateScanDetail(TEST_SSID1, TEST_BSSID1)});
+
+ // Setup matching providers for ScanDetail with TEST_SSID1.
+ Pair<PasspointProvider, PasspointMatch> homeProvider = Pair.create(
+ TEST_PROVIDER1, PasspointMatch.HomeProvider);
+
+ // Return homeProvider for the first ScanDetail (TEST_SSID1).
+ when(mPasspointManager.matchProvider(any(ScanResult.class))).thenReturn(homeProvider);
+ when(mWifiConfigManager.addOrUpdateNetwork(any(WifiConfiguration.class), anyInt()))
+ .thenReturn(new NetworkUpdateResult(TEST_NETWORK_ID));
+ when(mWifiConfigManager.getConfiguredNetwork(TEST_NETWORK_ID)).thenReturn(TEST_CONFIG1);
+ when(mWifiConfigManager.wasEphemeralNetworkDeleted("\"" + TEST_SSID1 + "\""))
+ .thenReturn(true);
+ assertEquals(null, mEvaluator.evaluateNetworks(
+ scanDetails, null, null, false, false, mOnConnectableListener));
+ verify(mOnConnectableListener, never()).onConnectable(any(), any(), anyInt());
+ }
}