From 2800851c885bd0f228e42a587c1db33da98f29ce Mon Sep 17 00:00:00 2001 From: Kai Shi Date: Thu, 25 Jun 2020 23:29:12 -0700 Subject: Bug fix channel utilization during high traffic In some wifi hal implmentations, ccaBusyTime includes the device's own packet Rx time which results in high channel utilization during full-buffer downlink throughput test. The fix is to add config_wifiChannelUtilizationOverridingEnabled to allow OEM to use fixed band-dependent values. These band-dependent values are programmable through overlay. Test: atest com.android.server.wifi Test: manually check reported cca level during iperf downlink and uplink test Bug: 159866355 Change-Id: If8432929f767ceaf6f18a7d269636dcaf909f33a Merged-In: I6e131f149d242e5dbf0b8b0087303e85ed428f9f --- .../server/wifi/WifiChannelUtilization.java | 27 ++++++++++++++++++++-- .../java/com/android/server/wifi/WifiInjector.java | 4 ++-- service/res/values/config.xml | 9 ++++++++ service/res/values/overlayable.xml | 4 ++++ 4 files changed, 40 insertions(+), 4 deletions(-) (limited to 'service') diff --git a/service/java/com/android/server/wifi/WifiChannelUtilization.java b/service/java/com/android/server/wifi/WifiChannelUtilization.java index 906e2d04c..5e8cde61d 100644 --- a/service/java/com/android/server/wifi/WifiChannelUtilization.java +++ b/service/java/com/android/server/wifi/WifiChannelUtilization.java @@ -19,6 +19,8 @@ package com.android.server.wifi; import static android.net.wifi.WifiManager.DEVICE_MOBILITY_STATE_STATIONARY; import static android.net.wifi.WifiManager.DEVICE_MOBILITY_STATE_UNKNOWN; +import android.content.Context; +import android.net.wifi.ScanResult; import android.net.wifi.WifiManager.DeviceMobilityState; import android.util.Log; import android.util.SparseArray; @@ -27,6 +29,7 @@ import android.util.SparseIntArray; import com.android.internal.annotations.VisibleForTesting; import com.android.server.wifi.WifiLinkLayerStats.ChannelStats; import com.android.server.wifi.util.InformationElementUtil.BssLoad; +import com.android.wifi.resources.R; import java.util.ArrayDeque; import java.util.Iterator; @@ -60,6 +63,7 @@ public class WifiChannelUtilization { @VisibleForTesting static final int CHANNEL_STATS_CACHE_SIZE = 5; private final Clock mClock; + private final Context mContext; private @DeviceMobilityState int mDeviceMobilityState = DEVICE_MOBILITY_STATE_UNKNOWN; private int mCacheUpdateIntervalMinMs = DEFAULT_CACHE_UPDATE_INTERVAL_MIN_MS; @@ -72,7 +76,8 @@ public class WifiChannelUtilization { private long mLastChannelStatsMapTimeStamp; private int mLastChannelStatsMapMobilityState; - WifiChannelUtilization(Clock clock) { + WifiChannelUtilization(Clock clock, Context context) { + mContext = context; mClock = clock; } @@ -85,7 +90,7 @@ public class WifiChannelUtilization { } /** - * Initialize internal variables and status after wifi is enabled + * (Re)initialize internal variables and status * @param wifiLinkLayerStats The latest wifi link layer stats */ public void init(WifiLinkLayerStats wifiLinkLayerStats) { @@ -120,6 +125,19 @@ public class WifiChannelUtilization { * @return Utilization ratio value if it is available; BssLoad.INVALID otherwise */ public int getUtilizationRatio(int frequency) { + if (mContext.getResources().getBoolean( + R.bool.config_wifiChannelUtilizationOverrideEnabled)) { + if (ScanResult.is24GHz(frequency)) { + return mContext.getResources().getInteger( + R.integer.config_wifiChannelUtilizationOverride2g); + } + if (ScanResult.is5GHz(frequency)) { + return mContext.getResources().getInteger( + R.integer.config_wifiChannelUtilizationOverride5g); + } + return mContext.getResources().getInteger( + R.integer.config_wifiChannelUtilizationOverride6g); + } return mChannelUtilizationMap.get(frequency, BssLoad.INVALID); } @@ -153,6 +171,11 @@ public class WifiChannelUtilization { */ public void refreshChannelStatsAndChannelUtilization(WifiLinkLayerStats wifiLinkLayerStats, int frequency) { + if (mContext.getResources().getBoolean( + R.bool.config_wifiChannelUtilizationOverrideEnabled)) { + return; + } + if (wifiLinkLayerStats == null) { return; } diff --git a/service/java/com/android/server/wifi/WifiInjector.java b/service/java/com/android/server/wifi/WifiInjector.java index 8f6465b00..b9aa0521f 100644 --- a/service/java/com/android/server/wifi/WifiInjector.java +++ b/service/java/com/android/server/wifi/WifiInjector.java @@ -329,7 +329,7 @@ public class WifiInjector { mWifiDiagnostics = new WifiDiagnostics( mContext, this, mWifiNative, mBuildProperties, new LastMileLogger(this), mClock); - mWifiChannelUtilizationConnected = new WifiChannelUtilization(mClock); + mWifiChannelUtilizationConnected = new WifiChannelUtilization(mClock, mContext); mWifiDataStall = new WifiDataStall(mFrameworkFacade, mWifiMetrics, mContext, mDeviceConfigFacade, mWifiChannelUtilizationConnected, mClock, wifiHandler, mThroughputPredictor); @@ -617,7 +617,7 @@ public class WifiInjector { mBssidBlocklistMonitor = new BssidBlocklistMonitor(mContext, mWifiConnectivityHelper, mWifiLastResortWatchdog, mClock, mConnectivityLocalLog, mWifiScoreCard); mWifiMetrics.setBssidBlocklistMonitor(mBssidBlocklistMonitor); - mWifiChannelUtilizationScan = new WifiChannelUtilization(mClock); + mWifiChannelUtilizationScan = new WifiChannelUtilization(mClock, mContext); return new WifiConnectivityManager(mContext, getScoringParams(), clientModeImpl, this, mWifiConfigManager, mWifiNetworkSuggestionsManager, clientModeImpl.getWifiInfo(), diff --git a/service/res/values/config.xml b/service/res/values/config.xml index 4ea23adc0..cc80f608c 100644 --- a/service/res/values/config.xml +++ b/service/res/values/config.xml @@ -422,6 +422,15 @@ 3000 + + true + + 80 + 15 + 10 + true diff --git a/service/res/values/overlayable.xml b/service/res/values/overlayable.xml index b02eb9e77..a4b7011b0 100644 --- a/service/res/values/overlayable.xml +++ b/service/res/values/overlayable.xml @@ -132,6 +132,10 @@ + + + + -- cgit v1.2.3