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