diff options
| -rw-r--r-- | api/current.txt | 2 | ||||
| -rw-r--r-- | wifi/java/android/net/wifi/SupplicantState.java | 44 | ||||
| -rw-r--r-- | wifi/java/android/net/wifi/SupplicantStateTracker.java | 22 | ||||
| -rw-r--r-- | wifi/java/android/net/wifi/WifiInfo.java | 2 |
4 files changed, 59 insertions, 11 deletions
diff --git a/api/current.txt b/api/current.txt index 3a90ef7a3c3c..8ea9ebd47418 100644 --- a/api/current.txt +++ b/api/current.txt @@ -11596,12 +11596,14 @@ package android.net.wifi { method public void writeToParcel(android.os.Parcel, int); enum_constant public static final android.net.wifi.SupplicantState ASSOCIATED; enum_constant public static final android.net.wifi.SupplicantState ASSOCIATING; + enum_constant public static final android.net.wifi.SupplicantState AUTHENTICATING; enum_constant public static final android.net.wifi.SupplicantState COMPLETED; enum_constant public static final android.net.wifi.SupplicantState DISCONNECTED; enum_constant public static final android.net.wifi.SupplicantState DORMANT; enum_constant public static final android.net.wifi.SupplicantState FOUR_WAY_HANDSHAKE; enum_constant public static final android.net.wifi.SupplicantState GROUP_HANDSHAKE; enum_constant public static final android.net.wifi.SupplicantState INACTIVE; + enum_constant public static final android.net.wifi.SupplicantState INTERFACE_DISABLED; enum_constant public static final android.net.wifi.SupplicantState INVALID; enum_constant public static final android.net.wifi.SupplicantState SCANNING; enum_constant public static final android.net.wifi.SupplicantState UNINITIALIZED; diff --git a/wifi/java/android/net/wifi/SupplicantState.java b/wifi/java/android/net/wifi/SupplicantState.java index 6b79210adacd..91e685fde905 100644 --- a/wifi/java/android/net/wifi/SupplicantState.java +++ b/wifi/java/android/net/wifi/SupplicantState.java @@ -39,6 +39,15 @@ public enum SupplicantState implements Parcelable { 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 @@ -57,6 +66,15 @@ public enum SupplicantState implements Parcelable { 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 @@ -152,8 +170,33 @@ public enum SupplicantState implements Parcelable { return state != UNINITIALIZED && state != INVALID; } + + /* Supplicant associating or authenticating is considered a handshake state */ + 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"); + } + } + static boolean isConnecting(SupplicantState state) { switch(state) { + case AUTHENTICATING: case ASSOCIATING: case ASSOCIATED: case FOUR_WAY_HANDSHAKE: @@ -161,6 +204,7 @@ public enum SupplicantState implements Parcelable { case COMPLETED: return true; case DISCONNECTED: + case INTERFACE_DISABLED: case INACTIVE: case SCANNING: case DORMANT: diff --git a/wifi/java/android/net/wifi/SupplicantStateTracker.java b/wifi/java/android/net/wifi/SupplicantStateTracker.java index 9ae26daa9302..0c4f9f6d49b0 100644 --- a/wifi/java/android/net/wifi/SupplicantStateTracker.java +++ b/wifi/java/android/net/wifi/SupplicantStateTracker.java @@ -98,12 +98,16 @@ class SupplicantStateTracker extends StateMachine { if (DBG) Log.d(TAG, "Supplicant state: " + supState.toString() + "\n"); switch (supState) { - case DISCONNECTED: + case DISCONNECTED: transitionTo(mDisconnectState); break; + case INTERFACE_DISABLED: + //we should have received a disconnection already, do nothing + break; case SCANNING: transitionTo(mScanState); break; + case AUTHENTICATING: case ASSOCIATING: case ASSOCIATED: case FOUR_WAY_HANDSHAKE: @@ -250,10 +254,7 @@ class SupplicantStateTracker extends StateMachine { case WifiStateMachine.SUPPLICANT_STATE_CHANGE_EVENT: StateChangeResult stateChangeResult = (StateChangeResult) message.obj; SupplicantState state = stateChangeResult.state; - if (state == SupplicantState.ASSOCIATING || - state == SupplicantState.ASSOCIATED || - state == SupplicantState.FOUR_WAY_HANDSHAKE || - state == SupplicantState.GROUP_HANDSHAKE) { + if (SupplicantState.isHandshakeState(state)) { if (mLoopDetectIndex > state.ordinal()) { mLoopDetectCount++; } @@ -296,12 +297,11 @@ class SupplicantStateTracker extends StateMachine { StateChangeResult stateChangeResult = (StateChangeResult) message.obj; SupplicantState state = stateChangeResult.state; sendSupplicantStateChangedBroadcast(state, mAuthFailureInSupplicantBroadcast); - /* Ignore a re-auth in completed state */ - if (state == SupplicantState.ASSOCIATING || - state == SupplicantState.ASSOCIATED || - state == SupplicantState.FOUR_WAY_HANDSHAKE || - state == SupplicantState.GROUP_HANDSHAKE || - state == SupplicantState.COMPLETED) { + /* Ignore any connecting state in completed state. Group re-keying + * events and other auth events that do not affect connectivity are + * ignored + */ + if (SupplicantState.isConnecting(state)) { break; } transitionOnSupplicantStateChange(stateChangeResult); diff --git a/wifi/java/android/net/wifi/WifiInfo.java b/wifi/java/android/net/wifi/WifiInfo.java index f60ae4835f85..e3661bfa8d35 100644 --- a/wifi/java/android/net/wifi/WifiInfo.java +++ b/wifi/java/android/net/wifi/WifiInfo.java @@ -41,8 +41,10 @@ public class WifiInfo implements Parcelable { static { stateMap.put(SupplicantState.DISCONNECTED, DetailedState.DISCONNECTED); + stateMap.put(SupplicantState.INTERFACE_DISABLED, DetailedState.DISCONNECTED); stateMap.put(SupplicantState.INACTIVE, DetailedState.IDLE); stateMap.put(SupplicantState.SCANNING, DetailedState.SCANNING); + stateMap.put(SupplicantState.AUTHENTICATING, DetailedState.CONNECTING); stateMap.put(SupplicantState.ASSOCIATING, DetailedState.CONNECTING); stateMap.put(SupplicantState.ASSOCIATED, DetailedState.CONNECTING); stateMap.put(SupplicantState.FOUR_WAY_HANDSHAKE, DetailedState.AUTHENTICATING); |