diff options
author | Rebecca Silberstein <silberst@google.com> | 2018-04-19 13:24:12 -0700 |
---|---|---|
committer | Rebecca Silberstein <silberst@google.com> | 2018-04-19 13:24:12 -0700 |
commit | 91c1a804938164cb5c4309a160a576a24648ed6c (patch) | |
tree | b9a943ff7008ce491f1a60d0bbac2bd23d390590 /service | |
parent | 080c2f856866353e300ec431acc106eb076bfeb6 (diff) |
WifiStateMachine: switch modes immediately
When switching modes, do it immediately instead of sending a message.
To trigger the transition, moved SET_OPERATIONAL_MODE to be a simple
trigger for the transition. The states themselves manage the state.
Bug: 78268615
Test: frameworks/opt/net/wifi/tests/wifitests/runtests.sh
Test: manually toggled airplane mode repeatedly (and quickly)
Test: manually toggled wifi repeatedly (and quickly)
Change-Id: I024174c140e610c7d84fc4d42b1dee3487d23b97
Diffstat (limited to 'service')
-rw-r--r-- | service/java/com/android/server/wifi/WifiStateMachine.java | 45 |
1 files changed, 23 insertions, 22 deletions
diff --git a/service/java/com/android/server/wifi/WifiStateMachine.java b/service/java/com/android/server/wifi/WifiStateMachine.java index 32427c92c..c274b0198 100644 --- a/service/java/com/android/server/wifi/WifiStateMachine.java +++ b/service/java/com/android/server/wifi/WifiStateMachine.java @@ -1453,8 +1453,22 @@ public class WifiStateMachine extends StateMachine { log("setting operational mode to " + String.valueOf(mode) + " for iface: " + ifaceName); } mModeChange = true; - mInterfaceName = ifaceName; - sendMessage(CMD_SET_OPERATIONAL_MODE, mode, 0); + if (mode != CONNECT_MODE) { + // we are disabling client mode... need to exit connect mode now + transitionTo(mDefaultState); + } else { + // do a quick sanity check on the iface name, make sure it isn't null + if (ifaceName != null) { + mInterfaceName = ifaceName; + transitionTo(mDisconnectedState); + } else { + Log.e(TAG, "supposed to enter connect mode, but iface is null -> DefaultState"); + transitionTo(mDefaultState); + } + } + // use the CMD_SET_OPERATIONAL_MODE to force the transitions before other messages are + // handled. + sendMessageAtFrontOfQueue(CMD_SET_OPERATIONAL_MODE); } /** @@ -3427,20 +3441,8 @@ public class WifiStateMachine extends StateMachine { messageHandlingStatus = MESSAGE_HANDLING_STATUS_DISCARD; break; case CMD_SET_OPERATIONAL_MODE: - mOperationalMode = message.arg1; - // now processing the mode change - we will start setting up new state and want - // to know about failures - mModeChange = false; - if (mOperationalMode == DISABLED_MODE) { - Log.d(TAG, "set operational mode - disabled. stay in default"); - transitionTo(mDefaultState); - break; - } else if (mOperationalMode == CONNECT_MODE) { - transitionTo(mDisconnectedState); - } else { - Log.e(TAG, "set operational mode with invalid mode: " + mOperationalMode); - mOperationalMode = DISABLED_MODE; - } + // using the CMD_SET_OPERATIONAL_MODE (sent at front of queue) to trigger the + // state transitions performed in setOperationalMode. break; case CMD_SET_SUSPEND_OPT_ENABLED: if (message.arg1 == 1) { @@ -3698,6 +3700,7 @@ public class WifiStateMachine extends StateMachine { * Helper method to start other services and get state ready for client mode */ private void setupClientMode() { + Log.d(TAG, "setupClientMode() ifacename = " + mInterfaceName); mWifiStateTracker.updateState(WifiStateTracker.INVALID); if (mWifiConnectivityManager == null) { @@ -3798,6 +3801,7 @@ public class WifiStateMachine extends StateMachine { mNetworkInfo.setIsAvailable(false); if (mNetworkAgent != null) mNetworkAgent.sendNetworkInfo(mNetworkInfo); mCountryCode.setReadyForChange(false); + mInterfaceName = null; setWifiState(WIFI_STATE_DISABLED); } @@ -3861,6 +3865,8 @@ public class WifiStateMachine extends StateMachine { @Override public void enter() { + Log.d(TAG, "entering ConnectModeState: ifaceName = " + mInterfaceName); + mOperationalMode = CONNECT_MODE; setupClientMode(); if (!mWifiNative.removeAllNetworks(mInterfaceName)) { loge("Failed to remove networks on entering connect mode"); @@ -3889,6 +3895,7 @@ public class WifiStateMachine extends StateMachine { @Override public void exit() { + mOperationalMode = DISABLED_MODE; // Let the system know that wifi is not available since we are exiting client mode. mNetworkInfo.setIsAvailable(false); if (mNetworkAgent != null) mNetworkAgent.sendNetworkInfo(mNetworkInfo); @@ -3925,12 +3932,6 @@ public class WifiStateMachine extends StateMachine { logStateAndMessage(message, this); switch (message.what) { - case CMD_SET_OPERATIONAL_MODE: - if (message.arg1 == CONNECT_MODE) { - break; - } else { - return NOT_HANDLED; - } case WifiMonitor.ASSOCIATION_REJECTION_EVENT: mWifiDiagnostics.captureBugReportData( WifiDiagnostics.REPORT_REASON_ASSOC_FAILURE); |