WifiConfiguration.java revision 5fb7bf5fdb93831684b00eb637ec15b5cf0d1e2d
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.net.wifi; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 196346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimimport android.net.IpConfiguration; 206346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimimport android.net.IpConfiguration.ProxySettings; 216346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimimport android.net.IpConfiguration.IpAssignment; 226346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimimport android.net.ProxyInfo; 23678979748585c5903125a404e448ad6c111dedadJaewan Kimimport android.net.LinkProperties; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 256346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimimport android.os.Parcelable; 2626d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriffimport android.text.TextUtils; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 287c3606c103e95d3991267cca2592402a68779cafvandwalleimport java.util.HashMap; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.BitSet; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A class representing a configured Wi-Fi network, including the 339b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff * security configuration. 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 35678979748585c5903125a404e448ad6c111dedadJaewan Kimpublic class WifiConfiguration implements Parcelable { 369b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff private static final String TAG = "WifiConfiguration"; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** {@hide} */ 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ssidVarName = "ssid"; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** {@hide} */ 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String bssidVarName = "bssid"; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** {@hide} */ 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String pskVarName = "psk"; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** {@hide} */ 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String[] wepKeyVarNames = { "wep_key0", "wep_key1", "wep_key2", "wep_key3" }; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** {@hide} */ 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String wepTxKeyIdxVarName = "wep_tx_keyidx"; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** {@hide} */ 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String priorityVarName = "priority"; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** {@hide} */ 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String hiddenSSIDVarName = "scan_ssid"; 515ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff /** {@hide} */ 525ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff public static final int INVALID_NETWORK_ID = -1; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Recognized key management schemes. 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class KeyMgmt { 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private KeyMgmt() { } 585069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** WPA is not used; plaintext or static WEP could be used. */ 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int NONE = 0; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** WPA pre-shared key (requires {@code preSharedKey} to be specified). */ 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WPA_PSK = 1; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** WPA using EAP authentication. Generally used with an external authentication server. */ 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WPA_EAP = 2; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** IEEE 802.1X using EAP authentication and (optionally) dynamically 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * generated WEP keys. */ 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int IEEE8021X = 3; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 69ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff /** WPA2 pre-shared key for use with soft access point 70ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff * (requires {@code preSharedKey} to be specified). 71ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff * @hide 72ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff */ 73ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff public static final int WPA2_PSK = 4; 74ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String varName = "key_mgmt"; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 77ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff public static final String[] strings = { "NONE", "WPA_PSK", "WPA_EAP", "IEEE8021X", 78ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff "WPA2_PSK" }; 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 805069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Recognized security protocols. 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class Protocol { 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Protocol() { } 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** WPA/IEEE 802.11i/D3.0 */ 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WPA = 0; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** WPA2/IEEE 802.11i */ 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int RSN = 1; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String varName = "proto"; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String[] strings = { "WPA", "RSN" }; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Recognized IEEE 802.11 authentication algorithms. 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class AuthAlgorithm { 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private AuthAlgorithm() { } 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Open System authentication (required for WPA/WPA2) */ 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int OPEN = 0; 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Shared Key authentication (requires static WEP keys) */ 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int SHARED = 1; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** LEAP/Network EAP (only used with LEAP) */ 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int LEAP = 2; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String varName = "auth_alg"; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String[] strings = { "OPEN", "SHARED", "LEAP" }; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Recognized pairwise ciphers for WPA. 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class PairwiseCipher { 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private PairwiseCipher() { } 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Use only Group keys (deprecated) */ 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int NONE = 0; 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Temporal Key Integrity Protocol [IEEE 802.11i/D7.0] */ 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int TKIP = 1; 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** AES in Counter mode with CBC-MAC [RFC 3610, IEEE 802.11i/D7.0] */ 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int CCMP = 2; 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String varName = "pairwise"; 1295069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String[] strings = { "NONE", "TKIP", "CCMP" }; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Recognized group ciphers. 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre> 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * CCMP = AES in Counter mode with CBC-MAC [RFC 3610, IEEE 802.11i/D7.0] 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * TKIP = Temporal Key Integrity Protocol [IEEE 802.11i/D7.0] 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WEP104 = WEP (Wired Equivalent Privacy) with 104-bit key 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WEP40 = WEP (Wired Equivalent Privacy) with 40-bit key (original 802.11) 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </pre> 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class GroupCipher { 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private GroupCipher() { } 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** WEP40 = WEP (Wired Equivalent Privacy) with 40-bit key (original 802.11) */ 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WEP40 = 0; 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** WEP104 = WEP (Wired Equivalent Privacy) with 104-bit key */ 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WEP104 = 1; 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Temporal Key Integrity Protocol [IEEE 802.11i/D7.0] */ 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int TKIP = 2; 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** AES in Counter mode with CBC-MAC [RFC 3610, IEEE 802.11i/D7.0] */ 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int CCMP = 3; 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String varName = "group"; 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String[] strings = { "WEP40", "WEP104", "TKIP", "CCMP" }; 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Possible status of a network configuration. */ 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class Status { 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Status() { } 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** this is the network we are currently connected to */ 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int CURRENT = 0; 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** supplicant will not attempt to use this network */ 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int DISABLED = 1; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** supplicant will consider this network available for association */ 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int ENABLED = 2; 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String[] strings = { "current", "disabled", "enabled" }; 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1738dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy /** @hide */ 1748dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy public static final int DISABLED_UNKNOWN_REASON = 0; 1758dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy /** @hide */ 1768dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy public static final int DISABLED_DNS_FAILURE = 1; 1778dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy /** @hide */ 1788dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy public static final int DISABLED_DHCP_FAILURE = 2; 1798dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy /** @hide */ 1808dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy public static final int DISABLED_AUTH_FAILURE = 3; 181c1b631e757999232674e53e9a1bc21abed6b1862Deepthi Gowri /** @hide */ 182c1b631e757999232674e53e9a1bc21abed6b1862Deepthi Gowri public static final int DISABLED_ASSOCIATION_REJECT = 4; 1838dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The ID number that the supplicant uses to identify this 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * network configuration entry. This must be passed as an argument 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to most calls into the supplicant. 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int networkId; 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The current status of this network configuration entry. 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see Status 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int status; 1968dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy 1978dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy /** 1988dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy * The code referring to a reason for disabling the network 1998dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy * Valid when {@link #status} == Status.DISABLED 2008dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy * @hide 2018dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy */ 2028dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy public int disableReason; 2038dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The network's SSID. Can either be an ASCII string, 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * which must be enclosed in double quotation marks 2074e8620f868e2490782ebb960404140ea9482c91dBen Dodson * (e.g., {@code "MyNetwork"}, or a string of 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * hex digits,which are not enclosed in quotes 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (e.g., {@code 01a243f405}). 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String SSID; 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When set, this network configuration entry should only be used when 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * associating with the AP having the specified BSSID. The value is 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a string in the format of an Ethernet MAC address, e.g., 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <code>XX:XX:XX:XX:XX:XX</code> where each <code>X</code> is a hex digit. 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String BSSID; 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Pre-shared key for use with WPA-PSK. 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p/> 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When the value of this key is read, the actual key is 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not returned, just a "*" if the key has a value, or the null 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * string otherwise. 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String preSharedKey; 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Up to four WEP keys. Either an ASCII string enclosed in double 2304e8620f868e2490782ebb960404140ea9482c91dBen Dodson * quotation marks (e.g., {@code "abcdef"} or a string 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of hex digits (e.g., {@code 0102030405}). 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p/> 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When the value of one of these keys is read, the actual key is 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not returned, just a "*" if the key has a value, or the null 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * string otherwise. 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String[] wepKeys; 2385069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Default WEP key index, ranging from 0 to 3. */ 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int wepTxKeyIndex; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Priority determines the preference given to a network by {@code wpa_supplicant} 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when choosing an access point with which to associate. 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int priority; 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is a network that does not broadcast its SSID, so an 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * SSID-specific probe request must be used for scans. 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hiddenSSID; 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The set of key management protocols supported by this configuration. 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See {@link KeyMgmt} for descriptions of the values. 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Defaults to WPA-PSK WPA-EAP. 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BitSet allowedKeyManagement; 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The set of security protocols supported by this configuration. 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See {@link Protocol} for descriptions of the values. 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Defaults to WPA RSN. 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BitSet allowedProtocols; 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The set of authentication protocols supported by this configuration. 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See {@link AuthAlgorithm} for descriptions of the values. 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Defaults to automatic selection. 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BitSet allowedAuthAlgorithms; 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The set of pairwise ciphers for WPA supported by this configuration. 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See {@link PairwiseCipher} for descriptions of the values. 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Defaults to CCMP TKIP. 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BitSet allowedPairwiseCiphers; 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The set of group ciphers supported by this configuration. 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See {@link GroupCipher} for descriptions of the values. 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Defaults to CCMP TKIP WEP104 WEP40. 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BitSet allowedGroupCiphers; 2849b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff /** 28526d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff * The enterprise configuration details specifying the EAP method, 28626d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff * certificates and other settings associated with the EAP. 2879b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff */ 2889b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff public WifiEnterpriseConfig enterpriseConfig; 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 290678979748585c5903125a404e448ad6c111dedadJaewan Kim /** 291678979748585c5903125a404e448ad6c111dedadJaewan Kim * @hide 292678979748585c5903125a404e448ad6c111dedadJaewan Kim */ 2936346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim private IpConfiguration mIpConfiguration; 294678979748585c5903125a404e448ad6c111dedadJaewan Kim 295678979748585c5903125a404e448ad6c111dedadJaewan Kim /** 296678979748585c5903125a404e448ad6c111dedadJaewan Kim * @hide 2977c3606c103e95d3991267cca2592402a68779cafvandwalle * dhcp server MAC address if known 2987c3606c103e95d3991267cca2592402a68779cafvandwalle */ 2997c3606c103e95d3991267cca2592402a68779cafvandwalle public String dhcpServer; 3007c3606c103e95d3991267cca2592402a68779cafvandwalle 3017c3606c103e95d3991267cca2592402a68779cafvandwalle /** 3027c3606c103e95d3991267cca2592402a68779cafvandwalle * @hide 3037c3606c103e95d3991267cca2592402a68779cafvandwalle * default Gateway MAC address if known 3047c3606c103e95d3991267cca2592402a68779cafvandwalle */ 3057c3606c103e95d3991267cca2592402a68779cafvandwalle public String defaultGwMacAddress; 3067c3606c103e95d3991267cca2592402a68779cafvandwalle 3077c3606c103e95d3991267cca2592402a68779cafvandwalle /** 3087c3606c103e95d3991267cca2592402a68779cafvandwalle * @hide 3097c3606c103e95d3991267cca2592402a68779cafvandwalle * BSSID list on which this configuration was seen. 3107c3606c103e95d3991267cca2592402a68779cafvandwalle * TODO: prevent this list to grow infinitely, age-out the results 3117c3606c103e95d3991267cca2592402a68779cafvandwalle */ 3127c3606c103e95d3991267cca2592402a68779cafvandwalle public HashMap<String, ScanResult> scanResultCache; 3137c3606c103e95d3991267cca2592402a68779cafvandwalle 3147c3606c103e95d3991267cca2592402a68779cafvandwalle /** @hide **/ 3157c3606c103e95d3991267cca2592402a68779cafvandwalle public static int INVALID_RSSI = -127; 3167c3606c103e95d3991267cca2592402a68779cafvandwalle 3177c3606c103e95d3991267cca2592402a68779cafvandwalle /** 3187c3606c103e95d3991267cca2592402a68779cafvandwalle * @hide 3197c3606c103e95d3991267cca2592402a68779cafvandwalle * A summary of the RSSI and Band status for that configuration 3207c3606c103e95d3991267cca2592402a68779cafvandwalle * This is used as a temporary value by the auto-join controller 3217c3606c103e95d3991267cca2592402a68779cafvandwalle */ 3225fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle public final class Visibility { 3237c3606c103e95d3991267cca2592402a68779cafvandwalle public int rssi5; // strongest 5GHz RSSI 3247c3606c103e95d3991267cca2592402a68779cafvandwalle public int rssi24; // strongest 2.4GHz RSSI 3257c3606c103e95d3991267cca2592402a68779cafvandwalle public int num5; // number of BSSIDs on 5GHz 3267c3606c103e95d3991267cca2592402a68779cafvandwalle public int num24; // number of BSSIDs on 2.4GHz 3277c3606c103e95d3991267cca2592402a68779cafvandwalle public long age5; // timestamp of the strongest 5GHz BSSID (last time it was seen) 3287c3606c103e95d3991267cca2592402a68779cafvandwalle public long age24; // timestamp of the strongest 2.4GHz BSSID (last time it was seen) 3295fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle 3305fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle public Visibility() { 3317c3606c103e95d3991267cca2592402a68779cafvandwalle rssi5 = INVALID_RSSI; 3327c3606c103e95d3991267cca2592402a68779cafvandwalle rssi24 = INVALID_RSSI; 3337c3606c103e95d3991267cca2592402a68779cafvandwalle } 3345fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle 3355fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle public Visibility(Visibility source) { 3367c3606c103e95d3991267cca2592402a68779cafvandwalle rssi5 = source.rssi5; 3377c3606c103e95d3991267cca2592402a68779cafvandwalle rssi24 = source.rssi24; 3387c3606c103e95d3991267cca2592402a68779cafvandwalle age24 = source.age24; 3397c3606c103e95d3991267cca2592402a68779cafvandwalle age5 = source.age5; 3407c3606c103e95d3991267cca2592402a68779cafvandwalle num24 = source.num24; 3417c3606c103e95d3991267cca2592402a68779cafvandwalle num5 = source.num5; 3427c3606c103e95d3991267cca2592402a68779cafvandwalle } 3435fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle 3445fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle @Override 3455fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle public String toString() { 3465fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle StringBuilder sbuf = new StringBuilder(); 3475fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle sbuf.append("["); 3485fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle if (rssi24 > INVALID_RSSI) { 3495fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle sbuf.append(Integer.toString(rssi24)); 3505fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle sbuf.append(","); 3515fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle sbuf.append(Integer.toString(num24)); 3525fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } else { 3535fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle sbuf.append("*"); 3545fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } 3555fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle sbuf.append(" - "); 3565fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle if (rssi5 > INVALID_RSSI) { 3575fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle sbuf.append(Integer.toString(rssi5)); 3585fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle sbuf.append(","); 3595fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle sbuf.append(Integer.toString(num5)); 3605fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } 3615fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle sbuf.append("]"); 3625fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle return sbuf.toString(); 3635fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } 3647c3606c103e95d3991267cca2592402a68779cafvandwalle } 3657c3606c103e95d3991267cca2592402a68779cafvandwalle 3667c3606c103e95d3991267cca2592402a68779cafvandwalle /** @hide 3677c3606c103e95d3991267cca2592402a68779cafvandwalle * Cache the visibility status of this configuration. 3687c3606c103e95d3991267cca2592402a68779cafvandwalle * Visibility can change at any time depending on scan results availability. 3697c3606c103e95d3991267cca2592402a68779cafvandwalle * Owner of the WifiConfiguration is responsible to set this field based on 3707c3606c103e95d3991267cca2592402a68779cafvandwalle * recent scan results. 3717c3606c103e95d3991267cca2592402a68779cafvandwalle ***/ 3727c3606c103e95d3991267cca2592402a68779cafvandwalle public Visibility visibility; 3737c3606c103e95d3991267cca2592402a68779cafvandwalle 3747c3606c103e95d3991267cca2592402a68779cafvandwalle /** @hide 3757c3606c103e95d3991267cca2592402a68779cafvandwalle * calculate and set Visibility for that configuration. 3767c3606c103e95d3991267cca2592402a68779cafvandwalle * 3777c3606c103e95d3991267cca2592402a68779cafvandwalle * age in milliseconds: we will consider only ScanResults that are more recent, 3787c3606c103e95d3991267cca2592402a68779cafvandwalle * i.e. younger. 3797c3606c103e95d3991267cca2592402a68779cafvandwalle ***/ 3807c3606c103e95d3991267cca2592402a68779cafvandwalle public Visibility setVisibility(long age) { 3817c3606c103e95d3991267cca2592402a68779cafvandwalle if (scanResultCache == null) { 3827c3606c103e95d3991267cca2592402a68779cafvandwalle visibility = null; 3837c3606c103e95d3991267cca2592402a68779cafvandwalle return null; 3847c3606c103e95d3991267cca2592402a68779cafvandwalle } 3857c3606c103e95d3991267cca2592402a68779cafvandwalle 3867c3606c103e95d3991267cca2592402a68779cafvandwalle Visibility status = new Visibility(); 3877c3606c103e95d3991267cca2592402a68779cafvandwalle 3887c3606c103e95d3991267cca2592402a68779cafvandwalle long now_ms = System.currentTimeMillis(); 3897c3606c103e95d3991267cca2592402a68779cafvandwalle for(ScanResult result : scanResultCache.values()) { 3907c3606c103e95d3991267cca2592402a68779cafvandwalle if (result.seen == 0) 3917c3606c103e95d3991267cca2592402a68779cafvandwalle continue; 3927c3606c103e95d3991267cca2592402a68779cafvandwalle 3937c3606c103e95d3991267cca2592402a68779cafvandwalle if ((result.frequency > 4900) && (result.frequency < 5900)) { 3947c3606c103e95d3991267cca2592402a68779cafvandwalle //strictly speaking: [4915, 5825] 3957c3606c103e95d3991267cca2592402a68779cafvandwalle //number of known BSSID on 5GHz band 3967c3606c103e95d3991267cca2592402a68779cafvandwalle status.num5 = status.num5 + 1; 3977c3606c103e95d3991267cca2592402a68779cafvandwalle } else if ((result.frequency > 2400) && (result.frequency < 2500)) { 3987c3606c103e95d3991267cca2592402a68779cafvandwalle //strictly speaking: [2412, 2482] 3997c3606c103e95d3991267cca2592402a68779cafvandwalle //number of known BSSID on 2.4Ghz band 4007c3606c103e95d3991267cca2592402a68779cafvandwalle status.num24 = status.num24 + 1; 4017c3606c103e95d3991267cca2592402a68779cafvandwalle } 4027c3606c103e95d3991267cca2592402a68779cafvandwalle 4037c3606c103e95d3991267cca2592402a68779cafvandwalle if ((now_ms - result.seen) > age) continue; 4047c3606c103e95d3991267cca2592402a68779cafvandwalle 4057c3606c103e95d3991267cca2592402a68779cafvandwalle if ((result.frequency > 4900) && (result.frequency < 5900)) { 4067c3606c103e95d3991267cca2592402a68779cafvandwalle if (result.level > status.rssi5) { 4077c3606c103e95d3991267cca2592402a68779cafvandwalle status.rssi5 = result.level; 4087c3606c103e95d3991267cca2592402a68779cafvandwalle status.age5 = result.seen; 4097c3606c103e95d3991267cca2592402a68779cafvandwalle } 4107c3606c103e95d3991267cca2592402a68779cafvandwalle } else if ((result.frequency > 2400) && (result.frequency < 2500)) { 4117c3606c103e95d3991267cca2592402a68779cafvandwalle if (result.level > status.rssi24) { 4127c3606c103e95d3991267cca2592402a68779cafvandwalle status.rssi24 = result.level; 4137c3606c103e95d3991267cca2592402a68779cafvandwalle status.age24 = result.seen; 4147c3606c103e95d3991267cca2592402a68779cafvandwalle } 4157c3606c103e95d3991267cca2592402a68779cafvandwalle } 4167c3606c103e95d3991267cca2592402a68779cafvandwalle } 4177c3606c103e95d3991267cca2592402a68779cafvandwalle visibility = status; 4187c3606c103e95d3991267cca2592402a68779cafvandwalle return status; 4197c3606c103e95d3991267cca2592402a68779cafvandwalle } 4207c3606c103e95d3991267cca2592402a68779cafvandwalle 4217c3606c103e95d3991267cca2592402a68779cafvandwalle /** @hide */ 4227c3606c103e95d3991267cca2592402a68779cafvandwalle public static final int AUTO_JOIN_ENABLED = 0; 423d3adb7e81658b9c3af8955360acd1b930be6cda8vandwalle /** @hide 424d3adb7e81658b9c3af8955360acd1b930be6cda8vandwalle * if this is set, the WifiConfiguration cannot use linkages so as to bump 425d3adb7e81658b9c3af8955360acd1b930be6cda8vandwalle * it's relative priority. 426d3adb7e81658b9c3af8955360acd1b930be6cda8vandwalle * */ 427d3adb7e81658b9c3af8955360acd1b930be6cda8vandwalle public static final int AUTO_JOIN_TEMPORARY_DISABLED = 1; 4287c3606c103e95d3991267cca2592402a68779cafvandwalle /** @hide */ 429d3adb7e81658b9c3af8955360acd1b930be6cda8vandwalle public static final int AUTO_JOIN_DISABLED_ON_AUTH_FAILURE = 2; 430d3adb7e81658b9c3af8955360acd1b930be6cda8vandwalle 4317c3606c103e95d3991267cca2592402a68779cafvandwalle /** 4327c3606c103e95d3991267cca2592402a68779cafvandwalle * @hide 4337c3606c103e95d3991267cca2592402a68779cafvandwalle */ 4347c3606c103e95d3991267cca2592402a68779cafvandwalle public int autoJoinStatus; 4357c3606c103e95d3991267cca2592402a68779cafvandwalle 4367c3606c103e95d3991267cca2592402a68779cafvandwalle /** 437e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle * Set if the configuration was self added by the framework 438e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle * @hide 439e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle */ 440e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle public boolean selfAdded; 441e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle 442e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle /** 4437c3606c103e95d3991267cca2592402a68779cafvandwalle * @hide 4447c3606c103e95d3991267cca2592402a68779cafvandwalle * Indicate that a WifiConfiguration is temporary and should not be saved 4457c3606c103e95d3991267cca2592402a68779cafvandwalle * nor considered by AutoJoin. 4467c3606c103e95d3991267cca2592402a68779cafvandwalle */ 4477c3606c103e95d3991267cca2592402a68779cafvandwalle public boolean ephemeral; 4487c3606c103e95d3991267cca2592402a68779cafvandwalle 4497c3606c103e95d3991267cca2592402a68779cafvandwalle /** 4507c3606c103e95d3991267cca2592402a68779cafvandwalle * @hide 4517c3606c103e95d3991267cca2592402a68779cafvandwalle * Connect choices 4527c3606c103e95d3991267cca2592402a68779cafvandwalle * 4537c3606c103e95d3991267cca2592402a68779cafvandwalle * remember the keys identifying the known WifiConfiguration over which this configuration 4547c3606c103e95d3991267cca2592402a68779cafvandwalle * was preferred by user or a "WiFi Network Management app", that is, 4557c3606c103e95d3991267cca2592402a68779cafvandwalle * a WifiManager.CONNECT_NETWORK or SELECT_NETWORK was received while this configuration 4567c3606c103e95d3991267cca2592402a68779cafvandwalle * was visible to the user: 4577c3606c103e95d3991267cca2592402a68779cafvandwalle * configKey is : "SSID"-WEP-WPA_PSK-WPA_EAP 4587c3606c103e95d3991267cca2592402a68779cafvandwalle * 4597c3606c103e95d3991267cca2592402a68779cafvandwalle * The integer represents the configuration's RSSI at that time (useful?) 4607c3606c103e95d3991267cca2592402a68779cafvandwalle * 4617c3606c103e95d3991267cca2592402a68779cafvandwalle * The overall auto-join algorithm make use of past connect choice so as to sort configuration, 4627c3606c103e95d3991267cca2592402a68779cafvandwalle * the exact algorithm still fluctuating as of 5/7/2014 4637c3606c103e95d3991267cca2592402a68779cafvandwalle * 4647c3606c103e95d3991267cca2592402a68779cafvandwalle */ 4657c3606c103e95d3991267cca2592402a68779cafvandwalle public HashMap<String, Integer> connectChoices; 4667c3606c103e95d3991267cca2592402a68779cafvandwalle 4677c3606c103e95d3991267cca2592402a68779cafvandwalle /** 4687c3606c103e95d3991267cca2592402a68779cafvandwalle * @hide 4697c3606c103e95d3991267cca2592402a68779cafvandwalle * Linked Configurations: represent the set of Wificonfigurations that are equivalent 4707c3606c103e95d3991267cca2592402a68779cafvandwalle * regarding roaming and auto-joining. 4717c3606c103e95d3991267cca2592402a68779cafvandwalle * The linked configuration may or may not have same SSID, and may or may not have same 4727c3606c103e95d3991267cca2592402a68779cafvandwalle * credentials. 4737c3606c103e95d3991267cca2592402a68779cafvandwalle * For instance, linked configurations will have same defaultGwMacAddress or same dhcp server. 4747c3606c103e95d3991267cca2592402a68779cafvandwalle */ 4757c3606c103e95d3991267cca2592402a68779cafvandwalle public HashMap<String, Integer> linkedConfigurations; 4767c3606c103e95d3991267cca2592402a68779cafvandwalle 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public WifiConfiguration() { 4785ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff networkId = INVALID_NETWORK_ID; 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SSID = null; 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BSSID = null; 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project priority = 0; 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hiddenSSID = false; 4838dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy disableReason = DISABLED_UNKNOWN_REASON; 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project allowedKeyManagement = new BitSet(); 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project allowedProtocols = new BitSet(); 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project allowedAuthAlgorithms = new BitSet(); 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project allowedPairwiseCiphers = new BitSet(); 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project allowedGroupCiphers = new BitSet(); 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wepKeys = new String[4]; 4909b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff for (int i = 0; i < wepKeys.length; i++) { 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wepKeys[i] = null; 4924337476a6669ce52549ce4a60f5e4d07f8e3033fChung-yih Wang } 4939b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff enterpriseConfig = new WifiEnterpriseConfig(); 4947c3606c103e95d3991267cca2592402a68779cafvandwalle autoJoinStatus = AUTO_JOIN_ENABLED; 495e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle selfAdded = false; 496e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle ephemeral = false; 4976346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim mIpConfiguration = new IpConfiguration(); 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 50010652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde /** 50110652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde * indicates whether the configuration is valid 50210652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde * @return true if valid, false otherwise 50310652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde * @hide 50410652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde */ 50510652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde public boolean isValid() { 50660a28c6c4b992d1d3959484442a205d6ae2bd977vandwalle if (SSID == null) 50760a28c6c4b992d1d3959484442a205d6ae2bd977vandwalle return false; 50860a28c6c4b992d1d3959484442a205d6ae2bd977vandwalle 50960a28c6c4b992d1d3959484442a205d6ae2bd977vandwalle if (allowedKeyManagement == null) 51060a28c6c4b992d1d3959484442a205d6ae2bd977vandwalle return false; 51160a28c6c4b992d1d3959484442a205d6ae2bd977vandwalle 51210652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde if (allowedKeyManagement.cardinality() > 1) { 5133b25f51609209ecd1374278b3dbec55a7bd15813Vinit Deshapnde if (allowedKeyManagement.cardinality() != 2) { 5143b25f51609209ecd1374278b3dbec55a7bd15813Vinit Deshapnde return false; 5153b25f51609209ecd1374278b3dbec55a7bd15813Vinit Deshapnde } 5163b25f51609209ecd1374278b3dbec55a7bd15813Vinit Deshapnde if (allowedKeyManagement.get(KeyMgmt.WPA_EAP) == false) { 5173b25f51609209ecd1374278b3dbec55a7bd15813Vinit Deshapnde return false; 5183b25f51609209ecd1374278b3dbec55a7bd15813Vinit Deshapnde } 5192871588101c9bf1e6c9573599dee9be106466175Vinit Deshapnde if ((allowedKeyManagement.get(KeyMgmt.IEEE8021X) == false) 5202871588101c9bf1e6c9573599dee9be106466175Vinit Deshapnde && (allowedKeyManagement.get(KeyMgmt.WPA_PSK) == false)) { 5213b25f51609209ecd1374278b3dbec55a7bd15813Vinit Deshapnde return false; 5223b25f51609209ecd1374278b3dbec55a7bd15813Vinit Deshapnde } 52310652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde } 52410652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde 52510652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde // TODO: Add more checks 52610652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde return true; 5277c3606c103e95d3991267cca2592402a68779cafvandwalle 5287c3606c103e95d3991267cca2592402a68779cafvandwalle } 5297c3606c103e95d3991267cca2592402a68779cafvandwalle 5307c3606c103e95d3991267cca2592402a68779cafvandwalle /** 5317c3606c103e95d3991267cca2592402a68779cafvandwalle * most recent time we have seen this configuration 5327c3606c103e95d3991267cca2592402a68779cafvandwalle * @return most recent scanResult 5337c3606c103e95d3991267cca2592402a68779cafvandwalle * @hide 5347c3606c103e95d3991267cca2592402a68779cafvandwalle */ 5357c3606c103e95d3991267cca2592402a68779cafvandwalle public ScanResult lastSeen() { 5367c3606c103e95d3991267cca2592402a68779cafvandwalle ScanResult mostRecent = null; 5377c3606c103e95d3991267cca2592402a68779cafvandwalle 5387c3606c103e95d3991267cca2592402a68779cafvandwalle if (scanResultCache == null) { 5397c3606c103e95d3991267cca2592402a68779cafvandwalle return null; 5407c3606c103e95d3991267cca2592402a68779cafvandwalle } 5417c3606c103e95d3991267cca2592402a68779cafvandwalle 5427c3606c103e95d3991267cca2592402a68779cafvandwalle for (ScanResult result : scanResultCache.values()) { 5437c3606c103e95d3991267cca2592402a68779cafvandwalle if (mostRecent == null) { 5447c3606c103e95d3991267cca2592402a68779cafvandwalle if (result.seen != 0) 5457c3606c103e95d3991267cca2592402a68779cafvandwalle mostRecent = result; 5467c3606c103e95d3991267cca2592402a68779cafvandwalle } else { 5477c3606c103e95d3991267cca2592402a68779cafvandwalle if (result.seen > mostRecent.seen) { 5487c3606c103e95d3991267cca2592402a68779cafvandwalle mostRecent = result; 5497c3606c103e95d3991267cca2592402a68779cafvandwalle } 5507c3606c103e95d3991267cca2592402a68779cafvandwalle } 5517c3606c103e95d3991267cca2592402a68779cafvandwalle } 5527c3606c103e95d3991267cca2592402a68779cafvandwalle return mostRecent; 55310652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde } 55410652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde 5558dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy @Override 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 5578dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy StringBuilder sbuf = new StringBuilder(); 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (this.status == WifiConfiguration.Status.CURRENT) { 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sbuf.append("* "); 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (this.status == WifiConfiguration.Status.DISABLED) { 5618dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy sbuf.append("- DSBLE: ").append(this.disableReason).append(" "); 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sbuf.append("ID: ").append(this.networkId).append(" SSID: ").append(this.SSID). 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project append(" BSSID: ").append(this.BSSID).append(" PRIO: ").append(this.priority). 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project append('\n'); 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sbuf.append(" KeyMgmt:"); 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int k = 0; k < this.allowedKeyManagement.size(); k++) { 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (this.allowedKeyManagement.get(k)) { 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sbuf.append(" "); 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (k < KeyMgmt.strings.length) { 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sbuf.append(KeyMgmt.strings[k]); 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sbuf.append("??"); 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sbuf.append(" Protocols:"); 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int p = 0; p < this.allowedProtocols.size(); p++) { 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (this.allowedProtocols.get(p)) { 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sbuf.append(" "); 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p < Protocol.strings.length) { 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sbuf.append(Protocol.strings[p]); 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sbuf.append("??"); 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sbuf.append('\n'); 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sbuf.append(" AuthAlgorithms:"); 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int a = 0; a < this.allowedAuthAlgorithms.size(); a++) { 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (this.allowedAuthAlgorithms.get(a)) { 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sbuf.append(" "); 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a < AuthAlgorithm.strings.length) { 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sbuf.append(AuthAlgorithm.strings[a]); 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sbuf.append("??"); 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sbuf.append('\n'); 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sbuf.append(" PairwiseCiphers:"); 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int pc = 0; pc < this.allowedPairwiseCiphers.size(); pc++) { 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (this.allowedPairwiseCiphers.get(pc)) { 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sbuf.append(" "); 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pc < PairwiseCipher.strings.length) { 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sbuf.append(PairwiseCipher.strings[pc]); 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sbuf.append("??"); 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sbuf.append('\n'); 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sbuf.append(" GroupCiphers:"); 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int gc = 0; gc < this.allowedGroupCiphers.size(); gc++) { 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (this.allowedGroupCiphers.get(gc)) { 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sbuf.append(" "); 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (gc < GroupCipher.strings.length) { 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sbuf.append(GroupCipher.strings[gc]); 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sbuf.append("??"); 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6245069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang sbuf.append('\n').append(" PSK: "); 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (this.preSharedKey != null) { 6265069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang sbuf.append('*'); 6275069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang } 6284337476a6669ce52549ce4a60f5e4d07f8e3033fChung-yih Wang 6299b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff sbuf.append(enterpriseConfig); 6305069cc78497209c035a7019b2f407bd1ed57f64aChung-yih Wang sbuf.append('\n'); 6319b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff 6326346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim sbuf.append(mIpConfiguration.toString()); 633128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sbuf.toString(); 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Construct a WifiConfiguration from a scanned network 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param scannedAP the scan result used to construct the config entry 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * TODO: figure out whether this is a useful way to construct a new entry. 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public WifiConfiguration(ScanResult scannedAP) { 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project networkId = -1; 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SSID = scannedAP.SSID; 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BSSID = scannedAP.BSSID; 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 649b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff /** {@hide} */ 650b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff public String getPrintableSsid() { 651b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff if (SSID == null) return ""; 652b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff final int length = SSID.length(); 653b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff if (length > 2 && (SSID.charAt(0) == '"') && SSID.charAt(length - 1) == '"') { 654b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff return SSID.substring(1, length - 1); 655b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff } 656b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff 657b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff /** The ascii-encoded string format is P"<ascii-encoded-string>" 658b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff * The decoding is implemented in the supplicant for a newly configured 659b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff * network. 660b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff */ 661b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff if (length > 3 && (SSID.charAt(0) == 'P') && (SSID.charAt(1) == '"') && 662b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff (SSID.charAt(length-1) == '"')) { 663b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff WifiSsid wifiSsid = WifiSsid.createFromAsciiEncoded( 664b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff SSID.substring(2, length - 1)); 665b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff return wifiSsid.toString(); 666b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff } 667b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff return SSID; 668b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff } 669b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff 67026d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff /** 67126d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff * Get an identifier for associating credentials with this config 67226d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff * @param current configuration contains values for additional fields 67326d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff * that are not part of this configuration. Used 67426d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff * when a config with some fields is passed by an application. 67526d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff * @throws IllegalStateException if config is invalid for key id generation 67626d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff * @hide 67726d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff */ 678ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde public String getKeyIdForCredentials(WifiConfiguration current) { 67926d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff String keyMgmt = null; 68026d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff 68126d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff try { 68226d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff // Get current config details for fields that are not initialized 68326d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff if (TextUtils.isEmpty(SSID)) SSID = current.SSID; 68426d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff if (allowedKeyManagement.cardinality() == 0) { 68526d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff allowedKeyManagement = current.allowedKeyManagement; 68626d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff } 68726d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff if (allowedKeyManagement.get(KeyMgmt.WPA_EAP)) { 68826d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff keyMgmt = KeyMgmt.strings[KeyMgmt.WPA_EAP]; 68926d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff } 69026d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff if (allowedKeyManagement.get(KeyMgmt.IEEE8021X)) { 69126d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff keyMgmt += KeyMgmt.strings[KeyMgmt.IEEE8021X]; 69226d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff } 69326d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff 69426d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff if (TextUtils.isEmpty(keyMgmt)) { 69526d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff throw new IllegalStateException("Not an EAP network"); 69626d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff } 69726d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff 69826d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff return trimStringForKeyId(SSID) + "_" + keyMgmt + "_" + 69926d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff trimStringForKeyId(enterpriseConfig.getKeyId(current != null ? 70026d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff current.enterpriseConfig : null)); 70126d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff } catch (NullPointerException e) { 70226d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff throw new IllegalStateException("Invalid config details"); 70326d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff } 70426d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff } 70526d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff 70626d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff private String trimStringForKeyId(String string) { 70726d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff // Remove quotes and spaces 70826d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff return string.replace("\"", "").replace(" ", ""); 70926d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff } 71026d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static BitSet readBitSet(Parcel src) { 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int cardinality = src.readInt(); 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BitSet set = new BitSet(); 7159b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff for (int i = 0; i < cardinality; i++) { 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project set.set(src.readInt()); 7179b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff } 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return set; 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static void writeBitSet(Parcel dest, BitSet set) { 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int nextSetBit = -1; 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(set.cardinality()); 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7279b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff while ((nextSetBit = set.nextSetBit(nextSetBit + 1)) != -1) { 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(nextSetBit); 7299b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff } 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 732ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff /** @hide */ 733ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff public int getAuthType() { 7340fd3b1be14ec6b6ba33140efa321b27dc3bf2862Vinit Deshapnde if (isValid() == false) { 7350fd3b1be14ec6b6ba33140efa321b27dc3bf2862Vinit Deshapnde throw new IllegalStateException("Invalid configuration"); 73626d0076f0dbb021c4e5cc1b37b632b2223fd9278Irfan Sheriff } 737ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff if (allowedKeyManagement.get(KeyMgmt.WPA_PSK)) { 738ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff return KeyMgmt.WPA_PSK; 739ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff } else if (allowedKeyManagement.get(KeyMgmt.WPA2_PSK)) { 740ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff return KeyMgmt.WPA2_PSK; 741ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff } else if (allowedKeyManagement.get(KeyMgmt.WPA_EAP)) { 742ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff return KeyMgmt.WPA_EAP; 743ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff } else if (allowedKeyManagement.get(KeyMgmt.IEEE8021X)) { 744ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff return KeyMgmt.IEEE8021X; 745ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff } 746ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff return KeyMgmt.NONE; 747ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff } 748ec8d23af7372204f068aebaa1bfae87dc9260e23Irfan Sheriff 7497c3606c103e95d3991267cca2592402a68779cafvandwalle /* @hide 7507c3606c103e95d3991267cca2592402a68779cafvandwalle * Cache the config key, this seems useful as a speed up since a lot of 7517c3606c103e95d3991267cca2592402a68779cafvandwalle * lookups in the config store are done and based on this key. 7527c3606c103e95d3991267cca2592402a68779cafvandwalle */ 7537c3606c103e95d3991267cca2592402a68779cafvandwalle String mCachedConfigKey; 7547c3606c103e95d3991267cca2592402a68779cafvandwalle 7557c3606c103e95d3991267cca2592402a68779cafvandwalle /** @hide 7567c3606c103e95d3991267cca2592402a68779cafvandwalle * return the string used to calculate the hash in WifiConfigStore 7577c3606c103e95d3991267cca2592402a68779cafvandwalle * and uniquely identify this WifiConfiguration 7587c3606c103e95d3991267cca2592402a68779cafvandwalle */ 7597c3606c103e95d3991267cca2592402a68779cafvandwalle public String configKey(boolean allowCached) { 7607c3606c103e95d3991267cca2592402a68779cafvandwalle String key; 7617c3606c103e95d3991267cca2592402a68779cafvandwalle if (allowCached && mCachedConfigKey != null) { 7627c3606c103e95d3991267cca2592402a68779cafvandwalle key = mCachedConfigKey; 7637c3606c103e95d3991267cca2592402a68779cafvandwalle } else { 7647c3606c103e95d3991267cca2592402a68779cafvandwalle key = this.SSID; 7657c3606c103e95d3991267cca2592402a68779cafvandwalle if (key == null) 7667c3606c103e95d3991267cca2592402a68779cafvandwalle key = ""; 7677c3606c103e95d3991267cca2592402a68779cafvandwalle if (this.wepKeys[0] != null) { 7687c3606c103e95d3991267cca2592402a68779cafvandwalle key = key + "-WEP"; 7697c3606c103e95d3991267cca2592402a68779cafvandwalle } 7707c3606c103e95d3991267cca2592402a68779cafvandwalle if (this.allowedKeyManagement.get(KeyMgmt.WPA_PSK)) { 7717c3606c103e95d3991267cca2592402a68779cafvandwalle key = key + "-" + KeyMgmt.strings[KeyMgmt.WPA_PSK]; 7727c3606c103e95d3991267cca2592402a68779cafvandwalle } 7737c3606c103e95d3991267cca2592402a68779cafvandwalle if (this.allowedKeyManagement.get(KeyMgmt.WPA_EAP) || 7747c3606c103e95d3991267cca2592402a68779cafvandwalle this.allowedKeyManagement.get(KeyMgmt.IEEE8021X)) { 7757c3606c103e95d3991267cca2592402a68779cafvandwalle key = key + "-" + KeyMgmt.strings[KeyMgmt.WPA_EAP]; 7767c3606c103e95d3991267cca2592402a68779cafvandwalle } 7777c3606c103e95d3991267cca2592402a68779cafvandwalle mCachedConfigKey = key; 7787c3606c103e95d3991267cca2592402a68779cafvandwalle } 7797c3606c103e95d3991267cca2592402a68779cafvandwalle return key; 7807c3606c103e95d3991267cca2592402a68779cafvandwalle } 7817c3606c103e95d3991267cca2592402a68779cafvandwalle 7827c3606c103e95d3991267cca2592402a68779cafvandwalle /** @hide 7837c3606c103e95d3991267cca2592402a68779cafvandwalle * get configKey, force calculating the config string 7847c3606c103e95d3991267cca2592402a68779cafvandwalle */ 7857c3606c103e95d3991267cca2592402a68779cafvandwalle public String configKey() { 7867c3606c103e95d3991267cca2592402a68779cafvandwalle return configKey(false); 7877c3606c103e95d3991267cca2592402a68779cafvandwalle } 7887c3606c103e95d3991267cca2592402a68779cafvandwalle 78913f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle /** @hide 79013f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle * return the config key string based on a scan result 79113f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle */ 79213f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle static public String configKey(ScanResult result) { 79313f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle String key = "\"" + result.SSID + "\""; 79413f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle 79513f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle if (result.capabilities.contains("WEP")) { 79613f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle key = key + "-WEP"; 79713f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle } 79813f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle 79913f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle if (result.capabilities.contains("PSK")) { 80013f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle key = key + "-" + KeyMgmt.strings[KeyMgmt.WPA_PSK]; 80113f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle } 80213f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle 80313f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle if (result.capabilities.contains("EAP")) { 80413f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle key = key + "-" + KeyMgmt.strings[KeyMgmt.WPA_EAP]; 80513f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle } 80613f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle 80713f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle return key; 80813f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle } 8097c3606c103e95d3991267cca2592402a68779cafvandwalle 8106346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim /** @hide */ 8116346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim public IpConfiguration getIpConfiguration() { 8126346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim return mIpConfiguration; 8136346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim } 8146346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim 8156346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim /** @hide */ 8166346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim public void setIpConfiguration(IpConfiguration ipConfiguration) { 8176346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim mIpConfiguration = ipConfiguration; 8186346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim } 8196346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim 8206346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim /** @hide */ 8216346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim public LinkProperties getLinkProperties() { 8226346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim return mIpConfiguration.linkProperties; 8236346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim } 8246346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim 8256346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim /** @hide */ 8266346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim public void setLinkProperties(LinkProperties linkProperties) { 8276346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim mIpConfiguration.linkProperties = linkProperties; 8286346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim } 8296346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim 8306346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim /** @hide */ 8316346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim public IpConfiguration.IpAssignment getIpAssignment() { 8326346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim return mIpConfiguration.ipAssignment; 8336346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim } 8346346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim 8356346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim /** @hide */ 8366346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim public void setIpAssignment(IpConfiguration.IpAssignment ipAssignment) { 8376346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim mIpConfiguration.ipAssignment = ipAssignment; 8386346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim } 8396346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim 8406346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim /** @hide */ 8416346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim public IpConfiguration.ProxySettings getProxySettings() { 8426346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim return mIpConfiguration.proxySettings; 8436346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim } 8446346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim 8456346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim /** @hide */ 8466346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim public void setProxySettings(IpConfiguration.ProxySettings proxySettings) { 8476346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim mIpConfiguration.proxySettings = proxySettings; 8486346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim } 8496346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim 8506346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim /** @hide */ 8516346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim public void setProxy(ProxySettings settings, ProxyInfo proxy) { 8526346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim mIpConfiguration.proxySettings = settings; 8536346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim mIpConfiguration.linkProperties.setHttpProxy(proxy); 8546346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim } 8556346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim 85613f48ffab8c24d18a0a83e488a9b358a730580d4vandwalle /** Implement the Parcelable interface {@hide} */ 857678979748585c5903125a404e448ad6c111dedadJaewan Kim public int describeContents() { 858678979748585c5903125a404e448ad6c111dedadJaewan Kim return 0; 859678979748585c5903125a404e448ad6c111dedadJaewan Kim } 860678979748585c5903125a404e448ad6c111dedadJaewan Kim 861128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff /** copy constructor {@hide} */ 862128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff public WifiConfiguration(WifiConfiguration source) { 863128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff if (source != null) { 864128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff networkId = source.networkId; 865128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff status = source.status; 8668136de08ff4b5c4cca11220143f5905dca38cc26Isaac Levy disableReason = source.disableReason; 867128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff SSID = source.SSID; 868128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff BSSID = source.BSSID; 869128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff preSharedKey = source.preSharedKey; 870128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff 871128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff wepKeys = new String[4]; 8729b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff for (int i = 0; i < wepKeys.length; i++) { 873128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff wepKeys[i] = source.wepKeys[i]; 8749b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff } 875128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff 876128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff wepTxKeyIndex = source.wepTxKeyIndex; 877128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff priority = source.priority; 878128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff hiddenSSID = source.hiddenSSID; 879128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff allowedKeyManagement = (BitSet) source.allowedKeyManagement.clone(); 880128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff allowedProtocols = (BitSet) source.allowedProtocols.clone(); 881128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff allowedAuthAlgorithms = (BitSet) source.allowedAuthAlgorithms.clone(); 882128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff allowedPairwiseCiphers = (BitSet) source.allowedPairwiseCiphers.clone(); 883128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff allowedGroupCiphers = (BitSet) source.allowedGroupCiphers.clone(); 884128cecab968337038591cc14e3cdd5b37b2e5cb9Irfan Sheriff 8859b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff enterpriseConfig = new WifiEnterpriseConfig(source.enterpriseConfig); 886678979748585c5903125a404e448ad6c111dedadJaewan Kim 8877c3606c103e95d3991267cca2592402a68779cafvandwalle defaultGwMacAddress = source.defaultGwMacAddress; 8887c3606c103e95d3991267cca2592402a68779cafvandwalle 8896346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim mIpConfiguration = new IpConfiguration(source.mIpConfiguration); 8906346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim 8917c3606c103e95d3991267cca2592402a68779cafvandwalle if ((source.scanResultCache != null) && (source.scanResultCache.size() > 0)) { 8927c3606c103e95d3991267cca2592402a68779cafvandwalle scanResultCache = new HashMap<String, ScanResult>(); 8937c3606c103e95d3991267cca2592402a68779cafvandwalle scanResultCache.putAll(source.scanResultCache); 8947c3606c103e95d3991267cca2592402a68779cafvandwalle } 8957c3606c103e95d3991267cca2592402a68779cafvandwalle 8967c3606c103e95d3991267cca2592402a68779cafvandwalle if ((source.connectChoices != null) && (source.connectChoices.size() > 0)) { 8977c3606c103e95d3991267cca2592402a68779cafvandwalle connectChoices = new HashMap<String, Integer>(); 8987c3606c103e95d3991267cca2592402a68779cafvandwalle connectChoices.putAll(source.connectChoices); 8997c3606c103e95d3991267cca2592402a68779cafvandwalle } 9007c3606c103e95d3991267cca2592402a68779cafvandwalle 9017c3606c103e95d3991267cca2592402a68779cafvandwalle if ((source.linkedConfigurations != null) 9027c3606c103e95d3991267cca2592402a68779cafvandwalle && (source.linkedConfigurations.size() > 0)) { 9037c3606c103e95d3991267cca2592402a68779cafvandwalle linkedConfigurations = new HashMap<String, Integer>(); 9047c3606c103e95d3991267cca2592402a68779cafvandwalle linkedConfigurations.putAll(source.linkedConfigurations); 9057c3606c103e95d3991267cca2592402a68779cafvandwalle } 9067c3606c103e95d3991267cca2592402a68779cafvandwalle mCachedConfigKey = null; //force null configKey 9077c3606c103e95d3991267cca2592402a68779cafvandwalle autoJoinStatus = source.autoJoinStatus; 908e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle selfAdded = source.selfAdded; 9097c3606c103e95d3991267cca2592402a68779cafvandwalle 9107c3606c103e95d3991267cca2592402a68779cafvandwalle if (source.visibility != null) { 9117c3606c103e95d3991267cca2592402a68779cafvandwalle visibility = new Visibility(source.visibility); 9127c3606c103e95d3991267cca2592402a68779cafvandwalle } 9136346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim } 9149e6222f4c126252c9950d072ab67d8b849d17643Irfan Sheriff } 9159e6222f4c126252c9950d072ab67d8b849d17643Irfan Sheriff 9165fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle /** {@hide} */ 9175fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle //public static final int NOTHING_TAG = 0; 9185fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle /** {@hide} */ 9195fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle //public static final int SCAN_CACHE_TAG = 1; 9205fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Implement the Parcelable interface {@hide} */ 9226346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim @Override 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel dest, int flags) { 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(networkId); 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(status); 9268dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy dest.writeInt(disableReason); 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeString(SSID); 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeString(BSSID); 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeString(preSharedKey); 9309b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff for (String wepKey : wepKeys) { 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeString(wepKey); 9329b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff } 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(wepTxKeyIndex); 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(priority); 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(hiddenSSID ? 1 : 0); 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeBitSet(dest, allowedKeyManagement); 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeBitSet(dest, allowedProtocols); 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeBitSet(dest, allowedAuthAlgorithms); 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeBitSet(dest, allowedPairwiseCiphers); 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeBitSet(dest, allowedGroupCiphers); 9424337476a6669ce52549ce4a60f5e4d07f8e3033fChung-yih Wang 9439b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff dest.writeParcelable(enterpriseConfig, flags); 944678979748585c5903125a404e448ad6c111dedadJaewan Kim 9456346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim dest.writeParcelable(mIpConfiguration, flags); 9467c3606c103e95d3991267cca2592402a68779cafvandwalle dest.writeString(dhcpServer); 9477c3606c103e95d3991267cca2592402a68779cafvandwalle dest.writeString(defaultGwMacAddress); 9487c3606c103e95d3991267cca2592402a68779cafvandwalle dest.writeInt(autoJoinStatus); 949e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle dest.writeInt(selfAdded ? 1 : 0); 9505fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle /* 9515fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle TODO: should we write the cache results to the parcel? 9525fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle if (scanResultCache != null) { 9535fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle dest.writeInt(WifiConfiguration.SCAN_CACHE_TAG); 9545fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle dest.writeInt(scanResultCache.size()); 9555fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle for (ScanResult result : scanResultCache.values()) { 9565fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle result.writeToParcel(dest, flags); 9575fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } 9585fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } else { 9595fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle dest.writeInt(WifiConfiguration.NOTHING_TAG); 9605fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle }*/ 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Implement the Parcelable interface {@hide} */ 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Creator<WifiConfiguration> CREATOR = 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new Creator<WifiConfiguration>() { 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public WifiConfiguration createFromParcel(Parcel in) { 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WifiConfiguration config = new WifiConfiguration(); 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.networkId = in.readInt(); 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.status = in.readInt(); 9708dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy config.disableReason = in.readInt(); 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.SSID = in.readString(); 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.BSSID = in.readString(); 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.preSharedKey = in.readString(); 9749b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff for (int i = 0; i < config.wepKeys.length; i++) { 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.wepKeys[i] = in.readString(); 9769b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff } 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.wepTxKeyIndex = in.readInt(); 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.priority = in.readInt(); 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.hiddenSSID = in.readInt() != 0; 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.allowedKeyManagement = readBitSet(in); 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.allowedProtocols = readBitSet(in); 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.allowedAuthAlgorithms = readBitSet(in); 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.allowedPairwiseCiphers = readBitSet(in); 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.allowedGroupCiphers = readBitSet(in); 9854337476a6669ce52549ce4a60f5e4d07f8e3033fChung-yih Wang 9869b81319002634cf7118055f7aafaa26c27d4e5e8Irfan Sheriff config.enterpriseConfig = in.readParcelable(null); 98731b62322bfa9470d648fbfd69510e03da29b29afIrfan Sheriff 9886346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim config.mIpConfiguration = in.readParcelable(null); 9897c3606c103e95d3991267cca2592402a68779cafvandwalle config.dhcpServer = in.readString(); 9907c3606c103e95d3991267cca2592402a68779cafvandwalle config.defaultGwMacAddress = in.readString(); 9917c3606c103e95d3991267cca2592402a68779cafvandwalle config.autoJoinStatus = in.readInt(); 992e50869df0d1a216a73c7bcbeeb9406d5ba475b20vandwalle config.selfAdded = in.readInt() != 0; 9935fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle /* 9945fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle TODO: should we write the cache results to the parcel? 9955fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle boolean done = false; 9965fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle do { 9975fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle int tag = in.readInt(); 9985fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle switch (tag) { 9995fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle case WifiConfiguration.SCAN_CACHE_TAG: 10005fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle int size = in.readInt(); 10015fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle config.scanResultCache = new HashMap<String, ScanResult>(); 10025fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle while (size > 0) { 10035fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle ScanResult result = ScanResult.CREATOR.createFromParcel(in); 10045fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle config.scanResultCache.put(result.BSSID, result); 10055fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle size--; 10065fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } 10075fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle break; 10085fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle case WifiConfiguration.NOTHING_TAG: 10095fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle done = true; 10105fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle break; 10115fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } 10125fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } while (!done);*/ 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return config; 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public WifiConfiguration[] newArray(int size) { 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new WifiConfiguration[size]; 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1021