Allow WiFi components to manage interface up state

Setting the WiFi network interface up or down is racy because it
is not synchronized with the WiFi components managing the interface.

This causes a problem for hostapd when the interface is marked down
before hostapd starts because it causes the driver to enter the
de-initialization process.  hostapd does not know how to react to this
change of events.

Bug: 31205821
Test: bug no longer reproduces on upcoming devices, unit tests pass

Change-Id: I96938e2aef89b400593d42ce1b0a6ccc2d2e5754
This commit is contained in:
Christopher Wiley
2016-09-13 12:07:58 -07:00
parent 16e1007481
commit ce5d913387
2 changed files with 18 additions and 3 deletions

View File

@@ -80,6 +80,14 @@ public class InterfaceConfiguration implements Parcelable {
mFlags.add(FLAG_DOWN);
}
/**
* Set flags so that no changes will be made to the up/down status.
*/
public void ignoreInterfaceUpDownStatus() {
mFlags.remove(FLAG_UP);
mFlags.remove(FLAG_DOWN);
}
public LinkAddress getLinkAddress() {
return mAddr;
}

View File

@@ -136,10 +136,17 @@ public class TetherInterfaceStateMachine extends StateMachine {
if (ifcg != null) {
InetAddress addr = NetworkUtils.numericToInetAddress(ipAsString);
ifcg.setLinkAddress(new LinkAddress(addr, prefixLen));
if (enabled) {
ifcg.setInterfaceUp();
if (mInterfaceType == ConnectivityManager.TETHERING_WIFI) {
// The WiFi stack has ownership of the interface up/down state.
// It is unclear whether the bluetooth or USB stacks will manage their own
// state.
ifcg.ignoreInterfaceUpDownStatus();
} else {
ifcg.setInterfaceDown();
if (enabled) {
ifcg.setInterfaceUp();
} else {
ifcg.setInterfaceDown();
}
}
ifcg.clearFlag("running");
mNMService.setInterfaceConfig(mIfaceName, ifcg);