diff options
author | Mitchell Wills <mwills@google.com> | 2016-09-20 11:03:58 -0700 |
---|---|---|
committer | Mitchell Wills <mwills@google.com> | 2016-09-20 11:37:46 -0700 |
commit | d76a14997a969ea44daa47756dcc8f83aee96935 (patch) | |
tree | 0140721df8b20b68f88028864cf5a4e03d672c40 | |
parent | 5e816a8c6f96076f69dd8bbb0110203d92940c4e (diff) | |
download | wifi-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.java | 4 | ||||
-rw-r--r-- | tests/wifitests/src/com/android/server/wifi/scanner/WifiScanningServiceTest.java | 55 |
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); + } } |