summaryrefslogtreecommitdiff
path: root/service
diff options
context:
space:
mode:
authorMitchell Wills <mwills@google.com>2016-03-21 11:25:50 -0700
committerMitchell Wills <mwills@google.com>2016-03-21 17:11:01 -0700
commit9d0c558cab7c80a572a32ae70d501df15367fd5f (patch)
treee66fe576be86ab86c37078bae44f655a54abbb38 /service
parent1b662dbe559e74179ddcb86a02baa74a0a85b3ce (diff)
Make sure to cleanup when timing out from a single scan
Also fix general failure cases Bug: 26095183 Change-Id: I88433ff77c0adb4073350ae7a4746b5ee4da5033
Diffstat (limited to 'service')
-rw-r--r--service/java/com/android/server/wifi/SupplicantWifiScannerImpl.java53
-rw-r--r--service/java/com/android/server/wifi/WifiScanningServiceImpl.java32
2 files changed, 48 insertions, 37 deletions
diff --git a/service/java/com/android/server/wifi/SupplicantWifiScannerImpl.java b/service/java/com/android/server/wifi/SupplicantWifiScannerImpl.java
index 9cc685ffc..7e466a5e6 100644
--- a/service/java/com/android/server/wifi/SupplicantWifiScannerImpl.java
+++ b/service/java/com/android/server/wifi/SupplicantWifiScannerImpl.java
@@ -48,6 +48,9 @@ public class SupplicantWifiScannerImpl extends WifiScannerImpl implements Handle
private static final String TAG = "SupplicantWifiScannerImpl";
private static final boolean DBG = false;
+ public static final String BACKGROUND_PERIOD_ALARM_TAG = TAG + " Background Scan Period";
+ public static final String TIMEOUT_ALARM_TAG = TAG + " Scan Timeout";
+
private static final int SCAN_BUFFER_CAPACITY = 10;
private static final int MAX_APS_PER_SCAN = 32;
private static final int MAX_SCAN_BUCKETS = 16;
@@ -94,6 +97,14 @@ public class SupplicantWifiScannerImpl extends WifiScannerImpl implements Handle
private boolean mHwPnoRunning = false;
private final boolean mHwPnoScanSupported;
+ /**
+ * Duration to wait before timing out a scan.
+ *
+ * The expected behavior is that the hardware will return a failed scan if it does not
+ * complete, but timeout just in case it does not.
+ */
+ private static final long SCAN_TIMEOUT_MS = 10000;
+
AlarmManager.OnAlarmListener mScanPeriodListener = new AlarmManager.OnAlarmListener() {
public void onAlarm() {
synchronized (mSettingsLock) {
@@ -102,6 +113,14 @@ public class SupplicantWifiScannerImpl extends WifiScannerImpl implements Handle
}
};
+ AlarmManager.OnAlarmListener mScanTimeoutListener = new AlarmManager.OnAlarmListener() {
+ public void onAlarm() {
+ synchronized (mSettingsLock) {
+ handleScanTimeout();
+ }
+ }
+ };
+
public SupplicantWifiScannerImpl(Context context, WifiNative wifiNative,
ChannelHelper channelHelper, Looper looper) {
mContext = context;
@@ -292,6 +311,12 @@ public class SupplicantWifiScannerImpl extends WifiScannerImpl implements Handle
}
}
+ private void handleScanTimeout() {
+ Log.e(TAG, "Timed out waiting for scan result from supplicant");
+ reportScanFailure();
+ processPendingScans();
+ }
+
private void processPendingScans() {
synchronized (mSettingsLock) {
// Wait for the active scan result to come back to reschedule other scans,
@@ -366,8 +391,7 @@ public class SupplicantWifiScannerImpl extends WifiScannerImpl implements Handle
mBackgroundScanPeriodPending = false;
mAlarmManager.set(AlarmManager.RTC_WAKEUP,
System.currentTimeMillis() + mBackgroundScanSettings.base_period_ms,
- "SupplicantWifiScannerImpl Period",
- mScanPeriodListener, mEventHandler);
+ BACKGROUND_PERIOD_ALARM_TAG, mScanPeriodListener, mEventHandler);
}
}
@@ -409,6 +433,9 @@ public class SupplicantWifiScannerImpl extends WifiScannerImpl implements Handle
+ ", background=" + newScanSettings.backgroundScanActive
+ ", single=" + newScanSettings.singleScanActive);
mLastScanSettings = newScanSettings;
+ mAlarmManager.set(AlarmManager.RTC_WAKEUP,
+ System.currentTimeMillis() + SCAN_TIMEOUT_MS,
+ TIMEOUT_ALARM_TAG, mScanTimeoutListener, mEventHandler);
} else {
Log.e(TAG, "Failed to start scan, freqs=" + freqs);
// indicate scan failure async
@@ -421,7 +448,7 @@ public class SupplicantWifiScannerImpl extends WifiScannerImpl implements Handle
}
}
});
- // TODO if scans fail enough background scans should be failed as well
+ // TODO(b/27769665) background scans should be failed too if scans fail enough
}
} else if (isHwPnoScanRequired()) {
newScanSettings.setHwPnoScan(mPnoEventHandler);
@@ -454,14 +481,13 @@ public class SupplicantWifiScannerImpl extends WifiScannerImpl implements Handle
public boolean handleMessage(Message msg) {
switch(msg.what) {
case WifiMonitor.SCAN_FAILED_EVENT:
- // TODO indicate failure to caller
Log.w(TAG, "Scan failed");
- synchronized (mSettingsLock) {
- mLastScanSettings = null;
- }
+ mAlarmManager.cancel(mScanTimeoutListener);
+ reportScanFailure();
processPendingScans();
break;
case WifiMonitor.SCAN_RESULTS_EVENT:
+ mAlarmManager.cancel(mScanTimeoutListener);
pollLatestScanData();
processPendingScans();
break;
@@ -471,6 +497,19 @@ public class SupplicantWifiScannerImpl extends WifiScannerImpl implements Handle
return true;
}
+ private void reportScanFailure() {
+ synchronized (mSettingsLock) {
+ if (mLastScanSettings != null) {
+ if (mLastScanSettings.singleScanEventHandler != null) {
+ mLastScanSettings.singleScanEventHandler
+ .onScanStatus(WifiNative.WIFI_SCAN_FAILED);
+ }
+ // TODO(b/27769665) background scans should be failed too if scans fail enough
+ mLastScanSettings = null;
+ }
+ }
+ }
+
private void pollLatestScanData() {
synchronized (mSettingsLock) {
if (mLastScanSettings == null) {
diff --git a/service/java/com/android/server/wifi/WifiScanningServiceImpl.java b/service/java/com/android/server/wifi/WifiScanningServiceImpl.java
index 98b4e1e78..0dc6ad733 100644
--- a/service/java/com/android/server/wifi/WifiScanningServiceImpl.java
+++ b/service/java/com/android/server/wifi/WifiScanningServiceImpl.java
@@ -40,7 +40,6 @@ import android.os.Looper;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
-import android.os.SystemClock;
import android.os.WorkSource;
import android.util.ArrayMap;
import android.util.LocalLog;
@@ -53,7 +52,6 @@ import com.android.internal.util.AsyncChannel;
import com.android.internal.util.Protocol;
import com.android.internal.util.State;
import com.android.internal.util.StateMachine;
-import com.android.internal.util.WakeupMessage;
import com.android.server.wifi.scanner.BackgroundScanScheduler;
import com.android.server.wifi.scanner.ChannelHelper;
import com.android.server.wifi.scanner.ChannelHelper.ChannelCollection;
@@ -228,9 +226,8 @@ public class WifiScanningServiceImpl extends IWifiScanner.Stub {
private static final int CMD_SCAN_PAUSED = BASE + 8;
private static final int CMD_SCAN_RESTARTED = BASE + 9;
private static final int CMD_SCAN_FAILED = BASE + 10;
- private static final int CMD_SCAN_TIMEOUT = BASE + 11;
- private static final int CMD_PNO_NETWORK_FOUND = BASE + 12;
- private static final int CMD_PNO_SCAN_FAILED = BASE + 13;
+ private static final int CMD_PNO_NETWORK_FOUND = BASE + 11;
+ private static final int CMD_PNO_SCAN_FAILED = BASE + 12;
private final Context mContext;
private final Looper mLooper;
@@ -462,27 +459,8 @@ public class WifiScanningServiceImpl extends IWifiScanner.Stub {
}
class ScanningState extends State {
- /**
- * Duration to wait before timing out a scan.
- *
- * The expected behavior is that the hardware will return a failed scan if it does not
- * complete, but timeout just in case it does not.
- * It is possible that there may already be a scan in progress when the scan is
- * scheduled, so make sure that there is time for two scans to complete.
- */
- private static final long SINGLE_SCAN_TIMEOUT_MS = 20000;
- private WakeupMessage mTimeoutMessage = new WakeupMessage(mContext, getHandler(),
- "WifiScanner Single Scan Timeout", CMD_SCAN_TIMEOUT);
-
- @Override
- public void enter() {
- mTimeoutMessage.schedule(
- SystemClock.elapsedRealtime() + SINGLE_SCAN_TIMEOUT_MS);
- }
-
@Override
public void exit() {
- mTimeoutMessage.cancel();
// if any scans are still active (never got results available then indicate failure)
sendOpFailedToAllAndClear(mActiveScans, WifiScanner.REASON_UNSPECIFIED,
"Scan was interrupted");
@@ -505,12 +483,6 @@ public class WifiScanningServiceImpl extends IWifiScanner.Stub {
"Scan failed");
transitionTo(mIdleState);
return HANDLED;
- case CMD_SCAN_TIMEOUT:
- sendOpFailedToAllAndClear(mActiveScans, WifiScanner.REASON_UNSPECIFIED,
- "Timed out waiting for a scan result");
- loge("Timed out waiting for single scan result/failure");
- transitionTo(mIdleState);
- return HANDLED;
default:
return NOT_HANDLED;
}