From d74ff28cdb01d3f711e0b0f0e99e51fdb221eaf2 Mon Sep 17 00:00:00 2001 From: Roshan Pius Date: Mon, 7 Mar 2016 13:55:30 -0800 Subject: 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 --- .../com/android/server/wifi/HalWifiScannerImpl.java | 11 +++++++++-- .../com/android/server/wifi/MultiClientScheduler.java | 16 +++++++++++++++- .../android/server/wifi/SupplicantWifiScannerImpl.java | 18 +++++++++++++++--- service/java/com/android/server/wifi/WifiNative.java | 2 ++ 4 files changed, 41 insertions(+), 6 deletions(-) (limited to 'service') 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 freqs = scanChannels.getSupplicantScanFreqs(); + Set 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 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 hiddenNetworkIdSet = new HashSet(); 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 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; } -- cgit v1.2.3 From 3c83d4783673c1e2fa64c56dc586c5f7c3ab73e0 Mon Sep 17 00:00:00 2001 From: Mitchell Wills Date: Wed, 9 Mar 2016 11:42:05 -0800 Subject: Allow multiple Handlers to be registered for a WifiMonitor event Bug: 26966049 Bug: 27569474 Change-Id: I07012b0e4ad2e3510e0a84368949b65d7b99507d --- .../java/com/android/server/wifi/WifiMonitor.java | 56 +++++++++++++--------- 1 file changed, 33 insertions(+), 23 deletions(-) (limited to 'service') 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> mHandlerMap = new HashMap<>(); + // TODO(b/27569474) remove support for multiple handlers for the same event + private final Map>> mHandlerMap = new HashMap<>(); public synchronized void registerHandler(String iface, int what, Handler handler) { - SparseArray ifaceHandlers = mHandlerMap.get(iface); + SparseArray> 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 ifaceHandlers = mHandlerMap.get(iface); - if (ifaceHandlers != null) { - ifaceHandlers.remove(what); + Set ifaceWhatHandlers = ifaceHandlers.get(what); + if (ifaceWhatHandlers == null) { + ifaceWhatHandlers = new ArraySet<>(); + ifaceHandlers.put(what, ifaceWhatHandlers); } + ifaceWhatHandlers.add(handler); } private final Map mMonitoringMap = new HashMap<>(); @@ -678,32 +676,44 @@ public class WifiMonitor { } private void sendMessage(String iface, Message message) { - SparseArray ifaceHandlers = mHandlerMap.get(iface); + SparseArray> ifaceHandlers = mHandlerMap.get(iface); if (iface != null && ifaceHandlers != null) { if (isMonitoring(iface)) { - sendMessage(ifaceHandlers, message); + boolean firstHandler = true; + Set 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> entry : mHandlerMap.entrySet()) { + for (Map.Entry>> entry : mHandlerMap.entrySet()) { if (isMonitoring(entry.getKey())) { - if (firstHandler) { - firstHandler = false; - sendMessage(entry.getValue(), message); - } - else { - sendMessage(entry.getValue(), Message.obtain(message)); + Set 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 ifaceHandlers, Message message) { - Handler handler = ifaceHandlers.get(message.what); + private void sendMessage(Handler handler, Message message) { if (handler != null) { message.setTarget(handler); message.sendToTarget(); -- cgit v1.2.3