diff options
-rw-r--r-- | service/java/com/android/server/wifi/aware/WifiAwareDataPathStateManager.java | 23 | ||||
-rw-r--r-- | tests/wifitests/src/com/android/server/wifi/aware/WifiAwareDataPathStateManagerTest.java | 65 |
2 files changed, 75 insertions, 13 deletions
diff --git a/service/java/com/android/server/wifi/aware/WifiAwareDataPathStateManager.java b/service/java/com/android/server/wifi/aware/WifiAwareDataPathStateManager.java index e9650715d..e641106a7 100644 --- a/service/java/com/android/server/wifi/aware/WifiAwareDataPathStateManager.java +++ b/service/java/com/android/server/wifi/aware/WifiAwareDataPathStateManager.java @@ -282,6 +282,7 @@ public class WifiAwareDataPathStateManager { Log.w(TAG, "onDataPathInitiateSuccess: network request in incorrect state: state=" + nnri.state); mNetworkRequestsCache.remove(networkSpecifier); + mNetworkFactory.letAppKnowThatRequestsAreUnavailable(nnri); mMgr.endDataPath(ndpId); return; } @@ -309,6 +310,7 @@ public class WifiAwareDataPathStateManager { + networkSpecifier); return; } + mNetworkFactory.letAppKnowThatRequestsAreUnavailable(nnri); if (nnri.state != AwareNetworkRequestInformation.STATE_INITIATOR_WAIT_FOR_REQUEST_RESPONSE) { @@ -420,6 +422,7 @@ public class WifiAwareDataPathStateManager { "onDataPathRequest: request " + networkSpecifier + " no interface available"); mMgr.respondToDataPathRequest(false, ndpId, "", null, null, null, false); mNetworkRequestsCache.remove(networkSpecifier); + mNetworkFactory.letAppKnowThatRequestsAreUnavailable(nnri); return null; } @@ -472,6 +475,7 @@ public class WifiAwareDataPathStateManager { + " failed responding"); mMgr.endDataPath(ndpId); mNetworkRequestsCache.remove(networkSpecifier); + mNetworkFactory.letAppKnowThatRequestsAreUnavailable(nnri); mAwareMetrics.recordNdpStatus(reasonOnFailure, networkSpecifier.isOutOfBand(), nnri.startTimestamp); return; @@ -483,6 +487,7 @@ public class WifiAwareDataPathStateManager { + " is incorrect state=" + nnri.state); mMgr.endDataPath(ndpId); mNetworkRequestsCache.remove(networkSpecifier); + mNetworkFactory.letAppKnowThatRequestsAreUnavailable(nnri); return; } @@ -533,6 +538,7 @@ public class WifiAwareDataPathStateManager { if (nnri.state != AwareNetworkRequestInformation.STATE_WAIT_FOR_CONFIRM) { Log.w(TAG, "onDataPathConfirm: invalid state=" + nnri.state); mNetworkRequestsCache.remove(networkSpecifier); + mNetworkFactory.letAppKnowThatRequestsAreUnavailable(nnri); if (accept) { mMgr.endDataPath(ndpId); } @@ -647,6 +653,7 @@ public class WifiAwareDataPathStateManager { + " rejected - reason=" + reason); } mNetworkRequestsCache.remove(networkSpecifier); + mNetworkFactory.letAppKnowThatRequestsAreUnavailable(nnri); mAwareMetrics.recordNdpStatus(reason, networkSpecifier.isOutOfBand(), nnri.startTimestamp); } @@ -745,6 +752,7 @@ public class WifiAwareDataPathStateManager { } mAwareMetrics.recordNdpStatus(NanStatusType.INTERNAL_FAILURE, nnri.networkSpecifier.isOutOfBand(), nnri.startTimestamp); + mNetworkFactory.letAppKnowThatRequestsAreUnavailable(nnri); mMgr.endDataPath(nnri.ndpId); nnri.state = AwareNetworkRequestInformation.STATE_TERMINATING; @@ -823,6 +831,7 @@ public class WifiAwareDataPathStateManager { if (nnri == null) { Log.e(TAG, "WifiAwareNetworkFactory.acceptRequest: request=" + request + " - can't parse network specifier"); + releaseRequestAsUnfulfillableByAnyFactory(request); return false; } @@ -886,6 +895,7 @@ public class WifiAwareDataPathStateManager { Log.w(TAG, "needNetworkFor: request " + networkSpecifier + " no interface available"); mNetworkRequestsCache.remove(networkSpecifier); + letAppKnowThatRequestsAreUnavailable(nnri); return; } @@ -950,6 +960,9 @@ public class WifiAwareDataPathStateManager { nnri.state = AwareNetworkRequestInformation.STATE_TERMINATING; } else { mNetworkRequestsCache.remove(networkSpecifier); + if (nnri.networkAgent != null) { + letAppKnowThatRequestsAreUnavailable(nnri); + } } } else { if (VDBG) { @@ -958,6 +971,12 @@ public class WifiAwareDataPathStateManager { } } } + + void letAppKnowThatRequestsAreUnavailable(AwareNetworkRequestInformation nnri) { + for (NetworkRequest nr : nnri.equivalentRequests) { + releaseRequestAsUnfulfillableByAnyFactory(nr); + } + } } private class WifiAwareNetworkAgent extends NetworkAgent { @@ -1017,7 +1036,9 @@ public class WifiAwareDataPathStateManager { } } - if (nnri.networkAgent != null) { + if (nnri.networkAgent == null) { + mNetworkFactory.letAppKnowThatRequestsAreUnavailable(nnri); + } else { nnri.networkAgent.reconfigureAgentAsDisconnected(); } } diff --git a/tests/wifitests/src/com/android/server/wifi/aware/WifiAwareDataPathStateManagerTest.java b/tests/wifitests/src/com/android/server/wifi/aware/WifiAwareDataPathStateManagerTest.java index 069e8655b..e7a61e575 100644 --- a/tests/wifitests/src/com/android/server/wifi/aware/WifiAwareDataPathStateManagerTest.java +++ b/tests/wifitests/src/com/android/server/wifi/aware/WifiAwareDataPathStateManagerTest.java @@ -29,6 +29,7 @@ import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyShort; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; @@ -74,6 +75,7 @@ import android.os.Messenger; import android.os.PowerManager; import android.os.Process; import android.os.test.TestLooper; +import android.util.Pair; import androidx.test.filters.SmallTest; @@ -299,7 +301,8 @@ public class WifiAwareDataPathStateManagerTest { res.mMessenger.send(reqNetworkMsg); mMockLooper.dispatchAll(); - // failure: no interactions with connectivity manager or native manager + // failure: no interactions with native manager + verifyUnfullfillableDispatched(res.mReverseMessenger); verifyNoMoreInteractions(mMockNative, mMockCm, mAwareMetricsMock, mMockNwMgt); } @@ -459,6 +462,8 @@ public class WifiAwareDataPathStateManagerTest { mDut.onRespondToDataPathSetupRequestResponse(transactionId.getValue(), true, 0); mMockLooper.dispatchAll(); + verifyUnfullfillableDispatched(res.mReverseMessenger); + // failure if there's further activity verifyNoMoreInteractions(mMockNative, mMockCm, mAwareMetricsMock, mMockNwMgt); } @@ -611,7 +616,7 @@ public class WifiAwareDataPathStateManagerTest { InOrder inOrderM = inOrder(mAwareMetricsMock); // (1) initialize all clients - Messenger messenger = initOobDataPathEndPoint(true, 2, clientId, inOrder, inOrderM); + Messenger messenger = initOobDataPathEndPoint(true, 2, clientId, inOrder, inOrderM).first; for (int i = 1; i < numRequestsPre + numRequestsPost; ++i) { initOobDataPathEndPoint(false, 1, clientId + i, inOrder, inOrderM); } @@ -751,7 +756,8 @@ public class WifiAwareDataPathStateManagerTest { InOrder inOrderM = inOrder(mAwareMetricsMock); // (1) initialize all clients - Messenger messenger = initOobDataPathEndPoint(true, numNdis, clientId, inOrder, inOrderM); + Pair<Messenger, Messenger> res = initOobDataPathEndPoint(true, numNdis, clientId, inOrder, + inOrderM); for (int i = 1; i < numNdis + 3; ++i) { initOobDataPathEndPoint(false, numNdis, clientId + i, inOrder, inOrderM); } @@ -770,7 +776,7 @@ public class WifiAwareDataPathStateManagerTest { reqNetworkMsg.what = NetworkFactory.CMD_REQUEST_NETWORK; reqNetworkMsg.obj = nr; reqNetworkMsg.arg1 = 0; - messenger.send(reqNetworkMsg); + res.first.send(reqNetworkMsg); mMockLooper.dispatchAll(); if (i < numNdis) { @@ -797,6 +803,8 @@ public class WifiAwareDataPathStateManagerTest { netInfo.getPeerIpv6Addr().getAddress()); assertEquals(0, netInfo.getPort()); // uninitialized -> 0 assertEquals(-1, netInfo.getTransportProtocol()); // uninitialized -> -1 + } else { + verifyUnfullfillableDispatched(res.second); } } @@ -1165,6 +1173,7 @@ public class WifiAwareDataPathStateManagerTest { // consequences of failure: // Responder (publisher): responds with a rejection to any data-path requests // Initiator (subscribe): doesn't initiate (i.e. no HAL requests) + verifyUnfullfillableDispatched(res.mReverseMessenger); if (doPublish) { // (2) get request & respond mDut.onDataPathRequestNotification(pubSubId, peerDiscoveryMac, ndpId, null); @@ -1224,6 +1233,7 @@ public class WifiAwareDataPathStateManagerTest { // consequences of failure: // Responder (publisher): responds with a rejection to any data-path requests // Initiator (subscribe): doesn't initiate (i.e. no HAL requests) + verifyUnfullfillableDispatched(res.mReverseMessenger); if (doPublish) { // (2) get request & respond mDut.onDataPathRequestNotification(pubSubId, peerDiscoveryMac, ndpId, null); @@ -1312,6 +1322,7 @@ public class WifiAwareDataPathStateManagerTest { // short-circuit the rest of this test inOrderM.verify(mAwareMetricsMock).recordNdpStatus(eq(NanStatusType.INTERNAL_FAILURE), eq(useDirect), anyLong()); + verifyUnfullfillableDispatched(res.mReverseMessenger); verifyNoMoreInteractions(mMockNative, mMockCm, mAwareMetricsMock); return; } @@ -1339,6 +1350,7 @@ public class WifiAwareDataPathStateManagerTest { assertTrue(mAlarmManager.dispatch( WifiAwareStateManager.HAL_DATA_PATH_CONFIRM_TIMEOUT_TAG)); mMockLooper.dispatchAll(); + verifyUnfullfillableDispatched(res.mReverseMessenger); inOrder.verify(mMockNative).endDataPath(transactionId.capture(), eq(ndpId)); mDut.onEndDataPathResponse(transactionId.getValue(), true, 0); mMockLooper.dispatchAll(); @@ -1453,6 +1465,7 @@ public class WifiAwareDataPathStateManagerTest { assertTrue(mAlarmManager.dispatch( WifiAwareStateManager.HAL_DATA_PATH_CONFIRM_TIMEOUT_TAG)); mMockLooper.dispatchAll(); + verifyUnfullfillableDispatched(res.mReverseMessenger); inOrder.verify(mMockNative).endDataPath(transactionId.capture(), eq(ndpId)); mDut.onEndDataPathResponse(transactionId.getValue(), true, 0); mMockLooper.dispatchAll(); @@ -1480,6 +1493,7 @@ public class WifiAwareDataPathStateManagerTest { inOrderM.verify(mAwareMetricsMock).recordNdpSessionDuration(anyLong()); } } else { + verifyUnfullfillableDispatched(res.mReverseMessenger); inOrder.verify(mMockNative).respondToDataPathRequest(transactionId.capture(), eq(false), eq(ndpId), eq(""), eq(null), eq(null), eq(null), eq(false), any()); mDut.onRespondToDataPathSetupRequestResponse(transactionId.getValue(), true, 0); @@ -1577,7 +1591,7 @@ public class WifiAwareDataPathStateManagerTest { nc.setLinkDownstreamBandwidthKbps(1); nc.setSignalStrength(1); - return new NetworkRequest(nc, 0, requestId, NetworkRequest.Type.NONE); + return new NetworkRequest(nc, 0, requestId, NetworkRequest.Type.REQUEST); } private NetworkRequest getDirectNetworkRequest(int clientId, int role, byte[] peer, @@ -1642,8 +1656,8 @@ public class WifiAwareDataPathStateManagerTest { ArgumentCaptor<Integer> sessionId = ArgumentCaptor.forClass(Integer.class); ArgumentCaptor<Integer> peerIdCaptor = ArgumentCaptor.forClass(Integer.class); - Messenger messenger = initOobDataPathEndPoint(isFirstIteration, 1, clientId, inOrder, - inOrderM); + Pair<Messenger, Messenger> res = initOobDataPathEndPoint(isFirstIteration, 1, clientId, + inOrder, inOrderM); if (doPublish) { mDut.publish(clientId, publishConfig, mMockSessionCallback); @@ -1672,11 +1686,12 @@ public class WifiAwareDataPathStateManagerTest { eq(someMsg.getBytes())); return new DataPathEndPointInfo(sessionId.getValue(), peerIdCaptor.getValue(), - isFirstIteration ? messenger : null); + isFirstIteration ? res.first : null, isFirstIteration ? res.second : null); } - private Messenger initOobDataPathEndPoint(boolean startUpSequence, int maxNdiInterfaces, - int clientId, InOrder inOrder, InOrder inOrderM) throws Exception { + private Pair<Messenger, Messenger> initOobDataPathEndPoint(boolean startUpSequence, + int maxNdiInterfaces, int clientId, InOrder inOrder, InOrder inOrderM) + throws Exception { final int pid = 2000; final String callingPackage = "com.android.somePackage"; final ConfigRequest configRequest = new ConfigRequest.Builder().build(); @@ -1734,7 +1749,20 @@ public class WifiAwareDataPathStateManagerTest { mDut.onCreateDataPathInterfaceResponse(transactionId.getValue(), true, 0); mMockLooper.dispatchAll(); } - return messengerCaptor.getValue(); + Messenger messenger = messengerCaptor.getValue(); + + Messenger reverseMessenger = null; + if (messenger != null) { + reverseMessenger = mock(Messenger.class); + + Message fullConnectionMessage = Message.obtain(); + fullConnectionMessage.what = AsyncChannel.CMD_CHANNEL_FULL_CONNECTION; + fullConnectionMessage.replyTo = reverseMessenger; + messenger.send(fullConnectionMessage); + mMockLooper.dispatchAll(); + } + + return Pair.create(messenger, reverseMessenger); } return null; @@ -1786,14 +1814,27 @@ public class WifiAwareDataPathStateManagerTest { int mSessionId; PeerHandle mPeerHandle; Messenger mMessenger; + Messenger mReverseMessenger; - DataPathEndPointInfo(int sessionId, int peerId, Messenger messenger) { + DataPathEndPointInfo(int sessionId, int peerId, Messenger messenger, + Messenger reverseMessenger) { mSessionId = sessionId; mPeerHandle = new PeerHandle(peerId); mMessenger = messenger; + mReverseMessenger = reverseMessenger; } } + /** + * Verify that an EVENT_UNFULFILLABLE_REQUEST was dispatched on the (mock) messenger. + */ + private void verifyUnfullfillableDispatched(Messenger messenger) throws Exception { + ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class); + + verify(messenger, atLeastOnce()).send(messageCaptor.capture()); + assertEquals(NetworkFactory.EVENT_UNFULFILLABLE_REQUEST, messageCaptor.getValue().what); + } + // copy of the method in WifiAwareDataPathStateManager - but without error checking (so we can // construct invalid TLVs for testing). private static byte[] buildTlv(int port, int transportProtocol, boolean includeGarbageTlv) { |