diff options
author | Kai Shi <kaishi@google.com> | 2019-11-25 18:10:54 -0800 |
---|---|---|
committer | Kai Shi <kaishi@google.com> | 2020-01-02 13:58:22 -0800 |
commit | 50148c4a8d15a8a65af0ba2434fefcc0ee5b3a3a (patch) | |
tree | d80a16ea0a511494f6037f4f52c0fd7b85a6fdbb /service | |
parent | c1d2eaf646902d6512496a0e101b726b524d4978 (diff) |
Wifi: enhance pre-scan check and simplify network selection sufficiency check.
1) Skip single scan scheduled by periodic scan alarm if current RSSI ssufficient
2) Simplify pre-network-selection sufficiency check. Skip selection only if
+) Current network has internet access, active traffic and sufficient RSSI.
+) or current network is in OSU process.
3) Move to rely on network selection scorer to stick with user selected network.
Bug: 141714375
Test: unit test with atest com.android.server.wifi
Test: manual test with phone.
Change-Id: Id232b59a546271d7f0798bc6a85ca6ccd65621e9
Diffstat (limited to 'service')
-rw-r--r-- | service/java/com/android/server/wifi/ScoringParams.java | 17 | ||||
-rw-r--r-- | service/java/com/android/server/wifi/WifiConnectivityManager.java | 22 | ||||
-rw-r--r-- | service/java/com/android/server/wifi/WifiNetworkSelector.java | 98 | ||||
-rw-r--r-- | service/res/values/config.xml | 12 | ||||
-rw-r--r-- | service/res/values/overlayable.xml | 6 |
5 files changed, 73 insertions, 82 deletions
diff --git a/service/java/com/android/server/wifi/ScoringParams.java b/service/java/com/android/server/wifi/ScoringParams.java index 94efde198..216848771 100644 --- a/service/java/com/android/server/wifi/ScoringParams.java +++ b/service/java/com/android/server/wifi/ScoringParams.java @@ -48,6 +48,8 @@ public class ScoringParams { private static final int SUFFICIENT = 2; private static final int GOOD = 3; + private static final int ACTIVE_TRAFFIC = 1; + private static final int HIGH_TRAFFIC = 2; /** * Parameter values are stored in a separate container so that a new collection of values can * be checked for consistency before activating them. @@ -284,7 +286,10 @@ public class ScoringParams { R.integer.config_wifiFrameworkSecureNetworkBonus); mVal.lastSelectionBonus = context.getResources().getInteger( R.integer.config_wifiFrameworkLastSelectionBonus); - + mVal.pps[ACTIVE_TRAFFIC] = context.getResources().getInteger( + R.integer.config_wifiFrameworkMinPacketPerSecondActiveTraffic); + mVal.pps[HIGH_TRAFFIC] = context.getResources().getInteger( + R.integer.config_wifiFrameworkMinPacketPerSecondHighTraffic); try { mVal.validate(); } catch (IllegalArgumentException e) { @@ -409,7 +414,15 @@ public class ScoringParams { */ public int getYippeeSkippyPacketsPerSecond() { loadResources(mContext); - return mVal.pps[2]; + return mVal.pps[HIGH_TRAFFIC]; + } + + /** + * Returns a packet rate that should be considered acceptable to skip scan or network selection + */ + public int getActiveTrafficPacketsPerSecond() { + loadResources(mContext); + return mVal.pps[ACTIVE_TRAFFIC]; } /** diff --git a/service/java/com/android/server/wifi/WifiConnectivityManager.java b/service/java/com/android/server/wifi/WifiConnectivityManager.java index 5c67fa591..53261d36e 100644 --- a/service/java/com/android/server/wifi/WifiConnectivityManager.java +++ b/service/java/com/android/server/wifi/WifiConnectivityManager.java @@ -268,8 +268,8 @@ public class WifiConnectivityManager { /** * Set whether bluetooth is in the connected state */ - public void setBluetoothConnected(boolean isBlueToothConnected) { - mNetworkSelector.setBluetoothConnected(isBlueToothConnected); + public void setBluetoothConnected(boolean isBluetoothConnected) { + mNetworkSelector.setBluetoothConnected(isBluetoothConnected); } // All single scan results listener. @@ -574,7 +574,6 @@ public class WifiConnectivityManager { mClock = clock; mScoringParams = scoringParams; mConnectionAttemptTimeStamps = new LinkedList<>(); - mPnoScanIntervalMs = MOVING_PNO_SCAN_INTERVAL_MS; // Listen to WifiConfigManager network update events @@ -815,15 +814,12 @@ public class WifiConnectivityManager { boolean isScanNeeded = true; boolean isFullBandScan = true; - boolean isTrafficOverThreshold = mWifiInfo.getTxSuccessRate() - > mContext.getResources().getInteger( - R.integer.config_wifi_framework_max_tx_rate_for_full_scan) - || mWifiInfo.getRxSuccessRate() - > mContext.getResources().getInteger( - R.integer.config_wifi_framework_max_rx_rate_for_full_scan); - - // If the WiFi traffic is heavy, only partial scan is proposed. - if (mWifiState == WIFI_STATE_CONNECTED && isTrafficOverThreshold) { + + // If current network link quality is sufficient or has active stream, + // skip scan (with firmware roaming) or do partial scan only (without firmware roaming). + if (mWifiState == WIFI_STATE_CONNECTED + && (mNetworkSelector.hasSufficientLinkQuality(mWifiInfo, mScoringParams) + || mNetworkSelector.hasActiveStream(mWifiInfo, mScoringParams))) { // If only partial scan is proposed and firmware roaming control is supported, // we will not issue any scan because firmware roaming will take care of // intra-SSID roam. @@ -831,7 +827,7 @@ public class WifiConnectivityManager { localLog("No partial scan because firmware roaming is supported."); isScanNeeded = false; } else { - localLog("No full band scan due to ongoing traffic"); + localLog("No full band scan because current network is sufficient"); isFullBandScan = false; } } diff --git a/service/java/com/android/server/wifi/WifiNetworkSelector.java b/service/java/com/android/server/wifi/WifiNetworkSelector.java index 426a81424..fec8e0dde 100644 --- a/service/java/com/android/server/wifi/WifiNetworkSelector.java +++ b/service/java/com/android/server/wifi/WifiNetworkSelector.java @@ -214,7 +214,34 @@ public class WifiNetworkSelector { mLocalLog.log(log); } - private boolean isCurrentNetworkSufficient(WifiInfo wifiInfo, List<ScanDetail> scanDetails) { + /** + * Check if current network has sufficient RSSI + * @param wifiInfo info of currently connected network + * @param scoringParams scoring parameter set including RSSI sufficiency check threshold + * @return true if current link quality is sufficient, false otherwise. + */ + public static boolean hasSufficientLinkQuality(WifiInfo wifiInfo, ScoringParams scoringParams) { + int currentRssi = wifiInfo.getRssi(); + return currentRssi >= scoringParams.getSufficientRssi(wifiInfo.getFrequency()); + } + + /** + * Check if current network has active Tx or Rx traffic + * @param wifiInfo info of currently connected network + * @param scoringParams scoring parameter set including active traffic check threshold + * @return true if it has active Tx or Rx traffic, false otherwise. + */ + public static boolean hasActiveStream(WifiInfo wifiInfo, ScoringParams scoringParams) { + return (wifiInfo.getTxSuccessRate() > scoringParams.getActiveTrafficPacketsPerSecond()) + || (wifiInfo.getRxSuccessRate() > scoringParams.getActiveTrafficPacketsPerSecond()); + } + + /** + * Check if one of following conditions is met to avoid a new network selection + * 1) current network is in OSU process + * 2) current network has internet access, sufficient link quality and active traffic + */ + private boolean isCurrentNetworkSufficient(WifiInfo wifiInfo) { // Currently connected? if (wifiInfo.getSupplicantState() != SupplicantState.COMPLETED) { localLog("No current connected network."); @@ -224,19 +251,6 @@ public class WifiNetworkSelector { + " , ID: " + wifiInfo.getNetworkId()); } - final int stayOnNetworkMinimumTxRate = mContext.getResources().getInteger( - R.integer.config_wifi_framework_min_tx_rate_for_staying_on_network); - final int stayOnNetworkMinimumRxRate = mContext.getResources().getInteger( - R.integer.config_wifi_framework_min_rx_rate_for_staying_on_network); - int currentRssi = wifiInfo.getRssi(); - boolean hasQualifiedRssi = currentRssi - > mScoringParams.getSufficientRssi(wifiInfo.getFrequency()); - boolean hasActiveStream = (wifiInfo.getTxSuccessRate() > stayOnNetworkMinimumTxRate) - || (wifiInfo.getRxSuccessRate() > stayOnNetworkMinimumRxRate); - if (hasQualifiedRssi && hasActiveStream) { - localLog("Stay on current network because of good RSSI and ongoing traffic"); - return true; - } WifiConfiguration network = mWifiConfigManager.getConfiguredNetwork(wifiInfo.getNetworkId()); @@ -245,58 +259,25 @@ public class WifiNetworkSelector { return false; } - if (mWifiConfigManager.getLastSelectedNetwork() == network.networkId - && (mClock.getElapsedSinceBootMillis() - - mWifiConfigManager.getLastSelectedTimeStamp()) - <= LAST_USER_SELECTION_SUFFICIENT_MS) { - localLog("Current network is recently user-selected."); - return true; - } - - // OSU (Online Sign Up) network for Passpoint Release 2 is sufficient network. + // Set OSU (Online Sign Up) network for Passpoint Release 2 to sufficient + // so that network select selection is skipped and OSU process can complete. if (network.osu) { return true; } - // Ephemeral network is not qualified. - if (wifiInfo.isEphemeral()) { - localLog("Current network is an ephemeral one."); - return false; - } - - if (wifiInfo.is24GHz()) { - // 2.4GHz networks is not qualified whenever 5GHz is available - if (is5GHzNetworkAvailable(scanDetails)) { - localLog("Current network is 2.4GHz. 5GHz networks available."); - return false; - } - } - if (!hasQualifiedRssi) { - localLog("Current network RSSI[" + currentRssi + "]-acceptable but not qualified."); - return false; - } - - // Open network is not qualified. - if (WifiConfigurationUtil.isConfigForOpenNetwork(network)) { - localLog("Current network is a open one."); - return false; - } - - // Network with no internet access reports is not qualified. + // Network with no internet access reports is not sufficient if (network.numNoInternetAccessReports > 0 && !network.noInternetAccessExpected) { localLog("Current network has [" + network.numNoInternetAccessReports + "] no-internet access reports."); return false; } - return true; - } - // Determine whether there are any 5GHz networks in the scan result - private boolean is5GHzNetworkAvailable(List<ScanDetail> scanDetails) { - for (ScanDetail detail : scanDetails) { - ScanResult result = detail.getScanResult(); - if (result.is5GHz()) return true; + if ((hasSufficientLinkQuality(wifiInfo, mScoringParams)) + && hasActiveStream(wifiInfo, mScoringParams)) { + localLog("Stay on current network due to sufficient link quality and ongoing traffic"); + return true; } + return false; } @@ -326,8 +307,10 @@ public class WifiNetworkSelector { return false; } } - - if (isCurrentNetworkSufficient(wifiInfo, scanDetails)) { + // Please note other scans (e.g., location scan or app scan) may also trigger network + // selection and these scans may or may not run sufficiency check. + // So it is better to run sufficiency check here before network selection. + if (isCurrentNetworkSufficient(wifiInfo)) { localLog("Current connected network already sufficient. Skip network selection."); return false; } else { @@ -828,6 +811,7 @@ public class WifiNetworkSelector { // Get a fresh copy of WifiConfiguration reflecting any scan result updates WifiConfiguration selectedNetwork = mWifiConfigManager.getConfiguredNetwork(selectedNetworkId); + // TODO (b/136675430): the legacyOverrideWanted check seems unnecessary if (selectedNetwork != null && legacyOverrideWanted) { selectedNetwork = overrideCandidateWithUserConnectChoice(selectedNetwork); mLastNetworkSelectionTimeStamp = mClock.getElapsedSinceBootMillis(); diff --git a/service/res/values/config.xml b/service/res/values/config.xml index ec8da0e50..29cd63456 100644 --- a/service/res/values/config.xml +++ b/service/res/values/config.xml @@ -98,12 +98,12 @@ boundaries. --> <integer translatable="false" name="config_wifiFrameworkLastSelectionBonus">1999</integer> - <!-- Integers specifying the max packet Tx/Rx rates for full scan --> - <integer translatable="false" name="config_wifi_framework_max_tx_rate_for_full_scan">8</integer> - <integer translatable="false" name="config_wifi_framework_max_rx_rate_for_full_scan">16</integer> - <!-- Integers specifying the min packet Tx/Rx rates in packets per second for staying on the same network --> - <integer translatable="false" name="config_wifi_framework_min_tx_rate_for_staying_on_network">16</integer> - <integer translatable="false" name="config_wifi_framework_min_rx_rate_for_staying_on_network">16</integer> + <!-- Integer specifying the min packet Tx/Rx rates in packets per second to be considered + active traffic so that network selection and scan could be skipped--> + <integer translatable="false" name="config_wifiFrameworkMinPacketPerSecondActiveTraffic">16</integer> + <!-- Integer specifying the min packet Tx/Rx rates in packets per second to be considered + high traffic so that the device should stay on WiFi even if RSSI is very low --> + <integer translatable="false" name="config_wifiFrameworkMinPacketPerSecondHighTraffic">100</integer> <!-- Integer parameters of the wifi to cellular handover feature wifi should not stick to bad networks --> <!-- Integer threshold for low network score, should be somewhat less than the entry threshhold --> diff --git a/service/res/values/overlayable.xml b/service/res/values/overlayable.xml index e7b82ce64..a60e04d19 100644 --- a/service/res/values/overlayable.xml +++ b/service/res/values/overlayable.xml @@ -40,10 +40,8 @@ <item type="integer" name="config_wifiFrameworkCurrentNetworkBonus" /> <item type="integer" name="config_wifiFrameworkSecureNetworkBonus" /> <item type="integer" name="config_wifiFrameworkLastSelectionBonus" /> - <item type="integer" name="config_wifi_framework_max_tx_rate_for_full_scan" /> - <item type="integer" name="config_wifi_framework_max_rx_rate_for_full_scan" /> - <item type="integer" name="config_wifi_framework_min_tx_rate_for_staying_on_network" /> - <item type="integer" name="config_wifi_framework_min_rx_rate_for_staying_on_network" /> + <item type="integer" name="config_wifiFrameworkMinPacketPerSecondActiveTraffic" /> + <item type="integer" name="config_wifiFrameworkMinPacketPerSecondHighTraffic" /> <item type="integer" name="config_wifi_framework_wifi_score_bad_rssi_threshold_5GHz" /> <item type="integer" name="config_wifi_framework_wifi_score_entry_rssi_threshold_5GHz" /> <item type="integer" name="config_wifi_framework_wifi_score_low_rssi_threshold_5GHz" /> |