diff options
author | Etan Cohen <etancohen@google.com> | 2017-08-10 17:43:42 -0700 |
---|---|---|
committer | Etan Cohen <etancohen@google.com> | 2017-08-23 13:34:22 -0700 |
commit | 049cbc49e0dfda9c12f21d8a8b5a22eddf4e1495 (patch) | |
tree | 6af4435c37bb54e109a4ff6e4dce218d9c1aacf4 /service | |
parent | f6e0f26cc0823b628f887c651a906fa3ebbab070 (diff) |
[AWARE] Defer requests received while terminating an NDP
Defer requests received while an identical (canonically)
requests is being terminated (i.e. a termination was issued
but confirmation of termination not yet received).
In such a case the request is now rejected but a flag is set which
when (any) termination confirmation is received tickles the
connectivity service to re-evaluate the requests.
Bug: 63866251
Test: unit tests and integration tests
Change-Id: I77f8fd2c8444fb50aa05c356645216622f282677
Diffstat (limited to 'service')
-rw-r--r-- | service/java/com/android/server/wifi/aware/WifiAwareDataPathStateManager.java | 60 |
1 files changed, 43 insertions, 17 deletions
diff --git a/service/java/com/android/server/wifi/aware/WifiAwareDataPathStateManager.java b/service/java/com/android/server/wifi/aware/WifiAwareDataPathStateManager.java index b20445ae1..16888c81e 100644 --- a/service/java/com/android/server/wifi/aware/WifiAwareDataPathStateManager.java +++ b/service/java/com/android/server/wifi/aware/WifiAwareDataPathStateManager.java @@ -514,7 +514,7 @@ public class WifiAwareDataPathStateManager { AGENT_TAG_PREFIX + nnri.ndpId, new NetworkInfo(ConnectivityManager.TYPE_NONE, 0, NETWORK_TAG, ""), networkCapabilities, linkProperties, NETWORK_FACTORY_SCORE_AVAIL, - networkSpecifier, ndpId); + nnri); nnri.networkAgent.sendNetworkInfo(networkInfo); mAwareMetrics.recordNdpStatus(NanStatusType.SUCCESS, networkSpecifier.isOutOfBand(), @@ -553,10 +553,13 @@ public class WifiAwareDataPathStateManager { } tearDownInterfaceIfPossible(nnriE.getValue()); - if (nnriE.getValue().state == AwareNetworkRequestInformation.STATE_CONFIRMED) { + if (nnriE.getValue().state == AwareNetworkRequestInformation.STATE_CONFIRMED + || nnriE.getValue().state == AwareNetworkRequestInformation.STATE_TERMINATING) { mAwareMetrics.recordNdpSessionDuration(nnriE.getValue().startTimestamp); } mNetworkRequestsCache.remove(nnriE.getKey()); + + mNetworkFactory.tickleConnectivityIfWaiting(); } /** @@ -597,10 +600,22 @@ public class WifiAwareDataPathStateManager { } private class WifiAwareNetworkFactory extends NetworkFactory { + // Request received while waiting for confirmation that a canonically identical data-path + // (NDP) is in the process of being terminated + private boolean mWaitingForTermination = false; + WifiAwareNetworkFactory(Looper looper, Context context, NetworkCapabilities filter) { super(looper, context, NETWORK_TAG, filter); } + public void tickleConnectivityIfWaiting() { + if (mWaitingForTermination) { + if (VDBG) Log.v(TAG, "tickleConnectivityIfWaiting: was waiting!"); + mWaitingForTermination = false; + reevaluateAllRequests(); + } + } + @Override public boolean acceptRequest(NetworkRequest request, int score) { if (VDBG) { @@ -638,7 +653,12 @@ public class WifiAwareDataPathStateManager { if (nnri != null) { if (DBG) { Log.d(TAG, "WifiAwareNetworkFactory.acceptRequest: request=" + request - + " - already in cache!?"); + + " - already in cache with state=" + nnri.state); + } + + if (nnri.state == AwareNetworkRequestInformation.STATE_TERMINATING) { + mWaitingForTermination = true; + return false; } // seems to happen after a network agent is created - trying to rematch all @@ -660,9 +680,16 @@ public class WifiAwareDataPathStateManager { if (primaryRequest != null) { if (VDBG) { Log.v(TAG, "WifiAwareNetworkFactory.acceptRequest: request=" + request - + ", already has a primary request=" + primaryRequest.getKey()); + + ", already has a primary request=" + primaryRequest.getKey() + + " with state=" + primaryRequest.getValue().state); + } + + if (primaryRequest.getValue().state + == AwareNetworkRequestInformation.STATE_TERMINATING) { + mWaitingForTermination = true; + } else { + primaryRequest.getValue().updateToSupportNewRequest(networkSpecifier); } - primaryRequest.getValue().updateToSupportNewRequest(networkSpecifier); return false; } @@ -780,27 +807,25 @@ public class WifiAwareDataPathStateManager { private class WifiAwareNetworkAgent extends NetworkAgent { private NetworkInfo mNetworkInfo; - private WifiAwareNetworkSpecifier mNetworkSpecifier; - private int mNdpId; + private AwareNetworkRequestInformation mAwareNetworkRequestInfo; WifiAwareNetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni, NetworkCapabilities nc, LinkProperties lp, int score, - WifiAwareNetworkSpecifier networkSpecifier, int ndpId) { + AwareNetworkRequestInformation anri) { super(looper, context, logTag, ni, nc, lp, score); mNetworkInfo = ni; - mNetworkSpecifier = networkSpecifier; - mNdpId = ndpId; + mAwareNetworkRequestInfo = anri; } @Override protected void unwanted() { if (VDBG) { - Log.v(TAG, "WifiAwareNetworkAgent.unwanted: networkSpecifier=" + mNetworkSpecifier - + ", ndpId=" + mNdpId); + Log.v(TAG, "WifiAwareNetworkAgent.unwanted: request=" + mAwareNetworkRequestInfo); } - mMgr.endDataPath(mNdpId); + mMgr.endDataPath(mAwareNetworkRequestInfo.ndpId); + mAwareNetworkRequestInfo.state = AwareNetworkRequestInformation.STATE_TERMINATING; // Will get a callback (on both initiator and responder) when data-path actually // terminated. At that point will inform the agent and will clear the cache. @@ -808,8 +833,8 @@ public class WifiAwareDataPathStateManager { void reconfigureAgentAsDisconnected() { if (VDBG) { - Log.v(TAG, "WifiAwareNetworkAgent.reconfigureAgentAsDisconnected: networkSpecifier=" - + mNetworkSpecifier + ", ndpId=" + mNdpId); + Log.v(TAG, "WifiAwareNetworkAgent.reconfigureAgentAsDisconnected: request=" + + mAwareNetworkRequestInfo); } mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.DISCONNECTED, null, ""); @@ -848,8 +873,9 @@ public class WifiAwareDataPathStateManager { continue; } - if (nri.interfaceName.equals(lnri.interfaceName) - && lnri.state == AwareNetworkRequestInformation.STATE_CONFIRMED) { + if (nri.interfaceName.equals(lnri.interfaceName) && ( + lnri.state == AwareNetworkRequestInformation.STATE_CONFIRMED + || lnri.state == AwareNetworkRequestInformation.STATE_TERMINATING)) { return true; } } |