diff options
author | Rebecca Silberstein <silberst@google.com> | 2018-05-16 08:58:42 -0700 |
---|---|---|
committer | Rebecca Silberstein <silberst@google.com> | 2018-05-18 11:12:59 -0700 |
commit | f7814ce9117a6622dd1662cbe9396b1684447004 (patch) | |
tree | 0fa3322d74406bf256eeb76d1b0e82466e64cf98 /service | |
parent | e93744bec9cb63b00b4597d49a20378749634358 (diff) |
ModeManagers: do not report disabled when stopped
When Client and Scan modes are explicitly stopped, there is no need to
report state changes to WSMP.
Bug: 79532177
Test: toggle wifi quickly
Test: WifiCrashTest
Test: atest android.net.wifi.cts
Change-Id: I133f486159f3c475084619cddfd6da482a17c00a
Diffstat (limited to 'service')
3 files changed, 38 insertions, 1 deletions
diff --git a/service/java/com/android/server/wifi/ClientModeManager.java b/service/java/com/android/server/wifi/ClientModeManager.java index 922d21958..b5300d24c 100644 --- a/service/java/com/android/server/wifi/ClientModeManager.java +++ b/service/java/com/android/server/wifi/ClientModeManager.java @@ -53,6 +53,8 @@ public class ClientModeManager implements ActiveModeManager { private String mClientInterfaceName; private boolean mIfaceIsUp = false; + private boolean mExpectedStop = false; + ClientModeManager(Context context, @NonNull Looper looper, WifiNative wifiNative, Listener listener, WifiMetrics wifiMetrics, ScanRequestProxy scanRequestProxy, WifiStateMachine wifiStateMachine) { @@ -77,6 +79,7 @@ public class ClientModeManager implements ActiveModeManager { */ public void stop() { Log.d(TAG, " currentstate: " + getCurrentStateName()); + mExpectedStop = true; if (mClientInterfaceName != null) { if (mIfaceIsUp) { updateWifiState(WifiManager.WIFI_STATE_DISABLING, @@ -127,7 +130,19 @@ public class ClientModeManager implements ActiveModeManager { * @param currentState current wifi state */ private void updateWifiState(int newState, int currentState) { - mListener.onStateChanged(newState); + if (!mExpectedStop) { + mListener.onStateChanged(newState); + } else { + Log.d(TAG, "expected stop, not triggering callbacks: newState = " + newState); + } + + // Once we report the mode has stopped/failed any other stop signals are redundant + // note: this can happen in failure modes where we get multiple callbacks as underlying + // components/interface stops or the underlying interface is destroyed in cleanup + if (newState == WifiManager.WIFI_STATE_UNKNOWN + || newState == WifiManager.WIFI_STATE_DISABLED) { + mExpectedStop = true; + } if (newState == WifiManager.WIFI_STATE_UNKNOWN) { // do not need to broadcast failure to system @@ -314,6 +329,9 @@ public class ClientModeManager implements ActiveModeManager { updateWifiState(WifiManager.WIFI_STATE_DISABLED, WifiManager.WIFI_STATE_DISABLING); + + // once we leave started, nothing else to do... stop the state machine + mStateMachine.quitNow(); } } diff --git a/service/java/com/android/server/wifi/ScanOnlyModeManager.java b/service/java/com/android/server/wifi/ScanOnlyModeManager.java index a98c6ba66..346d2ca67 100644 --- a/service/java/com/android/server/wifi/ScanOnlyModeManager.java +++ b/service/java/com/android/server/wifi/ScanOnlyModeManager.java @@ -52,6 +52,8 @@ public class ScanOnlyModeManager implements ActiveModeManager { private String mClientInterfaceName; private boolean mIfaceIsUp = false; + private boolean mExpectedStop = false; + ScanOnlyModeManager(@NonNull Context context, @NonNull Looper looper, @NonNull WifiNative wifiNative, @NonNull Listener listener, @NonNull WifiMetrics wifiMetrics, @@ -78,6 +80,7 @@ public class ScanOnlyModeManager implements ActiveModeManager { */ public void stop() { Log.d(TAG, " currentstate: " + getCurrentStateName()); + mExpectedStop = true; mStateMachine.quitNow(); } @@ -118,6 +121,18 @@ public class ScanOnlyModeManager implements ActiveModeManager { * @param state new Wifi state */ private void updateWifiState(int state) { + if (mExpectedStop) { + Log.d(TAG, "expected stop, not triggering callbacks: state = " + state); + return; + } + + // Once we report the mode has stopped/failed any other stop signals are redundant + // note: this can happen in failure modes where we get multiple callbacks as underlying + // components/interface stops or the underlying interface is destroyed in cleanup + if (state == WifiManager.WIFI_STATE_UNKNOWN || state == WifiManager.WIFI_STATE_DISABLED) { + mExpectedStop = true; + } + mListener.onStateChanged(state); } @@ -266,6 +281,9 @@ public class ScanOnlyModeManager implements ActiveModeManager { mClientInterfaceName = null; } updateWifiState(WifiManager.WIFI_STATE_DISABLED); + + // once we leave started, nothing else to do... stop the state machine + mStateMachine.quitNow(); } } } diff --git a/service/java/com/android/server/wifi/SoftApManager.java b/service/java/com/android/server/wifi/SoftApManager.java index 2faf11577..6c52918a5 100644 --- a/service/java/com/android/server/wifi/SoftApManager.java +++ b/service/java/com/android/server/wifi/SoftApManager.java @@ -514,6 +514,7 @@ public class SoftApManager implements ActiveModeManager { WifiManager.WIFI_AP_STATE_DISABLING, 0); mApInterfaceName = null; mIfaceIsUp = false; + mStateMachine.quitNow(); } @Override |