Only disable Wi-Fi IP serving on specific interface, if available

Test: as follows
    - built
    - flashed
    - booted
    - runtest frameworks-net passes
Bug: 32163131
Bug: 62343300

Merged-In: Id8d9c3f67f7a850af69069abee86adfc62841b28
Merged-In: Iac19359fd8712fa6a135f31bed9f0da97b3f2977
Merged-In: I99b170ebacc4135d1a09ce1ec3d43f76c6765de4
Change-Id: Ifd9131bad20810ee24c9436d8c0df7a81fae11d5
(cherry picked from commit 218c226b08)
This commit is contained in:
Erik Kline
2017-06-09 16:36:29 +09:00
parent c0af382a25
commit c8b180116d
2 changed files with 27 additions and 12 deletions

View File

@@ -792,30 +792,41 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
case WifiManager.WIFI_AP_STATE_DISABLING:
case WifiManager.WIFI_AP_STATE_FAILED:
default:
disableWifiIpServingLocked(curState);
disableWifiIpServingLocked(ifname, curState);
break;
}
}
}
}
// TODO: Pass in the interface name and, if non-empty, only turn down IP
// serving on that one interface.
private void disableWifiIpServingLocked(int apState) {
if (DBG) Log.d(TAG, "Canceling WiFi tethering request - AP_STATE=" + apState);
private void disableWifiIpServingLocked(String ifname, int apState) {
mLog.log("Canceling WiFi tethering request - AP_STATE=" + apState);
// 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.
// TODO: Remove this altogether, once Wi-Fi reliably gives us an
// interface name with every broadcast.
mWifiTetherRequested = false;
if (!TextUtils.isEmpty(ifname)) {
final TetherState ts = mTetherStates.get(ifname);
if (ts != null) {
ts.stateMachine.unwanted();
return;
}
}
// Tell appropriate interface state machines that they should tear
// themselves down.
for (int i = 0; i < mTetherStates.size(); i++) {
TetherInterfaceStateMachine tism = mTetherStates.valueAt(i).stateMachine;
if (tism.interfaceType() == ConnectivityManager.TETHERING_WIFI) {
tism.sendMessage(TetherInterfaceStateMachine.CMD_TETHER_UNREQUESTED);
break; // There should be at most one of these.
tism.unwanted();
return;
}
}
// 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;
mLog.log("Error disabling Wi-Fi IP serving; " +
(TextUtils.isEmpty(ifname) ? "no interface name specified"
: "specified interface: " + ifname));
}
private void enableWifiIpServingLocked(String ifname, int wifiIpMode) {

View File

@@ -127,6 +127,10 @@ public class TetherInterfaceStateMachine extends StateMachine {
public int lastError() { return mLastError; }
public void stop() { sendMessage(CMD_INTERFACE_DOWN); }
public void unwanted() { sendMessage(CMD_TETHER_UNREQUESTED); }
// configured when we start tethering and unconfig'd on error or conclusion
private boolean configureIfaceIp(boolean enabled) {
if (VDBG) Log.d(TAG, "configureIfaceIp(" + enabled + ")");