diff options
author | Roshan Pius <rpius@google.com> | 2016-05-20 23:18:48 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2016-05-20 23:18:48 +0000 |
commit | a2cc7092156cb3280fa4b9c1d832e5d1ed2855a4 (patch) | |
tree | 1bca2410fa30e67529766e8a8c1504af791d02f5 | |
parent | 61d025c1d760de811fd62e3b2d376b47d61d10a1 (diff) | |
parent | fb196453c07daad5e525520cecad84cec5d89fb7 (diff) |
Merge "WifiConnectivityManager: Fall back to full band scan" into nyc-dev
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()); + } } |