summaryrefslogtreecommitdiffstats
path: root/wifi/java/android/net/wifi/WifiStateTracker.java
diff options
context:
space:
mode:
Diffstat (limited to 'wifi/java/android/net/wifi/WifiStateTracker.java')
-rw-r--r--wifi/java/android/net/wifi/WifiStateTracker.java40
1 files changed, 35 insertions, 5 deletions
diff --git a/wifi/java/android/net/wifi/WifiStateTracker.java b/wifi/java/android/net/wifi/WifiStateTracker.java
index f7a9677..6ea35f5 100644
--- a/wifi/java/android/net/wifi/WifiStateTracker.java
+++ b/wifi/java/android/net/wifi/WifiStateTracker.java
@@ -245,6 +245,13 @@ public class WifiStateTracker extends NetworkStateTracker {
private static final int RUN_STATE_RUNNING = 2;
private static final int RUN_STATE_STOPPING = 3;
private static final int RUN_STATE_STOPPED = 4;
+
+ private static final String mRunStateNames[] = {
+ "Starting",
+ "Running",
+ "Stopping",
+ "Stopped"
+ };
private int mRunState;
private final IBatteryStats mBatteryStats;
@@ -836,7 +843,14 @@ public class WifiStateTracker extends NetworkStateTracker {
newDetailedState = DetailedState.FAILED;
}
handleDisconnectedState(newDetailedState);
- if (mRunState == RUN_STATE_RUNNING && !mIsScanOnly) {
+ /**
+ * If we were associated with a network (networkId != -1),
+ * assume we reached this state because of a failed attempt
+ * to acquire an IP address, and attempt another connection
+ * and IP address acquisition in RECONNECT_DELAY_MSECS
+ * milliseconds.
+ */
+ if (mRunState == RUN_STATE_RUNNING && !mIsScanOnly && networkId != -1) {
sendEmptyMessageDelayed(EVENT_DEFERRED_RECONNECT, RECONNECT_DELAY_MSECS);
} else if (mRunState == RUN_STATE_STOPPING) {
synchronized (this) {
@@ -1376,13 +1390,24 @@ public class WifiStateTracker extends NetworkStateTracker {
}
}
+ /**
+ * We want to stop the driver, but if we're connected to a network,
+ * we first want to disconnect, so that the supplicant is always in
+ * a known state (DISCONNECTED) when the driver is stopped.
+ * @return {@code true} if the operation succeeds, which means that the
+ * disconnect or stop command was initiated.
+ */
public synchronized boolean disconnectAndStop() {
if (mRunState != RUN_STATE_STOPPING && mRunState != RUN_STATE_STOPPED) {
// Take down any open network notifications
setNotificationVisible(false, 0, false, 0);
mRunState = RUN_STATE_STOPPING;
- return WifiNative.disconnectCommand();
+ if (mWifiInfo.getSupplicantState() == SupplicantState.DORMANT) {
+ return WifiNative.stopDriverCommand();
+ } else {
+ return WifiNative.disconnectCommand();
+ }
} else {
/*
* The "driver-stop" wake lock normally is released from the
@@ -1574,9 +1599,14 @@ public class WifiStateTracker extends NetworkStateTracker {
@Override
public String toString() {
StringBuffer sb = new StringBuffer();
- sb.append("interface ").append(mInterfaceName).
- append(" runState=").append(mRunState).append(LS);
- sb.append(mWifiInfo).append(LS);
+ sb.append("interface ").append(mInterfaceName);
+ sb.append(" runState=");
+ if (mRunState >= 1 && mRunState <= mRunStateNames.length) {
+ sb.append(mRunStateNames[mRunState-1]);
+ } else {
+ sb.append(mRunState);
+ }
+ sb.append(LS).append(mWifiInfo).append(LS);
sb.append(mDhcpInfo).append(LS);
sb.append("haveIpAddress=").append(mHaveIPAddress).
append(", obtainingIpAddress=").append(mObtainingIPAddress).