Snap for 6193921 from 69c2a18a462a573fe387d3da93a8ac2dbbaeb917 to rvc-release
Change-Id: I39fd167bdcd8e00a37a9ed1ab26fb5dcf65421c4
This commit is contained in:
@@ -3123,7 +3123,13 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
handleUpdateLinkProperties(nai, new LinkProperties(nai.linkProperties));
|
||||
}
|
||||
|
||||
private void updateLingerState(NetworkAgentInfo nai, long now) {
|
||||
/**
|
||||
* Updates the linger state from the network requests inside the NAI.
|
||||
* @param nai the agent info to update
|
||||
* @param now the timestamp of the event causing this update
|
||||
* @return whether the network was lingered as a result of this update
|
||||
*/
|
||||
private boolean updateLingerState(@NonNull final NetworkAgentInfo nai, final long now) {
|
||||
// 1. Update the linger timer. If it's changed, reschedule or cancel the alarm.
|
||||
// 2. If the network was lingering and there are now requests, unlinger it.
|
||||
// 3. If this network is unneeded (which implies it is not lingering), and there is at least
|
||||
@@ -3134,12 +3140,15 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
nai.unlinger();
|
||||
logNetworkEvent(nai, NetworkEvent.NETWORK_UNLINGER);
|
||||
} else if (unneeded(nai, UnneededFor.LINGER) && nai.getLingerExpiry() > 0) {
|
||||
int lingerTime = (int) (nai.getLingerExpiry() - now);
|
||||
if (DBG) log("Lingering " + nai.name() + " for " + lingerTime + "ms");
|
||||
if (DBG) {
|
||||
final int lingerTime = (int) (nai.getLingerExpiry() - now);
|
||||
log("Lingering " + nai.name() + " for " + lingerTime + "ms");
|
||||
}
|
||||
nai.linger();
|
||||
logNetworkEvent(nai, NetworkEvent.NETWORK_LINGER);
|
||||
notifyNetworkCallbacks(nai, ConnectivityManager.CALLBACK_LOSING, lingerTime);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private void handleAsyncChannelHalfConnect(Message msg) {
|
||||
@@ -3483,7 +3492,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
}
|
||||
// If there are still lingered requests on this network, don't tear it down,
|
||||
// but resume lingering instead.
|
||||
updateLingerState(nai, SystemClock.elapsedRealtime());
|
||||
final long now = SystemClock.elapsedRealtime();
|
||||
if (updateLingerState(nai, now)) {
|
||||
notifyNetworkLosing(nai, now);
|
||||
}
|
||||
if (unneeded(nai, UnneededFor.TEARDOWN)) {
|
||||
if (DBG) log("no live requests for " + nai.name() + "; disconnecting");
|
||||
teardownUnneededNetwork(nai);
|
||||
@@ -6620,11 +6632,16 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
}
|
||||
if (currentNetwork == null || currentNetwork.getCurrentScore() < score) {
|
||||
reassignedRequests.put(nri, newNetwork);
|
||||
changes.addRequestReassignment(new NetworkReassignment.RequestReassignment(
|
||||
nri, currentNetwork, newNetwork));
|
||||
}
|
||||
} else if (newNetwork == currentNetwork) {
|
||||
reassignedRequests.put(nri, null);
|
||||
changes.addRequestReassignment(new NetworkReassignment.RequestReassignment(
|
||||
nri, currentNetwork, null));
|
||||
}
|
||||
}
|
||||
|
||||
return reassignedRequests;
|
||||
}
|
||||
|
||||
@@ -6663,41 +6680,39 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
final NetworkRequestInfo nri = entry.getKey();
|
||||
final NetworkAgentInfo previousSatisfier = nri.mSatisfier;
|
||||
final NetworkAgentInfo newSatisfier = entry.getValue();
|
||||
changes.addRequestReassignment(new NetworkReassignment.RequestReassignment(
|
||||
nri, previousSatisfier, newSatisfier));
|
||||
if (newSatisfier != null) {
|
||||
if (VDBG) log("rematch for " + newSatisfier.name());
|
||||
if (previousSatisfier != null) {
|
||||
if (VDBG || DDBG) {
|
||||
log(" accepting network in place of " + previousSatisfier.name());
|
||||
}
|
||||
previousSatisfier.removeRequest(nri.request.requestId);
|
||||
previousSatisfier.lingerRequest(nri.request, now, mLingerDelayMs);
|
||||
} else {
|
||||
if (VDBG || DDBG) log(" accepting network in place of null");
|
||||
}
|
||||
newSatisfier.unlingerRequest(nri.request);
|
||||
if (!newSatisfier.addRequest(nri.request)) {
|
||||
Slog.wtf(TAG, "BUG: " + newSatisfier.name() + " already has " + nri.request);
|
||||
}
|
||||
} else {
|
||||
// If "newNetwork" is listed as satisfying "nri" but no longer satisfies "nri",
|
||||
// mark it as no longer satisfying "nri". Because networks are processed by
|
||||
// rematchAllNetworksAndRequests() in descending score order, "currentNetwork" will
|
||||
// match "newNetwork" before this loop will encounter a "currentNetwork" with higher
|
||||
// score than "newNetwork" and where "currentNetwork" no longer satisfies "nri".
|
||||
// This means this code doesn't have to handle the case where "currentNetwork" no
|
||||
// longer satisfies "nri" when "currentNetwork" does not equal "newNetwork".
|
||||
if (DBG) {
|
||||
log("Network " + newNetwork.name() + " stopped satisfying" +
|
||||
" request " + nri.request.requestId);
|
||||
}
|
||||
newNetwork.removeRequest(nri.request.requestId);
|
||||
}
|
||||
nri.mSatisfier = newSatisfier;
|
||||
updateSatisfiersForRematchRequest(nri, previousSatisfier, newSatisfier, now);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateSatisfiersForRematchRequest(@NonNull final NetworkRequestInfo nri,
|
||||
@Nullable final NetworkAgentInfo previousSatisfier,
|
||||
@Nullable final NetworkAgentInfo newSatisfier,
|
||||
final long now) {
|
||||
if (newSatisfier != null) {
|
||||
if (VDBG) log("rematch for " + newSatisfier.name());
|
||||
if (previousSatisfier != null) {
|
||||
if (VDBG || DDBG) {
|
||||
log(" accepting network in place of " + previousSatisfier.name());
|
||||
}
|
||||
previousSatisfier.removeRequest(nri.request.requestId);
|
||||
previousSatisfier.lingerRequest(nri.request, now, mLingerDelayMs);
|
||||
} else {
|
||||
if (VDBG || DDBG) log(" accepting network in place of null");
|
||||
}
|
||||
newSatisfier.unlingerRequest(nri.request);
|
||||
if (!newSatisfier.addRequest(nri.request)) {
|
||||
Slog.wtf(TAG, "BUG: " + newSatisfier.name() + " already has " + nri.request);
|
||||
}
|
||||
} else {
|
||||
if (DBG) {
|
||||
log("Network " + previousSatisfier.name() + " stopped satisfying"
|
||||
+ " request " + nri.request.requestId);
|
||||
}
|
||||
previousSatisfier.removeRequest(nri.request.requestId);
|
||||
}
|
||||
nri.mSatisfier = newSatisfier;
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempt to rematch all Networks with NetworkRequests. This may result in Networks
|
||||
* being disconnected.
|
||||
@@ -6773,13 +6788,20 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
processNewlySatisfiedListenRequests(event.mNetwork);
|
||||
}
|
||||
|
||||
final ArrayList<NetworkAgentInfo> lingeredNetworks = new ArrayList<>();
|
||||
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);
|
||||
if (updateLingerState(nai, now)) {
|
||||
lingeredNetworks.add(nai);
|
||||
}
|
||||
}
|
||||
|
||||
for (final NetworkAgentInfo nai : lingeredNetworks) {
|
||||
notifyNetworkLosing(nai, now);
|
||||
}
|
||||
|
||||
updateLegacyTypeTrackerAndVpnLockdownForRematch(oldDefaultNetwork, newDefaultNetwork, nais);
|
||||
@@ -6795,7 +6817,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
// and became unneeded due to another network improving its score to the
|
||||
// point where this network will no longer be able to satisfy any requests
|
||||
// even if it validates.
|
||||
updateLingerState(nai, now);
|
||||
if (updateLingerState(nai, now)) {
|
||||
notifyNetworkLosing(nai, now);
|
||||
}
|
||||
} else {
|
||||
if (DBG) log("Reaping " + nai.name());
|
||||
teardownUnneededNetwork(nai);
|
||||
@@ -7048,6 +7072,12 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
callCallbackForRequest(nri, nai, ConnectivityManager.CALLBACK_AVAILABLE, blocked ? 1 : 0);
|
||||
}
|
||||
|
||||
// Notify the requests on this NAI that the network is now lingered.
|
||||
private void notifyNetworkLosing(@NonNull final NetworkAgentInfo nai, final long now) {
|
||||
final int lingerTime = (int) (nai.getLingerExpiry() - now);
|
||||
notifyNetworkCallbacks(nai, ConnectivityManager.CALLBACK_LOSING, lingerTime);
|
||||
}
|
||||
|
||||
/**
|
||||
* Notify of the blocked state apps with a registered callback matching a given NAI.
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user