summaryrefslogtreecommitdiff
path: root/service
diff options
context:
space:
mode:
authorKai Shi <kaishi@google.com>2019-11-25 18:10:54 -0800
committerKai Shi <kaishi@google.com>2020-01-02 13:58:22 -0800
commit50148c4a8d15a8a65af0ba2434fefcc0ee5b3a3a (patch)
treed80a16ea0a511494f6037f4f52c0fd7b85a6fdbb /service
parentc1d2eaf646902d6512496a0e101b726b524d4978 (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.java17
-rw-r--r--service/java/com/android/server/wifi/WifiConnectivityManager.java22
-rw-r--r--service/java/com/android/server/wifi/WifiNetworkSelector.java98
-rw-r--r--service/res/values/config.xml12
-rw-r--r--service/res/values/overlayable.xml6
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" />