summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/connectivity/Tethering.java30
1 files changed, 18 insertions, 12 deletions
diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java
index 92b55db40cd8..312588eb3903 100644
--- a/services/core/java/com/android/server/connectivity/Tethering.java
+++ b/services/core/java/com/android/server/connectivity/Tethering.java
@@ -450,8 +450,6 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
private int setWifiTethering(final boolean enable) {
synchronized (mPublicSync) {
- // Note that we're maintaining a predicate that mWifiTetherRequested always matches
- // our last request to WifiManager re: its AP enabled status.
mWifiTetherRequested = enable;
final WifiManager wifiManager =
(WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
@@ -794,10 +792,6 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
}
} else if (action.equals(WifiManager.WIFI_AP_STATE_CHANGED_ACTION)) {
synchronized (Tethering.this.mPublicSync) {
- if (!mWifiTetherRequested) {
- // We only care when we're trying to tether via our WiFi interface.
- return;
- }
int curState = intent.getIntExtra(WifiManager.EXTRA_WIFI_AP_STATE,
WifiManager.WIFI_AP_STATE_DISABLED);
switch (curState) {
@@ -805,8 +799,10 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
// We can see this state on the way to both enabled and failure states.
break;
case WifiManager.WIFI_AP_STATE_ENABLED:
- // Tell an appropriate interface state machine that it should tether.
- tetherMatchingInterfaces(true, ConnectivityManager.TETHERING_WIFI);
+ // When the AP comes up and we've been requested to tether it, do so.
+ if (mWifiTetherRequested) {
+ tetherMatchingInterfaces(true, ConnectivityManager.TETHERING_WIFI);
+ }
break;
case WifiManager.WIFI_AP_STATE_DISABLED:
case WifiManager.WIFI_AP_STATE_DISABLING:
@@ -816,10 +812,20 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
Log.d(TAG, "Canceling WiFi tethering request - AP_STATE=" +
curState);
}
- // Tell an appropriate interface state machine that
- // it needs to tear itself down.
- tetherMatchingInterfaces(false, ConnectivityManager.TETHERING_WIFI);
- setWifiTethering(false);
+ // Tell appropriate interface state machines that they should tear
+ // themselves down.
+ for (int i = 0; i < mTetherStates.size(); i++) {
+ TetherInterfaceStateMachine tism =
+ mTetherStates.valueAt(i).mStateMachine;
+ if (tism.interfaceType() == ConnectivityManager.TETHERING_WIFI) {
+ tism.sendMessage(
+ TetherInterfaceStateMachine.CMD_TETHER_UNREQUESTED);
+ break; // There should be at most one of these.
+ }
+ }
+ // Regardless of whether we requested this transition, the AP has gone
+ // down. Don't try to tether again unless we're requested to do so.
+ mWifiTetherRequested = false;
break;
}
}