diff options
author | Mitchell Wills <mwills@google.com> | 2016-03-10 04:08:26 +0000 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2016-03-10 04:08:26 +0000 |
commit | cc1d874560e4c0ca157bfda5d12df33a4f50fc11 (patch) | |
tree | f82c4bd97f1225ef4234097aa54a16ccdd06cfb8 /service | |
parent | 143d50d011d4a26ff5402fc6b3ff19f945ff7153 (diff) | |
parent | 01fb5b27ba32f180080f2b2b12adbc5c803611ce (diff) |
Merge changes from topic \'wifi_scanner_hidden_network_ids\' into mm-wireless-dev
am: 01fb5b27ba
* commit '01fb5b27ba32f180080f2b2b12adbc5c803611ce':
Allow multiple Handlers to be registered for a WifiMonitor event
WifiScanner: Changes to support hidden Network Ids
Diffstat (limited to 'service')
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; } |