summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoshan Pius <rpius@google.com>2016-05-20 23:18:48 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2016-05-20 23:18:48 +0000
commita2cc7092156cb3280fa4b9c1d832e5d1ed2855a4 (patch)
tree1bca2410fa30e67529766e8a8c1504af791d02f5
parent61d025c1d760de811fd62e3b2d376b47d61d10a1 (diff)
parentfb196453c07daad5e525520cecad84cec5d89fb7 (diff)
Merge "WifiConnectivityManager: Fall back to full band scan" into nyc-dev
-rw-r--r--service/java/com/android/server/wifi/WifiConnectivityManager.java18
-rw-r--r--service/java/com/android/server/wifi/WifiStateMachine.java6
-rw-r--r--tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java136
3 files changed, 145 insertions, 15 deletions
diff --git a/service/java/com/android/server/wifi/WifiConnectivityManager.java b/service/java/com/android/server/wifi/WifiConnectivityManager.java
index dd182dd16..4e4cd2fbc 100644
--- a/service/java/com/android/server/wifi/WifiConnectivityManager.java
+++ b/service/java/com/android/server/wifi/WifiConnectivityManager.java
@@ -621,13 +621,13 @@ public class WifiConnectivityManager {
}
}
- // Helper for setting the channels for connectivity scan when
- // band is unspecified
- private void setScanChannels(ScanSettings settings) {
+ // Helper for setting the channels for connectivity scan when band is unspecified. Returns
+ // false if we can't retrieve the info.
+ private boolean setScanChannels(ScanSettings settings) {
WifiConfiguration config = mStateMachine.getCurrentWifiConfiguration();
if (config == null) {
- return;
+ return false;
}
HashSet<Integer> freqs = mConfigManager.makeChannelList(config, CHANNEL_LIST_AGE_MS);
@@ -638,8 +638,10 @@ public class WifiConnectivityManager {
for (Integer freq : freqs) {
settings.channels[index++] = new WifiScanner.ChannelSpec(freq);
}
+ return true;
} else {
- localLog("no scan channels for " + config.configKey());
+ localLog("No scan channels for " + config.configKey() + ". Perform full band scan");
+ return false;
}
}
@@ -703,10 +705,12 @@ public class WifiConnectivityManager {
mPnoScanListener.resetLowRssiNetworkRetryDelay();
ScanSettings settings = new ScanSettings();
- settings.band = getScanBand(isFullBandScan);
if (!isFullBandScan) {
- setScanChannels(settings);
+ if (!setScanChannels(settings)) {
+ isFullBandScan = true;
+ }
}
+ settings.band = getScanBand(isFullBandScan);
settings.reportEvents = WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
| WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN;
settings.numBssidsPerScan = 0;
diff --git a/service/java/com/android/server/wifi/WifiStateMachine.java b/service/java/com/android/server/wifi/WifiStateMachine.java
index f5309a70f..936fa146c 100644
--- a/service/java/com/android/server/wifi/WifiStateMachine.java
+++ b/service/java/com/android/server/wifi/WifiStateMachine.java
@@ -5227,7 +5227,11 @@ public class WifiStateMachine extends StateMachine implements WifiNative.WifiRss
}
}
- WifiConfiguration getCurrentWifiConfiguration() {
+ /**
+ * Returns Wificonfiguration object correponding to the currently connected network, null if
+ * not connected.
+ */
+ public WifiConfiguration getCurrentWifiConfiguration() {
if (mLastNetworkId == WifiConfiguration.INVALID_NETWORK_ID) {
return null;
}
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java b/tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java
index 2127a0145..9fb859d39 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java
@@ -18,7 +18,7 @@ package com.android.server.wifi;
import static com.android.server.wifi.WifiConfigurationTestUtil.generateWifiConfig;
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import android.content.Context;
@@ -28,6 +28,7 @@ import android.net.wifi.ScanResult.InformationElement;
import android.net.wifi.SupplicantState;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
import android.net.wifi.WifiScanner;
import android.net.wifi.WifiScanner.PnoScanListener;
import android.net.wifi.WifiScanner.PnoSettings;
@@ -46,6 +47,7 @@ import org.junit.Test;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
+import java.util.HashSet;
import java.util.concurrent.atomic.AtomicInteger;
/**
@@ -65,7 +67,7 @@ public class WifiConnectivityManagerTest {
mContext = mockContext();
mWifiStateMachine = mockWifiStateMachine();
mWifiConfigManager = mockWifiConfigManager();
- mWifiInfo = mockWifiInfo();
+ mWifiInfo = getWifiInfo();
mWifiScanner = mockWifiScanner();
mWifiQNS = mockWifiQualifiedNetworkSelector();
mWifiConnectivityManager = new WifiConnectivityManager(mContext, mWifiStateMachine,
@@ -198,12 +200,12 @@ public class WifiConnectivityManagerTest {
return qns;
}
- WifiInfo mockWifiInfo() {
- WifiInfo wifiInfo = mock(WifiInfo.class);
+ WifiInfo getWifiInfo() {
+ WifiInfo wifiInfo = new WifiInfo();
- when(wifiInfo.getNetworkId()).thenReturn(WifiConfiguration.INVALID_NETWORK_ID);
- when(wifiInfo.getBSSID()).thenReturn(null);
- when(wifiInfo.getSupplicantState()).thenReturn(SupplicantState.DISCONNECTED);
+ wifiInfo.setNetworkId(WifiConfiguration.INVALID_NETWORK_ID);
+ wifiInfo.setBSSID(null);
+ wifiInfo.setSupplicantState(SupplicantState.DISCONNECTED);
return wifiInfo;
}
@@ -618,4 +620,124 @@ public class WifiConnectivityManagerTest {
assertEquals(intervalMs, WifiConnectivityManager.MAX_PERIODIC_SCAN_INTERVAL_MS);
}
+
+ /**
+ * Verify that we perform full band scan when the currently connected network's tx/rx success
+ * rate is low.
+ *
+ * Expected behavior: WifiConnectivityManager does full band scan.
+ */
+ @Test
+ public void checkSingleScanSettingsWhenConnectedWithLowDataRate() {
+ mWifiInfo.txSuccessRate = 0;
+ mWifiInfo.rxSuccessRate = 0;
+
+ final HashSet<Integer> channelList = new HashSet<>();
+ channelList.add(1);
+ channelList.add(2);
+ channelList.add(3);
+
+ when(mWifiStateMachine.getCurrentWifiConfiguration())
+ .thenReturn(new WifiConfiguration());
+ when(mWifiStateMachine.getFrequencyBand())
+ .thenReturn(WifiManager.WIFI_FREQUENCY_BAND_5GHZ);
+ when(mWifiConfigManager.makeChannelList(any(WifiConfiguration.class), anyInt()))
+ .thenReturn(channelList);
+
+ doAnswer(new AnswerWithArguments() {
+ public void answer(ScanSettings settings, ScanListener listener,
+ WorkSource workSource) throws Exception {
+ assertEquals(settings.band, WifiScanner.WIFI_BAND_5_GHZ_WITH_DFS);
+ assertNull(settings.channels);
+ }}).when(mWifiScanner).startScan(anyObject(), anyObject(), anyObject());
+
+ // Set screen to ON
+ mWifiConnectivityManager.handleScreenStateChanged(true);
+
+ // Set WiFi to connected state to trigger periodic scan
+ mWifiConnectivityManager.handleConnectionStateChanged(
+ WifiConnectivityManager.WIFI_STATE_CONNECTED);
+
+ verify(mWifiScanner).startScan(anyObject(), anyObject(), anyObject());
+ }
+
+ /**
+ * Verify that we perform partial scan when the currently connected network's tx/rx success
+ * rate is high and when the currently connected network is present in scan
+ * cache in WifiConfigManager.
+ *
+ * Expected behavior: WifiConnectivityManager does full band scan.
+ */
+ @Test
+ public void checkSingleScanSettingsWhenConnectedWithHighDataRate() {
+ mWifiInfo.txSuccessRate = WifiConfigManager.MAX_TX_PACKET_FOR_FULL_SCANS * 2;
+ mWifiInfo.rxSuccessRate = WifiConfigManager.MAX_RX_PACKET_FOR_FULL_SCANS * 2;
+
+ final HashSet<Integer> channelList = new HashSet<>();
+ channelList.add(1);
+ channelList.add(2);
+ channelList.add(3);
+
+ when(mWifiStateMachine.getCurrentWifiConfiguration())
+ .thenReturn(new WifiConfiguration());
+ when(mWifiConfigManager.makeChannelList(any(WifiConfiguration.class), anyInt()))
+ .thenReturn(channelList);
+
+ doAnswer(new AnswerWithArguments() {
+ public void answer(ScanSettings settings, ScanListener listener,
+ WorkSource workSource) throws Exception {
+ assertEquals(settings.band, WifiScanner.WIFI_BAND_UNSPECIFIED);
+ assertEquals(settings.channels.length, channelList.size());
+ for (int chanIdx = 0; chanIdx < settings.channels.length; chanIdx++) {
+ assertTrue(channelList.contains(settings.channels[chanIdx].frequency));
+ }
+ }}).when(mWifiScanner).startScan(anyObject(), anyObject(), anyObject());
+
+ // Set screen to ON
+ mWifiConnectivityManager.handleScreenStateChanged(true);
+
+ // Set WiFi to connected state to trigger periodic scan
+ mWifiConnectivityManager.handleConnectionStateChanged(
+ WifiConnectivityManager.WIFI_STATE_CONNECTED);
+
+ verify(mWifiScanner).startScan(anyObject(), anyObject(), anyObject());
+ }
+
+ /**
+ * Verify that we fall back to full band scan when the currently connected network's tx/rx
+ * success rate is high and the currently connected network is not present in scan cache in
+ * WifiConfigManager. This is simulated by returning an empty hashset in |makeChannelList|.
+ *
+ * Expected behavior: WifiConnectivityManager does full band scan.
+ */
+ @Test
+ public void checkSingleScanSettingsWhenConnectedWithHighDataRateNotInCache() {
+ mWifiInfo.txSuccessRate = WifiConfigManager.MAX_TX_PACKET_FOR_FULL_SCANS * 2;
+ mWifiInfo.rxSuccessRate = WifiConfigManager.MAX_RX_PACKET_FOR_FULL_SCANS * 2;
+
+ final HashSet<Integer> channelList = new HashSet<>();
+
+ when(mWifiStateMachine.getCurrentWifiConfiguration())
+ .thenReturn(new WifiConfiguration());
+ when(mWifiStateMachine.getFrequencyBand())
+ .thenReturn(WifiManager.WIFI_FREQUENCY_BAND_5GHZ);
+ when(mWifiConfigManager.makeChannelList(any(WifiConfiguration.class), anyInt()))
+ .thenReturn(channelList);
+
+ doAnswer(new AnswerWithArguments() {
+ public void answer(ScanSettings settings, ScanListener listener,
+ WorkSource workSource) throws Exception {
+ assertEquals(settings.band, WifiScanner.WIFI_BAND_5_GHZ_WITH_DFS);
+ assertNull(settings.channels);
+ }}).when(mWifiScanner).startScan(anyObject(), anyObject(), anyObject());
+
+ // Set screen to ON
+ mWifiConnectivityManager.handleScreenStateChanged(true);
+
+ // Set WiFi to connected state to trigger periodic scan
+ mWifiConnectivityManager.handleConnectionStateChanged(
+ WifiConnectivityManager.WIFI_STATE_CONNECTED);
+
+ verify(mWifiScanner).startScan(anyObject(), anyObject(), anyObject());
+ }
}