summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoshan Pius <rpius@google.com>2016-03-07 13:55:30 -0800
committerRoshan Pius <rpius@google.com>2016-03-08 13:13:16 -0800
commitd74ff28cdb01d3f711e0b0f0e99e51fdb221eaf2 (patch)
treefd0ea751d3108b75d9c29808ca9aa5c3441321b6
parenta7aef0a45759880487863fd81bfbfbc748baa73b (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
-rw-r--r--service/java/com/android/server/wifi/HalWifiScannerImpl.java11
-rw-r--r--service/java/com/android/server/wifi/MultiClientScheduler.java16
-rw-r--r--service/java/com/android/server/wifi/SupplicantWifiScannerImpl.java18
-rw-r--r--service/java/com/android/server/wifi/WifiNative.java2
-rw-r--r--tests/wifitests/src/com/android/server/wifi/BaseWifiScannerImplTest.java38
-rw-r--r--tests/wifitests/src/com/android/server/wifi/ScanTestUtil.java10
-rw-r--r--tests/wifitests/src/com/android/server/wifi/SupplicantWifiScannerTest.java16
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);