SupplicantState.java revision 9b3710b253db932d560f2f08d62b6eb2d37e3c67
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 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * From <code>defs.h</code> in <code>wpa_supplicant</code>. 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p/> 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * These enumeration values are used to indicate the current wpa_supplicant 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * state. This is more fine-grained than most users will be interested in. 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * In general, it is better to use 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.net.NetworkInfo.State NetworkInfo.State}. 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p/> 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Note, the order of these enum constants must match the numerical values of the 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * state constants in <code>defs.h</code> in <code>wpa_supplicant</code>. 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic enum SupplicantState implements Parcelable { 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This state indicates that client is not associated, but is likely to 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * start looking for an access point. This state is entered when a 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * connection is lost. 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DISCONNECTED, 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Inactive state (wpa_supplicant disabled). 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p/> 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This state is entered if there are no enabled networks in the 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * configuration. wpa_supplicant is not trying to associate with a new 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * network and external interaction (e.g., ctrl_iface call to add or 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * enable a network) is needed to start association. 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project INACTIVE, 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Scanning for a network. 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p/> 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This state is entered when wpa_supplicant starts scanning for a 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * network. 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SCANNING, 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Trying to associate with a BSS/SSID. 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p/> 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This state is entered when wpa_supplicant has found a suitable BSS 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to associate with and the driver is configured to try to associate 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with this BSS in ap_scan=1 mode. When using ap_scan=2 mode, this 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * state is entered when the driver is configured to try to associate 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with a network using the configured SSID and security policy. 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ASSOCIATING, 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Association completed. 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p/> 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This state is entered when the driver reports that association has 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * been successfully completed with an AP. If IEEE 802.1X is used 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (with or without WPA/WPA2), wpa_supplicant remains in this state 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * until the IEEE 802.1X/EAPOL authentication has been completed. 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ASSOCIATED, 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WPA 4-Way Key Handshake in progress. 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p/> 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This state is entered when WPA/WPA2 4-Way Handshake is started. In 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * case of WPA-PSK, this happens when receiving the first EAPOL-Key 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * frame after association. In case of WPA-EAP, this state is entered 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when the IEEE 802.1X/EAPOL authentication has been completed. 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FOUR_WAY_HANDSHAKE, 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WPA Group Key Handshake in progress. 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p/> 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This state is entered when 4-Way Key Handshake has been completed 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (i.e., when the supplicant sends out message 4/4) and when Group 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Key rekeying is started by the AP (i.e., when supplicant receives 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * message 1/2). 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GROUP_HANDSHAKE, 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All authentication completed. 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p/> 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This state is entered when the full authentication process is 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * completed. In case of WPA2, this happens when the 4-Way Handshake is 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * successfully completed. With WPA, this state is entered after the 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Group Key Handshake; with IEEE 802.1X (non-WPA) connection is 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * completed after dynamic keys are received (or if not used, after 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the EAP authentication has been completed). With static WEP keys and 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * plaintext connections, this state is entered when an association 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * has been completed. 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p/> 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This state indicates that the supplicant has completed its 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * processing for the association phase and that data connection is 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * fully configured. Note, however, that there may not be any IP 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * address associated with the connection yet. Typically, a DHCP 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * request needs to be sent at this point to obtain an address. 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project COMPLETED, 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * An Android-added state that is reported when a client issues an 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * explicit DISCONNECT command. In such a case, the supplicant is 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not only dissociated from the current access point (as for the 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * DISCONNECTED state above), but it also does not attempt to connect 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to any access point until a RECONNECT or REASSOCIATE command 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is issued by the client. 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DORMANT, 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * No connection to wpa_supplicant. 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p/> 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is an additional pseudo-state to handle the case where 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * wpa_supplicant is not running and/or we have not been able 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to establish a connection to it. 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project UNINITIALIZED, 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A pseudo-state that should normally never be seen. 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project INVALID; 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns {@code true} if the supplicant state is valid and {@code false} 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * otherwise. 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param state The supplicant state 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the supplicant state is valid and {@code false} 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * otherwise. 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static boolean isValidState(SupplicantState state) { 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return state != UNINITIALIZED && state != INVALID; 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1559b3710b253db932d560f2f08d62b6eb2d37e3c67Irfan Sheriff static boolean isConnecting(SupplicantState state) { 1569b3710b253db932d560f2f08d62b6eb2d37e3c67Irfan Sheriff switch(state) { 1579b3710b253db932d560f2f08d62b6eb2d37e3c67Irfan Sheriff case ASSOCIATING: 1589b3710b253db932d560f2f08d62b6eb2d37e3c67Irfan Sheriff case ASSOCIATED: 1599b3710b253db932d560f2f08d62b6eb2d37e3c67Irfan Sheriff case FOUR_WAY_HANDSHAKE: 1609b3710b253db932d560f2f08d62b6eb2d37e3c67Irfan Sheriff case GROUP_HANDSHAKE: 1619b3710b253db932d560f2f08d62b6eb2d37e3c67Irfan Sheriff case COMPLETED: 1629b3710b253db932d560f2f08d62b6eb2d37e3c67Irfan Sheriff return true; 1639b3710b253db932d560f2f08d62b6eb2d37e3c67Irfan Sheriff case DISCONNECTED: 1649b3710b253db932d560f2f08d62b6eb2d37e3c67Irfan Sheriff case INACTIVE: 1659b3710b253db932d560f2f08d62b6eb2d37e3c67Irfan Sheriff case SCANNING: 1669b3710b253db932d560f2f08d62b6eb2d37e3c67Irfan Sheriff case DORMANT: 1679b3710b253db932d560f2f08d62b6eb2d37e3c67Irfan Sheriff case UNINITIALIZED: 1689b3710b253db932d560f2f08d62b6eb2d37e3c67Irfan Sheriff case INVALID: 1699b3710b253db932d560f2f08d62b6eb2d37e3c67Irfan Sheriff return false; 1709b3710b253db932d560f2f08d62b6eb2d37e3c67Irfan Sheriff default: 1719b3710b253db932d560f2f08d62b6eb2d37e3c67Irfan Sheriff throw new IllegalArgumentException("Unknown supplicant state"); 1729b3710b253db932d560f2f08d62b6eb2d37e3c67Irfan Sheriff } 1739b3710b253db932d560f2f08d62b6eb2d37e3c67Irfan Sheriff } 1749b3710b253db932d560f2f08d62b6eb2d37e3c67Irfan Sheriff 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Implement the Parcelable interface {@hide} */ 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Implement the Parcelable interface {@hide} */ 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel dest, int flags) { 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeString(name()); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Implement the Parcelable interface {@hide} */ 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Creator<SupplicantState> CREATOR = 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new Creator<SupplicantState>() { 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SupplicantState createFromParcel(Parcel in) { 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return SupplicantState.valueOf(in.readString()); 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SupplicantState[] newArray(int size) { 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new SupplicantState[size]; 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 198