diff options
| -rw-r--r-- | core/java/android/os/INetworkManagementService.aidl | 10 | ||||
| -rw-r--r-- | services/java/com/android/server/NetworkManagementService.java | 22 | ||||
| -rw-r--r-- | wifi/java/android/net/wifi/WifiStateMachine.java | 11 |
3 files changed, 43 insertions, 0 deletions
diff --git a/core/java/android/os/INetworkManagementService.aidl b/core/java/android/os/INetworkManagementService.aidl index 9ffc52af7665..04409234172c 100644 --- a/core/java/android/os/INetworkManagementService.aidl +++ b/core/java/android/os/INetworkManagementService.aidl @@ -64,6 +64,16 @@ interface INetworkManagementService void clearInterfaceAddresses(String iface); /** + * Set interface down + */ + void setInterfaceDown(String iface); + + /** + * Set interface up + */ + void setInterfaceUp(String iface); + + /** * Retrieves the network routes currently configured on the specified * interface */ diff --git a/services/java/com/android/server/NetworkManagementService.java b/services/java/com/android/server/NetworkManagementService.java index 4b7256a6f6db..782e7d7acdd5 100644 --- a/services/java/com/android/server/NetworkManagementService.java +++ b/services/java/com/android/server/NetworkManagementService.java @@ -446,6 +446,28 @@ class NetworkManagementService extends INetworkManagementService.Stub { } } + public void setInterfaceDown(String iface) throws IllegalStateException { + try { + InterfaceConfiguration ifcg = getInterfaceConfig(iface); + ifcg.interfaceFlags = ifcg.interfaceFlags.replace("up", "down"); + setInterfaceConfig(iface, ifcg); + } catch (NativeDaemonConnectorException e) { + throw new IllegalStateException( + "Unable to communicate with native daemon for interface down - " + e); + } + } + + public void setInterfaceUp(String iface) throws IllegalStateException { + try { + InterfaceConfiguration ifcg = getInterfaceConfig(iface); + ifcg.interfaceFlags = ifcg.interfaceFlags.replace("down", "up"); + setInterfaceConfig(iface, ifcg); + } catch (NativeDaemonConnectorException e) { + throw new IllegalStateException( + "Unable to communicate with native daemon for interface up - " + e); + } + } + /* TODO: This is right now a IPv4 only function. Works for wifi which loses its IPv6 addresses on interface down, but we need to do full clean up here */ public void clearInterfaceAddresses(String iface) throws IllegalStateException { diff --git a/wifi/java/android/net/wifi/WifiStateMachine.java b/wifi/java/android/net/wifi/WifiStateMachine.java index 8be53635c8f5..c6f7da29e9e4 100644 --- a/wifi/java/android/net/wifi/WifiStateMachine.java +++ b/wifi/java/android/net/wifi/WifiStateMachine.java @@ -1911,6 +1911,17 @@ public class WifiStateMachine extends StateMachine { transitionTo(mDriverUnloadingState); break; case CMD_START_SUPPLICANT: + //A runtime crash can leave the interface up and + //this affects connectivity when supplicant starts up. + //Ensure interface is down before a supplicant start. + try { + mNwService.setInterfaceDown(mInterfaceName); + } catch (RemoteException re) { + if (DBG) Log.w(TAG, "Unable to bring down wlan interface: " + re); + } catch (IllegalStateException ie) { + if (DBG) Log.w(TAG, "Unable to bring down wlan interface: " + ie); + } + if(WifiNative.startSupplicant()) { Log.d(TAG, "Supplicant start successful"); mWifiMonitor.startMonitoring(); |