diff options
author | Roshan Pius <rpius@google.com> | 2016-03-05 00:22:20 +0000 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2016-03-05 00:22:20 +0000 |
commit | b51e54f90373ec8cfcf57cc67f495dc831d8f5b4 (patch) | |
tree | 656ccee6dd99b4a03e030d1a93cac400afba9731 /service | |
parent | aba75f2f27c381db3048e1edc075dd2dd293c41a (diff) | |
parent | 6b0c636d0a97e6163a99a8fbf5c199998c1be770 (diff) |
Merge "Send list of hidden networkID for supplicant scan" into mm-wireless-dev
am: 6b0c636d0a
* commit '6b0c636d0a97e6163a99a8fbf5c199998c1be770':
Send list of hidden networkID for supplicant scan
Diffstat (limited to 'service')
6 files changed, 81 insertions, 29 deletions
diff --git a/service/java/com/android/server/wifi/ConfigurationMap.java b/service/java/com/android/server/wifi/ConfigurationMap.java index 376e8e606..a94ff0dff 100644 --- a/service/java/com/android/server/wifi/ConfigurationMap.java +++ b/service/java/com/android/server/wifi/ConfigurationMap.java @@ -8,9 +8,11 @@ import android.os.UserManager; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Set; public class ConfigurationMap { private final Map<Integer, WifiConfiguration> mPerID = new HashMap<>(); @@ -18,6 +20,11 @@ public class ConfigurationMap { private final Map<Integer, WifiConfiguration> mPerIDForCurrentUser = new HashMap<>(); private final Map<String, WifiConfiguration> mPerFQDNForCurrentUser = new HashMap<>(); + /** + * List of all hidden networks in the current user's configuration. + * Use this list as a param for directed scanning . + */ + private final Set<Integer> mHiddenNetworkIdsForCurrentUser = new HashSet<>(); private final UserManager mUserManager; @@ -37,6 +44,9 @@ public class ConfigurationMap { if (config.FQDN != null && config.FQDN.length() > 0) { mPerFQDNForCurrentUser.put(config.FQDN, config); } + if (config.hiddenSSID) { + mHiddenNetworkIdsForCurrentUser.add(config.networkId); + } } return current; } @@ -57,6 +67,7 @@ public class ConfigurationMap { break; } } + mHiddenNetworkIdsForCurrentUser.remove(netID); return config; } @@ -65,6 +76,7 @@ public class ConfigurationMap { mPerConfigKey.clear(); mPerIDForCurrentUser.clear(); mPerFQDNForCurrentUser.clear(); + mHiddenNetworkIdsForCurrentUser.clear(); } /** @@ -78,6 +90,7 @@ public class ConfigurationMap { public List<WifiConfiguration> handleUserSwitch(int userId) { mPerIDForCurrentUser.clear(); mPerFQDNForCurrentUser.clear(); + mHiddenNetworkIdsForCurrentUser.clear(); final List<UserInfo> previousUserProfiles = mUserManager.getProfiles(mCurrentUserId); mCurrentUserId = userId; @@ -91,6 +104,9 @@ public class ConfigurationMap { if (config.FQDN != null && config.FQDN.length() > 0) { mPerFQDNForCurrentUser.put(config.FQDN, config); } + if (config.hiddenSSID) { + mHiddenNetworkIdsForCurrentUser.add(config.networkId); + } } else if (WifiConfigurationUtil.isVisibleToAnyProfile(config, previousUserProfiles)) { hiddenConfigurations.add(config); } @@ -162,4 +178,8 @@ public class ConfigurationMap { public Collection<WifiConfiguration> valuesForCurrentUser() { return mPerIDForCurrentUser.values(); } + + public Set<Integer> getHiddenNetworkIdsForCurrentUser() { + return mHiddenNetworkIdsForCurrentUser; + } } diff --git a/service/java/com/android/server/wifi/HalWifiScannerImpl.java b/service/java/com/android/server/wifi/HalWifiScannerImpl.java index 90a54f09f..c7fbbd6c5 100644 --- a/service/java/com/android/server/wifi/HalWifiScannerImpl.java +++ b/service/java/com/android/server/wifi/HalWifiScannerImpl.java @@ -113,7 +113,8 @@ public class HalWifiScannerImpl extends WifiScannerImpl implements Handler.Callb mSingleScanEventHandler = eventHandler; Set<Integer> freqs = scanChannels.getSupplicantScanFreqs(); - if (!mWifiNative.scan(freqs)) { + // TODO(rpius): Need to plumb in the hiddessid network list via Scanner. + if (!mWifiNative.scan(freqs, null)) { 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/SupplicantWifiScannerImpl.java b/service/java/com/android/server/wifi/SupplicantWifiScannerImpl.java index 90413ff85..35209f578 100644 --- a/service/java/com/android/server/wifi/SupplicantWifiScannerImpl.java +++ b/service/java/com/android/server/wifi/SupplicantWifiScannerImpl.java @@ -345,7 +345,8 @@ public class SupplicantWifiScannerImpl extends WifiScannerImpl implements Handle if (!allFreqs.isEmpty()) { Set<Integer> freqs = allFreqs.getSupplicantScanFreqs(); - boolean success = mWifiNative.scan(freqs); + // TODO(rpius): Need to plumb in the hidden ssid network list via Scanner. + boolean success = mWifiNative.scan(freqs, null); if (success) { // TODO handle scan timeout Log.d(TAG, "Starting wifi scan for freqs=" + freqs diff --git a/service/java/com/android/server/wifi/WifiConfigManager.java b/service/java/com/android/server/wifi/WifiConfigManager.java index f3863cd3b..4f3109dd6 100644 --- a/service/java/com/android/server/wifi/WifiConfigManager.java +++ b/service/java/com/android/server/wifi/WifiConfigManager.java @@ -94,9 +94,9 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.ConcurrentHashMap; import java.util.regex.Pattern; import java.util.zip.CRC32; import java.util.zip.Checksum; @@ -631,6 +631,14 @@ public class WifiConfigManager { } /** + * Fetch the list of networkId's which are hidden in current user's configuration. + * @return List of networkIds + */ + public Set<Integer> getHiddenConfiguredNetworkIds() { + return mConfiguredNetworks.getHiddenNetworkIdsForCurrentUser(); + } + + /** * Find matching network for this scanResult */ WifiConfiguration getMatchingConfig(ScanResult scanResult) { diff --git a/service/java/com/android/server/wifi/WifiNative.java b/service/java/com/android/server/wifi/WifiNative.java index a19bee32c..6b9683150 100644 --- a/service/java/com/android/server/wifi/WifiNative.java +++ b/service/java/com/android/server/wifi/WifiNative.java @@ -326,36 +326,51 @@ public class WifiNative { return doStringCommand("GET_CAPABILITY freq"); } + /** + * Create a comma separate string from integer set. + * @param values List of integers. + * @return comma separated string. + */ + private static String createCSVStringFromIntegerSet(Set<Integer> values) { + StringBuilder list = new StringBuilder(); + boolean first = true; + for (Integer value : values) { + if (!first) { + list.append(","); + } + list.append(value); + first = false; + } + return list.toString(); + } /** * Start a scan using wpa_supplicant for the given frequencies. - * If freqs is null then all supported channels are scanned. + * @param freqs list of frequencies to scan for, if null scan all supported channels. + * @param hiddenNetworkIds List of hidden networks to be scanned for. */ - public boolean scan(Set<Integer> freqs) { - if (freqs == null) { - return scanFrequencyList(null); - } else if (freqs.size() != 0) { - StringBuilder freqList = new StringBuilder(); - boolean first = true; - for (Integer freq : freqs) { - if (!first) { - freqList.append(","); - } - freqList.append(freq.toString()); - first = false; - } - return scanFrequencyList(freqList.toString()); - } else { - return false; + public boolean scan(Set<Integer> freqs, Set<Integer> hiddenNetworkIds) { + String freqList = null; + String hiddenNetworkIdList = null; + if (freqs != null && freqs.size() != 0) { + freqList = createCSVStringFromIntegerSet(freqs); } + if (hiddenNetworkIds != null && hiddenNetworkIds.size() != 0) { + hiddenNetworkIdList = createCSVStringFromIntegerSet(hiddenNetworkIds); + } + return scanWithParams(freqList, hiddenNetworkIdList); } - private boolean scanFrequencyList(String freqList) { - if (freqList == null) { - return doBooleanCommand("SCAN TYPE=ONLY"); - } else { - return doBooleanCommand("SCAN TYPE=ONLY freq=" + freqList); + private boolean scanWithParams(String freqList, String hiddenNetworkIdList) { + StringBuilder scanCommand = new StringBuilder(); + scanCommand.append("SCAN TYPE=ONLY"); + if (freqList != null) { + scanCommand.append(" freq=" + freqList); + } + if (hiddenNetworkIdList != null) { + scanCommand.append(" scan_id=" + hiddenNetworkIdList); } + return doBooleanCommand(scanCommand.toString()); } /* Does a graceful shutdown of supplicant. Is a common stop function for both p2p and sta. diff --git a/service/java/com/android/server/wifi/WifiStateMachine.java b/service/java/com/android/server/wifi/WifiStateMachine.java index 6804b4295..2ce51114b 100644 --- a/service/java/com/android/server/wifi/WifiStateMachine.java +++ b/service/java/com/android/server/wifi/WifiStateMachine.java @@ -2017,8 +2017,11 @@ public class WifiStateMachine extends StateMachine implements WifiNative.WifiPno } } + // Retrieve the list of hidden networkId's to scan for. + Set<Integer> hiddenNetworkIds = mWifiConfigManager.getHiddenConfiguredNetworkIds(); + // call wifi native to start the scan - if (startScanNative(freqs)) { + if (startScanNative(freqs, hiddenNetworkIds)) { // only count battery consumption if scan request is accepted noteScanStart(message.arg1, workSource); // a full scan covers everything, clearing scan request buffer @@ -2072,8 +2075,8 @@ public class WifiStateMachine extends StateMachine implements WifiNative.WifiPno /** * return true iff scan request is accepted */ - private boolean startScanNative(Set<Integer> freqs) { - if (mWifiNative.scan(freqs)) { + private boolean startScanNative(Set<Integer> freqs, Set<Integer> hiddenNetworkIds) { + if (mWifiNative.scan(freqs, hiddenNetworkIds)) { mIsScanOngoing = true; mIsFullScanOngoing = (freqs == null); lastScanFreqs = freqs; @@ -7267,8 +7270,12 @@ public class WifiStateMachine extends StateMachine implements WifiNative.WifiPno //if (DBG) { logd("starting scan for " + config.configKey() + " with " + freqs); //} + Set<Integer> hiddenNetworkIds = new HashSet<>(); + if (config.hiddenSSID) { + hiddenNetworkIds.add(config.networkId); + } // Call wifi native to start the scan - if (startScanNative(freqs)) { + if (startScanNative(freqs, hiddenNetworkIds)) { // Only count battery consumption if scan request is accepted noteScanStart(SCAN_ALARM_SOURCE, null); messageHandlingStatus = MESSAGE_HANDLING_STATUS_OK; |