SupplicantStateTracker.java revision 55bc5f3e0408bcb5a39a6732de0b2d1aa99a55be
119d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff/* 219d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff * Copyright (C) 2010 The Android Open Source Project 319d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff * 419d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff * Licensed under the Apache License, Version 2.0 (the "License"); 519d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff * you may not use this file except in compliance with the License. 619d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff * You may obtain a copy of the License at 719d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff * 819d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff * http://www.apache.org/licenses/LICENSE-2.0 919d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff * 1019d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff * Unless required by applicable law or agreed to in writing, software 1119d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff * distributed under the License is distributed on an "AS IS" BASIS, 1219d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1319d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff * See the License for the specific language governing permissions and 1419d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff * limitations under the License. 1519d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff */ 1619d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff 1719d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriffpackage android.net.wifi; 1819d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff 1964c42cae4482fe0157e977b8ddd0f2c2436b3f31Wink Savilleimport com.android.internal.util.State; 2064c42cae4482fe0157e977b8ddd0f2c2436b3f31Wink Savilleimport com.android.internal.util.StateMachine; 2119d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff 2255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.net.wifi.StateChangeResult; 2319d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriffimport android.content.Context; 2419d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriffimport android.content.Intent; 2519d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriffimport android.os.Handler; 2619d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriffimport android.os.Message; 2719d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriffimport android.os.Parcelable; 2819d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriffimport android.util.Log; 2919d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff 3019d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff/** 3119d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff * Tracks the state changes in supplicant and provides functionality 3219d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff * that is based on these state changes: 3319d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff * - detect a failed WPA handshake that loops indefinitely 34b98d878f43748a64c68ffe05ce64c5b7c72fe922Irfan Sheriff * - authentication failure handling 3519d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff */ 3664c42cae4482fe0157e977b8ddd0f2c2436b3f31Wink Savilleclass SupplicantStateTracker extends StateMachine { 3719d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff 3819d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff private static final String TAG = "SupplicantStateTracker"; 3919d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff private static final boolean DBG = false; 4019d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff 4119d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff private WifiStateMachine mWifiStateMachine; 42b98d878f43748a64c68ffe05ce64c5b7c72fe922Irfan Sheriff private int mAuthenticationFailuresCount = 0; 4319d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff /* Indicates authentication failure in supplicant broadcast. 4419d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff * TODO: enhance auth failure reporting to include notification 4519d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff * for all type of failures: EAP, WPS & WPA networks */ 4619d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff private boolean mAuthFailureInSupplicantBroadcast = false; 4719d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff 48b98d878f43748a64c68ffe05ce64c5b7c72fe922Irfan Sheriff /* Maximum retries on a authentication failure notification */ 49b98d878f43748a64c68ffe05ce64c5b7c72fe922Irfan Sheriff private static final int MAX_RETRIES_ON_AUTHENTICATION_FAILURE = 2; 5019d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff 518e86b89860114386e6c43f55fc034a26798b73e2Irfan Sheriff /* Tracks if networks have been disabled during a connection */ 528e86b89860114386e6c43f55fc034a26798b73e2Irfan Sheriff private boolean mNetworksDisabledDuringConnect = false; 538e86b89860114386e6c43f55fc034a26798b73e2Irfan Sheriff 5419d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff private Context mContext; 5519d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff 5664c42cae4482fe0157e977b8ddd0f2c2436b3f31Wink Saville private State mUninitializedState = new UninitializedState(); 5764c42cae4482fe0157e977b8ddd0f2c2436b3f31Wink Saville private State mDefaultState = new DefaultState(); 5864c42cae4482fe0157e977b8ddd0f2c2436b3f31Wink Saville private State mInactiveState = new InactiveState(); 5964c42cae4482fe0157e977b8ddd0f2c2436b3f31Wink Saville private State mDisconnectState = new DisconnectedState(); 6064c42cae4482fe0157e977b8ddd0f2c2436b3f31Wink Saville private State mScanState = new ScanState(); 6164c42cae4482fe0157e977b8ddd0f2c2436b3f31Wink Saville private State mHandshakeState = new HandshakeState(); 6264c42cae4482fe0157e977b8ddd0f2c2436b3f31Wink Saville private State mCompletedState = new CompletedState(); 6364c42cae4482fe0157e977b8ddd0f2c2436b3f31Wink Saville private State mDormantState = new DormantState(); 6419d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff 6519d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff public SupplicantStateTracker(Context context, WifiStateMachine wsm, Handler target) { 6619d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff super(TAG, target.getLooper()); 6719d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff 6819d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff mContext = context; 6919d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff mWifiStateMachine = wsm; 7019d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff addState(mDefaultState); 7119d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff addState(mUninitializedState, mDefaultState); 7219d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff addState(mInactiveState, mDefaultState); 7319d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff addState(mDisconnectState, mDefaultState); 7419d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff addState(mScanState, mDefaultState); 7519d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff addState(mHandshakeState, mDefaultState); 7619d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff addState(mCompletedState, mDefaultState); 7719d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff addState(mDormantState, mDefaultState); 7819d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff 7919d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff setInitialState(mUninitializedState); 8019d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff 8119d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff //start the state machine 8219d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff start(); 8319d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff } 8419d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff 858e86b89860114386e6c43f55fc034a26798b73e2Irfan Sheriff private void handleNetworkConnectionFailure(int netId) { 868e86b89860114386e6c43f55fc034a26798b73e2Irfan Sheriff /* If other networks disabled during connection, enable them */ 878e86b89860114386e6c43f55fc034a26798b73e2Irfan Sheriff if (mNetworksDisabledDuringConnect) { 888e86b89860114386e6c43f55fc034a26798b73e2Irfan Sheriff WifiConfigStore.enableAllNetworks(); 898e86b89860114386e6c43f55fc034a26798b73e2Irfan Sheriff mNetworksDisabledDuringConnect = false; 908e86b89860114386e6c43f55fc034a26798b73e2Irfan Sheriff } 918e86b89860114386e6c43f55fc034a26798b73e2Irfan Sheriff /* Disable failed network */ 928e86b89860114386e6c43f55fc034a26798b73e2Irfan Sheriff WifiConfigStore.disableNetwork(netId); 938e86b89860114386e6c43f55fc034a26798b73e2Irfan Sheriff } 948e86b89860114386e6c43f55fc034a26798b73e2Irfan Sheriff 9519d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff private void transitionOnSupplicantStateChange(StateChangeResult stateChangeResult) { 9619d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff SupplicantState supState = (SupplicantState) stateChangeResult.state; 9719d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff 9819d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff if (DBG) Log.d(TAG, "Supplicant state: " + supState.toString() + "\n"); 9919d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff 10019d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff switch (supState) { 101319da8c4c59be36fe2e221a0aba230ef6b77a14fIrfan Sheriff case DISCONNECTED: 10219d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff transitionTo(mDisconnectState); 10319d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff break; 104319da8c4c59be36fe2e221a0aba230ef6b77a14fIrfan Sheriff case INTERFACE_DISABLED: 105319da8c4c59be36fe2e221a0aba230ef6b77a14fIrfan Sheriff //we should have received a disconnection already, do nothing 106319da8c4c59be36fe2e221a0aba230ef6b77a14fIrfan Sheriff break; 10719d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff case SCANNING: 10819d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff transitionTo(mScanState); 10919d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff break; 110319da8c4c59be36fe2e221a0aba230ef6b77a14fIrfan Sheriff case AUTHENTICATING: 11119d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff case ASSOCIATING: 11219d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff case ASSOCIATED: 11319d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff case FOUR_WAY_HANDSHAKE: 11419d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff case GROUP_HANDSHAKE: 11519d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff transitionTo(mHandshakeState); 11619d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff break; 11719d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff case COMPLETED: 11819d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff transitionTo(mCompletedState); 11919d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff break; 12019d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff case DORMANT: 12119d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff transitionTo(mDormantState); 12219d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff break; 12319d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff case INACTIVE: 12419d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff transitionTo(mInactiveState); 12519d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff break; 12619d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff case UNINITIALIZED: 12719d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff case INVALID: 12819d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff transitionTo(mUninitializedState); 12919d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff break; 13019d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff default: 13119d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff Log.e(TAG, "Unknown supplicant state " + supState); 13219d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff break; 13319d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff } 13419d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff } 13519d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff 136b45e726bf5df9650e8a67a7c05bf2f41f414c07dIrfan Sheriff private void sendSupplicantStateChangedBroadcast(SupplicantState state, boolean failedAuth) { 13719d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff Intent intent = new Intent(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); 13819d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT 13919d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff | Intent.FLAG_RECEIVER_REPLACE_PENDING); 140b45e726bf5df9650e8a67a7c05bf2f41f414c07dIrfan Sheriff intent.putExtra(WifiManager.EXTRA_NEW_STATE, (Parcelable) state); 14119d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff if (failedAuth) { 14219d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff intent.putExtra( 14319d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff WifiManager.EXTRA_SUPPLICANT_ERROR, 14419d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff WifiManager.ERROR_AUTHENTICATING); 14519d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff } 14619d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff mContext.sendStickyBroadcast(intent); 14719d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff } 14819d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff 14919d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff /******************************************************** 15019d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff * HSM states 15119d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff *******************************************************/ 15219d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff 15364c42cae4482fe0157e977b8ddd0f2c2436b3f31Wink Saville class DefaultState extends State { 15419d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff @Override 15519d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff public void enter() { 15619d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff if (DBG) Log.d(TAG, getName() + "\n"); 15719d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff } 15819d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff @Override 15919d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff public boolean processMessage(Message message) { 16019d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff if (DBG) Log.d(TAG, getName() + message.toString() + "\n"); 16119d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff switch (message.what) { 16255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiMonitor.AUTHENTICATION_FAILURE_EVENT: 163b98d878f43748a64c68ffe05ce64c5b7c72fe922Irfan Sheriff mAuthenticationFailuresCount++; 16419d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff mAuthFailureInSupplicantBroadcast = true; 16519d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff break; 16655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT: 16719d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff StateChangeResult stateChangeResult = (StateChangeResult) message.obj; 168b45e726bf5df9650e8a67a7c05bf2f41f414c07dIrfan Sheriff SupplicantState state = stateChangeResult.state; 169b45e726bf5df9650e8a67a7c05bf2f41f414c07dIrfan Sheriff sendSupplicantStateChangedBroadcast(state, mAuthFailureInSupplicantBroadcast); 17019d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff mAuthFailureInSupplicantBroadcast = false; 17119d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff transitionOnSupplicantStateChange(stateChangeResult); 17219d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff break; 173b45e726bf5df9650e8a67a7c05bf2f41f414c07dIrfan Sheriff case WifiStateMachine.CMD_RESET_SUPPLICANT_STATE: 174b45e726bf5df9650e8a67a7c05bf2f41f414c07dIrfan Sheriff transitionTo(mUninitializedState); 175b45e726bf5df9650e8a67a7c05bf2f41f414c07dIrfan Sheriff break; 1768e86b89860114386e6c43f55fc034a26798b73e2Irfan Sheriff case WifiStateMachine.CMD_CONNECT_NETWORK: 1778e86b89860114386e6c43f55fc034a26798b73e2Irfan Sheriff mNetworksDisabledDuringConnect = true; 1788e86b89860114386e6c43f55fc034a26798b73e2Irfan Sheriff break; 17919d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff default: 18019d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff Log.e(TAG, "Ignoring " + message); 18119d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff break; 18219d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff } 18319d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff return HANDLED; 18419d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff } 18519d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff } 18619d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff 187b45e726bf5df9650e8a67a7c05bf2f41f414c07dIrfan Sheriff /* 188b45e726bf5df9650e8a67a7c05bf2f41f414c07dIrfan Sheriff * This indicates that the supplicant state as seen 189b45e726bf5df9650e8a67a7c05bf2f41f414c07dIrfan Sheriff * by the framework is not initialized yet. We are 190b45e726bf5df9650e8a67a7c05bf2f41f414c07dIrfan Sheriff * in this state right after establishing a control 191b45e726bf5df9650e8a67a7c05bf2f41f414c07dIrfan Sheriff * channel connection before any supplicant events 192b45e726bf5df9650e8a67a7c05bf2f41f414c07dIrfan Sheriff * or after we have lost the control channel 193b45e726bf5df9650e8a67a7c05bf2f41f414c07dIrfan Sheriff * connection to the supplicant 194b45e726bf5df9650e8a67a7c05bf2f41f414c07dIrfan Sheriff */ 19564c42cae4482fe0157e977b8ddd0f2c2436b3f31Wink Saville class UninitializedState extends State { 19619d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff @Override 19719d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff public void enter() { 19819d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff if (DBG) Log.d(TAG, getName() + "\n"); 19919d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff } 20019d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff } 20119d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff 20264c42cae4482fe0157e977b8ddd0f2c2436b3f31Wink Saville class InactiveState extends State { 20319d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff @Override 20419d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff public void enter() { 20519d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff if (DBG) Log.d(TAG, getName() + "\n"); 20619d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff } 20719d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff } 20819d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff 20964c42cae4482fe0157e977b8ddd0f2c2436b3f31Wink Saville class DisconnectedState extends State { 21019d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff @Override 21119d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff public void enter() { 21219d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff if (DBG) Log.d(TAG, getName() + "\n"); 213b98d878f43748a64c68ffe05ce64c5b7c72fe922Irfan Sheriff /* If a disconnect event happens after authentication failure 21419d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff * exceeds maximum retries, disable the network 21519d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff */ 21619d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff Message message = getCurrentMessage(); 21719d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff StateChangeResult stateChangeResult = (StateChangeResult) message.obj; 21819d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff 219b98d878f43748a64c68ffe05ce64c5b7c72fe922Irfan Sheriff if (mAuthenticationFailuresCount >= MAX_RETRIES_ON_AUTHENTICATION_FAILURE) { 22019d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff Log.d(TAG, "Failed to authenticate, disabling network " + 22119d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff stateChangeResult.networkId); 2228e86b89860114386e6c43f55fc034a26798b73e2Irfan Sheriff handleNetworkConnectionFailure(stateChangeResult.networkId); 223b98d878f43748a64c68ffe05ce64c5b7c72fe922Irfan Sheriff mAuthenticationFailuresCount = 0; 22419d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff } 22519d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff } 22619d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff } 22719d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff 22864c42cae4482fe0157e977b8ddd0f2c2436b3f31Wink Saville class ScanState extends State { 22919d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff @Override 23019d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff public void enter() { 23119d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff if (DBG) Log.d(TAG, getName() + "\n"); 23219d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff } 23319d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff } 23419d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff 23564c42cae4482fe0157e977b8ddd0f2c2436b3f31Wink Saville class HandshakeState extends State { 23619d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff /** 23719d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff * The max number of the WPA supplicant loop iterations before we 23819d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff * decide that the loop should be terminated: 23919d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff */ 24019d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff private static final int MAX_SUPPLICANT_LOOP_ITERATIONS = 4; 24119d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff private int mLoopDetectIndex; 24219d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff private int mLoopDetectCount; 24319d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff 24419d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff @Override 24519d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff public void enter() { 24619d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff if (DBG) Log.d(TAG, getName() + "\n"); 24719d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff mLoopDetectIndex = 0; 24819d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff mLoopDetectCount = 0; 24919d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff } 25019d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff @Override 25119d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff public boolean processMessage(Message message) { 25219d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff if (DBG) Log.d(TAG, getName() + message.toString() + "\n"); 25319d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff switch (message.what) { 25455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT: 25519d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff StateChangeResult stateChangeResult = (StateChangeResult) message.obj; 256b45e726bf5df9650e8a67a7c05bf2f41f414c07dIrfan Sheriff SupplicantState state = stateChangeResult.state; 257319da8c4c59be36fe2e221a0aba230ef6b77a14fIrfan Sheriff if (SupplicantState.isHandshakeState(state)) { 25819d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff if (mLoopDetectIndex > state.ordinal()) { 25919d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff mLoopDetectCount++; 26019d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff } 26119d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff if (mLoopDetectCount > MAX_SUPPLICANT_LOOP_ITERATIONS) { 26219d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff Log.d(TAG, "Supplicant loop detected, disabling network " + 26319d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff stateChangeResult.networkId); 2648e86b89860114386e6c43f55fc034a26798b73e2Irfan Sheriff handleNetworkConnectionFailure(stateChangeResult.networkId); 26519d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff } 26619d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff mLoopDetectIndex = state.ordinal(); 267b45e726bf5df9650e8a67a7c05bf2f41f414c07dIrfan Sheriff sendSupplicantStateChangedBroadcast(state, 26819d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff mAuthFailureInSupplicantBroadcast); 26919d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff } else { 27019d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff //Have the DefaultState handle the transition 27119d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff return NOT_HANDLED; 27219d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff } 27319d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff break; 27419d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff default: 27519d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff return NOT_HANDLED; 27619d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff } 27719d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff return HANDLED; 27819d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff } 27919d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff } 28019d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff 28164c42cae4482fe0157e977b8ddd0f2c2436b3f31Wink Saville class CompletedState extends State { 28219d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff @Override 28319d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff public void enter() { 28419d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff if (DBG) Log.d(TAG, getName() + "\n"); 285b98d878f43748a64c68ffe05ce64c5b7c72fe922Irfan Sheriff /* Reset authentication failure count */ 286b98d878f43748a64c68ffe05ce64c5b7c72fe922Irfan Sheriff mAuthenticationFailuresCount = 0; 2878e86b89860114386e6c43f55fc034a26798b73e2Irfan Sheriff if (mNetworksDisabledDuringConnect) { 2888e86b89860114386e6c43f55fc034a26798b73e2Irfan Sheriff WifiConfigStore.enableAllNetworks(); 2898e86b89860114386e6c43f55fc034a26798b73e2Irfan Sheriff mNetworksDisabledDuringConnect = false; 2908e86b89860114386e6c43f55fc034a26798b73e2Irfan Sheriff } 2918e86b89860114386e6c43f55fc034a26798b73e2Irfan Sheriff } 29219d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff @Override 29319d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff public boolean processMessage(Message message) { 29419d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff if (DBG) Log.d(TAG, getName() + message.toString() + "\n"); 29519d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff switch(message.what) { 29655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT: 29719d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff StateChangeResult stateChangeResult = (StateChangeResult) message.obj; 298b45e726bf5df9650e8a67a7c05bf2f41f414c07dIrfan Sheriff SupplicantState state = stateChangeResult.state; 299b45e726bf5df9650e8a67a7c05bf2f41f414c07dIrfan Sheriff sendSupplicantStateChangedBroadcast(state, mAuthFailureInSupplicantBroadcast); 300319da8c4c59be36fe2e221a0aba230ef6b77a14fIrfan Sheriff /* Ignore any connecting state in completed state. Group re-keying 301319da8c4c59be36fe2e221a0aba230ef6b77a14fIrfan Sheriff * events and other auth events that do not affect connectivity are 302319da8c4c59be36fe2e221a0aba230ef6b77a14fIrfan Sheriff * ignored 303319da8c4c59be36fe2e221a0aba230ef6b77a14fIrfan Sheriff */ 304319da8c4c59be36fe2e221a0aba230ef6b77a14fIrfan Sheriff if (SupplicantState.isConnecting(state)) { 30519d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff break; 30619d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff } 30719d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff transitionOnSupplicantStateChange(stateChangeResult); 30819d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff break; 309b45e726bf5df9650e8a67a7c05bf2f41f414c07dIrfan Sheriff case WifiStateMachine.CMD_RESET_SUPPLICANT_STATE: 310b45e726bf5df9650e8a67a7c05bf2f41f414c07dIrfan Sheriff sendSupplicantStateChangedBroadcast(SupplicantState.DISCONNECTED, false); 311b45e726bf5df9650e8a67a7c05bf2f41f414c07dIrfan Sheriff transitionTo(mUninitializedState); 312b45e726bf5df9650e8a67a7c05bf2f41f414c07dIrfan Sheriff break; 31319d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff default: 31419d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff return NOT_HANDLED; 31519d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff } 31619d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff return HANDLED; 31719d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff } 31819d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff } 31919d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff 32019d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff //TODO: remove after getting rid of the state in supplicant 32164c42cae4482fe0157e977b8ddd0f2c2436b3f31Wink Saville class DormantState extends State { 32219d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff @Override 32319d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff public void enter() { 32419d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff if (DBG) Log.d(TAG, getName() + "\n"); 32519d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff } 32619d245b792e1d941fbba9b04ae20ce9d6e6e18f8Irfan Sheriff } 3276bb7652b47b7c3068fa5e20a20263e651180c856Irfan Sheriff} 328