summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/current.txt2
-rw-r--r--wifi/java/android/net/wifi/SupplicantState.java44
-rw-r--r--wifi/java/android/net/wifi/SupplicantStateTracker.java22
-rw-r--r--wifi/java/android/net/wifi/WifiInfo.java2
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);