104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff/* 204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * Copyright (C) 2010 The Android Open Source Project 304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * 404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * Licensed under the Apache License, Version 2.0 (the "License"); 504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * you may not use this file except in compliance with the License. 604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * You may obtain a copy of the License at 704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * 804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * http://www.apache.org/licenses/LICENSE-2.0 904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * 1004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * Unless required by applicable law or agreed to in writing, software 1104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * distributed under the License is distributed on an "AS IS" BASIS, 1204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * See the License for the specific language governing permissions and 1404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * limitations under the License. 1504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff */ 1604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 1704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriffpackage android.net.wifi; 1804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 1904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriffimport android.content.Context; 2004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriffimport android.content.Intent; 2196ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriffimport android.net.LinkAddress; 2296ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriffimport android.net.LinkProperties; 2396ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriffimport android.net.NetworkUtils; 24cdc077c9dd6473b5abfad4edfaf1ff41a436caafIrfan Sheriffimport android.net.NetworkInfo.DetailedState; 25128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriffimport android.net.ProxyProperties; 26aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwaltimport android.net.RouteInfo; 2731b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriffimport android.net.wifi.WifiConfiguration.IpAssignment; 2831b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriffimport android.net.wifi.WifiConfiguration.KeyMgmt; 29128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriffimport android.net.wifi.WifiConfiguration.ProxySettings; 3004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriffimport android.net.wifi.WifiConfiguration.Status; 31be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriffimport android.net.wifi.NetworkUpdateResult; 325ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriffimport static android.net.wifi.WifiConfiguration.INVALID_NETWORK_ID; 3331b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriffimport android.os.Environment; 3448c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapndeimport android.os.FileObserver; 35e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriffimport android.os.Message; 36e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriffimport android.os.Handler; 37e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriffimport android.os.HandlerThread; 385ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackbornimport android.os.UserHandle; 3926d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriffimport android.security.KeyStore; 4004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriffimport android.text.TextUtils; 41e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapndeimport android.util.LocalLog; 4204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriffimport android.util.Log; 4304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 44128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriffimport java.io.BufferedInputStream; 45128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriffimport java.io.BufferedOutputStream; 4648c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapndeimport java.io.BufferedReader; 47128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriffimport java.io.DataInputStream; 48128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriffimport java.io.DataOutputStream; 4996ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriffimport java.io.EOFException; 5048c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapndeimport java.io.File; 51f0afe4144d09aa9b980cffd444911ab118fa9cbeIrfan Sheriffimport java.io.FileDescriptor; 5231b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriffimport java.io.FileInputStream; 5348c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapndeimport java.io.FileNotFoundException; 54128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriffimport java.io.FileOutputStream; 5548c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapndeimport java.io.FileReader; 5631b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriffimport java.io.IOException; 57f0afe4144d09aa9b980cffd444911ab118fa9cbeIrfan Sheriffimport java.io.PrintWriter; 5896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriffimport java.net.InetAddress; 5996ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriffimport java.net.UnknownHostException; 60a3038b2b311cd07d851c404ccc5df2f4e07bcfd8Vinit Deshapndeimport java.security.PublicKey; 6104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriffimport java.util.ArrayList; 6204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriffimport java.util.BitSet; 6396ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriffimport java.util.Collection; 6431b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriffimport java.util.HashMap; 6596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriffimport java.util.Iterator; 6604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriffimport java.util.List; 67e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriffimport java.util.concurrent.atomic.AtomicInteger; 6804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 6904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff/** 7004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * This class provides the API to manage configured 7104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * wifi networks. The API is not thread safe is being 7204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * used only from WifiStateMachine. 7304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * 7404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * It deals with the following 7504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * - Add/update/remove a WifiConfiguration 7631b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff * The configuration contains two types of information. 77128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff * = IP and proxy configuration that is handled by WifiConfigStore and 7831b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff * is saved to disk on any change. 79128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff * 80128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff * The format of configuration file is as follows: 81128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff * <version> 82128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff * <netA_key1><netA_value1><netA_key2><netA_value2>...<EOS> 83128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff * <netB_key1><netB_value1><netB_key2><netB_value2>...<EOS> 84128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff * .. 85128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff * 86128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff * (key, value) pairs for a given network are grouped together and can 8796ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff * be in any order. A EOS at the end of a set of (key, value) pairs 88128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff * indicates that the next set of (key, value) pairs are for a new 8996ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff * network. A network is identified by a unique ID_KEY. If there is no 9096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff * ID_KEY in the (key, value) pairs, the data is discarded. 91128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff * 92128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff * An invalid version on read would result in discarding the contents of 93128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff * the file. On the next write, the latest version is written to file. 94128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff * 95128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff * Any failures during read or write to the configuration file are ignored 96128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff * without reporting to the user since the likelihood of these errors are 97128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff * low and the impact on connectivity is low. 98128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff * 9931b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff * = SSID & security details that is pushed to the supplicant. 10031b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff * supplicant saves these details to the disk on calling 10131b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff * saveConfigCommand(). 10231b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff * 10331b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff * We have two kinds of APIs exposed: 10431b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff * > public API calls that provide fine grained control 10531b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff * - enableNetwork, disableNetwork, addOrUpdateNetwork(), 10631b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff * removeNetwork(). For these calls, the config is not persisted 10731b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff * to the disk. (TODO: deprecate these calls in WifiManager) 10831b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff * > The new API calls - selectNetwork(), saveNetwork() & forgetNetwork(). 10931b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff * These calls persist the supplicant config to disk. 110128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff * 11104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * - Maintain a list of configured networks for quick access 11231b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff * 11304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff */ 11404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriffclass WifiConfigStore { 11504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 116fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff private Context mContext; 11704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff private static final String TAG = "WifiConfigStore"; 118e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde private static final boolean DBG = true; 1193569fdd9afdec7d32b290b41b7a16ff8467592f0Vinit Deshapnde private static final boolean VDBG = false; 12004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 12148c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde private static final String SUPPLICANT_CONFIG_FILE = "/data/misc/wifi/wpa_supplicant.conf"; 12248c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde 12331b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff /* configured networks with network id as the key */ 124fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff private HashMap<Integer, WifiConfiguration> mConfiguredNetworks = 12531b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff new HashMap<Integer, WifiConfiguration>(); 12631b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff 12731b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff /* A network id is a unique identifier for a network configured in the 12831b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff * supplicant. Network ids are generated when the supplicant reads 12931b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff * the configuration file at start and can thus change for networks. 13031b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff * We store the IP configuration for networks along with a unique id 13131b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff * that is generated from SSID and security type of the network. A mapping 13231b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff * from the generated unique id to network id of the network is needed to 13331b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff * map supplicant config to IP configuration. */ 134fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff private HashMap<Integer, Integer> mNetworkIds = 13531b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff new HashMap<Integer, Integer>(); 13631b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff 13704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff /* Tracks the highest priority of configured networks */ 138fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff private int mLastPriority = -1; 13904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 14031b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff private static final String ipConfigFile = Environment.getDataDirectory() + 14131b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff "/misc/wifi/ipconfig.txt"; 14231b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff 143aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt private static final int IPCONFIG_FILE_VERSION = 2; 14431b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff 14596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff /* IP and proxy configuration keys */ 14696ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff private static final String ID_KEY = "id"; 14796ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff private static final String IP_ASSIGNMENT_KEY = "ipAssignment"; 14896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff private static final String LINK_ADDRESS_KEY = "linkAddress"; 14996ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff private static final String GATEWAY_KEY = "gateway"; 15096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff private static final String DNS_KEY = "dns"; 15196ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff private static final String PROXY_SETTINGS_KEY = "proxySettings"; 15296ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff private static final String PROXY_HOST_KEY = "proxyHost"; 15396ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff private static final String PROXY_PORT_KEY = "proxyPort"; 154602b232a06ede86999aa362a12eb28cbc782dc1dJason Monk private static final String PROXY_PAC_FILE = "proxyPac"; 15596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff private static final String EXCLUSION_LIST_KEY = "exclusionList"; 15696ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff private static final String EOS = "eos"; 15796ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff 158e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde private final LocalLog mLocalLog; 1593569fdd9afdec7d32b290b41b7a16ff8467592f0Vinit Deshapnde private final WpaConfigFileObserver mFileObserver; 160e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde 161fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff private WifiNative mWifiNative; 16226d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff private final KeyStore mKeyStore = KeyStore.getInstance(); 163fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff 164fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff WifiConfigStore(Context c, WifiNative wn) { 165fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff mContext = c; 166fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff mWifiNative = wn; 167e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde 1683569fdd9afdec7d32b290b41b7a16ff8467592f0Vinit Deshapnde if (VDBG) { 16948c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde mLocalLog = mWifiNative.getLocalLog(); 17048c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde mFileObserver = new WpaConfigFileObserver(); 17148c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde mFileObserver.startWatching(); 1723569fdd9afdec7d32b290b41b7a16ff8467592f0Vinit Deshapnde } else { 1733569fdd9afdec7d32b290b41b7a16ff8467592f0Vinit Deshapnde mLocalLog = null; 1743569fdd9afdec7d32b290b41b7a16ff8467592f0Vinit Deshapnde mFileObserver = null; 175e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde } 176fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff } 177e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff 17848c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde class WpaConfigFileObserver extends FileObserver { 17948c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde 18048c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde public WpaConfigFileObserver() { 18148c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde super(SUPPLICANT_CONFIG_FILE, CLOSE_WRITE); 18248c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde } 18348c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde 18448c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde @Override 18548c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde public void onEvent(int event, String path) { 18648c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde if (event == CLOSE_WRITE) { 18748c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde File file = new File(SUPPLICANT_CONFIG_FILE); 1883569fdd9afdec7d32b290b41b7a16ff8467592f0Vinit Deshapnde if (VDBG) localLog("wpa_supplicant.conf changed; new size = " + file.length()); 18948c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde } 19048c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde } 19148c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde } 19248c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde 19348c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde 19404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff /** 195fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff * Fetch the list of configured networks 19604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * and enable all stored networks in supplicant. 19704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff */ 198cca308e3e841731662d3ceacf3c631ce5ecf8fb2Irfan Sheriff void loadAndEnableAllNetworks() { 1997f8a12c75cf2b376fce58fc22b5ecb1b64acf110Irfan Sheriff if (DBG) log("Loading config and enabling all networks"); 2005ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff loadConfiguredNetworks(); 20104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff enableAllNetworks(); 20204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 20304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 20404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff /** 20504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * Fetch the list of currently configured networks 20604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * @return List of networks 20704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff */ 208fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff List<WifiConfiguration> getConfiguredNetworks() { 20904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff List<WifiConfiguration> networks = new ArrayList<WifiConfiguration>(); 210fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff for(WifiConfiguration config : mConfiguredNetworks.values()) { 211e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff networks.add(new WifiConfiguration(config)); 21204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 21304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff return networks; 21404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 21504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 21604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff /** 21704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * enable all networks and save config. This will be a no-op if the list 21804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * of configured networks indicates all networks as being enabled 21904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff */ 220fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff void enableAllNetworks() { 2218e86b89860114386e6c43f55fc034a26798b73e2Irfan Sheriff boolean networkEnabledStateChanged = false; 222fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff for(WifiConfiguration config : mConfiguredNetworks.values()) { 223e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff if(config != null && config.status == Status.DISABLED) { 224fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff if(mWifiNative.enableNetwork(config.networkId, false)) { 225e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff networkEnabledStateChanged = true; 226e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff config.status = Status.ENABLED; 227e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff } else { 228e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff loge("Enable network failed on " + config.networkId); 22931b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff } 23004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 23104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 23204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 2338e86b89860114386e6c43f55fc034a26798b73e2Irfan Sheriff if (networkEnabledStateChanged) { 234fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff mWifiNative.saveConfig(); 2358e86b89860114386e6c43f55fc034a26798b73e2Irfan Sheriff sendConfiguredNetworksChangedBroadcast(); 2368e86b89860114386e6c43f55fc034a26798b73e2Irfan Sheriff } 23704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 23804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 23904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 24004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff /** 24104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * Selects the specified network for connection. This involves 24204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * updating the priority of all the networks and enabling the given 24304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * network while disabling others. 24404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * 24504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * Selecting a network will leave the other networks disabled and 24604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * a call to enableAllNetworks() needs to be issued upon a connection 24704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * or a failure event from supplicant 24804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * 24904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * @param netId network to select for connection 250b3e96c527b8ac96e869bafeff5f7fab099e28396Irfan Sheriff * @return false if the network id is invalid 25104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff */ 252b3e96c527b8ac96e869bafeff5f7fab099e28396Irfan Sheriff boolean selectNetwork(int netId) { 2533569fdd9afdec7d32b290b41b7a16ff8467592f0Vinit Deshapnde if (VDBG) localLog("selectNetwork", netId); 254b3e96c527b8ac96e869bafeff5f7fab099e28396Irfan Sheriff if (netId == INVALID_NETWORK_ID) return false; 255b3e96c527b8ac96e869bafeff5f7fab099e28396Irfan Sheriff 25604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff // Reset the priority of each network at start or if it goes too high. 257fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff if (mLastPriority == -1 || mLastPriority > 1000000) { 258fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff for(WifiConfiguration config : mConfiguredNetworks.values()) { 259e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff if (config.networkId != INVALID_NETWORK_ID) { 260e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff config.priority = 0; 261e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff addOrUpdateNetworkNative(config); 26204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 26304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 264fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff mLastPriority = 0; 26504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 26604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 26704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff // Set to the highest priority and save the configuration. 26804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff WifiConfiguration config = new WifiConfiguration(); 26904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff config.networkId = netId; 270fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff config.priority = ++mLastPriority; 27104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 27204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff addOrUpdateNetworkNative(config); 273fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff mWifiNative.saveConfig(); 27404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 27504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff /* Enable the given network while disabling all other networks */ 27631b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff enableNetworkWithoutBroadcast(netId, true); 27704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 27831b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff /* Avoid saving the config & sending a broadcast to prevent settings 27931b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff * from displaying a disabled list of networks */ 280b3e96c527b8ac96e869bafeff5f7fab099e28396Irfan Sheriff return true; 28104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 28204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 28304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff /** 28404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * Add/update the specified configuration and save config 28504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * 28604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * @param config WifiConfiguration to be saved 287d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @return network update result 28804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff */ 289fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff NetworkUpdateResult saveNetwork(WifiConfiguration config) { 2903569fdd9afdec7d32b290b41b7a16ff8467592f0Vinit Deshapnde if (VDBG) localLog("saveNetwork", config.networkId); 291b3e96c527b8ac96e869bafeff5f7fab099e28396Irfan Sheriff // A new network cannot have null SSID 292b3e96c527b8ac96e869bafeff5f7fab099e28396Irfan Sheriff if (config == null || (config.networkId == INVALID_NETWORK_ID && 293b3e96c527b8ac96e869bafeff5f7fab099e28396Irfan Sheriff config.SSID == null)) { 294b3e96c527b8ac96e869bafeff5f7fab099e28396Irfan Sheriff return new NetworkUpdateResult(INVALID_NETWORK_ID); 295b3e96c527b8ac96e869bafeff5f7fab099e28396Irfan Sheriff } 296b3e96c527b8ac96e869bafeff5f7fab099e28396Irfan Sheriff 2975ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff boolean newNetwork = (config.networkId == INVALID_NETWORK_ID); 298be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff NetworkUpdateResult result = addOrUpdateNetworkNative(config); 299be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff int netId = result.getNetworkId(); 30004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff /* enable a new network */ 3015ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff if (newNetwork && netId != INVALID_NETWORK_ID) { 302fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff mWifiNative.enableNetwork(netId, false); 303fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff mConfiguredNetworks.get(netId).status = Status.ENABLED; 30404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 305fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff mWifiNative.saveConfig(); 3061b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood sendConfiguredNetworksChangedBroadcast(config, result.isNewNetwork() ? 3071b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood WifiManager.CHANGE_REASON_ADDED : WifiManager.CHANGE_REASON_CONFIG_CHANGE); 308be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff return result; 30904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 31004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 311fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff void updateStatus(int netId, DetailedState state) { 312cdc077c9dd6473b5abfad4edfaf1ff41a436caafIrfan Sheriff if (netId != INVALID_NETWORK_ID) { 313fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff WifiConfiguration config = mConfiguredNetworks.get(netId); 314cdc077c9dd6473b5abfad4edfaf1ff41a436caafIrfan Sheriff if (config == null) return; 315cdc077c9dd6473b5abfad4edfaf1ff41a436caafIrfan Sheriff switch (state) { 316cdc077c9dd6473b5abfad4edfaf1ff41a436caafIrfan Sheriff case CONNECTED: 317cdc077c9dd6473b5abfad4edfaf1ff41a436caafIrfan Sheriff config.status = Status.CURRENT; 318cdc077c9dd6473b5abfad4edfaf1ff41a436caafIrfan Sheriff break; 319cdc077c9dd6473b5abfad4edfaf1ff41a436caafIrfan Sheriff case DISCONNECTED: 32086a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff //If network is already disabled, keep the status 32186a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff if (config.status == Status.CURRENT) { 32286a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff config.status = Status.ENABLED; 32386a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff } 324cdc077c9dd6473b5abfad4edfaf1ff41a436caafIrfan Sheriff break; 325cdc077c9dd6473b5abfad4edfaf1ff41a436caafIrfan Sheriff default: 326cdc077c9dd6473b5abfad4edfaf1ff41a436caafIrfan Sheriff //do nothing, retain the existing state 327cdc077c9dd6473b5abfad4edfaf1ff41a436caafIrfan Sheriff break; 328cdc077c9dd6473b5abfad4edfaf1ff41a436caafIrfan Sheriff } 329cdc077c9dd6473b5abfad4edfaf1ff41a436caafIrfan Sheriff } 330cdc077c9dd6473b5abfad4edfaf1ff41a436caafIrfan Sheriff } 331cdc077c9dd6473b5abfad4edfaf1ff41a436caafIrfan Sheriff 33204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff /** 33304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * Forget the specified network and save config 33404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * 33504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * @param netId network to forget 336d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @return {@code true} if it succeeds, {@code false} otherwise 33704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff */ 338d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff boolean forgetNetwork(int netId) { 3393569fdd9afdec7d32b290b41b7a16ff8467592f0Vinit Deshapnde if (VDBG) localLog("forgetNetwork", netId); 340fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff if (mWifiNative.removeNetwork(netId)) { 341fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff mWifiNative.saveConfig(); 34226d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff removeConfigAndSendBroadcastIfNeeded(netId); 343d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff return true; 34431b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff } else { 3457f8a12c75cf2b376fce58fc22b5ecb1b64acf110Irfan Sheriff loge("Failed to remove network " + netId); 346d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff return false; 34731b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff } 34804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 34904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 35004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff /** 35104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * Add/update a network. Note that there is no saveConfig operation. 35204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * This function is retained for compatibility with the public 35304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * API. The more powerful saveNetwork() is used by the 35404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * state machine 35504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * 35604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * @param config wifi configuration to add/update 357d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @return network Id 35804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff */ 359fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff int addOrUpdateNetwork(WifiConfiguration config) { 3603569fdd9afdec7d32b290b41b7a16ff8467592f0Vinit Deshapnde if (VDBG) localLog("addOrUpdateNetwork", config.networkId); 361be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff NetworkUpdateResult result = addOrUpdateNetworkNative(config); 3621b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood if (result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID) { 3631b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood sendConfiguredNetworksChangedBroadcast(mConfiguredNetworks.get(result.getNetworkId()), 3641b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood result.isNewNetwork ? WifiManager.CHANGE_REASON_ADDED : 36548c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde WifiManager.CHANGE_REASON_CONFIG_CHANGE); 3661b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood } 367be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff return result.getNetworkId(); 36804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 36904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 37004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff /** 37104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * Remove a network. Note that there is no saveConfig operation. 37204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * This function is retained for compatibility with the public 37304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * API. The more powerful forgetNetwork() is used by the 37404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * state machine for network removal 37504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * 37604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * @param netId network to be removed 377d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @return {@code true} if it succeeds, {@code false} otherwise 37804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff */ 379fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff boolean removeNetwork(int netId) { 3803569fdd9afdec7d32b290b41b7a16ff8467592f0Vinit Deshapnde if (VDBG) localLog("removeNetwork", netId); 381fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff boolean ret = mWifiNative.removeNetwork(netId); 382e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff if (ret) { 38326d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff removeConfigAndSendBroadcastIfNeeded(netId); 38431b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff } 38526d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff return ret; 38626d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff } 38726d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff 38826d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff private void removeConfigAndSendBroadcastIfNeeded(int netId) { 38926d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff WifiConfiguration config = mConfiguredNetworks.get(netId); 3901b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood if (config != null) { 39126d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff // Remove any associated keys 39226d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff if (config.enterpriseConfig != null) { 39326d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff config.enterpriseConfig.removeKeys(mKeyStore); 39426d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff } 39526d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff mConfiguredNetworks.remove(netId); 39626d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff mNetworkIds.remove(configKey(config)); 39726d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff 39826d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff writeIpAndProxyConfigurations(); 3991b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood sendConfiguredNetworksChangedBroadcast(config, WifiManager.CHANGE_REASON_REMOVED); 4001b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood } 40104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 40204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 40304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff /** 40404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * Enable a network. Note that there is no saveConfig operation. 40504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * This function is retained for compatibility with the public 40604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * API. The more powerful selectNetwork()/saveNetwork() is used by the 40704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * state machine for connecting to a network 40804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * 4091b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @param netId network to be enabled 410d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @return {@code true} if it succeeds, {@code false} otherwise 41104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff */ 412fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff boolean enableNetwork(int netId, boolean disableOthers) { 41331b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff boolean ret = enableNetworkWithoutBroadcast(netId, disableOthers); 4141b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood if (disableOthers) { 4153569fdd9afdec7d32b290b41b7a16ff8467592f0Vinit Deshapnde if (VDBG) localLog("enableNetwork(disableOthers=true) ", netId); 4161b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood sendConfiguredNetworksChangedBroadcast(); 4171b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood } else { 4183569fdd9afdec7d32b290b41b7a16ff8467592f0Vinit Deshapnde if (VDBG) localLog("enableNetwork(disableOthers=false) ", netId); 4191b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood WifiConfiguration enabledNetwork = null; 4201b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood synchronized(mConfiguredNetworks) { 4211b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood enabledNetwork = mConfiguredNetworks.get(netId); 4221b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood } 4231b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood // check just in case the network was removed by someone else. 4241b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood if (enabledNetwork != null) { 4251b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood sendConfiguredNetworksChangedBroadcast(enabledNetwork, 4261b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood WifiManager.CHANGE_REASON_CONFIG_CHANGE); 4271b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood } 4281b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood } 42931b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff return ret; 43031b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff } 43131b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff 432fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff boolean enableNetworkWithoutBroadcast(int netId, boolean disableOthers) { 433fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff boolean ret = mWifiNative.enableNetwork(netId, disableOthers); 43431b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff 435fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff WifiConfiguration config = mConfiguredNetworks.get(netId); 436e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff if (config != null) config.status = Status.ENABLED; 43731b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff 43831b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff if (disableOthers) { 4395ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff markAllNetworksDisabledExcept(netId); 44031b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff } 44104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff return ret; 44204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 44304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 44411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff void disableAllNetworks() { 4453569fdd9afdec7d32b290b41b7a16ff8467592f0Vinit Deshapnde if (VDBG) localLog("disableAllNetworks"); 44611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff boolean networkDisabled = false; 44711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff for(WifiConfiguration config : mConfiguredNetworks.values()) { 44811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff if(config != null && config.status != Status.DISABLED) { 44911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff if(mWifiNative.disableNetwork(config.networkId)) { 45011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff networkDisabled = true; 45111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff config.status = Status.DISABLED; 45211aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } else { 45311aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff loge("Disable network failed on " + config.networkId); 45411aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 45511aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 45611aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 45711aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff 45811aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff if (networkDisabled) { 45911aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff sendConfiguredNetworksChangedBroadcast(); 46011aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 46111aefad94de6569c4c7394e7bc5fdeb0ae60d5bbIrfan Sheriff } 46204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff /** 46304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * Disable a network. Note that there is no saveConfig operation. 46404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * @param netId network to be disabled 465d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @return {@code true} if it succeeds, {@code false} otherwise 46604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff */ 467fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff boolean disableNetwork(int netId) { 4688dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy return disableNetwork(netId, WifiConfiguration.DISABLED_UNKNOWN_REASON); 4698dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy } 4708dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy 4718dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy /** 4728dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy * Disable a network. Note that there is no saveConfig operation. 4738dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy * @param netId network to be disabled 4748dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy * @param reason reason code network was disabled 475d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @return {@code true} if it succeeds, {@code false} otherwise 4768dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy */ 477fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff boolean disableNetwork(int netId, int reason) { 4783569fdd9afdec7d32b290b41b7a16ff8467592f0Vinit Deshapnde if (VDBG) localLog("disableNetwork", netId); 479fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff boolean ret = mWifiNative.disableNetwork(netId); 4801b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood WifiConfiguration network = null; 481fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff WifiConfiguration config = mConfiguredNetworks.get(netId); 482e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff /* Only change the reason if the network was not previously disabled */ 483e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff if (config != null && config.status != Status.DISABLED) { 484e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff config.status = Status.DISABLED; 485e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff config.disableReason = reason; 4861b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood network = config; 4871b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood } 4881b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood if (network != null) { 4891b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood sendConfiguredNetworksChangedBroadcast(network, 4901b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood WifiManager.CHANGE_REASON_CONFIG_CHANGE); 49131b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff } 49204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff return ret; 49304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 49404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 49504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff /** 49604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * Save the configured networks in supplicant to disk 497d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @return {@code true} if it succeeds, {@code false} otherwise 49804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff */ 499fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff boolean saveConfig() { 500fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff return mWifiNative.saveConfig(); 50104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 50204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 50331b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff /** 504f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff * Start WPS pin method configuration with pin obtained 505f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff * from the access point 506d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param config WPS configuration 507d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @return Wps result containing status and pin 5085ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff */ 509fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff WpsResult startWpsWithPinFromAccessPoint(WpsInfo config) { 510e4c56c9655bf936454e2f3ee434aacb403876c7dIrfan Sheriff WpsResult result = new WpsResult(); 511fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff if (mWifiNative.startWpsRegistrar(config.BSSID, config.pin)) { 5125ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff /* WPS leaves all networks disabled */ 5135ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff markAllNetworksDisabled(); 514e4c56c9655bf936454e2f3ee434aacb403876c7dIrfan Sheriff result.status = WpsResult.Status.SUCCESS; 515e4c56c9655bf936454e2f3ee434aacb403876c7dIrfan Sheriff } else { 5167f8a12c75cf2b376fce58fc22b5ecb1b64acf110Irfan Sheriff loge("Failed to start WPS pin method configuration"); 517e4c56c9655bf936454e2f3ee434aacb403876c7dIrfan Sheriff result.status = WpsResult.Status.FAILURE; 5185ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff } 519e4c56c9655bf936454e2f3ee434aacb403876c7dIrfan Sheriff return result; 5205ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff } 5215ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff 5225ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff /** 523f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff * Start WPS pin method configuration with pin obtained 524f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff * from the device 525e4c56c9655bf936454e2f3ee434aacb403876c7dIrfan Sheriff * @return WpsResult indicating status and pin 526f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff */ 527fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff WpsResult startWpsWithPinFromDevice(WpsInfo config) { 528e4c56c9655bf936454e2f3ee434aacb403876c7dIrfan Sheriff WpsResult result = new WpsResult(); 529fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff result.pin = mWifiNative.startWpsPinDisplay(config.BSSID); 530f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff /* WPS leaves all networks disabled */ 531e4c56c9655bf936454e2f3ee434aacb403876c7dIrfan Sheriff if (!TextUtils.isEmpty(result.pin)) { 532f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff markAllNetworksDisabled(); 533e4c56c9655bf936454e2f3ee434aacb403876c7dIrfan Sheriff result.status = WpsResult.Status.SUCCESS; 534f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff } else { 5357f8a12c75cf2b376fce58fc22b5ecb1b64acf110Irfan Sheriff loge("Failed to start WPS pin method configuration"); 536e4c56c9655bf936454e2f3ee434aacb403876c7dIrfan Sheriff result.status = WpsResult.Status.FAILURE; 537f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff } 538e4c56c9655bf936454e2f3ee434aacb403876c7dIrfan Sheriff return result; 539f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff } 540f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff 541f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff /** 5425ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff * Start WPS push button configuration 543d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param config WPS configuration 544d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @return WpsResult indicating status and pin 5455ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff */ 546fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff WpsResult startWpsPbc(WpsInfo config) { 547e4c56c9655bf936454e2f3ee434aacb403876c7dIrfan Sheriff WpsResult result = new WpsResult(); 548fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff if (mWifiNative.startWpsPbc(config.BSSID)) { 5495ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff /* WPS leaves all networks disabled */ 5505ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff markAllNetworksDisabled(); 551e4c56c9655bf936454e2f3ee434aacb403876c7dIrfan Sheriff result.status = WpsResult.Status.SUCCESS; 552e4c56c9655bf936454e2f3ee434aacb403876c7dIrfan Sheriff } else { 5537f8a12c75cf2b376fce58fc22b5ecb1b64acf110Irfan Sheriff loge("Failed to start WPS push button configuration"); 554e4c56c9655bf936454e2f3ee434aacb403876c7dIrfan Sheriff result.status = WpsResult.Status.FAILURE; 5555ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff } 556e4c56c9655bf936454e2f3ee434aacb403876c7dIrfan Sheriff return result; 5575ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff } 5585ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff 5595ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff /** 56096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff * Fetch the link properties for a given network id 561d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @return LinkProperties for the given network id 56231b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff */ 563fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff LinkProperties getLinkProperties(int netId) { 564fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff WifiConfiguration config = mConfiguredNetworks.get(netId); 565e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff if (config != null) return new LinkProperties(config.linkProperties); 56631b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff return null; 56731b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff } 56831b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff 56931b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff /** 57084cffa45261519a96949ec5c6cd8e21fea950ff5Irfan Sheriff * set IP configuration for a given network id 57184cffa45261519a96949ec5c6cd8e21fea950ff5Irfan Sheriff */ 5724717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt void setLinkProperties(int netId, LinkProperties linkProperties) { 573fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff WifiConfiguration config = mConfiguredNetworks.get(netId); 574e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff if (config != null) { 5754717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt // add old proxy details - TODO - is this still needed? 576e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff if(config.linkProperties != null) { 577e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff linkProperties.setHttpProxy(config.linkProperties.getHttpProxy()); 57884cffa45261519a96949ec5c6cd8e21fea950ff5Irfan Sheriff } 579e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff config.linkProperties = linkProperties; 58084cffa45261519a96949ec5c6cd8e21fea950ff5Irfan Sheriff } 58184cffa45261519a96949ec5c6cd8e21fea950ff5Irfan Sheriff } 58284cffa45261519a96949ec5c6cd8e21fea950ff5Irfan Sheriff 5830c13d479398ab4d940a302d2efd37cfeee51f872Irfan Sheriff /** 5840c13d479398ab4d940a302d2efd37cfeee51f872Irfan Sheriff * clear IP configuration for a given network id 585d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param network id 5860c13d479398ab4d940a302d2efd37cfeee51f872Irfan Sheriff */ 5874717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt void clearLinkProperties(int netId) { 588fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff WifiConfiguration config = mConfiguredNetworks.get(netId); 589e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff if (config != null && config.linkProperties != null) { 590e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff // Clear everything except proxy 591e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff ProxyProperties proxy = config.linkProperties.getHttpProxy(); 592e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff config.linkProperties.clear(); 593e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff config.linkProperties.setHttpProxy(proxy); 5940c13d479398ab4d940a302d2efd37cfeee51f872Irfan Sheriff } 5950c13d479398ab4d940a302d2efd37cfeee51f872Irfan Sheriff } 5960c13d479398ab4d940a302d2efd37cfeee51f872Irfan Sheriff 59784cffa45261519a96949ec5c6cd8e21fea950ff5Irfan Sheriff 59884cffa45261519a96949ec5c6cd8e21fea950ff5Irfan Sheriff /** 599128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff * Fetch the proxy properties for a given network id 600d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param network id 601d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @return ProxyProperties for the network id 602128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff */ 603fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff ProxyProperties getProxyProperties(int netId) { 60496ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff LinkProperties linkProperties = getLinkProperties(netId); 60596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff if (linkProperties != null) { 60696ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff return new ProxyProperties(linkProperties.getHttpProxy()); 607128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff } 608128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff return null; 609128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff } 610128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff 611128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff /** 61231b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff * Return if the specified network is using static IP 613d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param network id 614d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @return {@code true} if using static ip for netId 61531b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff */ 616fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff boolean isUsingStaticIp(int netId) { 617fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff WifiConfiguration config = mConfiguredNetworks.get(netId); 618e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff if (config != null && config.ipAssignment == IpAssignment.STATIC) { 619e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff return true; 62031b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff } 62131b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff return false; 62231b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff } 62331b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff 6241b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood /** 6251b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * Should be called when a single network configuration is made. 6261b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @param network The network configuration that changed. 6271b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @param reason The reason for the change, should be one of WifiManager.CHANGE_REASON_ADDED, 6281b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * WifiManager.CHANGE_REASON_REMOVED, or WifiManager.CHANGE_REASON_CHANGE. 6291b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood */ 6301b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood private void sendConfiguredNetworksChangedBroadcast(WifiConfiguration network, 6311b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood int reason) { 6321b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood Intent intent = new Intent(WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION); 6331b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); 6341b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood intent.putExtra(WifiManager.EXTRA_MULTIPLE_NETWORKS_CHANGED, false); 6351b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood intent.putExtra(WifiManager.EXTRA_WIFI_CONFIGURATION, network); 6361b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood intent.putExtra(WifiManager.EXTRA_CHANGE_REASON, reason); 6375ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mContext.sendBroadcastAsUser(intent, UserHandle.ALL); 6381b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood } 6391b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood 6401b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood /** 6411b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * Should be called when multiple network configuration changes are made. 6421b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood */ 643fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff private void sendConfiguredNetworksChangedBroadcast() { 644be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff Intent intent = new Intent(WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION); 645be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); 6461b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood intent.putExtra(WifiManager.EXTRA_MULTIPLE_NETWORKS_CHANGED, true); 6475ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mContext.sendBroadcastAsUser(intent, UserHandle.ALL); 64804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 64904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 650fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff void loadConfiguredNetworks() { 651fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff String listStr = mWifiNative.listNetworks(); 652fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff mLastPriority = 0; 65304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 654fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff mConfiguredNetworks.clear(); 655fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff mNetworkIds.clear(); 656e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff 657e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff if (listStr == null) 658e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff return; 659e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff 660e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff String[] lines = listStr.split("\n"); 661e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff // Skip the first line, which is a header 662e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff for (int i = 1; i < lines.length; i++) { 663e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff String[] result = lines[i].split("\t"); 664e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff // network-id | ssid | bssid | flags 665e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff WifiConfiguration config = new WifiConfiguration(); 666e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff try { 667e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff config.networkId = Integer.parseInt(result[0]); 668e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff } catch(NumberFormatException e) { 66948c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde loge("Failed to read network-id '" + result[0] + "'"); 670e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff continue; 671e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff } 672e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff if (result.length > 3) { 673e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff if (result[3].indexOf("[CURRENT]") != -1) 674e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff config.status = WifiConfiguration.Status.CURRENT; 675e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff else if (result[3].indexOf("[DISABLED]") != -1) 676e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff config.status = WifiConfiguration.Status.DISABLED; 677e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff else 67804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff config.status = WifiConfiguration.Status.ENABLED; 679e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff } else { 680e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff config.status = WifiConfiguration.Status.ENABLED; 68104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 682e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff readNetworkVariables(config); 683fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff if (config.priority > mLastPriority) { 684fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff mLastPriority = config.priority; 685e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff } 68651e4ece385c6c34d97d5fa2dcc8e3b2c0bae7c22Irfan Sheriff config.ipAssignment = IpAssignment.DHCP; 68751e4ece385c6c34d97d5fa2dcc8e3b2c0bae7c22Irfan Sheriff config.proxySettings = ProxySettings.NONE; 6881ed7a0200ac705b20f71193030a59edd8361200bVinit Deshapnde 6891ed7a0200ac705b20f71193030a59edd8361200bVinit Deshapnde if (mNetworkIds.containsKey(configKey(config))) { 6901ed7a0200ac705b20f71193030a59edd8361200bVinit Deshapnde // That SSID is already known, just ignore this duplicate entry 6913569fdd9afdec7d32b290b41b7a16ff8467592f0Vinit Deshapnde if (VDBG) localLog("discarded duplicate network", config.networkId); 6921ed7a0200ac705b20f71193030a59edd8361200bVinit Deshapnde } else { 6931ed7a0200ac705b20f71193030a59edd8361200bVinit Deshapnde mConfiguredNetworks.put(config.networkId, config); 6941ed7a0200ac705b20f71193030a59edd8361200bVinit Deshapnde mNetworkIds.put(configKey(config), config.networkId); 6953569fdd9afdec7d32b290b41b7a16ff8467592f0Vinit Deshapnde if (VDBG) localLog("loaded configured network", config.networkId); 6961ed7a0200ac705b20f71193030a59edd8361200bVinit Deshapnde } 69704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 698e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff 699128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff readIpAndProxyConfigurations(); 700be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff sendConfiguredNetworksChangedBroadcast(); 701e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde 7023569fdd9afdec7d32b290b41b7a16ff8467592f0Vinit Deshapnde if (VDBG) localLog("loadConfiguredNetworks loaded " + mNetworkIds.size() + " networks"); 70348c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde 70448c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde if (mNetworkIds.size() == 0) { 70548c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde // no networks? Lets log if the wpa_supplicant.conf file contents 70648c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde BufferedReader reader = null; 70748c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde try { 70848c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde reader = new BufferedReader(new FileReader(SUPPLICANT_CONFIG_FILE)); 7093569fdd9afdec7d32b290b41b7a16ff8467592f0Vinit Deshapnde if (VDBG) localLog("--- Begin wpa_supplicant.conf Contents ---"); 71048c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde for (String line = reader.readLine(); line != null; line = reader.readLine()) { 7113569fdd9afdec7d32b290b41b7a16ff8467592f0Vinit Deshapnde if (VDBG) localLog(line); 71248c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde } 7133569fdd9afdec7d32b290b41b7a16ff8467592f0Vinit Deshapnde if (VDBG) localLog("--- End wpa_supplicant.conf Contents ---"); 71448c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde } catch (FileNotFoundException e) { 7153569fdd9afdec7d32b290b41b7a16ff8467592f0Vinit Deshapnde if (VDBG) localLog("Could not open " + SUPPLICANT_CONFIG_FILE + ", " + e); 71648c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde } catch (IOException e) { 7173569fdd9afdec7d32b290b41b7a16ff8467592f0Vinit Deshapnde if (VDBG) localLog("Could not read " + SUPPLICANT_CONFIG_FILE + ", " + e); 71848c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde } finally { 71948c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde try { 72048c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde if (reader != null) { 72148c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde reader.close(); 72248c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde } 72348c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde } catch (IOException e) { 72448c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde // Just ignore the fact that we couldn't close 72548c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde } 72648c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde } 72748c47471061d7d5da15fa2b45ac7c8102bdf847eVinit Deshapnde } 7285ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff } 7295ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff 7305ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff /* Mark all networks except specified netId as disabled */ 731fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff private void markAllNetworksDisabledExcept(int netId) { 732fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff for(WifiConfiguration config : mConfiguredNetworks.values()) { 733e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff if(config != null && config.networkId != netId) { 734e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff if (config.status != Status.DISABLED) { 735e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff config.status = Status.DISABLED; 736e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff config.disableReason = WifiConfiguration.DISABLED_UNKNOWN_REASON; 7375ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff } 7385ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff } 7395ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff } 7405ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff } 7415ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff 742fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff private void markAllNetworksDisabled() { 7435ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff markAllNetworksDisabledExcept(INVALID_NETWORK_ID); 74431b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff } 74531b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff 746a3038b2b311cd07d851c404ccc5df2f4e07bcfd8Vinit Deshapnde boolean needsUnlockedKeyStore() { 747a3038b2b311cd07d851c404ccc5df2f4e07bcfd8Vinit Deshapnde 748a3038b2b311cd07d851c404ccc5df2f4e07bcfd8Vinit Deshapnde // Any network using certificates to authenticate access requires 749a3038b2b311cd07d851c404ccc5df2f4e07bcfd8Vinit Deshapnde // unlocked key store; unless the certificates can be stored with 750a3038b2b311cd07d851c404ccc5df2f4e07bcfd8Vinit Deshapnde // hardware encryption 751a3038b2b311cd07d851c404ccc5df2f4e07bcfd8Vinit Deshapnde 752a3038b2b311cd07d851c404ccc5df2f4e07bcfd8Vinit Deshapnde for(WifiConfiguration config : mConfiguredNetworks.values()) { 753a3038b2b311cd07d851c404ccc5df2f4e07bcfd8Vinit Deshapnde 754a3038b2b311cd07d851c404ccc5df2f4e07bcfd8Vinit Deshapnde if (config.allowedKeyManagement.get(KeyMgmt.WPA_EAP) 755a3038b2b311cd07d851c404ccc5df2f4e07bcfd8Vinit Deshapnde && config.allowedKeyManagement.get(KeyMgmt.IEEE8021X)) { 756a3038b2b311cd07d851c404ccc5df2f4e07bcfd8Vinit Deshapnde 757a3038b2b311cd07d851c404ccc5df2f4e07bcfd8Vinit Deshapnde if (config.enterpriseConfig.needsSoftwareBackedKeyStore()) { 758a3038b2b311cd07d851c404ccc5df2f4e07bcfd8Vinit Deshapnde return true; 759a3038b2b311cd07d851c404ccc5df2f4e07bcfd8Vinit Deshapnde } 760a3038b2b311cd07d851c404ccc5df2f4e07bcfd8Vinit Deshapnde } 761a3038b2b311cd07d851c404ccc5df2f4e07bcfd8Vinit Deshapnde } 762a3038b2b311cd07d851c404ccc5df2f4e07bcfd8Vinit Deshapnde 763a3038b2b311cd07d851c404ccc5df2f4e07bcfd8Vinit Deshapnde return false; 764a3038b2b311cd07d851c404ccc5df2f4e07bcfd8Vinit Deshapnde } 765a3038b2b311cd07d851c404ccc5df2f4e07bcfd8Vinit Deshapnde 766fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff private void writeIpAndProxyConfigurations() { 76731b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff 768e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff /* Make a copy */ 769e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff List<WifiConfiguration> networks = new ArrayList<WifiConfiguration>(); 770fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff for(WifiConfiguration config : mConfiguredNetworks.values()) { 771e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff networks.add(new WifiConfiguration(config)); 772e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff } 77331b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff 774fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff DelayedDiskWrite.write(networks); 775e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff } 776e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff 777fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff private static class DelayedDiskWrite { 778e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff 779fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff private static HandlerThread sDiskWriteHandlerThread; 780fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff private static Handler sDiskWriteHandler; 781fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff /* Tracks multiple writes on the same thread */ 782fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff private static int sWriteSequence = 0; 783fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff private static final String TAG = "DelayedDiskWrite"; 784e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff 785fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff static void write (final List<WifiConfiguration> networks) { 786e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff 787fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff /* Do a delayed write to disk on a seperate handler thread */ 788fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff synchronized (DelayedDiskWrite.class) { 789fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff if (++sWriteSequence == 1) { 790fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff sDiskWriteHandlerThread = new HandlerThread("WifiConfigThread"); 791fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff sDiskWriteHandlerThread.start(); 792fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff sDiskWriteHandler = new Handler(sDiskWriteHandlerThread.getLooper()); 793fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff } 794e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff } 795128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff 796fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff sDiskWriteHandler.post(new Runnable() { 797fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff @Override 798fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff public void run() { 799fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff onWriteCalled(networks); 800fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff } 801fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff }); 802fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff } 803fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff 804fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff private static void onWriteCalled(List<WifiConfiguration> networks) { 805e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff 806e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff DataOutputStream out = null; 807e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff try { 808e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff out = new DataOutputStream(new BufferedOutputStream( 809e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff new FileOutputStream(ipConfigFile))); 810e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff 811e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff out.writeInt(IPCONFIG_FILE_VERSION); 812e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff 813e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff for(WifiConfiguration config : networks) { 814128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff boolean writeToFile = false; 815128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff 81696ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff try { 81796ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff LinkProperties linkProperties = config.linkProperties; 81896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff switch (config.ipAssignment) { 81996ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff case STATIC: 82096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff out.writeUTF(IP_ASSIGNMENT_KEY); 82196ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff out.writeUTF(config.ipAssignment.toString()); 82296ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff for (LinkAddress linkAddr : linkProperties.getLinkAddresses()) { 82396ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff out.writeUTF(LINK_ADDRESS_KEY); 82496ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff out.writeUTF(linkAddr.getAddress().getHostAddress()); 82596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff out.writeInt(linkAddr.getNetworkPrefixLength()); 826128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff } 827aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt for (RouteInfo route : linkProperties.getRoutes()) { 82896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff out.writeUTF(GATEWAY_KEY); 829aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt LinkAddress dest = route.getDestination(); 830aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt if (dest != null) { 831aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt out.writeInt(1); 832aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt out.writeUTF(dest.getAddress().getHostAddress()); 833aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt out.writeInt(dest.getNetworkPrefixLength()); 834aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt } else { 835aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt out.writeInt(0); 836aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt } 837aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt if (route.getGateway() != null) { 838aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt out.writeInt(1); 839aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt out.writeUTF(route.getGateway().getHostAddress()); 840aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt } else { 841aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt out.writeInt(0); 842aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt } 84396ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } 84496ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff for (InetAddress inetAddr : linkProperties.getDnses()) { 84596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff out.writeUTF(DNS_KEY); 84696ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff out.writeUTF(inetAddr.getHostAddress()); 84796ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } 84896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff writeToFile = true; 84996ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff break; 85096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff case DHCP: 85196ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff out.writeUTF(IP_ASSIGNMENT_KEY); 85296ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff out.writeUTF(config.ipAssignment.toString()); 85396ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff writeToFile = true; 85496ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff break; 85596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff case UNASSIGNED: 85696ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff /* Ignore */ 85796ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff break; 85896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff default: 8597f8a12c75cf2b376fce58fc22b5ecb1b64acf110Irfan Sheriff loge("Ignore invalid ip assignment while writing"); 86096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff break; 86196ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } 862128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff 86396ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff switch (config.proxySettings) { 86496ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff case STATIC: 86596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff ProxyProperties proxyProperties = linkProperties.getHttpProxy(); 86696ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff String exclusionList = proxyProperties.getExclusionList(); 86796ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff out.writeUTF(PROXY_SETTINGS_KEY); 86896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff out.writeUTF(config.proxySettings.toString()); 86996ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff out.writeUTF(PROXY_HOST_KEY); 870434203a277cd2f237a71508a3d5a7d1602126cd5Robert Greenwalt out.writeUTF(proxyProperties.getHost()); 87196ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff out.writeUTF(PROXY_PORT_KEY); 872434203a277cd2f237a71508a3d5a7d1602126cd5Robert Greenwalt out.writeInt(proxyProperties.getPort()); 87396ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff out.writeUTF(EXCLUSION_LIST_KEY); 87496ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff out.writeUTF(exclusionList); 87596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff writeToFile = true; 87696ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff break; 877602b232a06ede86999aa362a12eb28cbc782dc1dJason Monk case PAC: 878602b232a06ede86999aa362a12eb28cbc782dc1dJason Monk ProxyProperties proxyPacProperties = linkProperties.getHttpProxy(); 879602b232a06ede86999aa362a12eb28cbc782dc1dJason Monk out.writeUTF(PROXY_SETTINGS_KEY); 880602b232a06ede86999aa362a12eb28cbc782dc1dJason Monk out.writeUTF(config.proxySettings.toString()); 881602b232a06ede86999aa362a12eb28cbc782dc1dJason Monk out.writeUTF(PROXY_PAC_FILE); 882602b232a06ede86999aa362a12eb28cbc782dc1dJason Monk out.writeUTF(proxyPacProperties.getPacFileUrl()); 883602b232a06ede86999aa362a12eb28cbc782dc1dJason Monk writeToFile = true; 884602b232a06ede86999aa362a12eb28cbc782dc1dJason Monk break; 88596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff case NONE: 88696ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff out.writeUTF(PROXY_SETTINGS_KEY); 88796ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff out.writeUTF(config.proxySettings.toString()); 88896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff writeToFile = true; 88996ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff break; 89096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff case UNASSIGNED: 89196ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff /* Ignore */ 89296ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff break; 89396ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff default: 894fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff loge("Ignthisore invalid proxy settings while writing"); 89596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff break; 89696ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } 89796ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff if (writeToFile) { 89896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff out.writeUTF(ID_KEY); 89996ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff out.writeInt(configKey(config)); 90096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } 90196ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } catch (NullPointerException e) { 9027f8a12c75cf2b376fce58fc22b5ecb1b64acf110Irfan Sheriff loge("Failure in writing " + config.linkProperties + e); 903128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff } 90496ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff out.writeUTF(EOS); 90531b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff } 90631b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff 907e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff } catch (IOException e) { 908e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff loge("Error writing data file"); 909e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff } finally { 910e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff if (out != null) { 911e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff try { 912e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff out.close(); 913e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff } catch (Exception e) {} 914e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff } 915e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff 916e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff //Quit if no more writes sent 917fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff synchronized (DelayedDiskWrite.class) { 918e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff if (--sWriteSequence == 0) { 919fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff sDiskWriteHandler.getLooper().quit(); 920fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff sDiskWriteHandler = null; 921e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff sDiskWriteHandlerThread = null; 922e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff } 923e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff } 92431b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff } 925fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff } 926fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff 927fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff private static void loge(String s) { 928fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff Log.e(TAG, s); 929fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff } 93031b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff } 93131b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff 932fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff private void readIpAndProxyConfigurations() { 93331b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff 934128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff DataInputStream in = null; 93531b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff try { 936128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff in = new DataInputStream(new BufferedInputStream(new FileInputStream( 937128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff ipConfigFile))); 938128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff 939aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt int version = in.readInt(); 940aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt if (version != 2 && version != 1) { 9417f8a12c75cf2b376fce58fc22b5ecb1b64acf110Irfan Sheriff loge("Bad version on IP configuration file, ignore read"); 94231b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff return; 94331b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff } 94431b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff 945128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff while (true) { 946128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff int id = -1; 94751e4ece385c6c34d97d5fa2dcc8e3b2c0bae7c22Irfan Sheriff // Default is DHCP with no proxy 94851e4ece385c6c34d97d5fa2dcc8e3b2c0bae7c22Irfan Sheriff IpAssignment ipAssignment = IpAssignment.DHCP; 94951e4ece385c6c34d97d5fa2dcc8e3b2c0bae7c22Irfan Sheriff ProxySettings proxySettings = ProxySettings.NONE; 95096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff LinkProperties linkProperties = new LinkProperties(); 951128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff String proxyHost = null; 952602b232a06ede86999aa362a12eb28cbc782dc1dJason Monk String pacFileUrl = null; 953128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff int proxyPort = -1; 954128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff String exclusionList = null; 955128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff String key; 956128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff 957128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff do { 958128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff key = in.readUTF(); 95996ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff try { 96096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff if (key.equals(ID_KEY)) { 96196ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff id = in.readInt(); 96296ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } else if (key.equals(IP_ASSIGNMENT_KEY)) { 96396ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff ipAssignment = IpAssignment.valueOf(in.readUTF()); 96496ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } else if (key.equals(LINK_ADDRESS_KEY)) { 965e590373ea71251cfffc8f22f011e2e6335dce716Robert Greenwalt LinkAddress linkAddr = new LinkAddress( 966e590373ea71251cfffc8f22f011e2e6335dce716Robert Greenwalt NetworkUtils.numericToInetAddress(in.readUTF()), in.readInt()); 96796ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff linkProperties.addLinkAddress(linkAddr); 96896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } else if (key.equals(GATEWAY_KEY)) { 969aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt LinkAddress dest = null; 970aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt InetAddress gateway = null; 971aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt if (version == 1) { 972aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt // only supported default gateways - leave the dest/prefix empty 973aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt gateway = NetworkUtils.numericToInetAddress(in.readUTF()); 974aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt } else { 975aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt if (in.readInt() == 1) { 976aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt dest = new LinkAddress( 977aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt NetworkUtils.numericToInetAddress(in.readUTF()), 978aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt in.readInt()); 979aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt } 980aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt if (in.readInt() == 1) { 981aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt gateway = NetworkUtils.numericToInetAddress(in.readUTF()); 982aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt } 983aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt } 984aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt linkProperties.addRoute(new RouteInfo(dest, gateway)); 98596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } else if (key.equals(DNS_KEY)) { 986e590373ea71251cfffc8f22f011e2e6335dce716Robert Greenwalt linkProperties.addDns( 987e590373ea71251cfffc8f22f011e2e6335dce716Robert Greenwalt NetworkUtils.numericToInetAddress(in.readUTF())); 98896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } else if (key.equals(PROXY_SETTINGS_KEY)) { 98996ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff proxySettings = ProxySettings.valueOf(in.readUTF()); 99096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } else if (key.equals(PROXY_HOST_KEY)) { 99196ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff proxyHost = in.readUTF(); 99296ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } else if (key.equals(PROXY_PORT_KEY)) { 99396ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff proxyPort = in.readInt(); 994602b232a06ede86999aa362a12eb28cbc782dc1dJason Monk } else if (key.equals(PROXY_PAC_FILE)) { 995602b232a06ede86999aa362a12eb28cbc782dc1dJason Monk pacFileUrl = in.readUTF(); 99696ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } else if (key.equals(EXCLUSION_LIST_KEY)) { 99796ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff exclusionList = in.readUTF(); 99896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } else if (key.equals(EOS)) { 99996ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff break; 100096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } else { 10017f8a12c75cf2b376fce58fc22b5ecb1b64acf110Irfan Sheriff loge("Ignore unknown key " + key + "while reading"); 100296ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } 1003e590373ea71251cfffc8f22f011e2e6335dce716Robert Greenwalt } catch (IllegalArgumentException e) { 10047f8a12c75cf2b376fce58fc22b5ecb1b64acf110Irfan Sheriff loge("Ignore invalid address while reading" + e); 100531b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff } 1006128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff } while (true); 100731b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff 1008128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff if (id != -1) { 1009fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff WifiConfiguration config = mConfiguredNetworks.get( 1010fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff mNetworkIds.get(id)); 101131b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff 1012e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff if (config == null) { 1013e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff loge("configuration found for missing network, ignored"); 1014e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff } else { 1015e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff config.linkProperties = linkProperties; 1016e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff switch (ipAssignment) { 1017e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff case STATIC: 1018e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff case DHCP: 1019e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff config.ipAssignment = ipAssignment; 1020e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff break; 1021e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff case UNASSIGNED: 102251e4ece385c6c34d97d5fa2dcc8e3b2c0bae7c22Irfan Sheriff loge("BUG: Found UNASSIGNED IP on file, use DHCP"); 102351e4ece385c6c34d97d5fa2dcc8e3b2c0bae7c22Irfan Sheriff config.ipAssignment = IpAssignment.DHCP; 1024e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff break; 1025e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff default: 1026e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff loge("Ignore invalid ip assignment while reading"); 1027e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff break; 1028e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff } 1029128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff 1030e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff switch (proxySettings) { 1031e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff case STATIC: 1032e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff config.proxySettings = proxySettings; 1033e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff ProxyProperties proxyProperties = 1034e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff new ProxyProperties(proxyHost, proxyPort, exclusionList); 1035e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff linkProperties.setHttpProxy(proxyProperties); 1036e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff break; 1037602b232a06ede86999aa362a12eb28cbc782dc1dJason Monk case PAC: 1038602b232a06ede86999aa362a12eb28cbc782dc1dJason Monk config.proxySettings = proxySettings; 1039602b232a06ede86999aa362a12eb28cbc782dc1dJason Monk ProxyProperties proxyPacProperties = 1040602b232a06ede86999aa362a12eb28cbc782dc1dJason Monk new ProxyProperties(pacFileUrl); 1041602b232a06ede86999aa362a12eb28cbc782dc1dJason Monk linkProperties.setHttpProxy(proxyPacProperties); 1042602b232a06ede86999aa362a12eb28cbc782dc1dJason Monk break; 1043e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff case NONE: 1044e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff config.proxySettings = proxySettings; 1045e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff break; 1046e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff case UNASSIGNED: 104751e4ece385c6c34d97d5fa2dcc8e3b2c0bae7c22Irfan Sheriff loge("BUG: Found UNASSIGNED proxy on file, use NONE"); 104851e4ece385c6c34d97d5fa2dcc8e3b2c0bae7c22Irfan Sheriff config.proxySettings = ProxySettings.NONE; 1049e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff break; 1050e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff default: 1051e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff loge("Ignore invalid proxy settings while reading"); 1052e744cfff7ca5406f7bba17a14b89856c1ca83262Irfan Sheriff break; 105331b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff } 105431b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff } 105531b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff } else { 105686a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff if (DBG) log("Missing id while parsing configuration"); 105731b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff } 105831b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff } 105996ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } catch (EOFException ignore) { 1060128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff } catch (IOException e) { 10617f8a12c75cf2b376fce58fc22b5ecb1b64acf110Irfan Sheriff loge("Error parsing configuration" + e); 1062128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff } finally { 1063128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff if (in != null) { 1064128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff try { 1065128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff in.close(); 1066128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff } catch (Exception e) {} 1067128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff } 106831b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff } 106904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 107004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 1071fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff private NetworkUpdateResult addOrUpdateNetworkNative(WifiConfiguration config) { 107204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff /* 10735ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff * If the supplied networkId is INVALID_NETWORK_ID, we create a new empty 107404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * network configuration. Otherwise, the networkId should 107504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * refer to an existing configuration. 107604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff */ 1077e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde 10783569fdd9afdec7d32b290b41b7a16ff8467592f0Vinit Deshapnde if (VDBG) localLog("addOrUpdateNetworkNative " + config.getPrintableSsid()); 1079e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde 108004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff int netId = config.networkId; 10818fd4a3d0f72b3175936f1dd9ca174a91d196971fIsaac Levy boolean newNetwork = false; 10825ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff // networkId of INVALID_NETWORK_ID means we want to create a new network 10838fd4a3d0f72b3175936f1dd9ca174a91d196971fIsaac Levy if (netId == INVALID_NETWORK_ID) { 1084fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff Integer savedNetId = mNetworkIds.get(configKey(config)); 10858fd4a3d0f72b3175936f1dd9ca174a91d196971fIsaac Levy if (savedNetId != null) { 10868fd4a3d0f72b3175936f1dd9ca174a91d196971fIsaac Levy netId = savedNetId; 10878fd4a3d0f72b3175936f1dd9ca174a91d196971fIsaac Levy } else { 10888fd4a3d0f72b3175936f1dd9ca174a91d196971fIsaac Levy newNetwork = true; 1089fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff netId = mWifiNative.addNetwork(); 10908fd4a3d0f72b3175936f1dd9ca174a91d196971fIsaac Levy if (netId < 0) { 10917f8a12c75cf2b376fce58fc22b5ecb1b64acf110Irfan Sheriff loge("Failed to add a network!"); 10928fd4a3d0f72b3175936f1dd9ca174a91d196971fIsaac Levy return new NetworkUpdateResult(INVALID_NETWORK_ID); 10938fd4a3d0f72b3175936f1dd9ca174a91d196971fIsaac Levy } 10948fd4a3d0f72b3175936f1dd9ca174a91d196971fIsaac Levy } 109504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 109604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 10978fd4a3d0f72b3175936f1dd9ca174a91d196971fIsaac Levy boolean updateFailed = true; 10988fd4a3d0f72b3175936f1dd9ca174a91d196971fIsaac Levy 109904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff setVariables: { 110004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 110104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff if (config.SSID != null && 1102fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff !mWifiNative.setNetworkVariable( 110304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff netId, 110404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff WifiConfiguration.ssidVarName, 110504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff config.SSID)) { 11067f8a12c75cf2b376fce58fc22b5ecb1b64acf110Irfan Sheriff loge("failed to set SSID: "+config.SSID); 110704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff break setVariables; 110804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 110904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 111004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff if (config.BSSID != null && 1111fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff !mWifiNative.setNetworkVariable( 111204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff netId, 111304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff WifiConfiguration.bssidVarName, 111404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff config.BSSID)) { 11157f8a12c75cf2b376fce58fc22b5ecb1b64acf110Irfan Sheriff loge("failed to set BSSID: "+config.BSSID); 111604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff break setVariables; 111704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 111804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 111904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff String allowedKeyManagementString = 112004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff makeString(config.allowedKeyManagement, WifiConfiguration.KeyMgmt.strings); 112104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff if (config.allowedKeyManagement.cardinality() != 0 && 1122fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff !mWifiNative.setNetworkVariable( 112304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff netId, 112404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff WifiConfiguration.KeyMgmt.varName, 112504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff allowedKeyManagementString)) { 11267f8a12c75cf2b376fce58fc22b5ecb1b64acf110Irfan Sheriff loge("failed to set key_mgmt: "+ 112704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff allowedKeyManagementString); 112804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff break setVariables; 112904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 113004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 113104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff String allowedProtocolsString = 113204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff makeString(config.allowedProtocols, WifiConfiguration.Protocol.strings); 113304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff if (config.allowedProtocols.cardinality() != 0 && 1134fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff !mWifiNative.setNetworkVariable( 113504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff netId, 113604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff WifiConfiguration.Protocol.varName, 113704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff allowedProtocolsString)) { 11387f8a12c75cf2b376fce58fc22b5ecb1b64acf110Irfan Sheriff loge("failed to set proto: "+ 113904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff allowedProtocolsString); 114004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff break setVariables; 114104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 114204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 114304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff String allowedAuthAlgorithmsString = 114404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff makeString(config.allowedAuthAlgorithms, WifiConfiguration.AuthAlgorithm.strings); 114504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff if (config.allowedAuthAlgorithms.cardinality() != 0 && 1146fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff !mWifiNative.setNetworkVariable( 114704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff netId, 114804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff WifiConfiguration.AuthAlgorithm.varName, 114904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff allowedAuthAlgorithmsString)) { 11507f8a12c75cf2b376fce58fc22b5ecb1b64acf110Irfan Sheriff loge("failed to set auth_alg: "+ 115104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff allowedAuthAlgorithmsString); 115204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff break setVariables; 115304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 115404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 115504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff String allowedPairwiseCiphersString = 115604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff makeString(config.allowedPairwiseCiphers, 115704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff WifiConfiguration.PairwiseCipher.strings); 115804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff if (config.allowedPairwiseCiphers.cardinality() != 0 && 1159fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff !mWifiNative.setNetworkVariable( 116004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff netId, 116104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff WifiConfiguration.PairwiseCipher.varName, 116204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff allowedPairwiseCiphersString)) { 11637f8a12c75cf2b376fce58fc22b5ecb1b64acf110Irfan Sheriff loge("failed to set pairwise: "+ 116404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff allowedPairwiseCiphersString); 116504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff break setVariables; 116604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 116704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 116804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff String allowedGroupCiphersString = 116904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff makeString(config.allowedGroupCiphers, WifiConfiguration.GroupCipher.strings); 117004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff if (config.allowedGroupCiphers.cardinality() != 0 && 1171fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff !mWifiNative.setNetworkVariable( 117204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff netId, 117304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff WifiConfiguration.GroupCipher.varName, 117404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff allowedGroupCiphersString)) { 11757f8a12c75cf2b376fce58fc22b5ecb1b64acf110Irfan Sheriff loge("failed to set group: "+ 117604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff allowedGroupCiphersString); 117704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff break setVariables; 117804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 117904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 118004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff // Prevent client screw-up by passing in a WifiConfiguration we gave it 118104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff // by preventing "*" as a key. 118204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff if (config.preSharedKey != null && !config.preSharedKey.equals("*") && 1183fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff !mWifiNative.setNetworkVariable( 118404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff netId, 118504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff WifiConfiguration.pskVarName, 118604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff config.preSharedKey)) { 11877f8a12c75cf2b376fce58fc22b5ecb1b64acf110Irfan Sheriff loge("failed to set psk"); 118804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff break setVariables; 118904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 119004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 119104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff boolean hasSetKey = false; 119204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff if (config.wepKeys != null) { 119304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff for (int i = 0; i < config.wepKeys.length; i++) { 119404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff // Prevent client screw-up by passing in a WifiConfiguration we gave it 119504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff // by preventing "*" as a key. 119604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff if (config.wepKeys[i] != null && !config.wepKeys[i].equals("*")) { 1197fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff if (!mWifiNative.setNetworkVariable( 119804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff netId, 119904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff WifiConfiguration.wepKeyVarNames[i], 120004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff config.wepKeys[i])) { 12017f8a12c75cf2b376fce58fc22b5ecb1b64acf110Irfan Sheriff loge("failed to set wep_key" + i + ": " + config.wepKeys[i]); 120204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff break setVariables; 120304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 120404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff hasSetKey = true; 120504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 120604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 120704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 120804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 120904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff if (hasSetKey) { 1210fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff if (!mWifiNative.setNetworkVariable( 121104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff netId, 121204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff WifiConfiguration.wepTxKeyIdxVarName, 121304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff Integer.toString(config.wepTxKeyIndex))) { 12147f8a12c75cf2b376fce58fc22b5ecb1b64acf110Irfan Sheriff loge("failed to set wep_tx_keyidx: " + config.wepTxKeyIndex); 121504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff break setVariables; 121604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 121704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 121804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 1219fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff if (!mWifiNative.setNetworkVariable( 122004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff netId, 122104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff WifiConfiguration.priorityVarName, 122204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff Integer.toString(config.priority))) { 12237f8a12c75cf2b376fce58fc22b5ecb1b64acf110Irfan Sheriff loge(config.SSID + ": failed to set priority: " 122404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff +config.priority); 122504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff break setVariables; 122604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 122704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 1228fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff if (config.hiddenSSID && !mWifiNative.setNetworkVariable( 122904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff netId, 123004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff WifiConfiguration.hiddenSSIDVarName, 123104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff Integer.toString(config.hiddenSSID ? 1 : 0))) { 12327f8a12c75cf2b376fce58fc22b5ecb1b64acf110Irfan Sheriff loge(config.SSID + ": failed to set hiddenSSID: "+ 123304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff config.hiddenSSID); 123404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff break setVariables; 123504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 123604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 12370b132962e4e324ca3b37f845d0792226d4f94d27Irfan Sheriff if (config.enterpriseConfig != null && 12380b132962e4e324ca3b37f845d0792226d4f94d27Irfan Sheriff config.enterpriseConfig.getEapMethod() != WifiEnterpriseConfig.Eap.NONE) { 123926d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff 124026d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff WifiEnterpriseConfig enterpriseConfig = config.enterpriseConfig; 124126d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff 124226d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff if (enterpriseConfig.needsKeyStore()) { 124326d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff /** 124426d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff * Keyguard settings may eventually be controlled by device policy. 124526d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff * We check here if keystore is unlocked before installing 124626d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff * credentials. 124726d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff * TODO: Do we need a dialog here ? 124826d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff */ 124926d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff if (mKeyStore.state() != KeyStore.State.UNLOCKED) { 125026d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff loge(config.SSID + ": key store is locked"); 125126d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff break setVariables; 125226d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff } 125326d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff 125426d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff try { 125526d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff /* config passed may include only fields being updated. 125626d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff * In order to generate the key id, fetch uninitialized 125726d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff * fields from the currently tracked configuration 125826d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff */ 125926d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff WifiConfiguration currentConfig = mConfiguredNetworks.get(netId); 126026d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff String keyId = config.getKeyIdForCredentials(currentConfig); 126126d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff 126226d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff if (!enterpriseConfig.installKeys(mKeyStore, keyId)) { 126326d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff loge(config.SSID + ": failed to install keys"); 126426d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff break setVariables; 126526d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff } 126626d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff } catch (IllegalStateException e) { 126726d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff loge(config.SSID + " invalid config for key installation"); 126826d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff break setVariables; 126926d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff } 127026d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff } 127126d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff 127226d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff HashMap<String, String> enterpriseFields = enterpriseConfig.getFields(); 1273e095675c872f40f630aa3f9189eb5c02f3cfee6dIrfan Sheriff for (String key : enterpriseFields.keySet()) { 1274e095675c872f40f630aa3f9189eb5c02f3cfee6dIrfan Sheriff String value = enterpriseFields.get(key); 1275e095675c872f40f630aa3f9189eb5c02f3cfee6dIrfan Sheriff if (!mWifiNative.setNetworkVariable( 1276e095675c872f40f630aa3f9189eb5c02f3cfee6dIrfan Sheriff netId, 1277e095675c872f40f630aa3f9189eb5c02f3cfee6dIrfan Sheriff key, 1278e095675c872f40f630aa3f9189eb5c02f3cfee6dIrfan Sheriff value)) { 127926d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff enterpriseConfig.removeKeys(mKeyStore); 1280e095675c872f40f630aa3f9189eb5c02f3cfee6dIrfan Sheriff loge(config.SSID + ": failed to set " + key + 1281e095675c872f40f630aa3f9189eb5c02f3cfee6dIrfan Sheriff ": " + value); 1282e095675c872f40f630aa3f9189eb5c02f3cfee6dIrfan Sheriff break setVariables; 1283e095675c872f40f630aa3f9189eb5c02f3cfee6dIrfan Sheriff } 1284e095675c872f40f630aa3f9189eb5c02f3cfee6dIrfan Sheriff } 128504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 128631b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff updateFailed = false; 128726d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff } //end of setVariables 128804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 128931b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff if (updateFailed) { 129031b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff if (newNetwork) { 1291fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff mWifiNative.removeNetwork(netId); 12927f8a12c75cf2b376fce58fc22b5ecb1b64acf110Irfan Sheriff loge("Failed to set a network variable, removed network: " + netId); 129331b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff } 1294be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff return new NetworkUpdateResult(INVALID_NETWORK_ID); 129504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 129604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 129731b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff /* An update of the network variables requires reading them 1298fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff * back from the supplicant to update mConfiguredNetworks. 129931b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff * This is because some of the variables (SSID, wep keys & 130031b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff * passphrases) reflect different values when read back than 130131b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff * when written. For example, wep key is stored as * irrespective 130231b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff * of the value sent to the supplicant 130331b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff */ 1304fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff WifiConfiguration currentConfig = mConfiguredNetworks.get(netId); 1305fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff if (currentConfig == null) { 1306fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff currentConfig = new WifiConfiguration(); 130751e4ece385c6c34d97d5fa2dcc8e3b2c0bae7c22Irfan Sheriff currentConfig.ipAssignment = IpAssignment.DHCP; 130851e4ece385c6c34d97d5fa2dcc8e3b2c0bae7c22Irfan Sheriff currentConfig.proxySettings = ProxySettings.NONE; 1309fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff currentConfig.networkId = netId; 131031b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff } 13118fd4a3d0f72b3175936f1dd9ca174a91d196971fIsaac Levy 1312fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff readNetworkVariables(currentConfig); 1313be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff 1314fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff mConfiguredNetworks.put(netId, currentConfig); 1315fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff mNetworkIds.put(configKey(currentConfig), netId); 13168fd4a3d0f72b3175936f1dd9ca174a91d196971fIsaac Levy 1317fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff NetworkUpdateResult result = writeIpAndProxyConfigurationsOnChange(currentConfig, config); 13181b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood result.setIsNewNetwork(newNetwork); 1319be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff result.setNetworkId(netId); 1320be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff return result; 1321128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff } 132231b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff 1323128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff /* Compare current and new configuration and write to file on change */ 1324fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff private NetworkUpdateResult writeIpAndProxyConfigurationsOnChange( 1325be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff WifiConfiguration currentConfig, 1326128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff WifiConfiguration newConfig) { 132796ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff boolean ipChanged = false; 132896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff boolean proxyChanged = false; 13294b8fabd5a87828d676b1f9547fdaedcaeac39c6aRobert Greenwalt LinkProperties linkProperties = null; 133096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff 133196ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff switch (newConfig.ipAssignment) { 133296ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff case STATIC: 133396ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff Collection<LinkAddress> currentLinkAddresses = currentConfig.linkProperties 133496ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff .getLinkAddresses(); 133596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff Collection<LinkAddress> newLinkAddresses = newConfig.linkProperties 133696ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff .getLinkAddresses(); 133796ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff Collection<InetAddress> currentDnses = currentConfig.linkProperties.getDnses(); 133896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff Collection<InetAddress> newDnses = newConfig.linkProperties.getDnses(); 1339aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt Collection<RouteInfo> currentRoutes = currentConfig.linkProperties.getRoutes(); 1340aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt Collection<RouteInfo> newRoutes = newConfig.linkProperties.getRoutes(); 1341992564e481af13cbcb058ee801f9254a520c54a1Robert Greenwalt 1342992564e481af13cbcb058ee801f9254a520c54a1Robert Greenwalt boolean linkAddressesDiffer = 1343992564e481af13cbcb058ee801f9254a520c54a1Robert Greenwalt (currentLinkAddresses.size() != newLinkAddresses.size()) || 1344992564e481af13cbcb058ee801f9254a520c54a1Robert Greenwalt !currentLinkAddresses.containsAll(newLinkAddresses); 1345992564e481af13cbcb058ee801f9254a520c54a1Robert Greenwalt boolean dnsesDiffer = (currentDnses.size() != newDnses.size()) || 1346992564e481af13cbcb058ee801f9254a520c54a1Robert Greenwalt !currentDnses.containsAll(newDnses); 1347aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt boolean routesDiffer = (currentRoutes.size() != newRoutes.size()) || 1348aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt !currentRoutes.containsAll(newRoutes); 134996ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff 135096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff if ((currentConfig.ipAssignment != newConfig.ipAssignment) || 135196ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff linkAddressesDiffer || 135296ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff dnsesDiffer || 1353aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt routesDiffer) { 135496ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff ipChanged = true; 135596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } 135696ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff break; 135796ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff case DHCP: 135896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff if (currentConfig.ipAssignment != newConfig.ipAssignment) { 135996ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff ipChanged = true; 136096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } 136196ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff break; 136296ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff case UNASSIGNED: 136396ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff /* Ignore */ 136496ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff break; 136596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff default: 13667f8a12c75cf2b376fce58fc22b5ecb1b64acf110Irfan Sheriff loge("Ignore invalid ip assignment during write"); 136796ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff break; 136831b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff } 1369128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff 137096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff switch (newConfig.proxySettings) { 137196ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff case STATIC: 1372602b232a06ede86999aa362a12eb28cbc782dc1dJason Monk case PAC: 137396ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff ProxyProperties newHttpProxy = newConfig.linkProperties.getHttpProxy(); 137496ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff ProxyProperties currentHttpProxy = currentConfig.linkProperties.getHttpProxy(); 1375128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff 1376434203a277cd2f237a71508a3d5a7d1602126cd5Robert Greenwalt if (newHttpProxy != null) { 1377434203a277cd2f237a71508a3d5a7d1602126cd5Robert Greenwalt proxyChanged = !newHttpProxy.equals(currentHttpProxy); 1378434203a277cd2f237a71508a3d5a7d1602126cd5Robert Greenwalt } else { 1379434203a277cd2f237a71508a3d5a7d1602126cd5Robert Greenwalt proxyChanged = (currentHttpProxy != null); 138096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } 138196ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff break; 138296ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff case NONE: 138396ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff if (currentConfig.proxySettings != newConfig.proxySettings) { 138496ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff proxyChanged = true; 138596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } 138696ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff break; 138796ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff case UNASSIGNED: 138896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff /* Ignore */ 138996ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff break; 139096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff default: 13917f8a12c75cf2b376fce58fc22b5ecb1b64acf110Irfan Sheriff loge("Ignore invalid proxy configuration during write"); 139296ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff break; 139396ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } 1394128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff 139596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff if (!ipChanged) { 13964b8fabd5a87828d676b1f9547fdaedcaeac39c6aRobert Greenwalt linkProperties = copyIpSettingsFromConfig(currentConfig); 139796ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } else { 139896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff currentConfig.ipAssignment = newConfig.ipAssignment; 13994b8fabd5a87828d676b1f9547fdaedcaeac39c6aRobert Greenwalt linkProperties = copyIpSettingsFromConfig(newConfig); 14007f8a12c75cf2b376fce58fc22b5ecb1b64acf110Irfan Sheriff log("IP config changed SSID = " + currentConfig.SSID + " linkProperties: " + 140196ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff linkProperties.toString()); 140296ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } 140396ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff 140496ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff 140596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff if (!proxyChanged) { 140696ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff linkProperties.setHttpProxy(currentConfig.linkProperties.getHttpProxy()); 140796ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } else { 140896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff currentConfig.proxySettings = newConfig.proxySettings; 140996ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff linkProperties.setHttpProxy(newConfig.linkProperties.getHttpProxy()); 14107f8a12c75cf2b376fce58fc22b5ecb1b64acf110Irfan Sheriff log("proxy changed SSID = " + currentConfig.SSID); 141196ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff if (linkProperties.getHttpProxy() != null) { 14127f8a12c75cf2b376fce58fc22b5ecb1b64acf110Irfan Sheriff log(" proxyProperties: " + linkProperties.getHttpProxy().toString()); 1413128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff } 1414128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff } 1415128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff 141696ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff if (ipChanged || proxyChanged) { 141796ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff currentConfig.linkProperties = linkProperties; 1418128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff writeIpAndProxyConfigurations(); 14191b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood sendConfiguredNetworksChangedBroadcast(currentConfig, 14201b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood WifiManager.CHANGE_REASON_CONFIG_CHANGE); 1421128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff } 1422be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff return new NetworkUpdateResult(ipChanged, proxyChanged); 142304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 142404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 14254b8fabd5a87828d676b1f9547fdaedcaeac39c6aRobert Greenwalt private LinkProperties copyIpSettingsFromConfig(WifiConfiguration config) { 14264b8fabd5a87828d676b1f9547fdaedcaeac39c6aRobert Greenwalt LinkProperties linkProperties = new LinkProperties(); 14274b8fabd5a87828d676b1f9547fdaedcaeac39c6aRobert Greenwalt linkProperties.setInterfaceName(config.linkProperties.getInterfaceName()); 142896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff for (LinkAddress linkAddr : config.linkProperties.getLinkAddresses()) { 142996ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff linkProperties.addLinkAddress(linkAddr); 143096ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } 1431aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt for (RouteInfo route : config.linkProperties.getRoutes()) { 1432aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt linkProperties.addRoute(route); 1433992564e481af13cbcb058ee801f9254a520c54a1Robert Greenwalt } 143496ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff for (InetAddress dns : config.linkProperties.getDnses()) { 143596ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff linkProperties.addDns(dns); 143696ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } 14374b8fabd5a87828d676b1f9547fdaedcaeac39c6aRobert Greenwalt return linkProperties; 143896ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff } 143996ca91761e6857c1ca2e4fafe5b35e4b5fefe5a1Irfan Sheriff 144004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff /** 144104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * Read the variables from the supplicant daemon that are needed to 144204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * fill in the WifiConfiguration object. 144304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * 144404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * @param config the {@link WifiConfiguration} object to be filled in. 144504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff */ 1446fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff private void readNetworkVariables(WifiConfiguration config) { 144704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 144804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff int netId = config.networkId; 144904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff if (netId < 0) 145004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff return; 145104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 145204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff /* 145304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * TODO: maybe should have a native method that takes an array of 145404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * variable names and returns an array of values. But we'd still 145504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * be doing a round trip to the supplicant daemon for each variable. 145604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff */ 145704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff String value; 145804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 1459fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff value = mWifiNative.getNetworkVariable(netId, WifiConfiguration.ssidVarName); 146004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff if (!TextUtils.isEmpty(value)) { 1461b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff if (value.charAt(0) != '"') { 1462b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff config.SSID = "\"" + WifiSsid.createFromHex(value).toString() + "\""; 1463b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff //TODO: convert a hex string that is not UTF-8 decodable to a P-formatted 1464b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff //supplicant string 1465b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff } else { 1466b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff config.SSID = value; 1467b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff } 146804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } else { 146904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff config.SSID = null; 147004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 147104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 1472fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff value = mWifiNative.getNetworkVariable(netId, WifiConfiguration.bssidVarName); 147304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff if (!TextUtils.isEmpty(value)) { 147404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff config.BSSID = value; 147504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } else { 147604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff config.BSSID = null; 147704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 147804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 1479fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff value = mWifiNative.getNetworkVariable(netId, WifiConfiguration.priorityVarName); 148004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff config.priority = -1; 148104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff if (!TextUtils.isEmpty(value)) { 148204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff try { 148304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff config.priority = Integer.parseInt(value); 148404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } catch (NumberFormatException ignore) { 148504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 148604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 148704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 1488fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff value = mWifiNative.getNetworkVariable(netId, WifiConfiguration.hiddenSSIDVarName); 148904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff config.hiddenSSID = false; 149004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff if (!TextUtils.isEmpty(value)) { 149104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff try { 149204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff config.hiddenSSID = Integer.parseInt(value) != 0; 149304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } catch (NumberFormatException ignore) { 149404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 149504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 149604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 1497fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff value = mWifiNative.getNetworkVariable(netId, WifiConfiguration.wepTxKeyIdxVarName); 149804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff config.wepTxKeyIndex = -1; 149904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff if (!TextUtils.isEmpty(value)) { 150004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff try { 150104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff config.wepTxKeyIndex = Integer.parseInt(value); 150204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } catch (NumberFormatException ignore) { 150304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 150404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 150504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 150604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff for (int i = 0; i < 4; i++) { 1507fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff value = mWifiNative.getNetworkVariable(netId, 150804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff WifiConfiguration.wepKeyVarNames[i]); 150904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff if (!TextUtils.isEmpty(value)) { 151004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff config.wepKeys[i] = value; 151104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } else { 151204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff config.wepKeys[i] = null; 151304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 151404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 151504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 1516fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff value = mWifiNative.getNetworkVariable(netId, WifiConfiguration.pskVarName); 151704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff if (!TextUtils.isEmpty(value)) { 151804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff config.preSharedKey = value; 151904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } else { 152004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff config.preSharedKey = null; 152104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 152204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 1523fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff value = mWifiNative.getNetworkVariable(config.networkId, 152404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff WifiConfiguration.Protocol.varName); 152504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff if (!TextUtils.isEmpty(value)) { 152604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff String vals[] = value.split(" "); 152704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff for (String val : vals) { 152804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff int index = 152904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff lookupString(val, WifiConfiguration.Protocol.strings); 153004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff if (0 <= index) { 153104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff config.allowedProtocols.set(index); 153204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 153304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 153404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 153504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 1536fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff value = mWifiNative.getNetworkVariable(config.networkId, 153704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff WifiConfiguration.KeyMgmt.varName); 153804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff if (!TextUtils.isEmpty(value)) { 153904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff String vals[] = value.split(" "); 154004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff for (String val : vals) { 154104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff int index = 154204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff lookupString(val, WifiConfiguration.KeyMgmt.strings); 154304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff if (0 <= index) { 154404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff config.allowedKeyManagement.set(index); 154504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 154604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 154704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 154804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 1549fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff value = mWifiNative.getNetworkVariable(config.networkId, 155004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff WifiConfiguration.AuthAlgorithm.varName); 155104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff if (!TextUtils.isEmpty(value)) { 155204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff String vals[] = value.split(" "); 155304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff for (String val : vals) { 155404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff int index = 155504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff lookupString(val, WifiConfiguration.AuthAlgorithm.strings); 155604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff if (0 <= index) { 155704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff config.allowedAuthAlgorithms.set(index); 155804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 155904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 156004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 156104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 1562fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff value = mWifiNative.getNetworkVariable(config.networkId, 156304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff WifiConfiguration.PairwiseCipher.varName); 156404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff if (!TextUtils.isEmpty(value)) { 156504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff String vals[] = value.split(" "); 156604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff for (String val : vals) { 156704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff int index = 156804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff lookupString(val, WifiConfiguration.PairwiseCipher.strings); 156904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff if (0 <= index) { 157004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff config.allowedPairwiseCiphers.set(index); 157104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 157204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 157304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 157404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 1575fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff value = mWifiNative.getNetworkVariable(config.networkId, 157604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff WifiConfiguration.GroupCipher.varName); 157704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff if (!TextUtils.isEmpty(value)) { 157804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff String vals[] = value.split(" "); 157904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff for (String val : vals) { 158004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff int index = 158104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff lookupString(val, WifiConfiguration.GroupCipher.strings); 158204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff if (0 <= index) { 158304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff config.allowedGroupCiphers.set(index); 158404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 158504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 158604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 158704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 1588e095675c872f40f630aa3f9189eb5c02f3cfee6dIrfan Sheriff if (config.enterpriseConfig == null) { 1589e095675c872f40f630aa3f9189eb5c02f3cfee6dIrfan Sheriff config.enterpriseConfig = new WifiEnterpriseConfig(); 1590e095675c872f40f630aa3f9189eb5c02f3cfee6dIrfan Sheriff } 1591e095675c872f40f630aa3f9189eb5c02f3cfee6dIrfan Sheriff HashMap<String, String> enterpriseFields = config.enterpriseConfig.getFields(); 1592e095675c872f40f630aa3f9189eb5c02f3cfee6dIrfan Sheriff for (String key : WifiEnterpriseConfig.getSupplicantKeys()) { 15939b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff value = mWifiNative.getNetworkVariable(netId, key); 159404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff if (!TextUtils.isEmpty(value)) { 1595e095675c872f40f630aa3f9189eb5c02f3cfee6dIrfan Sheriff enterpriseFields.put(key, removeDoubleQuotes(value)); 1596e095675c872f40f630aa3f9189eb5c02f3cfee6dIrfan Sheriff } else { 1597e095675c872f40f630aa3f9189eb5c02f3cfee6dIrfan Sheriff enterpriseFields.put(key, WifiEnterpriseConfig.EMPTY_VALUE); 159804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 159904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 1600565f9f216aa87f11d451ae6532d5153001a386bfKenny Root 16019b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff if (config.enterpriseConfig.migrateOldEapTlsNative(mWifiNative, netId)) { 16029b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff saveConfig(); 1603565f9f216aa87f11d451ae6532d5153001a386bfKenny Root } 16048b643c13f97c0f304a45039b9d1fe6900940499eIrfan Sheriff 16058b643c13f97c0f304a45039b9d1fe6900940499eIrfan Sheriff config.enterpriseConfig.migrateCerts(mKeyStore); 1606a3038b2b311cd07d851c404ccc5df2f4e07bcfd8Vinit Deshapnde config.enterpriseConfig.initializeSoftwareKeystoreFlag(mKeyStore); 160704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 160804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 1609fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff private String removeDoubleQuotes(String string) { 16109b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff int length = string.length(); 16119b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff if ((length > 1) && (string.charAt(0) == '"') 16129b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff && (string.charAt(length - 1) == '"')) { 16139b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff return string.substring(1, length - 1); 16149b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff } 16159b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff return string; 161604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 161704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 1618fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff private String convertToQuotedString(String string) { 161904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff return "\"" + string + "\""; 162004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 162104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 1622fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff private String makeString(BitSet set, String[] strings) { 162304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff StringBuffer buf = new StringBuffer(); 162404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff int nextSetBit = -1; 162504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 162604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff /* Make sure all set bits are in [0, strings.length) to avoid 162704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff * going out of bounds on strings. (Shouldn't happen, but...) */ 162804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff set = set.get(0, strings.length); 162904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 163004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff while ((nextSetBit = set.nextSetBit(nextSetBit + 1)) != -1) { 163104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff buf.append(strings[nextSetBit].replace('_', '-')).append(' '); 163204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 163304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 163404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff // remove trailing space 163504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff if (set.cardinality() > 0) { 163604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff buf.setLength(buf.length() - 1); 163704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 163804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 163904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff return buf.toString(); 164004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 164104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 1642fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff private int lookupString(String string, String[] strings) { 164304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff int size = strings.length; 164404db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 164504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff string = string.replace('-', '_'); 164604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 164704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff for (int i = 0; i < size; i++) 164804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff if (string.equals(strings[i])) 164904db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff return i; 165004db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 165104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff // if we ever get here, we should probably add the 165204db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff // value to WifiConfiguration to reflect that it's 165304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff // supported by the WPA supplicant 16547f8a12c75cf2b376fce58fc22b5ecb1b64acf110Irfan Sheriff loge("Failed to look-up a string: " + string); 165504db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 165604db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff return -1; 165704db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 165804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff 165931b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff /* Returns a unique for a given configuration */ 166031b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff private static int configKey(WifiConfiguration config) { 166131b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff String key; 166231b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff 166331b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff if (config.allowedKeyManagement.get(KeyMgmt.WPA_PSK)) { 166431b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff key = config.SSID + KeyMgmt.strings[KeyMgmt.WPA_PSK]; 166531b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff } else if (config.allowedKeyManagement.get(KeyMgmt.WPA_EAP) || 166631b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff config.allowedKeyManagement.get(KeyMgmt.IEEE8021X)) { 166731b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff key = config.SSID + KeyMgmt.strings[KeyMgmt.WPA_EAP]; 166831b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff } else if (config.wepKeys[0] != null) { 166931b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff key = config.SSID + "WEP"; 167031b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff } else { 167131b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff key = config.SSID + KeyMgmt.strings[KeyMgmt.NONE]; 167231b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff } 167331b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff 167431b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff return key.hashCode(); 167531b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff } 167631b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff 1677f0afe4144d09aa9b980cffd444911ab118fa9cbeIrfan Sheriff void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 1678f0afe4144d09aa9b980cffd444911ab118fa9cbeIrfan Sheriff pw.println("WifiConfigStore"); 1679f0afe4144d09aa9b980cffd444911ab118fa9cbeIrfan Sheriff pw.println("mLastPriority " + mLastPriority); 1680f0afe4144d09aa9b980cffd444911ab118fa9cbeIrfan Sheriff pw.println("Configured networks"); 168104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff for (WifiConfiguration conf : getConfiguredNetworks()) { 1682f0afe4144d09aa9b980cffd444911ab118fa9cbeIrfan Sheriff pw.println(conf); 168304db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 1684f0afe4144d09aa9b980cffd444911ab118fa9cbeIrfan Sheriff pw.println(); 1685e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde 1686e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde if (mLocalLog != null) { 1687e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde pw.println("WifiConfigStore - Log Begin ----"); 1688e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde mLocalLog.dump(fd, pw, args); 1689e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde pw.println("WifiConfigStore - Log End ----"); 1690e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde } 169104db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff } 16924aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff 1693fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff public String getConfigFile() { 16944aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff return ipConfigFile; 16954aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff } 16967f8a12c75cf2b376fce58fc22b5ecb1b64acf110Irfan Sheriff 1697fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff private void loge(String s) { 16987f8a12c75cf2b376fce58fc22b5ecb1b64acf110Irfan Sheriff Log.e(TAG, s); 16997f8a12c75cf2b376fce58fc22b5ecb1b64acf110Irfan Sheriff } 17007f8a12c75cf2b376fce58fc22b5ecb1b64acf110Irfan Sheriff 1701fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff private void log(String s) { 17027f8a12c75cf2b376fce58fc22b5ecb1b64acf110Irfan Sheriff Log.d(TAG, s); 17037f8a12c75cf2b376fce58fc22b5ecb1b64acf110Irfan Sheriff } 1704e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde 1705e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde private void localLog(String s) { 1706e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde if (mLocalLog != null) { 1707e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde mLocalLog.log(s); 1708e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde } 1709e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde } 1710e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde 1711e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde private void localLog(String s, int netId) { 1712e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde if (mLocalLog == null) { 1713e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde return; 1714e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde } 1715e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde 1716e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde WifiConfiguration config; 1717e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde synchronized(mConfiguredNetworks) { 1718e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde config = mConfiguredNetworks.get(netId); 1719e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde } 1720e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde 1721e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde if (config != null) { 1722e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde mLocalLog.log(s + " " + config.getPrintableSsid()); 1723e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde } else { 1724e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde mLocalLog.log(s + " " + netId); 1725e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde } 1726e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde } 1727e8fabf98fb5e5543050679b4f4bff677bbc4164bVinit Deshapnde 172804db1d5d3a51f9b710b707cfdc1c2f41ad948237Irfan Sheriff} 1729