Do not perform RNR scan when no 6Ghz channels supported
Only enable RNR when at least one 6Ghz channel is supported.
Bug: 203616701
Test: atest com.android.server.wifi
Change-Id: Ief7f09d6de48c4556b69f5cccfb625c808e830e0
diff --git a/framework/java/android/net/wifi/WifiScanner.java b/framework/java/android/net/wifi/WifiScanner.java
index 1773200..147c405 100644
--- a/framework/java/android/net/wifi/WifiScanner.java
+++ b/framework/java/android/net/wifi/WifiScanner.java
@@ -181,7 +181,8 @@
* This constant is used for {@link ScanSettings#setRnrSetting(int)}.
* <p>
* Scan 6Ghz APs co-located with 2.4/5Ghz APs using Reduced Neighbor Report (RNR) if the 6Ghz
- * band is explicitly requested to be scanned. The 6Ghz band is explicitly requested if the
+ * band is explicitly requested to be scanned and the current country code supports scanning
+ * of at least one 6Ghz channel. The 6Ghz band is explicitly requested if the
* ScanSetting.band parameter is set to one of:
* <li> {@link #WIFI_BAND_6_GHZ} </li>
* <li> {@link #WIFI_BAND_24_5_6_GHZ} </li>
@@ -194,7 +195,8 @@
/**
* This constant is used for {@link ScanSettings#setRnrSetting(int)}.
* <p>
- * Request to scan 6Ghz APs co-located with 2.4/5Ghz APs using Reduced Neighbor Report (RNR).
+ * Request to scan 6Ghz APs co-located with 2.4/5Ghz APs using Reduced Neighbor Report (RNR)
+ * when the current country code supports scanning of at least one 6Ghz channel.
**/
public static final int WIFI_RNR_ENABLED = 1;
/**
diff --git a/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java b/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java
index 2310f1b..29efe33 100644
--- a/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java
+++ b/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java
@@ -1282,10 +1282,19 @@
bucketSettings.report_events = WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN;
ChannelCollection channels = mChannelHelper.createChannelCollection();
+ WifiScanner.ChannelSpec[][] available6GhzChannels =
+ mChannelHelper.getAvailableScanChannels(WifiScanner.WIFI_BAND_6_GHZ);
+ boolean are6GhzChannelsAvailable = available6GhzChannels.length > 0
+ && available6GhzChannels[0].length > 0;
List<WifiNative.HiddenNetwork> hiddenNetworkList = new ArrayList<>();
for (RequestInfo<ScanSettings> entry : mPendingScans) {
settings.scanType = mergeScanTypes(settings.scanType, entry.settings.type);
- settings.enable6GhzRnr = mergeRnrSetting(settings.enable6GhzRnr, entry.settings);
+ if (are6GhzChannelsAvailable) {
+ settings.enable6GhzRnr = mergeRnrSetting(
+ settings.enable6GhzRnr, entry.settings);
+ } else {
+ settings.enable6GhzRnr = false;
+ }
channels.addChannels(entry.settings);
for (ScanSettings.HiddenNetwork srcNetwork : entry.settings.hiddenNetworks) {
WifiNative.HiddenNetwork hiddenNetwork = new WifiNative.HiddenNetwork();
diff --git a/service/tests/wifitests/src/com/android/server/wifi/scanner/WifiScanningServiceTest.java b/service/tests/wifitests/src/com/android/server/wifi/scanner/WifiScanningServiceTest.java
index a5f8b3c..20c1b3f 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/scanner/WifiScanningServiceTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/scanner/WifiScanningServiceTest.java
@@ -152,8 +152,8 @@
@Mock WifiMetrics.ScanMetrics mScanMetrics;
@Mock WifiManager mWifiManager;
@Mock LastCallerInfoManager mLastCallerInfoManager;
- ChannelHelper mChannelHelper0;
- ChannelHelper mChannelHelper1;
+ PresetKnownBandsChannelHelper mChannelHelper0;
+ PresetKnownBandsChannelHelper mChannelHelper1;
TestLooper mLooper;
WifiScanningServiceImpl mWifiScanningServiceImpl;
@@ -883,6 +883,32 @@
}
/**
+ * Verify that when 6Ghz scanning is not supported, RNR will not get enabled even if RNR
+ * setting is WIFI_RNR_ENABLED.
+ */
+ @Test
+ public void testRnrIsDisabledWhen6GhzChannelsNotAvailable() throws Exception {
+ assumeTrue(SdkLevel.isAtLeastS());
+ mChannelHelper0 = new PresetKnownBandsChannelHelper(
+ new int[]{2412, 2450},
+ new int[]{5160, 5175},
+ new int[]{5600, 5650, 5660},
+ new int[0], // 6Ghz scanning unavailable
+ new int[]{58320, 60480});
+ when(mWifiScannerImpl0.getChannelHelper()).thenReturn(mChannelHelper0);
+ WifiScanner.ScanSettings requestSettings = createRequest(WifiScanner.WIFI_BAND_BOTH, 0,
+ 0, 20, WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN);
+ requestSettings.setRnrSetting(WifiScanner.WIFI_RNR_ENABLED);
+ WifiNative.ScanSettings nativeSettings = computeSingleScanNativeSettings(requestSettings);
+ // RNR should not be enabled in the native settings
+ nativeSettings.enable6GhzRnr = false;
+ assertEquals(WifiScanner.WIFI_RNR_ENABLED,
+ requestSettings.getRnrSetting());
+ doSuccessfulSingleScan(requestSettings, nativeSettings,
+ ScanResults.create(0, WifiScanner.WIFI_BAND_BOTH, new int[0]));
+ }
+
+ /**
* Verify that when WIFI_BAND_ALL is scanned, RNR is disabled when
* getRnrSetting() returns WIFI_RNR_NOT_NEEDED.
*/