[NS A25] Send all listen callbacks after all rematches
Reupload of I2db9535b1d72edd46b968b1bae66b148aa815235 with a bugfix. Bug: 113554781 Test: ConnectivityServiceTests NetworkStackTests Change-Id: I904d87c01d9422ba6233d22a189e8017dd298d37
This commit is contained in:
@@ -5791,6 +5791,19 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
return INetd.PERMISSION_NONE;
|
return INetd.PERMISSION_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void updateNetworkPermissions(@NonNull final NetworkAgentInfo nai,
|
||||||
|
@NonNull final NetworkCapabilities newNc) {
|
||||||
|
final int oldPermission = getNetworkPermission(nai.networkCapabilities);
|
||||||
|
final int newPermission = getNetworkPermission(newNc);
|
||||||
|
if (oldPermission != newPermission && nai.created && !nai.isVPN()) {
|
||||||
|
try {
|
||||||
|
mNMS.setNetworkPermission(nai.network.netId, newPermission);
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
loge("Exception in setNetworkPermission: " + e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Augments the NetworkCapabilities passed in by a NetworkAgent with capabilities that are
|
* Augments the NetworkCapabilities passed in by a NetworkAgent with capabilities that are
|
||||||
* maintained here that the NetworkAgent is not aware of (e.g., validated, captive portal,
|
* maintained here that the NetworkAgent is not aware of (e.g., validated, captive portal,
|
||||||
@@ -5862,21 +5875,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
* @param nai the network having its capabilities updated.
|
* @param nai the network having its capabilities updated.
|
||||||
* @param nc the new network capabilities.
|
* @param nc the new network capabilities.
|
||||||
*/
|
*/
|
||||||
private void updateCapabilities(int oldScore, NetworkAgentInfo nai, NetworkCapabilities nc) {
|
private void updateCapabilities(final int oldScore, @NonNull final NetworkAgentInfo nai,
|
||||||
|
@NonNull final NetworkCapabilities nc) {
|
||||||
NetworkCapabilities newNc = mixInCapabilities(nai, nc);
|
NetworkCapabilities newNc = mixInCapabilities(nai, nc);
|
||||||
|
|
||||||
if (Objects.equals(nai.networkCapabilities, newNc)) return;
|
if (Objects.equals(nai.networkCapabilities, newNc)) return;
|
||||||
|
updateNetworkPermissions(nai, newNc);
|
||||||
final int oldPermission = getNetworkPermission(nai.networkCapabilities);
|
|
||||||
final int newPermission = getNetworkPermission(newNc);
|
|
||||||
if (oldPermission != newPermission && nai.created && !nai.isVPN()) {
|
|
||||||
try {
|
|
||||||
mNMS.setNetworkPermission(nai.network.netId, newPermission);
|
|
||||||
} catch (RemoteException e) {
|
|
||||||
loge("Exception in setNetworkPermission: " + e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
final NetworkCapabilities prevNc = nai.getAndSetNetworkCapabilities(newNc);
|
final NetworkCapabilities prevNc = nai.getAndSetNetworkCapabilities(newNc);
|
||||||
|
|
||||||
updateUids(nai, prevNc, newNc);
|
updateUids(nai, prevNc, newNc);
|
||||||
@@ -6256,6 +6259,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
|
|
||||||
@NonNull private final Set<NetworkBgStatePair> mRematchedNetworks = new ArraySet<>();
|
@NonNull private final Set<NetworkBgStatePair> mRematchedNetworks = new ArraySet<>();
|
||||||
|
|
||||||
|
@NonNull Iterable<NetworkBgStatePair> getRematchedNetworks() {
|
||||||
|
return mRematchedNetworks;
|
||||||
|
}
|
||||||
|
|
||||||
void addRematchedNetwork(@NonNull final NetworkBgStatePair network) {
|
void addRematchedNetwork(@NonNull final NetworkBgStatePair network) {
|
||||||
mRematchedNetworks.add(network);
|
mRematchedNetworks.add(network);
|
||||||
}
|
}
|
||||||
@@ -6328,9 +6335,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
boolean isNewDefault = false;
|
boolean isNewDefault = false;
|
||||||
NetworkAgentInfo oldDefaultNetwork = null;
|
NetworkAgentInfo oldDefaultNetwork = null;
|
||||||
|
|
||||||
final boolean wasBackgroundNetwork = newNetwork.isBackgroundNetwork();
|
|
||||||
changes.addRematchedNetwork(new NetworkReassignment.NetworkBgStatePair(newNetwork,
|
changes.addRematchedNetwork(new NetworkReassignment.NetworkBgStatePair(newNetwork,
|
||||||
wasBackgroundNetwork));
|
newNetwork.isBackgroundNetwork()));
|
||||||
|
|
||||||
final int score = newNetwork.getCurrentScore();
|
final int score = newNetwork.getCurrentScore();
|
||||||
|
|
||||||
@@ -6440,33 +6446,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
// Notify requested networks are available after the default net is switched, but
|
// Notify requested networks are available after the default net is switched, but
|
||||||
// before LegacyTypeTracker sends legacy broadcasts
|
// before LegacyTypeTracker sends legacy broadcasts
|
||||||
for (NetworkRequestInfo nri : addedRequests) notifyNetworkAvailable(newNetwork, nri);
|
for (NetworkRequestInfo nri : addedRequests) notifyNetworkAvailable(newNetwork, nri);
|
||||||
|
|
||||||
// Finally, process listen requests and update capabilities if the background state has
|
|
||||||
// changed for this network. For consistency with previous behavior, send onLost callbacks
|
|
||||||
// before onAvailable.
|
|
||||||
processNewlyLostListenRequests(newNetwork);
|
|
||||||
|
|
||||||
// Maybe the network changed background states. Update its capabilities.
|
|
||||||
final boolean backgroundChanged = wasBackgroundNetwork != newNetwork.isBackgroundNetwork();
|
|
||||||
if (backgroundChanged) {
|
|
||||||
final NetworkCapabilities newNc = mixInCapabilities(newNetwork,
|
|
||||||
newNetwork.networkCapabilities);
|
|
||||||
|
|
||||||
final int oldPermission = getNetworkPermission(newNetwork.networkCapabilities);
|
|
||||||
final int newPermission = getNetworkPermission(newNc);
|
|
||||||
if (oldPermission != newPermission) {
|
|
||||||
try {
|
|
||||||
mNMS.setNetworkPermission(newNetwork.network.netId, newPermission);
|
|
||||||
} catch (RemoteException e) {
|
|
||||||
loge("Exception in setNetworkPermission: " + e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
newNetwork.getAndSetNetworkCapabilities(newNc);
|
|
||||||
notifyNetworkCallbacks(newNetwork, ConnectivityManager.CALLBACK_CAP_CHANGED);
|
|
||||||
}
|
|
||||||
|
|
||||||
processNewlySatisfiedListenRequests(newNetwork);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -6495,6 +6474,17 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
|
|
||||||
final NetworkAgentInfo newDefaultNetwork = getDefaultNetwork();
|
final NetworkAgentInfo newDefaultNetwork = getDefaultNetwork();
|
||||||
|
|
||||||
|
for (final NetworkReassignment.NetworkBgStatePair event : changes.getRematchedNetworks()) {
|
||||||
|
// Process listen requests and update capabilities if the background state has
|
||||||
|
// changed for this network. For consistency with previous behavior, send onLost
|
||||||
|
// callbacks before onAvailable.
|
||||||
|
processNewlyLostListenRequests(event.mNetwork);
|
||||||
|
if (event.mOldBackground != event.mNetwork.isBackgroundNetwork()) {
|
||||||
|
applyBackgroundChangeForRematch(event.mNetwork);
|
||||||
|
}
|
||||||
|
processNewlySatisfiedListenRequests(event.mNetwork);
|
||||||
|
}
|
||||||
|
|
||||||
for (final NetworkAgentInfo nai : nais) {
|
for (final NetworkAgentInfo nai : nais) {
|
||||||
// Rematching may have altered the linger state of some networks, so update all linger
|
// 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
|
// timers. updateLingerState reads the state from the network agent and does nothing
|
||||||
@@ -6526,6 +6516,24 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Apply a change in background state resulting from rematching networks with requests.
|
||||||
|
*
|
||||||
|
* During rematch, a network may change background states by starting to satisfy or stopping
|
||||||
|
* to satisfy a foreground request. Listens don't count for this. When a network changes
|
||||||
|
* background states, its capabilities need to be updated and callbacks fired for the
|
||||||
|
* capability change.
|
||||||
|
*
|
||||||
|
* @param nai The network that changed background states
|
||||||
|
*/
|
||||||
|
private void applyBackgroundChangeForRematch(@NonNull final NetworkAgentInfo nai) {
|
||||||
|
final NetworkCapabilities newNc = mixInCapabilities(nai, nai.networkCapabilities);
|
||||||
|
if (Objects.equals(nai.networkCapabilities, newNc)) return;
|
||||||
|
updateNetworkPermissions(nai, newNc);
|
||||||
|
nai.getAndSetNetworkCapabilities(newNc);
|
||||||
|
notifyNetworkCallbacks(nai, ConnectivityManager.CALLBACK_CAP_CHANGED);
|
||||||
|
}
|
||||||
|
|
||||||
private void updateLegacyTypeTrackerAndVpnLockdownForRematch(
|
private void updateLegacyTypeTrackerAndVpnLockdownForRematch(
|
||||||
@Nullable final NetworkAgentInfo oldDefaultNetwork,
|
@Nullable final NetworkAgentInfo oldDefaultNetwork,
|
||||||
@Nullable final NetworkAgentInfo newDefaultNetwork,
|
@Nullable final NetworkAgentInfo newDefaultNetwork,
|
||||||
|
|||||||
Reference in New Issue
Block a user