summaryrefslogtreecommitdiff
path: root/service
diff options
context:
space:
mode:
authorRoshan Pius <rpius@google.com>2016-03-10 04:04:21 +0000
committerAndroid Partner Code Review <android-gerrit-partner@google.com>2016-03-10 04:04:22 +0000
commit01fb5b27ba32f180080f2b2b12adbc5c803611ce (patch)
treedb2115ec1db00c00d51f31be2eeb92520c8dcf35 /service
parente5da466fd5d9d8024780590ee8b1c335889443a7 (diff)
parent3c83d4783673c1e2fa64c56dc586c5f7c3ab73e0 (diff)
Merge changes from topic 'wifi_scanner_hidden_network_ids' into mm-wireless-dev
* changes: Allow multiple Handlers to be registered for a WifiMonitor event WifiScanner: Changes to support hidden Network Ids
Diffstat (limited to 'service')
-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/WifiMonitor.java56
-rw-r--r--service/java/com/android/server/wifi/WifiNative.java2
5 files changed, 74 insertions, 29 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/WifiMonitor.java b/service/java/com/android/server/wifi/WifiMonitor.java
index c44c7c6eb..cd1e6405e 100644
--- a/service/java/com/android/server/wifi/WifiMonitor.java
+++ b/service/java/com/android/server/wifi/WifiMonitor.java
@@ -29,6 +29,7 @@ import android.net.wifi.p2p.nsd.WifiP2pServiceResponse;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
+import android.util.ArraySet;
import android.util.Base64;
import android.util.LocalLog;
import android.util.Log;
@@ -46,6 +47,7 @@ import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -545,24 +547,20 @@ public class WifiMonitor {
private boolean mConnected = false;
- private final Map<String, SparseArray<Handler>> mHandlerMap = new HashMap<>();
+ // TODO(b/27569474) remove support for multiple handlers for the same event
+ private final Map<String, SparseArray<Set<Handler>>> mHandlerMap = new HashMap<>();
public synchronized void registerHandler(String iface, int what, Handler handler) {
- SparseArray<Handler> ifaceHandlers = mHandlerMap.get(iface);
+ SparseArray<Set<Handler>> ifaceHandlers = mHandlerMap.get(iface);
if (ifaceHandlers == null) {
ifaceHandlers = new SparseArray<>();
mHandlerMap.put(iface, ifaceHandlers);
}
- if (ifaceHandlers.get(what) != null) {
- Log.w(TAG, "Handler for iface=" + iface + ",what=" + what + " already exists");
- }
- ifaceHandlers.put(what, handler);
- }
-
- public synchronized void unregisterHandler(String iface, int what) {
- SparseArray<Handler> ifaceHandlers = mHandlerMap.get(iface);
- if (ifaceHandlers != null) {
- ifaceHandlers.remove(what);
+ Set<Handler> ifaceWhatHandlers = ifaceHandlers.get(what);
+ if (ifaceWhatHandlers == null) {
+ ifaceWhatHandlers = new ArraySet<>();
+ ifaceHandlers.put(what, ifaceWhatHandlers);
}
+ ifaceWhatHandlers.add(handler);
}
private final Map<String, Boolean> mMonitoringMap = new HashMap<>();
@@ -678,32 +676,44 @@ public class WifiMonitor {
}
private void sendMessage(String iface, Message message) {
- SparseArray<Handler> ifaceHandlers = mHandlerMap.get(iface);
+ SparseArray<Set<Handler>> ifaceHandlers = mHandlerMap.get(iface);
if (iface != null && ifaceHandlers != null) {
if (isMonitoring(iface)) {
- sendMessage(ifaceHandlers, message);
+ boolean firstHandler = true;
+ Set<Handler> ifaceWhatHandlers = ifaceHandlers.get(message.what);
+ for (Handler handler : ifaceWhatHandlers) {
+ if (firstHandler) {
+ firstHandler = false;
+ sendMessage(handler, message);
+ }
+ else {
+ sendMessage(handler, Message.obtain(message));
+ }
+ }
} else {
if (DBG) Log.d(TAG, "Dropping event because (" + iface + ") is stopped");
}
} else {
if (DBG) Log.d(TAG, "Sending to all monitors because there's no matching iface");
boolean firstHandler = true;
- for (Map.Entry<String, SparseArray<Handler>> entry : mHandlerMap.entrySet()) {
+ for (Map.Entry<String, SparseArray<Set<Handler>>> entry : mHandlerMap.entrySet()) {
if (isMonitoring(entry.getKey())) {
- if (firstHandler) {
- firstHandler = false;
- sendMessage(entry.getValue(), message);
- }
- else {
- sendMessage(entry.getValue(), Message.obtain(message));
+ Set<Handler> ifaceWhatHandlers = ifaceHandlers.get(message.what);
+ for (Handler handler : ifaceWhatHandlers) {
+ if (firstHandler) {
+ firstHandler = false;
+ sendMessage(handler, message);
+ }
+ else {
+ sendMessage(handler, Message.obtain(message));
+ }
}
}
}
}
}
- private void sendMessage(SparseArray<Handler> ifaceHandlers, Message message) {
- Handler handler = ifaceHandlers.get(message.what);
+ private void sendMessage(Handler handler, Message message) {
if (handler != null) {
message.setTarget(handler);
message.sendToTarget();
diff --git a/service/java/com/android/server/wifi/WifiNative.java b/service/java/com/android/server/wifi/WifiNative.java
index c3afa3899..0a10b78df 100644
--- a/service/java/com/android/server/wifi/WifiNative.java
+++ b/service/java/com/android/server/wifi/WifiNative.java
@@ -1802,6 +1802,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;
}