diff options
author | Kai Shi <kaishi@google.com> | 2020-06-25 23:29:12 -0700 |
---|---|---|
committer | Kai Shi <kaishi@google.com> | 2020-06-29 18:39:54 -0700 |
commit | 2800851c885bd0f228e42a587c1db33da98f29ce (patch) | |
tree | 017335d573c8abeaebfba1c9c5317e01aaf95df5 | |
parent | 90723104f67badbfd95ca374fea2b514d3a314f3 (diff) |
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
6 files changed, 70 insertions, 6 deletions
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 @@ <!-- Integer indicating the RSSI and link layer stats polling interval in milliseconds when device is connected and screen is on --> <integer translatable="false" name="config_wifiPollRssiIntervalMilliseconds">3000</integer> + <!-- Override channel utilization estimation with fixed value --> + <bool translatable="false" name="config_wifiChannelUtilizationOverrideEnabled">true</bool> + <!-- Integer values represent the channel utilization in different RF bands when + config_wifiChannelUtilizationOverridingEnabled is true. + They should be set to [0, 255] corresponding to utilization ratio between 0 and 1 --> + <integer translatable="false" name="config_wifiChannelUtilizationOverride2g">80</integer> + <integer translatable="false" name="config_wifiChannelUtilizationOverride5g">15</integer> + <integer translatable="false" name="config_wifiChannelUtilizationOverride6g">10</integer> + <!-- Enable WPA2 to WPA3 auto-upgrade --> <bool translatable="false" name="config_wifiSaeUpgradeEnabled">true</bool> 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 @@ <item type="integer" name="config_wifiHighMovementNetworkSelectionOptimizationRssiDelta" /> <item type="integer" name="config_wifiRttBackgroundExecGapMs" /> <item type="integer" name="config_wifiPollRssiIntervalMilliseconds" /> + <item type="bool" name="config_wifiChannelUtilizationOverrideEnabled" /> + <item type="integer" name="config_wifiChannelUtilizationOverride2g" /> + <item type="integer" name="config_wifiChannelUtilizationOverride5g" /> + <item type="integer" name="config_wifiChannelUtilizationOverride6g" /> <item type="bool" name="config_wifiSaeUpgradeEnabled" /> <item type="bool" name="config_wifiSaeUpgradeOffloadEnabled" /> <item type="integer" name="config_wifiMaxNativeFailureSelfRecoveryPerHour" /> diff --git a/tests/wifitests/src/com/android/server/wifi/WifiChannelUtilizationTest.java b/tests/wifitests/src/com/android/server/wifi/WifiChannelUtilizationTest.java index 31fc7b7a9..bb6ff74a3 100644 --- a/tests/wifitests/src/com/android/server/wifi/WifiChannelUtilizationTest.java +++ b/tests/wifitests/src/com/android/server/wifi/WifiChannelUtilizationTest.java @@ -30,10 +30,13 @@ import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.*; import static org.mockito.Mockito.validateMockitoUsage; +import android.content.Context; + import androidx.test.filters.SmallTest; import com.android.server.wifi.WifiLinkLayerStats.ChannelStats; import com.android.server.wifi.util.InformationElementUtil.BssLoad; +import com.android.wifi.resources.R; import org.junit.After; import org.junit.Before; @@ -48,13 +51,19 @@ import org.mockito.MockitoAnnotations; public class WifiChannelUtilizationTest extends WifiBaseTest { private WifiChannelUtilization mWifiChannelUtilization; @Mock private Clock mClock; + @Mock Context mContext; + MockResources mMockResources = new MockResources(); /** * Called before each test */ @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - mWifiChannelUtilization = new WifiChannelUtilization(mClock); + when(mContext.getResources()).thenReturn(mMockResources); + mMockResources.setBoolean( + R.bool.config_wifiChannelUtilizationOverrideEnabled, + false); + mWifiChannelUtilization = new WifiChannelUtilization(mClock, mContext); mWifiChannelUtilization.init(null); } @@ -428,4 +437,23 @@ public class WifiChannelUtilizationTest extends WifiBaseTest { mWifiChannelUtilization.setUtilizationRatio(freq, utilizationRatio); assertEquals(utilizationRatio, mWifiChannelUtilization.getUtilizationRatio(freq)); } + + @Test + public void verifyOverridingUtilizationRatio() throws Exception { + mMockResources.setBoolean( + R.bool.config_wifiChannelUtilizationOverrideEnabled, + true); + mMockResources.setInteger( + R.integer.config_wifiChannelUtilizationOverride2g, + 60); + mMockResources.setInteger( + R.integer.config_wifiChannelUtilizationOverride5g, + 20); + mMockResources.setInteger( + R.integer.config_wifiChannelUtilizationOverride6g, + 10); + assertEquals(60, mWifiChannelUtilization.getUtilizationRatio(2412)); + assertEquals(20, mWifiChannelUtilization.getUtilizationRatio(5810)); + assertEquals(10, mWifiChannelUtilization.getUtilizationRatio(6710)); + } } diff --git a/tests/wifitests/src/com/android/server/wifi/WifiDataStallTest.java b/tests/wifitests/src/com/android/server/wifi/WifiDataStallTest.java index 61979f1e8..b1eb5e9a8 100644 --- a/tests/wifitests/src/com/android/server/wifi/WifiDataStallTest.java +++ b/tests/wifitests/src/com/android/server/wifi/WifiDataStallTest.java @@ -212,7 +212,7 @@ public class WifiDataStallTest extends WifiBaseTest { } /** - * Verify throughtput when Rx link speed is unavailable. + * Verify throughput when Rx link speed is unavailable. * Also verify the logging of channel utilization and throughput. */ @Test |