summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoshan Pius <rpius@google.com>2020-05-29 15:47:43 -0700
committerRoshan Pius <rpius@google.com>2020-05-30 04:44:19 +0000
commita442338fbb51bc797ab03eca48d3b0bc0c454e2e (patch)
treea2a19efa9f3e0d7fe7732d6a540dff5c4ff6ba29
parent7cf18381fa2099230c49269a435090115b7e633b (diff)
ClientModeImpl: Ignore connect when connecting to network
Use internal variables to check whether we're connected or connecting to the network requested in WifiManager.connect(). If there is a credential change, we will forcefully retrigger a new connection request. Bug: 157696785 Test: atest com.android.server.wifi Change-Id: I514b5b3a1ed5205fde98bc6fd2b59285e10913ef Merged-In: I514b5b3a1ed5205fde98bc6fd2b59285e10913ef
-rw-r--r--service/java/com/android/server/wifi/ClientModeImpl.java6
-rw-r--r--tests/wifitests/src/com/android/server/wifi/ClientModeImplTest.java54
2 files changed, 57 insertions, 3 deletions
diff --git a/service/java/com/android/server/wifi/ClientModeImpl.java b/service/java/com/android/server/wifi/ClientModeImpl.java
index 0f84b3dd9..7769455e8 100644
--- a/service/java/com/android/server/wifi/ClientModeImpl.java
+++ b/service/java/com/android/server/wifi/ClientModeImpl.java
@@ -368,7 +368,7 @@ public class ClientModeImpl extends StateMachine {
private String mTargetBssid = SUPPLICANT_BSSID_ANY;
// This one is used to track the current target network ID. This is used for error
// handling during connection setup since many error message from supplicant does not report
- // SSID Once connected, it will be set to invalid
+ // SSID. Once connected, it will be set to invalid
private int mTargetNetworkId = WifiConfiguration.INVALID_NETWORK_ID;
private long mLastDriverRoamAttempt = 0;
private WifiConfiguration mTargetWifiConfiguration = null;
@@ -1211,8 +1211,8 @@ public class ClientModeImpl extends StateMachine {
private void connectToUserSelectNetwork(int netId, int uid, boolean forceReconnect) {
logd("connectToUserSelectNetwork netId " + netId + ", uid " + uid
+ ", forceReconnect = " + forceReconnect);
- if (!forceReconnect && mWifiInfo.getNetworkId() == netId) {
- // We're already connected to the user specified network, don't trigger a
+ if (!forceReconnect && (mLastNetworkId == netId || mTargetNetworkId == netId)) {
+ // We're already connecting/connected to the user specified network, don't trigger a
// reconnection unless it was forced.
logi("connectToUserSelectNetwork already connecting/connected=" + netId);
} else {
diff --git a/tests/wifitests/src/com/android/server/wifi/ClientModeImplTest.java b/tests/wifitests/src/com/android/server/wifi/ClientModeImplTest.java
index 1761b2113..b53b648cf 100644
--- a/tests/wifitests/src/com/android/server/wifi/ClientModeImplTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/ClientModeImplTest.java
@@ -1535,6 +1535,60 @@ public class ClientModeImplTest extends WifiBaseTest {
}
/**
+ * If caller tries to connect to a network that is already connecting, the connection request
+ * should succeed.
+ *
+ * Test: Create and trigger connect to a network, then try to reconnect to the same network.
+ * Verify that connection request returns with CONNECT_NETWORK_SUCCEEDED and did not trigger a
+ * new connection.
+ */
+ @Test
+ public void reconnectToConnectingNetwork() throws Exception {
+ triggerConnect();
+
+ // try to reconnect to the same network (before connection is established).
+ IActionListener connectActionListener = mock(IActionListener.class);
+ mCmi.connect(null, FRAMEWORK_NETWORK_ID, mock(Binder.class), connectActionListener, 0,
+ Binder.getCallingUid());
+ mLooper.dispatchAll();
+ verify(connectActionListener).onSuccess();
+
+ // Verify that we didn't trigger a second connection.
+ verify(mWifiNative, times(1)).connectToNetwork(eq(WIFI_IFACE_NAME), any());
+ }
+
+ /**
+ * If caller tries to connect to a network that is already connecting, the connection request
+ * should succeed.
+ *
+ * Test: Create and trigger connect to a network, then try to reconnect to the same network.
+ * Verify that connection request returns with CONNECT_NETWORK_SUCCEEDED and did trigger a new
+ * connection.
+ */
+ @Test
+ public void reconnectToConnectingNetworkWithCredentialChange() throws Exception {
+ triggerConnect();
+
+ // try to reconnect to the same network with a credential changed (before connection is
+ // established).
+ WifiConfiguration config = new WifiConfiguration();
+ config.networkId = FRAMEWORK_NETWORK_ID;
+ NetworkUpdateResult networkUpdateResult =
+ new NetworkUpdateResult(false /* ip */, false /* proxy */, true /* credential */);
+ networkUpdateResult.setNetworkId(FRAMEWORK_NETWORK_ID);
+ when(mWifiConfigManager.addOrUpdateNetwork(eq(config), anyInt()))
+ .thenReturn(networkUpdateResult);
+ IActionListener connectActionListener = mock(IActionListener.class);
+ mCmi.connect(config, WifiConfiguration.INVALID_NETWORK_ID, mock(Binder.class),
+ connectActionListener, 0, Binder.getCallingUid());
+ mLooper.dispatchAll();
+ verify(connectActionListener).onSuccess();
+
+ // Verify that we triggered a second connection.
+ verify(mWifiNative, times(2)).connectToNetwork(eq(WIFI_IFACE_NAME), any());
+ }
+
+ /**
* If caller tries to connect to a new network while still provisioning the current one,
* the connection attempt should succeed.
*/