summaryrefslogtreecommitdiff
path: root/service
diff options
context:
space:
mode:
authorRebecca Silberstein <silberst@google.com>2018-05-16 08:58:42 -0700
committerRebecca Silberstein <silberst@google.com>2018-05-18 11:12:59 -0700
commitf7814ce9117a6622dd1662cbe9396b1684447004 (patch)
tree0fa3322d74406bf256eeb76d1b0e82466e64cf98 /service
parente93744bec9cb63b00b4597d49a20378749634358 (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')
-rw-r--r--service/java/com/android/server/wifi/ClientModeManager.java20
-rw-r--r--service/java/com/android/server/wifi/ScanOnlyModeManager.java18
-rw-r--r--service/java/com/android/server/wifi/SoftApManager.java1
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