diff options
author | Roshan Pius <rpius@google.com> | 2016-03-07 13:55:30 -0800 |
---|---|---|
committer | Roshan Pius <rpius@google.com> | 2016-03-08 13:13:16 -0800 |
commit | d74ff28cdb01d3f711e0b0f0e99e51fdb221eaf2 (patch) | |
tree | fd0ea751d3108b75d9c29808ca9aa5c3441321b6 | |
parent | a7aef0a45759880487863fd81bfbfbc748baa73b (diff) |
WifiScanner: Changes to support hidden Network Ids
Add the required plumbing to support scanning for hidden networks via
wpa_supplicant.
Added a test case to verify that the network ID list is being sent
as expected.
BUG: 27503786
Change-Id: I2d1ef74494080e01248ae8aad5081c7608fc0e81
TEST: Compiles & unit-test passes
7 files changed, 94 insertions, 17 deletions
diff --git a/service/java/com/android/server/wifi/HalWifiScannerImpl.java b/service/java/com/android/server/wifi/HalWifiScannerImpl.java index 8e220cab9..b86e4c6d8 100644 --- a/service/java/com/android/server/wifi/HalWifiScannerImpl.java +++ b/service/java/com/android/server/wifi/HalWifiScannerImpl.java @@ -30,6 +30,7 @@ import com.android.server.wifi.scanner.HalChannelHelper; import java.util.ArrayList; import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.Set; @@ -116,9 +117,15 @@ public class HalWifiScannerImpl extends WifiScannerImpl implements Handler.Callb mSingleScanEventHandler = eventHandler; Set<Integer> freqs = scanChannels.getSupplicantScanFreqs(); + Set<Integer> hiddenNetworkIdSet = new HashSet<>(); + if (settings.hiddenNetworkIds != null) { + for (int i = 0; i < settings.hiddenNetworkIds.length; i++) { + hiddenNetworkIdSet.add(settings.hiddenNetworkIds[i]); + } + } + mSingleScanStartTime = SystemClock.elapsedRealtime(); - // TODO(rpius): Need to plumb in the hiddessid network list via Scanner. - if (!mWifiNative.scan(freqs, null)) { + if (!mWifiNative.scan(freqs, hiddenNetworkIdSet)) { Log.e(TAG, "Failed to start scan, freqs=" + freqs); // indicate scan failure async mEventHandler.post(new Runnable() { diff --git a/service/java/com/android/server/wifi/MultiClientScheduler.java b/service/java/com/android/server/wifi/MultiClientScheduler.java index 2e05197bc..31fbf64e4 100644 --- a/service/java/com/android/server/wifi/MultiClientScheduler.java +++ b/service/java/com/android/server/wifi/MultiClientScheduler.java @@ -32,6 +32,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.HashSet; import java.util.List; /** @@ -328,6 +329,7 @@ public class MultiClientScheduler extends WifiScanningScheduler { // update batching settings schedule.max_ap_per_scan = 0; schedule.report_threshold_num_scans = getMaxBatch(); + HashSet<Integer> hiddenNetworkIdSet = new HashSet<>(); for (ScanSettings settings : requests) { // set APs per scan if (settings.numBssidsPerScan > schedule.max_ap_per_scan) { @@ -339,11 +341,23 @@ public class MultiClientScheduler extends WifiScanningScheduler { && settings.maxScansToCache < schedule.report_threshold_num_scans) { schedule.report_threshold_num_scans = settings.maxScansToCache; } + + if (settings.hiddenNetworkIds != null) { + for (int i = 0; i < settings.hiddenNetworkIds.length; i++) { + hiddenNetworkIdSet.add(settings.hiddenNetworkIds[i]); + } + } } if (schedule.max_ap_per_scan == 0 || schedule.max_ap_per_scan > getMaxApPerScan()) { schedule.max_ap_per_scan = getMaxApPerScan(); } - + if (hiddenNetworkIdSet.size() > 0) { + schedule.hiddenNetworkIds = new int[hiddenNetworkIdSet.size()]; + int numHiddenNetworks = 0; + for (Integer hiddenNetworkId : hiddenNetworkIdSet) { + schedule.hiddenNetworkIds[numHiddenNetworks++] = hiddenNetworkId; + } + } // update base period as gcd of periods if (schedule.num_buckets > 0) { diff --git a/service/java/com/android/server/wifi/SupplicantWifiScannerImpl.java b/service/java/com/android/server/wifi/SupplicantWifiScannerImpl.java index 168302170..b51317157 100644 --- a/service/java/com/android/server/wifi/SupplicantWifiScannerImpl.java +++ b/service/java/com/android/server/wifi/SupplicantWifiScannerImpl.java @@ -35,6 +35,7 @@ import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.Set; @@ -332,6 +333,7 @@ public class SupplicantWifiScannerImpl extends WifiScannerImpl implements Handle } ChannelCollection allFreqs = mChannelHelper.createChannelCollection(); + Set<Integer> hiddenNetworkIdSet = new HashSet<Integer>(); final LastScanSettings newScanSettings = new LastScanSettings(SystemClock.elapsedRealtime()); @@ -377,6 +379,12 @@ public class SupplicantWifiScannerImpl extends WifiScannerImpl implements Handle mBackgroundScanSettings.report_threshold_num_scans, mBackgroundScanSettings.report_threshold_percent); } + int[] hiddenNetworkIds = mBackgroundScanSettings.hiddenNetworkIds; + if (hiddenNetworkIds != null) { + for (int i = 0; i < hiddenNetworkIds.length; i++) { + hiddenNetworkIdSet.add(hiddenNetworkIds[i]); + } + } } mNextBackgroundScanPeriod++; @@ -403,15 +411,19 @@ public class SupplicantWifiScannerImpl extends WifiScannerImpl implements Handle } newScanSettings.setSingleScan(reportFullResults, singleScanFreqs, mPendingSingleScanEventHandler); - + int[] hiddenNetworkIds = mPendingSingleScanSettings.hiddenNetworkIds; + if (hiddenNetworkIds != null) { + for (int i = 0; i < hiddenNetworkIds.length; i++) { + hiddenNetworkIdSet.add(hiddenNetworkIds[i]); + } + } mPendingSingleScanSettings = null; mPendingSingleScanEventHandler = null; } if (!allFreqs.isEmpty()) { Set<Integer> freqs = allFreqs.getSupplicantScanFreqs(); - // TODO(rpius): Need to plumb in the hidden ssid network list via Scanner. - boolean success = mWifiNative.scan(freqs, null); + boolean success = mWifiNative.scan(freqs, hiddenNetworkIdSet); if (success) { // TODO handle scan timeout Log.d(TAG, "Starting wifi scan for freqs=" + freqs diff --git a/service/java/com/android/server/wifi/WifiNative.java b/service/java/com/android/server/wifi/WifiNative.java index 9cd9235fe..bbe28ae74 100644 --- a/service/java/com/android/server/wifi/WifiNative.java +++ b/service/java/com/android/server/wifi/WifiNative.java @@ -1792,6 +1792,8 @@ public class WifiNative { public int report_threshold_percent; public int report_threshold_num_scans; public int num_buckets; + /* Not part of gscan HAL API. Used only for wpa_supplicant scanning */ + public int[] hiddenNetworkIds; public BucketSettings[] buckets; } diff --git a/tests/wifitests/src/com/android/server/wifi/BaseWifiScannerImplTest.java b/tests/wifitests/src/com/android/server/wifi/BaseWifiScannerImplTest.java index 5e11cd97a..baf317280 100644 --- a/tests/wifitests/src/com/android/server/wifi/BaseWifiScannerImplTest.java +++ b/tests/wifitests/src/com/android/server/wifi/BaseWifiScannerImplTest.java @@ -47,6 +47,7 @@ import org.mockito.MockitoAnnotations; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.HashSet; import java.util.Set; /** @@ -104,6 +105,7 @@ public abstract class BaseWifiScannerImplTest { .build(); doSuccessfulSingleScanTest(settings, expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ), + new HashSet<Integer>(), ScanResults.create(0, 2400, 2450, 2450, 2400, 2450, 2450, 2400, 2450, 2450), false); } @@ -116,6 +118,7 @@ public abstract class BaseWifiScannerImplTest { .build(); doSuccessfulSingleScanTest(settings, createFreqSet(5650), + new HashSet<Integer>(), ScanResults.create(0, 5650, 5650, 5650, 5650, 5650, 5650, 5650, 5650), false); } @@ -131,9 +134,32 @@ public abstract class BaseWifiScannerImplTest { .build(); doSuccessfulSingleScanTest(settings, expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ), + new HashSet<Integer>(), ScanResults.create(0, 2400, 2450, 2450, 2400, 2450, 2450, 2400, 2450, 2450), true); } + /** + * Tests whether the provided hidden networkId's in scan settings is correctly passed along + * when invoking native scan. + */ + @Test + public void singleScanSuccessWithHiddenNetworkIds() { + int[] hiddenNetworkIds = {0, 5}; + WifiNative.ScanSettings settings = new NativeScanSettingsBuilder() + .withBasePeriod(10000) + .withMaxApPerScan(10) + .withHiddenNetworkIds(hiddenNetworkIds) + .addBucketWithChannels(20000, WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN, 5650) + .build(); + + Set<Integer> hiddenNetworkIdSet = new HashSet<Integer>(); + for (int i = 0; i < hiddenNetworkIds.length; i++) { + hiddenNetworkIdSet.add(hiddenNetworkIds[i]); + } + doSuccessfulSingleScanTest(settings, createFreqSet(5650), + hiddenNetworkIdSet, + ScanResults.create(0, 5650, 5650, 5650, 5650, 5650, 5650, 5650, 5650), false); + } @Test public void overlappingSingleScanFails() { @@ -235,6 +261,7 @@ public abstract class BaseWifiScannerImplTest { expectSuccessfulSingleScan(order, eventHandler, expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ), + new HashSet<Integer>(), ScanResults.create(0, 2400, 2450, 2450), false); // start second scan @@ -242,6 +269,7 @@ public abstract class BaseWifiScannerImplTest { expectSuccessfulSingleScan(order, eventHandler, expectedBandScanFreqs(WifiScanner.WIFI_BAND_5_GHZ), + new HashSet<Integer>(), ScanResults.create(0, 5150, 5175), false); verifyNoMoreInteractions(eventHandler); @@ -341,7 +369,8 @@ public abstract class BaseWifiScannerImplTest { } protected void doSuccessfulSingleScanTest(WifiNative.ScanSettings settings, - Set<Integer> expectedScan, ScanResults results, boolean expectFullResults) { + Set<Integer> expectedScan, Set<Integer> expectedHiddenNetIds, ScanResults results, + boolean expectFullResults) { WifiNative.ScanEventHandler eventHandler = mock(WifiNative.ScanEventHandler.class); InOrder order = inOrder(eventHandler, mWifiNative); @@ -352,15 +381,16 @@ public abstract class BaseWifiScannerImplTest { // start scan assertTrue(mScanner.startSingleScan(settings, eventHandler)); - expectSuccessfulSingleScan(order, eventHandler, expectedScan, results, expectFullResults); + expectSuccessfulSingleScan(order, eventHandler, expectedScan, expectedHiddenNetIds, + results, expectFullResults); verifyNoMoreInteractions(eventHandler); } protected void expectSuccessfulSingleScan(InOrder order, WifiNative.ScanEventHandler eventHandler, Set<Integer> expectedScan, - ScanResults results, boolean expectFullResults) { - order.verify(mWifiNative).scan(eq(expectedScan), any(Set.class)); + Set<Integer> expectedHiddenNetIds, ScanResults results, boolean expectFullResults) { + order.verify(mWifiNative).scan(eq(expectedScan), eq(expectedHiddenNetIds)); when(mWifiNative.getScanResults()).thenReturn(results.getScanDetailArrayList()); diff --git a/tests/wifitests/src/com/android/server/wifi/ScanTestUtil.java b/tests/wifitests/src/com/android/server/wifi/ScanTestUtil.java index 7be1e6e64..de46dff42 100644 --- a/tests/wifitests/src/com/android/server/wifi/ScanTestUtil.java +++ b/tests/wifitests/src/com/android/server/wifi/ScanTestUtil.java @@ -118,6 +118,16 @@ public class ScanTestUtil { return this; } + /** + * Add the provided hidden network IDs to scan request. + * @param networkIds List of hidden network IDs + * @return builder object + */ + public NativeScanSettingsBuilder withHiddenNetworkIds(int[] networkIds) { + mSettings.hiddenNetworkIds = networkIds; + return this; + } + public NativeScanSettingsBuilder addBucketWithBand( int period, int reportEvents, int band) { WifiNative.BucketSettings bucket = new WifiNative.BucketSettings(); diff --git a/tests/wifitests/src/com/android/server/wifi/SupplicantWifiScannerTest.java b/tests/wifitests/src/com/android/server/wifi/SupplicantWifiScannerTest.java index 16f169ade..72e9da5ec 100644 --- a/tests/wifitests/src/com/android/server/wifi/SupplicantWifiScannerTest.java +++ b/tests/wifitests/src/com/android/server/wifi/SupplicantWifiScannerTest.java @@ -40,6 +40,7 @@ import org.mockito.InOrder; import java.lang.reflect.Field; import java.util.ArrayList; +import java.util.HashSet; import java.util.Set; /** @@ -337,7 +338,7 @@ public class SupplicantWifiScannerTest extends BaseWifiScannerImplTest { assertEquals("alarm for next period", 1, mAlarmManager.getPendingCount()); expectFailedScanStart(order, eventHandler, - expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ), null); + expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ), new HashSet<Integer>()); // Fire alarm to start next scan dispatchOnlyAlarm(); @@ -345,7 +346,7 @@ public class SupplicantWifiScannerTest extends BaseWifiScannerImplTest { assertEquals("alarm for next period", 1, mAlarmManager.getPendingCount()); expectFailedScanStart(order, eventHandler, - expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ), null); + expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ), new HashSet<Integer>()); verifyNoMoreInteractions(eventHandler); } @@ -372,7 +373,7 @@ public class SupplicantWifiScannerTest extends BaseWifiScannerImplTest { assertEquals("alarm for next period", 1, mAlarmManager.getPendingCount()); expectFailedEventScan(order, eventHandler, - expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ), null); + expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ), new HashSet<Integer>()); // Fire alarm to start next scan dispatchOnlyAlarm(); @@ -380,7 +381,7 @@ public class SupplicantWifiScannerTest extends BaseWifiScannerImplTest { assertEquals("alarm for next period", 1, mAlarmManager.getPendingCount()); expectFailedEventScan(order, eventHandler, - expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ), null); + expectedBandScanFreqs(WifiScanner.WIFI_BAND_24_GHZ), new HashSet<Integer>()); verifyNoMoreInteractions(eventHandler); } @@ -629,7 +630,7 @@ public class SupplicantWifiScannerTest extends BaseWifiScannerImplTest { } } expectSuccessfulBackgroundScan(order, eventHandler, period.getScanFreqs(), - nativeResults, scanDatas, fullResults, periodId); + new HashSet<Integer>(), nativeResults, scanDatas, fullResults, periodId); } /** @@ -638,10 +639,11 @@ public class SupplicantWifiScannerTest extends BaseWifiScannerImplTest { */ private void expectSuccessfulBackgroundScan(InOrder order, WifiNative.ScanEventHandler eventHandler, Set<Integer> scanFreqs, - ArrayList<ScanDetail> nativeResults, WifiScanner.ScanData[] expectedScanResults, + Set<Integer> networkIds, ArrayList<ScanDetail> nativeResults, + WifiScanner.ScanData[] expectedScanResults, ScanResult[] fullResults, int periodId) { // Verify scan started - order.verify(mWifiNative).scan(eq(scanFreqs), any(Set.class)); + order.verify(mWifiNative).scan(eq(scanFreqs), eq(networkIds)); // Setup scan results when(mWifiNative.getScanResults()).thenReturn(nativeResults); |