summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRandy Pan <zpan@google.com>2016-09-20 16:09:49 -0700
committerRandy Pan <zpan@google.com>2016-09-21 10:45:02 -0700
commit8cf5bfbee9d70dac8c83729a979bd7208a47d44d (patch)
tree327b5c70ff41a72f4e3bb7b1ffc3802b29fa52dc
parent891bba121efd35038a2b17744779acc01ead8ad0 (diff)
downloadwifi-8cf5bfbee9d70dac8c83729a979bd7208a47d44d.tar.gz
WCM: forced connectivity scan
WCM starts a full band single scan when user forces a connectivity scan and wait for the full band scan results to make network selection. Bug: 30897947 Test: unit tests and manual test Change-Id: Ie220c25dd60a0534afbf33f62691f32515f7062b
-rw-r--r--service/java/com/android/server/wifi/WifiConnectivityManager.java18
-rw-r--r--service/java/com/android/server/wifi/WifiStateMachine.java7
-rw-r--r--tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java58
3 files changed, 75 insertions, 8 deletions
diff --git a/service/java/com/android/server/wifi/WifiConnectivityManager.java b/service/java/com/android/server/wifi/WifiConnectivityManager.java
index 1c6ba648c..49a2842d6 100644
--- a/service/java/com/android/server/wifi/WifiConnectivityManager.java
+++ b/service/java/com/android/server/wifi/WifiConnectivityManager.java
@@ -150,6 +150,7 @@ public class WifiConnectivityManager {
private long mLastPeriodicSingleScanTimeStamp = RESET_TIME_STAMP;
private boolean mPnoScanStarted = false;
private boolean mPeriodicScanTimerSet = false;
+ private boolean mWaitForFullBandScanResults = false;
// PNO settings
private int mMin5GHzRssi;
@@ -325,9 +326,21 @@ public class WifiConnectivityManager {
public void onResults(WifiScanner.ScanData[] results) {
if (!mWifiEnabled || !mWifiConnectivityManagerEnabled) {
clearScanDetails();
+ mWaitForFullBandScanResults = false;
return;
}
+ // Full band scan results only.
+ if (mWaitForFullBandScanResults) {
+ if (!results[0].isAllChannelsScanned()) {
+ localLog("AllSingleScanListener waiting for full band scan results.");
+ clearScanDetails();
+ return;
+ } else {
+ mWaitForFullBandScanResults = false;
+ }
+ }
+
boolean wasConnectAttempted = handleScanResults(mScanDetails, "AllSingleScanListener");
clearScanDetails();
@@ -1078,7 +1091,8 @@ public class WifiConnectivityManager {
public void forceConnectivityScan() {
Log.i(TAG, "forceConnectivityScan");
- startConnectivityScan(SCAN_IMMEDIATELY);
+ mWaitForFullBandScanResults = true;
+ startSingleScan(true);
}
/**
@@ -1122,6 +1136,7 @@ public class WifiConnectivityManager {
stopConnectivityScan();
resetLastPeriodicSingleScanTimeStamp();
mLastConnectionAttemptBssid = null;
+ mWaitForFullBandScanResults = false;
} else if (mWifiConnectivityManagerEnabled) {
startConnectivityScan(SCAN_IMMEDIATELY);
}
@@ -1139,6 +1154,7 @@ public class WifiConnectivityManager {
stopConnectivityScan();
resetLastPeriodicSingleScanTimeStamp();
mLastConnectionAttemptBssid = null;
+ mWaitForFullBandScanResults = false;
} else if (mWifiEnabled) {
startConnectivityScan(SCAN_IMMEDIATELY);
}
diff --git a/service/java/com/android/server/wifi/WifiStateMachine.java b/service/java/com/android/server/wifi/WifiStateMachine.java
index 5425181cc..a66a68f32 100644
--- a/service/java/com/android/server/wifi/WifiStateMachine.java
+++ b/service/java/com/android/server/wifi/WifiStateMachine.java
@@ -5607,8 +5607,11 @@ public class WifiStateMachine extends StateMachine implements WifiNative.WifiRss
config, disableOthers, message.sendingUid);
if (!ok) {
messageHandlingStatus = MESSAGE_HANDLING_STATUS_FAIL;
- } else if (disableOthers) {
- mTargetNetworkId = netId;
+ } else {
+ if (disableOthers) {
+ mTargetNetworkId = netId;
+ }
+ mWifiConnectivityManager.forceConnectivityScan();
}
replyToMessage(message, message.what, ok ? SUCCESS : FAILURE);
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java b/tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java
index b1f88ecc9..281ffa163 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java
@@ -33,6 +33,7 @@ import android.net.wifi.WifiManager;
import android.net.wifi.WifiScanner;
import android.net.wifi.WifiScanner.PnoScanListener;
import android.net.wifi.WifiScanner.PnoSettings;
+import android.net.wifi.WifiScanner.ScanData;
import android.net.wifi.WifiScanner.ScanListener;
import android.net.wifi.WifiScanner.ScanSettings;
import android.net.wifi.WifiSsid;
@@ -71,6 +72,7 @@ public class WifiConnectivityManagerTest {
mWifiStateMachine = mockWifiStateMachine();
mWifiConfigManager = mockWifiConfigManager();
mWifiInfo = getWifiInfo();
+ mScanData = mockScanData();
mWifiScanner = mockWifiScanner();
mWifiQNS = mockWifiQualifiedNetworkSelector();
mWifiConnectivityManager = new WifiConnectivityManager(mContext, mWifiStateMachine,
@@ -96,6 +98,7 @@ public class WifiConnectivityManagerTest {
private WifiQualifiedNetworkSelector mWifiQNS;
private WifiStateMachine mWifiStateMachine;
private WifiScanner mWifiScanner;
+ private ScanData mScanData;
private WifiConfigManager mWifiConfigManager;
private WifiInfo mWifiInfo;
private Clock mClock = mock(Clock.class);
@@ -128,6 +131,14 @@ public class WifiConnectivityManagerTest {
return context;
}
+ ScanData mockScanData() {
+ ScanData scanData = mock(ScanData.class);
+
+ when(scanData.isAllChannelsScanned()).thenReturn(true);
+
+ return scanData;
+ }
+
WifiScanner mockWifiScanner() {
WifiScanner scanner = mock(WifiScanner.class);
ArgumentCaptor<ScanListener> allSingleScanListenerCaptor =
@@ -135,9 +146,8 @@ public class WifiConnectivityManagerTest {
doNothing().when(scanner).registerScanListener(allSingleScanListenerCaptor.capture());
- // dummy scan results. QNS PeriodicScanListener bulids scanDetails from
- // the fullScanResult and doesn't really use results
- final WifiScanner.ScanData[] scanDatas = new WifiScanner.ScanData[1];
+ ScanData[] scanDatas = new ScanData[1];
+ scanDatas[0] = mScanData;
// do a synchronous answer for the ScanListener callbacks
doAnswer(new AnswerWithArguments() {
@@ -756,8 +766,9 @@ public class WifiConnectivityManagerTest {
currentTimeStamp += 2000;
when(mClock.elapsedRealtime()).thenReturn(currentTimeStamp);
- // Force a connectivity scan
- mWifiConnectivityManager.forceConnectivityScan();
+ // Allow untrusted networks so WifiConnectivityManager starts a periodic scan
+ // immediately.
+ mWifiConnectivityManager.setUntrustedConnectionAllowed(true);
// Get the second periodic scan actual time stamp. Note, this scan is not
// started from the AlarmManager.
@@ -944,4 +955,41 @@ public class WifiConnectivityManagerTest {
verify(mWifiStateMachine).autoConnectToNetwork(
CANDIDATE_NETWORK_ID, CANDIDATE_BSSID);
}
+
+ /**
+ * Verify that a forced connectivity scan waits for full band scan
+ * results.
+ *
+ * Expected behavior: WifiConnectivityManager doesn't invoke
+ * WifiStateMachine.autoConnectToNetwork() when full band scan
+ * results are not available.
+ */
+ @Test
+ public void waitForFullBandScanResults() {
+ // Set WiFi to connected state.
+ mWifiConnectivityManager.handleConnectionStateChanged(
+ WifiConnectivityManager.WIFI_STATE_CONNECTED);
+
+ // Set up as partial scan results.
+ when(mScanData.isAllChannelsScanned()).thenReturn(false);
+
+ // Force a connectivity scan which enables WifiConnectivityManager
+ // to wait for full band scan results.
+ mWifiConnectivityManager.forceConnectivityScan();
+
+ // No roaming because no full band scan results.
+ verify(mWifiStateMachine, times(0)).autoConnectToNetwork(
+ CANDIDATE_NETWORK_ID, CANDIDATE_BSSID);
+
+ // Set up as full band scan results.
+ when(mScanData.isAllChannelsScanned()).thenReturn(true);
+
+ // Force a connectivity scan which enables WifiConnectivityManager
+ // to wait for full band scan results.
+ mWifiConnectivityManager.forceConnectivityScan();
+
+ // Roaming attempt because full band scan results are available.
+ verify(mWifiStateMachine).autoConnectToNetwork(
+ CANDIDATE_NETWORK_ID, CANDIDATE_BSSID);
+ }
}