Merge "Clean up scan handling"

This commit is contained in:
Irfan Sheriff
2013-02-22 18:40:23 +00:00
committed by Android (Google) Code Review
7 changed files with 39 additions and 120 deletions

View File

@@ -167,7 +167,7 @@ public class WifiStressTest
ssidAppearInScanResultsCount, i));
long startTime = System.currentTimeMillis();
mAct.scanResultAvailable = false;
assertTrue("start scan failed", mAct.mWifiManager.startScanActive());
assertTrue("start scan failed", mAct.mWifiManager.startScan());
while (true) {
if ((System.currentTimeMillis() - startTime) >
ConnectivityManagerTestActivity.WIFI_SCAN_TIMEOUT) {

View File

@@ -588,7 +588,7 @@ public class ConnectionUtil {
return true;
} else {
// Start an active scan
mWifiManager.startScanActive();
mWifiManager.startScan();
mScanResultIsAvailable = false;
long startTime = System.currentTimeMillis();
while (!mScanResultIsAvailable) {

View File

@@ -375,9 +375,9 @@ public final class WifiService extends IWifiManager.Stub {
/**
* see {@link android.net.wifi.WifiManager#startScan()}
*/
public void startScan(boolean forceActive) {
public void startScan() {
enforceChangePermission();
mWifiStateMachine.startScan(forceActive);
mWifiStateMachine.startScan();
noteScanStart();
}

View File

@@ -43,7 +43,7 @@ interface IWifiManager
boolean pingSupplicant();
void startScan(boolean forceActive);
void startScan();
List<ScanResult> getScanResults(String callingPackage);

View File

@@ -733,26 +733,7 @@ public class WifiManager {
*/
public boolean startScan() {
try {
mService.startScan(false);
return true;
} catch (RemoteException e) {
return false;
}
}
/**
* Request a scan for access points. Returns immediately. The availability
* of the results is made known later by means of an asynchronous event sent
* on completion of the scan.
* This is a variant of startScan that forces an active scan, even if passive
* scans are the current default
* @return {@code true} if the operation succeeded, i.e., the scan was initiated
*
* @hide
*/
public boolean startScanActive() {
try {
mService.startScan(true);
mService.startScan();
return true;
} catch (RemoteException e) {
return false;

View File

@@ -42,11 +42,14 @@ public class WifiNative {
private static final boolean DBG = false;
private final String mTAG;
private static final int DEFAULT_GROUP_OWNER_INTENT = 6;
private static final int DEFAULT_GROUP_OWNER_INTENT = 6;
static final int BLUETOOTH_COEXISTENCE_MODE_ENABLED = 0;
static final int BLUETOOTH_COEXISTENCE_MODE_DISABLED = 1;
static final int BLUETOOTH_COEXISTENCE_MODE_SENSE = 2;
static final int BLUETOOTH_COEXISTENCE_MODE_ENABLED = 0;
static final int BLUETOOTH_COEXISTENCE_MODE_DISABLED = 1;
static final int BLUETOOTH_COEXISTENCE_MODE_SENSE = 2;
static final int SCAN_WITHOUT_CONNECTION_SETUP = 1;
static final int SCAN_WITH_CONNECTION_SETUP = 2;
String mInterface = "";
private boolean mSuspendOptEnabled = false;
@@ -116,15 +119,13 @@ public class WifiNative {
return (pong != null && pong.equals("PONG"));
}
public boolean scan() {
return doBooleanCommand("SCAN");
}
public boolean setScanMode(boolean setActive) {
if (setActive) {
return doBooleanCommand("DRIVER SCAN-ACTIVE");
public boolean scan(int type) {
if (type == SCAN_WITHOUT_CONNECTION_SETUP) {
return doBooleanCommand("SCAN TYPE=ONLY");
} else if (type == SCAN_WITH_CONNECTION_SETUP) {
return doBooleanCommand("SCAN");
} else {
return doBooleanCommand("DRIVER SCAN-PASSIVE");
throw new IllegalArgumentException("Invalid scan type");
}
}
@@ -332,12 +333,7 @@ public class WifiNative {
}
public boolean saveConfig() {
// Make sure we never write out a value for AP_SCAN other than 1
return doBooleanCommand("AP_SCAN 1") && doBooleanCommand("SAVE_CONFIG");
}
public boolean setScanResultHandling(int mode) {
return doBooleanCommand("AP_SCAN " + mode);
return doBooleanCommand("SAVE_CONFIG");
}
public boolean addToBlacklist(String bssid) {

View File

@@ -139,8 +139,6 @@ public class WifiStateMachine extends StateMachine {
private int mReconnectCount = 0;
private boolean mIsScanMode = false;
private boolean mScanResultIsPending = false;
/* Tracks if the current scan settings are active */
private boolean mSetScanActive = false;
/* Tracks if state machine has received any screen state change broadcast yet.
* We can miss one of these at boot.
*/
@@ -305,14 +303,12 @@ public class WifiStateMachine extends StateMachine {
static final int CMD_START_SCAN = BASE + 71;
/* Set scan mode. CONNECT_MODE or SCAN_ONLY_MODE */
static final int CMD_SET_SCAN_MODE = BASE + 72;
/* Set scan type. SCAN_ACTIVE or SCAN_PASSIVE */
static final int CMD_SET_SCAN_TYPE = BASE + 73;
/* Disconnect from a network */
static final int CMD_DISCONNECT = BASE + 74;
static final int CMD_DISCONNECT = BASE + 73;
/* Reconnect to a network */
static final int CMD_RECONNECT = BASE + 75;
static final int CMD_RECONNECT = BASE + 74;
/* Reassociate to a network */
static final int CMD_REASSOCIATE = BASE + 76;
static final int CMD_REASSOCIATE = BASE + 75;
/* Controls suspend mode optimizations
*
* When high perf mode is enabled, suspend mode optimizations are disabled
@@ -365,9 +361,6 @@ public class WifiStateMachine extends StateMachine {
private static final int CONNECT_MODE = 1;
private static final int SCAN_ONLY_MODE = 2;
private static final int SCAN_ACTIVE = 1;
private static final int SCAN_PASSIVE = 2;
private static final int SUCCESS = 1;
private static final int FAILURE = -1;
@@ -632,7 +625,7 @@ public class WifiStateMachine extends StateMachine {
new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
startScan(false);
startScan();
}
},
new IntentFilter(ACTION_START_SCAN));
@@ -743,9 +736,13 @@ public class WifiStateMachine extends StateMachine {
/**
* TODO: doc
*/
public void startScan(boolean forceActive) {
sendMessage(obtainMessage(CMD_START_SCAN, forceActive ?
SCAN_ACTIVE : SCAN_PASSIVE, 0));
public void startScan() {
sendMessage(CMD_START_SCAN);
}
private void startScanNative(int type) {
mWifiNative.scan(type);
mScanResultIsPending = true;
}
/**
@@ -886,17 +883,6 @@ public class WifiStateMachine extends StateMachine {
}
}
/**
* TODO: doc
*/
public void setScanType(boolean active) {
if (active) {
sendMessage(obtainMessage(CMD_SET_SCAN_TYPE, SCAN_ACTIVE, 0));
} else {
sendMessage(obtainMessage(CMD_SET_SCAN_TYPE, SCAN_PASSIVE, 0));
}
}
/**
* TODO: doc
*/
@@ -1931,7 +1917,6 @@ public class WifiStateMachine extends StateMachine {
case CMD_BLACKLIST_NETWORK:
case CMD_CLEAR_BLACKLIST:
case CMD_SET_SCAN_MODE:
case CMD_SET_SCAN_TYPE:
case CMD_SET_COUNTRY_CODE:
case CMD_SET_FREQUENCY_BAND:
case CMD_RSSI_POLL:
@@ -2101,7 +2086,6 @@ public class WifiStateMachine extends StateMachine {
case CMD_START_DRIVER:
case CMD_STOP_DRIVER:
case CMD_SET_SCAN_MODE:
case CMD_SET_SCAN_TYPE:
case CMD_SET_COUNTRY_CODE:
case CMD_SET_FREQUENCY_BAND:
case CMD_START_PACKET_FILTERING:
@@ -2237,7 +2221,6 @@ public class WifiStateMachine extends StateMachine {
case CMD_START_DRIVER:
case CMD_STOP_DRIVER:
case CMD_SET_SCAN_MODE:
case CMD_SET_SCAN_TYPE:
case CMD_SET_COUNTRY_CODE:
case CMD_SET_FREQUENCY_BAND:
case CMD_START_PACKET_FILTERING:
@@ -2365,7 +2348,6 @@ public class WifiStateMachine extends StateMachine {
case CMD_START_DRIVER:
case CMD_STOP_DRIVER:
case CMD_SET_SCAN_MODE:
case CMD_SET_SCAN_TYPE:
case CMD_SET_COUNTRY_CODE:
case CMD_SET_FREQUENCY_BAND:
case CMD_START_PACKET_FILTERING:
@@ -2585,7 +2567,6 @@ public class WifiStateMachine extends StateMachine {
case CMD_START_DRIVER:
case CMD_STOP_DRIVER:
case CMD_SET_SCAN_MODE:
case CMD_SET_SCAN_TYPE:
case CMD_SET_COUNTRY_CODE:
case CMD_SET_FREQUENCY_BAND:
case CMD_START_PACKET_FILTERING:
@@ -2649,7 +2630,6 @@ public class WifiStateMachine extends StateMachine {
case WifiMonitor.NETWORK_DISCONNECTION_EVENT:
case WifiMonitor.AUTHENTICATION_FAILURE_EVENT:
case WifiMonitor.WPS_OVERLAP_EVENT:
case CMD_SET_SCAN_TYPE:
case CMD_SET_COUNTRY_CODE:
case CMD_SET_FREQUENCY_BAND:
case CMD_START_PACKET_FILTERING:
@@ -2700,11 +2680,9 @@ public class WifiStateMachine extends StateMachine {
}
if (mIsScanMode) {
mWifiNative.setScanResultHandling(SCAN_ONLY_MODE);
mWifiNative.disconnect();
transitionTo(mScanModeState);
} else {
mWifiNative.setScanResultHandling(CONNECT_MODE);
mWifiNative.reconnect();
// Status pulls in the current supplicant state and network connection state
// events over the monitor connection. This helps framework sync up with
@@ -2731,20 +2709,8 @@ public class WifiStateMachine extends StateMachine {
public boolean processMessage(Message message) {
if (DBG) log(getName() + message.toString() + "\n");
switch(message.what) {
case CMD_SET_SCAN_TYPE:
mSetScanActive = (message.arg1 == SCAN_ACTIVE);
mWifiNative.setScanMode(mSetScanActive);
break;
case CMD_START_SCAN:
boolean forceActive = (message.arg1 == SCAN_ACTIVE);
if (forceActive && !mSetScanActive) {
mWifiNative.setScanMode(forceActive);
}
mWifiNative.scan();
if (forceActive && !mSetScanActive) {
mWifiNative.setScanMode(mSetScanActive);
}
mScanResultIsPending = true;
startScanNative(WifiNative.SCAN_WITH_CONNECTION_SETUP);
break;
case CMD_SET_COUNTRY_CODE:
String country = (String) message.obj;
@@ -2759,7 +2725,7 @@ public class WifiStateMachine extends StateMachine {
if (mWifiNative.setBand(band)) {
mFrequencyBand.set(band);
//Fetch the latest scan results when frequency band is set
startScan(true);
startScanNative(WifiNative.SCAN_WITH_CONNECTION_SETUP);
} else {
loge("Failed to set frequency band " + band);
}
@@ -2906,7 +2872,6 @@ public class WifiStateMachine extends StateMachine {
case CMD_START_DRIVER:
case CMD_STOP_DRIVER:
case CMD_SET_SCAN_MODE:
case CMD_SET_SCAN_TYPE:
case CMD_SET_COUNTRY_CODE:
case CMD_SET_FREQUENCY_BAND:
case CMD_START_PACKET_FILTERING:
@@ -2942,7 +2907,6 @@ public class WifiStateMachine extends StateMachine {
/* Queue driver commands */
case CMD_START_DRIVER:
case CMD_STOP_DRIVER:
case CMD_SET_SCAN_TYPE:
case CMD_SET_COUNTRY_CODE:
case CMD_SET_FREQUENCY_BAND:
case CMD_START_PACKET_FILTERING:
@@ -3005,12 +2969,14 @@ public class WifiStateMachine extends StateMachine {
/* Ignore */
return HANDLED;
} else {
mWifiNative.setScanResultHandling(message.arg1);
mWifiNative.reconnect();
mIsScanMode = false;
transitionTo(mDisconnectedState);
}
break;
case CMD_START_SCAN:
startScanNative(WifiNative.SCAN_WITHOUT_CONNECTION_SETUP);
break;
/* Ignore */
case CMD_DISCONNECT:
case CMD_RECONNECT:
@@ -3139,11 +3105,6 @@ public class WifiStateMachine extends StateMachine {
replyToMessage(message, WifiManager.WPS_FAILED, WifiManager.ERROR);
}
break;
case WifiMonitor.SCAN_RESULTS_EVENT:
/* Set the scan setting back to "connect" mode */
mWifiNative.setScanResultHandling(CONNECT_MODE);
/* Handle scan results */
return NOT_HANDLED;
case WifiMonitor.NETWORK_CONNECTION_EVENT:
if (DBG) log("Network connection established");
mLastNetworkId = message.arg1;
@@ -3216,14 +3177,9 @@ public class WifiStateMachine extends StateMachine {
}
break;
case CMD_START_SCAN:
/* When the network is connected, re-scanning can trigger
* a reconnection. Put it in scan-only mode during scan.
* When scan results are received, the mode is switched
* back to CONNECT_MODE.
*/
mWifiNative.setScanResultHandling(SCAN_ONLY_MODE);
/* Have the parent state handle the rest */
return NOT_HANDLED;
/* Do not attempt to connect when we are already connected */
startScanNative(WifiNative.SCAN_WITHOUT_CONNECTION_SETUP);
break;
/* Ignore connection to same network */
case WifiManager.CONNECT_NETWORK:
int netId = message.arg1;
@@ -3290,16 +3246,6 @@ public class WifiStateMachine extends StateMachine {
return HANDLED;
}
@Override
public void exit() {
/* If a scan result is pending in connected state, the supplicant
* is in SCAN_ONLY_MODE. Restore CONNECT_MODE on exit
*/
if (mScanResultIsPending) {
mWifiNative.setScanResultHandling(CONNECT_MODE);
}
}
}
class ObtainingIpState extends State {
@@ -3586,7 +3532,6 @@ public class WifiStateMachine extends StateMachine {
break;
case CMD_SET_SCAN_MODE:
if (message.arg1 == SCAN_ONLY_MODE) {
mWifiNative.setScanResultHandling(message.arg1);
//Supplicant disconnect to prevent further connects
mWifiNative.disconnect();
mIsScanMode = true;
@@ -3788,7 +3733,6 @@ public class WifiStateMachine extends StateMachine {
case CMD_START_DRIVER:
case CMD_STOP_DRIVER:
case CMD_SET_SCAN_MODE:
case CMD_SET_SCAN_TYPE:
case CMD_SET_COUNTRY_CODE:
case CMD_SET_FREQUENCY_BAND:
case CMD_START_PACKET_FILTERING:
@@ -3896,7 +3840,6 @@ public class WifiStateMachine extends StateMachine {
case CMD_START_DRIVER:
case CMD_STOP_DRIVER:
case CMD_SET_SCAN_MODE:
case CMD_SET_SCAN_TYPE:
case CMD_SET_COUNTRY_CODE:
case CMD_SET_FREQUENCY_BAND:
case CMD_START_PACKET_FILTERING:
@@ -3986,7 +3929,6 @@ public class WifiStateMachine extends StateMachine {
case CMD_START_DRIVER:
case CMD_STOP_DRIVER:
case CMD_SET_SCAN_MODE:
case CMD_SET_SCAN_TYPE:
case CMD_SET_COUNTRY_CODE:
case CMD_SET_FREQUENCY_BAND:
case CMD_START_PACKET_FILTERING: