diff options
| author | 2014-12-04 19:27:50 +0000 | |
|---|---|---|
| committer | 2014-12-04 19:27:52 +0000 | |
| commit | efb81b9e965c4ba782151b6767e7e3df4f2cdfd2 (patch) | |
| tree | 76d2348d68918abc8f9f33e1a2b83723993a1684 | |
| parent | ff5e5db319785d23d672af95ac2dff3f37827cfd (diff) | |
| parent | 0cc1732cfb9d68779449b4c12661b4df6bfc720b (diff) | |
Merge "Remember to cancel lingering when a network again satsifies a NetworkRequest." into lmp-mr1-dev
| -rw-r--r-- | services/core/java/com/android/server/ConnectivityService.java | 66 | ||||
| -rw-r--r-- | services/core/java/com/android/server/connectivity/NetworkAgentInfo.java | 6 |
2 files changed, 36 insertions, 36 deletions
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 84fddd76fb82..0f1ed0af9fe0 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -2076,6 +2076,17 @@ public class ConnectivityService extends IConnectivityManager.Stub } } + // Cancel any lingering so the linger timeout doesn't teardown a network. + // This should be called when a network begins satisfying a NetworkRequest. + // Note: depending on what state the NetworkMonitor is in (e.g., + // if it's awaiting captive portal login, or if validation failed), this + // may trigger a re-evaluation of the network. + private void unlinger(NetworkAgentInfo nai) { + if (VDBG) log("Canceling linger of " + nai.name()); + nai.networkLingered.clear(); + nai.networkMonitor.sendMessage(NetworkMonitor.CMD_NETWORK_CONNECTED); + } + private void handleAsyncChannelHalfConnect(Message msg) { AsyncChannel ac = (AsyncChannel) msg.obj; if (mNetworkFactoryInfos.containsKey(msg.replyTo)) { @@ -2111,6 +2122,7 @@ public class ConnectivityService extends IConnectivityManager.Stub } } } + private void handleAsyncChannelDisconnected(Message msg) { NetworkAgentInfo nai = mNetworkAgentInfos.get(msg.replyTo); if (nai != null) { @@ -2160,11 +2172,8 @@ public class ConnectivityService extends IConnectivityManager.Stub mNetworkForRequestId.remove(request.requestId); sendUpdatedScoreToFactories(request, 0); NetworkAgentInfo alternative = null; - for (Map.Entry entry : mNetworkAgentInfos.entrySet()) { - NetworkAgentInfo existing = (NetworkAgentInfo)entry.getValue(); - if (existing.networkInfo.isConnected() && - request.networkCapabilities.satisfiedByNetworkCapabilities( - existing.networkCapabilities) && + for (NetworkAgentInfo existing : mNetworkAgentInfos.values()) { + if (existing.satisfies(request) && (alternative == null || alternative.getCurrentScore() < existing.getCurrentScore())) { alternative = existing; @@ -2184,8 +2193,7 @@ public class ConnectivityService extends IConnectivityManager.Stub requestNetworkTransitionWakelock(nai.name()); } for (NetworkAgentInfo networkToActivate : toActivate) { - networkToActivate.networkLingered.clear(); - networkToActivate.networkMonitor.sendMessage(NetworkMonitor.CMD_NETWORK_CONNECTED); + unlinger(networkToActivate); rematchNetworkAndRequests(networkToActivate, false); } } @@ -2220,44 +2228,35 @@ public class ConnectivityService extends IConnectivityManager.Stub private void handleRegisterNetworkRequest(Message msg) { final NetworkRequestInfo nri = (NetworkRequestInfo) (msg.obj); - final NetworkCapabilities newCap = nri.request.networkCapabilities; - int score = 0; mNetworkRequests.put(nri.request, nri); + // TODO: This logic may be better replaced with a call to rematchNetworkAndRequests + // Check for the best currently alive network that satisfies this request NetworkAgentInfo bestNetwork = null; for (NetworkAgentInfo network : mNetworkAgentInfos.values()) { if (DBG) log("handleRegisterNetworkRequest checking " + network.name()); - if (newCap.satisfiedByNetworkCapabilities(network.networkCapabilities)) { + if (network.satisfies(nri.request)) { if (DBG) log("apparently satisfied. currentScore=" + network.getCurrentScore()); - if ((bestNetwork == null) || + if (!nri.isRequest) { + // Not setting bestNetwork here as a listening NetworkRequest may be + // satisfied by multiple Networks. Instead the request is added to + // each satisfying Network and notified about each. + network.addRequest(nri.request); + notifyNetworkCallback(network, nri); + } else if (bestNetwork == null || bestNetwork.getCurrentScore() < network.getCurrentScore()) { - if (!nri.isRequest) { - // Not setting bestNetwork here as a listening NetworkRequest may be - // satisfied by multiple Networks. Instead the request is added to - // each satisfying Network and notified about each. - network.addRequest(nri.request); - notifyNetworkCallback(network, nri); - } else { - bestNetwork = network; - } + bestNetwork = network; } } } if (bestNetwork != null) { if (DBG) log("using " + bestNetwork.name()); - if (bestNetwork.networkInfo.isConnected()) { - // Cancel any lingering so the linger timeout doesn't teardown this network - // even though we have a request for it. - bestNetwork.networkLingered.clear(); - bestNetwork.networkMonitor.sendMessage(NetworkMonitor.CMD_NETWORK_CONNECTED); - } - // TODO: This logic may be better replaced with a call to rematchNetworkAndRequests + unlinger(bestNetwork); bestNetwork.addRequest(nri.request); mNetworkForRequestId.put(nri.request.requestId, bestNetwork); notifyNetworkCallback(bestNetwork, nri); - score = bestNetwork.getCurrentScore(); if (nri.request.legacyType != TYPE_NONE) { mLegacyTypeTracker.add(nri.request.legacyType, bestNetwork); } @@ -2265,6 +2264,7 @@ public class ConnectivityService extends IConnectivityManager.Stub if (nri.isRequest) { if (DBG) log("sending new NetworkRequest to factories"); + final int score = bestNetwork == null ? 0 : bestNetwork.getCurrentScore(); for (NetworkFactoryInfo nfi : mNetworkFactoryInfos.values()) { nfi.asyncChannel.sendMessage(android.net.NetworkFactory.CMD_REQUEST_NETWORK, score, 0, nri.request); @@ -3966,8 +3966,7 @@ public class ConnectivityService extends IConnectivityManager.Stub // check if it satisfies the NetworkCapabilities if (VDBG) log(" checking if request is satisfied: " + nri.request); - if (nri.request.networkCapabilities.satisfiedByNetworkCapabilities( - newNetwork.networkCapabilities)) { + if (newNetwork.satisfies(nri.request)) { if (!nri.isRequest) { // This is not a request, it's a callback listener. // Add it to newNetwork regardless of score. @@ -4047,12 +4046,7 @@ public class ConnectivityService extends IConnectivityManager.Stub nai.networkMonitor.sendMessage(NetworkMonitor.CMD_NETWORK_LINGER); notifyNetworkCallbacks(nai, ConnectivityManager.CALLBACK_LOSING); } else { - // not going to linger, so kill the list of linger networks.. only - // notify them of linger if it happens as the result of gaining another, - // but if they transition and old network stays up, don't tell them of linger - // or very delayed loss - nai.networkLingered.clear(); - if (VDBG) log("Lingered for " + nai.name() + " cleared"); + unlinger(nai); } } if (keep) { diff --git a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java index 4af920affad2..6feeb7cff2f2 100644 --- a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java +++ b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java @@ -96,6 +96,12 @@ public class NetworkAgentInfo { networkRequests.put(networkRequest.requestId, networkRequest); } + // Does this network satisfy request? + public boolean satisfies(NetworkRequest request) { + return created && + request.networkCapabilities.satisfiedByNetworkCapabilities(networkCapabilities); + } + public boolean isVPN() { return networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN); } |