/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.net.wifi;
import android.os.Parcel;
import android.os.Parcelable;
/**
* From <code>defs.h</code> in <code>wpa_supplicant</code>.
* <p/>
* These enumeration values are used to indicate the current wpa_supplicant
* state. This is more fine-grained than most users will be interested in.
* In general, it is better to use
* {@link android.net.NetworkInfo.State NetworkInfo.State}.
* <p/>
* Note, the order of these enum constants must match the numerical values of the
* state constants in <code>defs.h</code> in <code>wpa_supplicant</code>.
*/
public enum SupplicantState implements Parcelable {
/**
* This state indicates that client is not associated, but is likely to
* start looking for an access point. This state is entered when a
* connection is lost.
*/
DISCONNECTED,
/**
* Interface is disabled
* <p/>
* This state is entered if the network interface is disabled.
* wpa_supplicant refuses any new operations that would
* use the radio until the interface has been enabled.
*/
INTERFACE_DISABLED,
/**
* Inactive state (wpa_supplicant disabled).
* <p/>
* This state is entered if there are no enabled networks in the
* configuration. wpa_supplicant is not trying to associate with a new
* network and external interaction (e.g., ctrl_iface call to add or
* enable a network) is needed to start association.
*/
INACTIVE,
/**
* Scanning for a network.
* <p/>
* This state is entered when wpa_supplicant starts scanning for a
* network.
*/
SCANNING,
/**
* Trying to authenticate with a BSS/SSID
* <p/>
* This state is entered when wpa_supplicant has found a suitable BSS
* to authenticate with and the driver is configured to try to
* authenticate with this BSS.
*/
AUTHENTICATING,
/**
* Trying to associate with a BSS/SSID.
* <p/>
* This state is entered when wpa_supplicant has found a suitable BSS
* to associate with and the driver is configured to try to associate
* with this BSS in ap_scan=1 mode. When using ap_scan=2 mode, this
* state is entered when the driver is configured to try to associate
* with a network using the configured SSID and security policy.
*/
ASSOCIATING,
/**
* Association completed.
* <p/>
* This state is entered when the driver reports that association has
* been successfully completed with an AP. If IEEE 802.1X is used
* (with or without WPA/WPA2), wpa_supplicant remains in this state
* until the IEEE 802.1X/EAPOL authentication has been completed.
*/
ASSOCIATED,
/**
* WPA 4-Way Key Handshake in progress.
* <p/>
* This state is entered when WPA/WPA2 4-Way Handshake is started. In
* case of WPA-PSK, this happens when receiving the first EAPOL-Key
* frame after association. In case of WPA-EAP, this state is entered
* when the IEEE 802.1X/EAPOL authentication has been completed.
*/
FOUR_WAY_HANDSHAKE,
/**
* WPA Group Key Handshake in progress.
* <p/>
* This state is entered when 4-Way Key Handshake has been completed
* (i.e., when the supplicant sends out message 4/4) and when Group
* Key rekeying is started by the AP (i.e., when supplicant receives
* message 1/2).
*/
GROUP_HANDSHAKE,
/**
* All authentication completed.
* <p/>
* This state is entered when the full authentication process is
* completed. In case of WPA2, this happens when the 4-Way Handshake is
* successfully completed. With WPA, this state is entered after the
* Group Key Handshake; with IEEE 802.1X (non-WPA) connection is
* completed after dynamic keys are received (or if not used, after
* the EAP authentication has been completed). With static WEP keys and
* plaintext connections, this state is entered when an association
* has been completed.
* <p/>
* This state indicates that the supplicant has completed its
* processing for the association phase and that data connection is
* fully configured. Note, however, that there may not be any IP
* address associated with the connection yet. Typically, a DHCP
* request needs to be sent at this point to obtain an address.
*/
COMPLETED,
/**
* An Android-added state that is reported when a client issues an
* explicit DISCONNECT command. In such a case, the supplicant is
* not only dissociated from the current access point (as for the
* DISCONNECTED state above), but it also does not attempt to connect
* to any access point until a RECONNECT or REASSOCIATE command
* is issued by the client.
*/
DORMANT,
/**
* No connection to wpa_supplicant.
* <p/>
* This is an additional pseudo-state to handle the case where
* wpa_supplicant is not running and/or we have not been able
* to establish a connection to it.
*/
UNINITIALIZED,
/**
* A pseudo-state that should normally never be seen.
*/
INVALID;
/**
* Returns {@code true} if the supplicant state is valid and {@code false}
* otherwise.
* @param state The supplicant state
* @return {@code true} if the supplicant state is valid and {@code false}
* otherwise.
*/
public static boolean isValidState(SupplicantState state) {
return state != UNINITIALIZED && state != INVALID;
}
/** Supplicant associating or authenticating is considered a handshake state {@hide} */
public static boolean isHandshakeState(SupplicantState state) {
switch(state) {
case AUTHENTICATING:
case ASSOCIATING:
case ASSOCIATED:
case FOUR_WAY_HANDSHAKE:
case GROUP_HANDSHAKE:
return true;
case COMPLETED:
case DISCONNECTED:
case INTERFACE_DISABLED:
case INACTIVE:
case SCANNING:
case DORMANT:
case UNINITIALIZED:
case INVALID:
return false;
default:
throw new IllegalArgumentException("Unknown supplicant state");
}
}
/** @hide */
public static boolean isConnecting(SupplicantState state) {
switch(state) {
case AUTHENTICATING:
case ASSOCIATING:
case ASSOCIATED:
case FOUR_WAY_HANDSHAKE:
case GROUP_HANDSHAKE:
case COMPLETED:
return true;
case DISCONNECTED:
case INTERFACE_DISABLED:
case INACTIVE:
case SCANNING:
case DORMANT:
case UNINITIALIZED:
case INVALID:
return false;
default:
throw new IllegalArgumentException("Unknown supplicant state");
}
}
/** @hide */
public static boolean isDriverActive(SupplicantState state) {
switch(state) {
case DISCONNECTED:
case DORMANT:
case INACTIVE:
case AUTHENTICATING:
case ASSOCIATING:
case ASSOCIATED:
case SCANNING:
case FOUR_WAY_HANDSHAKE:
case GROUP_HANDSHAKE:
case COMPLETED:
return true;
case INTERFACE_DISABLED:
case UNINITIALIZED:
case INVALID:
return false;
default:
throw new IllegalArgumentException("Unknown supplicant state");
}
}
/** Implement the Parcelable interface {@hide} */
public int describeContents() {
return 0;
}
/** Implement the Parcelable interface {@hide} */
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name());
}
/** Implement the Parcelable interface {@hide} */
public static final Creator<SupplicantState> CREATOR =
new Creator<SupplicantState>() {
public SupplicantState createFromParcel(Parcel in) {
return SupplicantState.valueOf(in.readString());
}
public SupplicantState[] newArray(int size) {
return new SupplicantState[size];
}
};
}