Merge change Iba087ecc into eclair-mr2

* changes:
  Make FWK start a wifi scan if supplicant forgets.
This commit is contained in:
Android (Google) Code Review
2009-10-08 17:21:07 -04:00

View File

@@ -90,6 +90,7 @@ public class WifiStateTracker extends NetworkStateTracker {
*/
private static final int EVENT_DRIVER_STATE_CHANGED = 12;
private static final int EVENT_PASSWORD_KEY_MAY_BE_INCORRECT = 13;
private static final int EVENT_MAYBE_START_SCAN_POST_DISCONNECT = 14;
/**
* Interval in milliseconds between polling for connection
@@ -125,6 +126,14 @@ public class WifiStateTracker extends NetworkStateTracker {
*/
private static final int RECONNECT_DELAY_MSECS = 2000;
/**
* When the supplicant disconnects from an AP it sometimes forgets
* to restart scanning. Wait this delay before asking it to start
* scanning (in case it forgot). 15 sec is the standard delay between
* scans.
*/
private static final int KICKSTART_SCANNING_DELAY_MSECS = 15000;
/**
* The maximum number of times we will retry a connection to an access point
* for which we have failed in acquiring an IP address from DHCP. A value of
@@ -148,6 +157,14 @@ public class WifiStateTracker extends NetworkStateTracker {
*/
private int mNumSupplicantLoopIterations = 0;
/**
* The current number of supplicant state changes. This is used to determine
* if we've received any new info since we found out it was DISCONNECTED or
* INACTIVE. If we haven't for X ms, we then request a scan - it should have
* done that automatically, but sometimes some firmware does not.
*/
private int mNumSupplicantStateChanges = 0;
/**
* True if we received an event that that a password-key may be incorrect.
* If the next incoming supplicant state change event is DISCONNECT,
@@ -831,7 +848,16 @@ public class WifiStateTracker extends NetworkStateTracker {
}
break;
case EVENT_MAYBE_START_SCAN_POST_DISCONNECT:
// Only do this if we haven't gotten a new supplicant status since the timer
// started
if (mNumSupplicantStateChanges == msg.arg1) {
WifiNative.scanCommand(false); // do a passive scan
}
break;
case EVENT_SUPPLICANT_STATE_CHANGED:
mNumSupplicantStateChanges++;
SupplicantStateChangeResult supplicantStateResult =
(SupplicantStateChangeResult) msg.obj;
SupplicantState newState = supplicantStateResult.state;
@@ -849,6 +875,17 @@ public class WifiStateTracker extends NetworkStateTracker {
int networkId = supplicantStateResult.networkId;
/*
* If we get disconnect or inactive we need to start our
* watchdog timer to start a scan
*/
if (newState == SupplicantState.DISCONNECTED ||
newState == SupplicantState.INACTIVE) {
sendMessageDelayed(obtainMessage(EVENT_MAYBE_START_SCAN_POST_DISCONNECT,
mNumSupplicantStateChanges, 0), KICKSTART_SCANNING_DELAY_MSECS);
}
/*
* Did we get to DISCONNECTED state due to an
* authentication (password) failure?