From 7807fa2b7fc7578370de638afacd1539b27664ac Mon Sep 17 00:00:00 2001 From: Chalard Jean Date: Tue, 19 Nov 2019 20:01:10 +0900 Subject: [PATCH] [NS A17] Update linger state after rematching. Test: FrameworksNetTests NetworkStackTests Change-Id: I720a1feb89088aa123201ef5867de444234343e8 --- .../android/server/ConnectivityService.java | 22 +++++++++---------- .../server/connectivity/NetworkAgentInfo.java | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 1d5016e9d5..245c7c7238 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -6486,15 +6486,6 @@ public class ConnectivityService extends IConnectivityManager.Stub // do this after the default net is switched, but // before LegacyTypeTracker sends legacy broadcasts for (NetworkRequestInfo nri : addedRequests) notifyNetworkAvailable(newNetwork, nri); - - // Linger any networks that are no longer needed. This should be done after sending the - // available callback for newNetwork. - for (NetworkAgentInfo nai : removedRequests) { - updateLingerState(nai, now); - } - // Possibly unlinger newNetwork. Unlingering a network does not send any callbacks so it - // does not need to be done in any particular order. - updateLingerState(newNetwork, now); } /** @@ -6514,14 +6505,23 @@ public class ConnectivityService extends IConnectivityManager.Stub new NetworkAgentInfo[mNetworkAgentInfos.size()]); // Rematch higher scoring networks first to prevent requests first matching a lower // scoring network and then a higher scoring network, which could produce multiple - // callbacks and inadvertently unlinger networks. + // callbacks. Arrays.sort(nais); - for (NetworkAgentInfo nai : nais) { + for (final NetworkAgentInfo nai : nais) { rematchNetworkAndRequests(nai, now); } final NetworkAgentInfo newDefaultNetwork = getDefaultNetwork(); + for (final NetworkAgentInfo nai : nais) { + // Rematching may have altered the linger state of some networks, so update all linger + // timers. updateLingerState reads the state from the network agent and does nothing + // if the state has not changed : the source of truth is controlled with + // NetworkAgentInfo#lingerRequest and NetworkAgentInfo#unlingerRequest, which have been + // called while rematching the individual networks above. + updateLingerState(nai, now); + } + updateLegacyTypeTrackerAndVpnLockdownForRematch(oldDefaultNetwork, newDefaultNetwork, nais); // Tear down all unneeded networks. diff --git a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java index 24a5b7fa14..bb7f86233a 100644 --- a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java +++ b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java @@ -580,7 +580,7 @@ public class NetworkAgentInfo implements Comparable { // semantics of WakeupMessage guarantee that if cancel is called then the alarm will // never call its callback (handleLingerComplete), even if it has already fired. // WakeupMessage makes no such guarantees about rescheduling a message, so if mLingerMessage - // has already been dispatched, rescheduling to some time in the future it won't stop it + // has already been dispatched, rescheduling to some time in the future won't stop it // from calling its callback immediately. if (mLingerMessage != null) { mLingerMessage.cancel();