summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMitchell Wills <mwills@google.com>2016-09-20 11:03:58 -0700
committerMitchell Wills <mwills@google.com>2016-09-20 11:37:46 -0700
commitd76a14997a969ea44daa47756dcc8f83aee96935 (patch)
tree0140721df8b20b68f88028864cf5a4e03d672c40
parent5e816a8c6f96076f69dd8bbb0110203d92940c4e (diff)
downloadwifi-d76a14997a969ea44daa47756dcc8f83aee96935.tar.gz
Ignore disconnect messages that don't indicate the channel is dead
Bug: 29368784 Test: mmma frameworks/opt/net/wifi/tests && runtest frameworks-wifi Change-Id: I5ae3665898565379b101c4ac0c5570c9debb1228
-rw-r--r--service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java4
-rw-r--r--tests/wifitests/src/com/android/server/wifi/scanner/WifiScanningServiceTest.java55
2 files changed, 56 insertions, 3 deletions
diff --git a/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java b/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java
index 6ae223717..9f8fb2f58 100644
--- a/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java
+++ b/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java
@@ -164,7 +164,9 @@ public class WifiScanningServiceImpl extends IWifiScanner.Stub {
}
case AsyncChannel.CMD_CHANNEL_DISCONNECTED: {
ExternalClientInfo client = (ExternalClientInfo) mClients.get(msg.replyTo);
- if (client != null) {
+ if (client != null && msg.arg1 != AsyncChannel.STATUS_SEND_UNSUCCESSFUL
+ && msg.arg1
+ != AsyncChannel.STATUS_FULL_CONNECTION_REFUSED_ALREADY_CONNECTED) {
localLog("client disconnected: " + client + ", reason: " + msg.arg1);
client.cleanup();
}
diff --git a/tests/wifitests/src/com/android/server/wifi/scanner/WifiScanningServiceTest.java b/tests/wifitests/src/com/android/server/wifi/scanner/WifiScanningServiceTest.java
index b18e4cc61..3498b53fc 100644
--- a/tests/wifitests/src/com/android/server/wifi/scanner/WifiScanningServiceTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/scanner/WifiScanningServiceTest.java
@@ -1667,8 +1667,8 @@ public class WifiScanningServiceTest {
sendSingleScanRequest(controlChannel, requestId, requestSettings, null);
// Can't call |disconnect| here because that sends |CMD_CHANNEL_DISCONNECT| followed by
// |CMD_CHANNEL_DISCONNECTED|.
- controlChannel.sendMessage(Message.obtain(null, AsyncChannel.CMD_CHANNEL_DISCONNECTED, 0,
- 0, null));
+ controlChannel.sendMessage(Message.obtain(null, AsyncChannel.CMD_CHANNEL_DISCONNECTED,
+ AsyncChannel.STATUS_REMOTE_DISCONNECTION, 0, null));
// Now process the above 2 actions. This should result in first processing the single scan
// request (which forwards the request to SingleScanStateMachine) and then processing the
@@ -1683,4 +1683,55 @@ public class WifiScanningServiceTest {
logLineRegex.matcher(serviceDump).find());
}
+ /**
+ * Tries to simulate the race scenario where a client is disconnected immediately after single
+ * scan request is sent to |SingleScanStateMachine|.
+ */
+ @Test
+ public void sendScanRequestAfterUnsuccessfulSend() throws Exception {
+ WifiScanner.ScanSettings requestSettings = createRequest(WifiScanner.WIFI_BAND_BOTH, 0,
+ 0, 20, WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN);
+ int requestId = 9;
+
+ startServiceAndLoadDriver();
+ Handler handler = mock(Handler.class);
+ BidirectionalAsyncChannel controlChannel = connectChannel(handler);
+ mLooper.dispatchAll();
+
+ when(mWifiScannerImpl.startSingleScan(any(WifiNative.ScanSettings.class),
+ any(WifiNative.ScanEventHandler.class))).thenReturn(true);
+ ScanResults results = ScanResults.create(0, 2400);
+ when(mWifiScannerImpl.getLatestSingleScanResults())
+ .thenReturn(results.getRawScanData());
+
+ InOrder order = inOrder(mWifiScannerImpl, handler);
+
+ sendSingleScanRequest(controlChannel, requestId, requestSettings, null);
+ mLooper.dispatchAll();
+ WifiNative.ScanEventHandler eventHandler1 = verifyStartSingleScan(order,
+ computeSingleScanNativeSettings(requestSettings));
+ verifySuccessfulResponse(order, handler, requestId);
+
+ eventHandler1.onScanStatus(WifiNative.WIFI_SCAN_RESULTS_AVAILABLE);
+ mLooper.dispatchAll();
+ verifyScanResultsRecieved(order, handler, requestId, results.getScanData());
+ verifySingleScanCompletedRecieved(order, handler, requestId);
+ verifyNoMoreInteractions(handler);
+
+ controlChannel.sendMessage(Message.obtain(null, AsyncChannel.CMD_CHANNEL_DISCONNECTED,
+ AsyncChannel.STATUS_SEND_UNSUCCESSFUL, 0, null));
+ mLooper.dispatchAll();
+
+ sendSingleScanRequest(controlChannel, requestId, requestSettings, null);
+ mLooper.dispatchAll();
+ WifiNative.ScanEventHandler eventHandler2 = verifyStartSingleScan(order,
+ computeSingleScanNativeSettings(requestSettings));
+ verifySuccessfulResponse(order, handler, requestId);
+
+ eventHandler2.onScanStatus(WifiNative.WIFI_SCAN_RESULTS_AVAILABLE);
+ mLooper.dispatchAll();
+ verifyScanResultsRecieved(order, handler, requestId, results.getScanData());
+ verifySingleScanCompletedRecieved(order, handler, requestId);
+ verifyNoMoreInteractions(handler);
+ }
}