diff options
-rw-r--r-- | service/java/com/android/server/wifi/WifiStateMachine.java | 453 |
1 files changed, 204 insertions, 249 deletions
diff --git a/service/java/com/android/server/wifi/WifiStateMachine.java b/service/java/com/android/server/wifi/WifiStateMachine.java index 08b08d55b..5b79d31e6 100644 --- a/service/java/com/android/server/wifi/WifiStateMachine.java +++ b/service/java/com/android/server/wifi/WifiStateMachine.java @@ -455,10 +455,6 @@ public class WifiStateMachine extends StateMachine { /* The base for wifi message types */ static final int BASE = Protocol.BASE_WIFI; - /* Start the STA interface */ - static final int CMD_START_SUPPLICANT = BASE + 11; - /* Stop the STA interface */ - static final int CMD_STOP_SUPPLICANT = BASE + 12; /* STA interface destroyed */ static final int CMD_INTERFACE_DESTROYED = BASE + 13; /* STA interface down */ @@ -770,8 +766,6 @@ public class WifiStateMachine extends StateMachine { private State mDefaultState = new DefaultState(); /* Temporary initial state */ private State mInitialState = new InitialState(); - /* Driver loaded and supplicant ready */ - private State mSupplicantStartedState = new SupplicantStartedState(); /* Scan for networks, no connection will be established */ private State mScanModeState = new ScanModeState(); /* Connecting to an access point */ @@ -991,14 +985,13 @@ public class WifiStateMachine extends StateMachine { // CHECKSTYLE:OFF IndentationCheck addState(mDefaultState); addState(mInitialState, mDefaultState); - addState(mSupplicantStartedState, mInitialState); - addState(mConnectModeState, mSupplicantStartedState); - addState(mL2ConnectedState, mConnectModeState); - addState(mObtainingIpState, mL2ConnectedState); - addState(mConnectedState, mL2ConnectedState); - addState(mRoamingState, mL2ConnectedState); - addState(mDisconnectingState, mConnectModeState); - addState(mDisconnectedState, mConnectModeState); + addState(mConnectModeState, mInitialState); + addState(mL2ConnectedState, mConnectModeState); + addState(mObtainingIpState, mL2ConnectedState); + addState(mConnectedState, mL2ConnectedState); + addState(mRoamingState, mL2ConnectedState); + addState(mDisconnectingState, mConnectModeState); + addState(mDisconnectedState, mConnectModeState); addState(mScanModeState, mDefaultState); addState(mSoftApState, mDefaultState); // CHECKSTYLE:ON IndentationCheck @@ -1449,17 +1442,6 @@ public class WifiStateMachine extends StateMachine { /** * TODO: doc */ - public void setSupplicantRunning(boolean enable) { - if (enable) { - sendMessage(CMD_START_SUPPLICANT); - } else { - sendMessage(CMD_STOP_SUPPLICANT); - } - } - - /** - * TODO: doc - */ public void setHostApRunning(SoftApModeConfiguration wifiConfig, boolean enable) { if (enable) { sendMessage(CMD_START_AP, wifiConfig); @@ -3503,8 +3485,6 @@ public class WifiStateMachine extends StateMachine { case CMD_SCREEN_STATE_CHANGED: handleScreenStateChanged(message.arg1 != 0); break; - case CMD_START_SUPPLICANT: - case CMD_STOP_SUPPLICANT: case CMD_START_AP_FAILURE: case CMD_STOP_AP: case CMD_AP_STOPPED: @@ -3554,7 +3534,7 @@ public class WifiStateMachine extends StateMachine { transitionTo(mDefaultState); break; } else if (mOperationalMode == CONNECT_MODE) { - transitionTo(mInitialState); + transitionTo(mDisconnectedState); } else if (mOperationalMode == SCAN_ONLY_MODE || mOperationalMode == SCAN_ONLY_WITH_WIFI_OFF_MODE) { transitionTo(mScanModeState); @@ -3760,86 +3740,7 @@ public class WifiStateMachine extends StateMachine { mIfaceIsUp = false; mWifiStateTracker.updateState(WifiStateTracker.INVALID); cleanup(); - sendMessage(CMD_START_SUPPLICANT); setWifiState(WIFI_STATE_ENABLING); - } - - @Override - public boolean processMessage(Message message) { - logStateAndMessage(message, this); - switch (message.what) { - case CMD_START_SUPPLICANT: - mInterfaceName = mWifiNative.setupInterfaceForClientMode(false, - mWifiNativeInterfaceCallback); - if (TextUtils.isEmpty(mInterfaceName)) { - Log.e(TAG, "setup failure when creating client interface."); - setWifiState(WifiManager.WIFI_STATE_UNKNOWN); - transitionTo(mDefaultState); - break; - } - // now that we have the interface, initialize our up/down status - onUpChanged(mWifiNative.isInterfaceUp(mInterfaceName)); - - mIpClient = mFacade.makeIpClient( - mContext, mInterfaceName, new IpClientCallback()); - mIpClient.setMulticastFilter(true); - if (mVerboseLoggingEnabled) log("Supplicant start successful"); - registerForWifiMonitorEvents(); - mWifiInjector.getWifiLastResortWatchdog().clearAllFailureCounts(); - setSupplicantLogLevel(); - transitionTo(mSupplicantStartedState); - break; - case CMD_SET_OPERATIONAL_MODE: - if (message.arg1 == CONNECT_MODE) { - break; - } else { - return NOT_HANDLED; - } - case CMD_INTERFACE_STATUS_CHANGED: - boolean isUp = message.arg1 == 1; - // For now, this message can be triggered due to link state and/or interface - // status changes (b/77218676). First check if we really see an iface down by - // consulting our view of supplicant state. - if (!isUp && SupplicantState.isDriverActive(mWifiInfo.getSupplicantState())) { - // the driver is active, so this could just be part of normal operation, do - // not disable wifi in these cases (ex, a network was removed) or worry - // about the link status - break; - } - - onUpChanged(isUp); - break; - default: - return NOT_HANDLED; - } - return HANDLED; - } - } - - class SupplicantStartedState extends State { - @Override - public void enter() { - if (mVerboseLoggingEnabled) { - logd("SupplicantStartedState enter"); - } - - // reset state related to supplicant starting - mSupplicantStateTracker.sendMessage(CMD_RESET_SUPPLICANT_STATE); - // Initialize data structures - mLastBssid = null; - mLastNetworkId = WifiConfiguration.INVALID_NETWORK_ID; - mLastSignalLevel = -1; - mWifiInfo.setMacAddress(mWifiNative.getMacAddress(mInterfaceName)); - // Attempt to migrate data out of legacy store. - if (!mWifiConfigManager.migrateFromLegacyStore()) { - Log.e(TAG, "Failed to migrate from legacy config store"); - } - sendSupplicantConnectionChangedBroadcast(true); - - mWifiNative.setExternalSim(mInterfaceName, true); - - setRandomMacOui(); - mCountryCode.setReadyForChange(true); if (mWifiConnectivityManager == null) { synchronized (mWifiReqCountLock) { @@ -3851,151 +3752,14 @@ public class WifiStateMachine extends StateMachine { } } - mWifiDiagnostics.startLogging(mVerboseLoggingEnabled); - mIsRunning = true; - updateBatteryWorkSource(null); - /** - * Enable bluetooth coexistence scan mode when bluetooth connection is active. - * When this mode is on, some of the low-level scan parameters used by the - * driver are changed to reduce interference with bluetooth - */ - mWifiNative.setBluetoothCoexistenceScanMode(mInterfaceName, mBluetoothConnectionActive); - // Check if there is a voice call on-going and set/reset the tx power limit - // appropriately. - if (mEnableVoiceCallSarTxPowerLimit) { - if (getTelephonyManager().isOffhook()) { - sendMessage(CMD_SELECT_TX_POWER_SCENARIO, - WifiNative.TX_POWER_SCENARIO_VOICE_CALL); - } else { - sendMessage(CMD_SELECT_TX_POWER_SCENARIO, - WifiNative.TX_POWER_SCENARIO_NORMAL); - } - } - - // initialize network state - setNetworkDetailedState(DetailedState.DISCONNECTED); - - // Disable legacy multicast filtering, which on some chipsets defaults to enabled. - // Legacy IPv6 multicast filtering blocks ICMPv6 router advertisements which breaks IPv6 - // provisioning. Legacy IPv4 multicast filtering may be re-enabled later via - // IpClient.Callback.setFallbackMulticastFilter() - mWifiNative.stopFilteringMulticastV4Packets(mInterfaceName); - mWifiNative.stopFilteringMulticastV6Packets(mInterfaceName); - - // Transitioning to Disconnected state will trigger a scan and subsequently AutoJoin - transitionTo(mDisconnectedState); - - // Set the right suspend mode settings - mWifiNative.setSuspendOptimizations(mInterfaceName, mSuspendOptNeedsDisabled == 0 - && mUserWantsSuspendOpt.get()); - - mWifiNative.setPowerSave(mInterfaceName, true); - - if (mP2pSupported) { - p2pSendMessage(WifiStateMachine.CMD_ENABLE_P2P); - } - - // Disable wpa_supplicant from auto reconnecting. - mWifiNative.enableStaAutoReconnect(mInterfaceName, false); - // STA has higher priority over P2P - mWifiNative.setConcurrencyPriority(true); - } - - @Override - public boolean processMessage(Message message) { - logStateAndMessage(message, this); - - switch(message.what) { - case CMD_TARGET_BSSID: - // Trying to associate to this BSSID - if (message.obj != null) { - mTargetRoamBSSID = (String) message.obj; - } - break; - case CMD_GET_LINK_LAYER_STATS: - WifiLinkLayerStats stats = getWifiLinkLayerStats(); - replyToMessage(message, message.what, stats); - break; - case CMD_RESET_SIM_NETWORKS: - log("resetting EAP-SIM/AKA/AKA' networks since SIM was changed"); - mWifiConfigManager.resetSimNetworks(message.arg1 == 1); - break; - case CMD_BLUETOOTH_ADAPTER_STATE_CHANGE: - mBluetoothConnectionActive = (message.arg1 != - BluetoothAdapter.STATE_DISCONNECTED); - mWifiNative.setBluetoothCoexistenceScanMode( - mInterfaceName, mBluetoothConnectionActive); - break; - case CMD_SET_SUSPEND_OPT_ENABLED: - if (message.arg1 == 1) { - setSuspendOptimizationsNative(SUSPEND_DUE_TO_SCREEN, true); - if (message.arg2 == 1) { - mSuspendWakeLock.release(); - } - } else { - setSuspendOptimizationsNative(SUSPEND_DUE_TO_SCREEN, false); - } - break; - case CMD_SET_HIGH_PERF_MODE: - if (message.arg1 == 1) { - setSuspendOptimizationsNative(SUSPEND_DUE_TO_HIGH_PERF, false); - } else { - setSuspendOptimizationsNative(SUSPEND_DUE_TO_HIGH_PERF, true); - } - break; - case CMD_ENABLE_TDLS: - if (message.obj != null) { - String remoteAddress = (String) message.obj; - boolean enable = (message.arg1 == 1); - mWifiNative.startTdls(mInterfaceName, remoteAddress, enable); - } - break; - case WifiMonitor.ANQP_DONE_EVENT: - // TODO(zqiu): remove this when switch over to wificond for ANQP requests. - mPasspointManager.notifyANQPDone((AnqpEvent) message.obj); - break; - case CMD_STOP_IP_PACKET_OFFLOAD: { - int slot = message.arg1; - int ret = stopWifiIPPacketOffload(slot); - if (mNetworkAgent != null) { - mNetworkAgent.onPacketKeepaliveEvent(slot, ret); - } - break; - } - case WifiMonitor.RX_HS20_ANQP_ICON_EVENT: - // TODO(zqiu): remove this when switch over to wificond for icon requests. - mPasspointManager.notifyIconDone((IconEvent) message.obj); - break; - case WifiMonitor.HS20_REMEDIATION_EVENT: - // TODO(zqiu): remove this when switch over to wificond for WNM frames - // monitoring. - mPasspointManager.receivedWnmFrame((WnmData) message.obj); - break; - case CMD_CONFIG_ND_OFFLOAD: - final boolean enabled = (message.arg1 > 0); - mWifiNative.configureNeighborDiscoveryOffload(mInterfaceName, enabled); - break; - case CMD_ENABLE_WIFI_CONNECTIVITY_MANAGER: - mWifiConnectivityManager.enable(message.arg1 == 1 ? true : false); - break; - case CMD_SELECT_TX_POWER_SCENARIO: - int txPowerScenario = message.arg1; - logd("Setting Tx power scenario to " + txPowerScenario); - if (!mWifiNative.selectTxPowerScenario(txPowerScenario)) { - loge("Failed to set TX power scenario"); - } - break; - default: - return NOT_HANDLED; - } - return HANDLED; + setupClientMode(); + // now that we have the interface, initialize our up/down status + onUpChanged(mWifiNative.isInterfaceUp(mInterfaceName)); } @Override public void exit() { setWifiState(WIFI_STATE_DISABLING); - // when client mode is moved to WSMP, cleanup will be done on exit. For now, cleanup is - // done when entering a mode. // exiting supplicant started state is now only applicable to client mode mWifiDiagnostics.stopLogging(); @@ -4006,8 +3770,6 @@ public class WifiStateMachine extends StateMachine { p2pSendMessage(WifiStateMachine.CMD_DISABLE_P2P_REQ); } - handleNetworkDisconnect(); - mIsRunning = false; updateBatteryWorkSource(null); @@ -4016,6 +3778,36 @@ public class WifiStateMachine extends StateMachine { mCountryCode.setReadyForChange(false); setWifiState(WIFI_STATE_DISABLED); } + + @Override + public boolean processMessage(Message message) { + logStateAndMessage(message, this); + switch (message.what) { + case CMD_SET_OPERATIONAL_MODE: + if (message.arg1 == CONNECT_MODE) { + break; + } else { + return NOT_HANDLED; + } + case CMD_INTERFACE_STATUS_CHANGED: + boolean isUp = message.arg1 == 1; + // For now, this message can be triggered due to link state and/or interface + // status changes (b/77218676). First check if we really see an iface down by + // consulting our view of supplicant state. + if (!isUp && SupplicantState.isDriverActive(mWifiInfo.getSupplicantState())) { + // the driver is active, so this could just be part of normal operation, do + // not disable wifi in these cases (ex, a network was removed) or worry + // about the link status + break; + } + + onUpChanged(isUp); + break; + default: + return NOT_HANDLED; + } + return HANDLED; + } } class ScanModeState extends State { @@ -4136,6 +3928,89 @@ public class WifiStateMachine extends StateMachine { return s; } + /** + * Helper method to start other services and get state ready for client mode + */ + private void setupClientMode() { + mInterfaceName = mWifiNative.setupInterfaceForClientMode(false, + mWifiNativeInterfaceCallback); + if (TextUtils.isEmpty(mInterfaceName)) { + Log.e(TAG, "setup failure when creating client interface."); + setWifiState(WifiManager.WIFI_STATE_UNKNOWN); + transitionTo(mDefaultState); + return; + } + + mIpClient = mFacade.makeIpClient(mContext, mInterfaceName, new IpClientCallback()); + mIpClient.setMulticastFilter(true); + registerForWifiMonitorEvents(); + mWifiMonitor.startMonitoring(mInterfaceName); + mWifiInjector.getWifiLastResortWatchdog().clearAllFailureCounts(); + setSupplicantLogLevel(); + + // reset state related to supplicant starting + mSupplicantStateTracker.sendMessage(CMD_RESET_SUPPLICANT_STATE); + // Initialize data structures + mLastBssid = null; + mLastNetworkId = WifiConfiguration.INVALID_NETWORK_ID; + mLastSignalLevel = -1; + mWifiInfo.setMacAddress(mWifiNative.getMacAddress(mInterfaceName)); + // Attempt to migrate data out of legacy store. + if (!mWifiConfigManager.migrateFromLegacyStore()) { + Log.e(TAG, "Failed to migrate from legacy config store"); + } + sendSupplicantConnectionChangedBroadcast(true); + + mWifiNative.setExternalSim(mInterfaceName, true); + + setRandomMacOui(); + mCountryCode.setReadyForChange(true); + + mWifiDiagnostics.startLogging(mVerboseLoggingEnabled); + mIsRunning = true; + updateBatteryWorkSource(null); + + /** + * Enable bluetooth coexistence scan mode when bluetooth connection is active. + * When this mode is on, some of the low-level scan parameters used by the + * driver are changed to reduce interference with bluetooth + */ + mWifiNative.setBluetoothCoexistenceScanMode(mInterfaceName, mBluetoothConnectionActive); + // Check if there is a voice call on-going and set/reset the tx power limit appropriately. + if (mEnableVoiceCallSarTxPowerLimit) { + if (getTelephonyManager().isOffhook()) { + sendMessage(CMD_SELECT_TX_POWER_SCENARIO, WifiNative.TX_POWER_SCENARIO_VOICE_CALL); + } else { + sendMessage(CMD_SELECT_TX_POWER_SCENARIO, WifiNative.TX_POWER_SCENARIO_NORMAL); + } + } + + // initialize network state + setNetworkDetailedState(DetailedState.DISCONNECTED); + + // Disable legacy multicast filtering, which on some chipsets defaults to enabled. + // Legacy IPv6 multicast filtering blocks ICMPv6 router advertisements which breaks IPv6 + // provisioning. Legacy IPv4 multicast filtering may be re-enabled later via + // IpClient.Callback.setFallbackMulticastFilter() + mWifiNative.stopFilteringMulticastV4Packets(mInterfaceName); + mWifiNative.stopFilteringMulticastV6Packets(mInterfaceName); + + // Set the right suspend mode settings + mWifiNative.setSuspendOptimizations(mInterfaceName, mSuspendOptNeedsDisabled == 0 + && mUserWantsSuspendOpt.get()); + + mWifiNative.setPowerSave(mInterfaceName, true); + + if (mP2pSupported) { + p2pSendMessage(WifiStateMachine.CMD_ENABLE_P2P); + } + + // Disable wpa_supplicant from auto reconnecting. + mWifiNative.enableStaAutoReconnect(mInterfaceName, false); + // STA has higher priority over P2P + mWifiNative.setConcurrencyPriority(true); + } + void registerConnected() { if (mLastNetworkId != WifiConfiguration.INVALID_NETWORK_ID) { mWifiConfigManager.updateNetworkAfterConnect(mLastNetworkId); @@ -4786,6 +4661,86 @@ public class WifiStateMachine extends StateMachine { replyToMessage(message, message.what, mPasspointManager.getAllMatchingWifiConfigs((ScanResult) message.obj)); break; + case CMD_TARGET_BSSID: + // Trying to associate to this BSSID + if (message.obj != null) { + mTargetRoamBSSID = (String) message.obj; + } + break; + case CMD_GET_LINK_LAYER_STATS: + WifiLinkLayerStats stats = getWifiLinkLayerStats(); + replyToMessage(message, message.what, stats); + break; + case CMD_RESET_SIM_NETWORKS: + log("resetting EAP-SIM/AKA/AKA' networks since SIM was changed"); + mWifiConfigManager.resetSimNetworks(message.arg1 == 1); + break; + case CMD_BLUETOOTH_ADAPTER_STATE_CHANGE: + mBluetoothConnectionActive = (message.arg1 + != BluetoothAdapter.STATE_DISCONNECTED); + mWifiNative.setBluetoothCoexistenceScanMode( + mInterfaceName, mBluetoothConnectionActive); + break; + case CMD_SET_SUSPEND_OPT_ENABLED: + if (message.arg1 == 1) { + setSuspendOptimizationsNative(SUSPEND_DUE_TO_SCREEN, true); + if (message.arg2 == 1) { + mSuspendWakeLock.release(); + } + } else { + setSuspendOptimizationsNative(SUSPEND_DUE_TO_SCREEN, false); + } + break; + case CMD_SET_HIGH_PERF_MODE: + if (message.arg1 == 1) { + setSuspendOptimizationsNative(SUSPEND_DUE_TO_HIGH_PERF, false); + } else { + setSuspendOptimizationsNative(SUSPEND_DUE_TO_HIGH_PERF, true); + } + break; + case CMD_ENABLE_TDLS: + if (message.obj != null) { + String remoteAddress = (String) message.obj; + boolean enable = (message.arg1 == 1); + mWifiNative.startTdls(mInterfaceName, remoteAddress, enable); + } + break; + case WifiMonitor.ANQP_DONE_EVENT: + // TODO(zqiu): remove this when switch over to wificond for ANQP requests. + mPasspointManager.notifyANQPDone((AnqpEvent) message.obj); + break; + case CMD_STOP_IP_PACKET_OFFLOAD: { + int slot = message.arg1; + int ret = stopWifiIPPacketOffload(slot); + if (mNetworkAgent != null) { + mNetworkAgent.onPacketKeepaliveEvent(slot, ret); + } + break; + } + case WifiMonitor.RX_HS20_ANQP_ICON_EVENT: + // TODO(zqiu): remove this when switch over to wificond for icon requests. + mPasspointManager.notifyIconDone((IconEvent) message.obj); + break; + case WifiMonitor.HS20_REMEDIATION_EVENT: + // TODO(zqiu): remove this when switch over to wificond for WNM frames + // monitoring. + mPasspointManager.receivedWnmFrame((WnmData) message.obj); + break; + case CMD_CONFIG_ND_OFFLOAD: + final boolean enabled = (message.arg1 > 0); + mWifiNative.configureNeighborDiscoveryOffload(mInterfaceName, enabled); + break; + case CMD_ENABLE_WIFI_CONNECTIVITY_MANAGER: + mWifiConnectivityManager.enable(message.arg1 == 1 ? true : false); + break; + case CMD_SELECT_TX_POWER_SCENARIO: + int txPowerScenario = message.arg1; + logd("Setting Tx power scenario to " + txPowerScenario); + if (!mWifiNative.selectTxPowerScenario(txPowerScenario)) { + loge("Failed to set TX power scenario"); + } + break; + default: return NOT_HANDLED; } |