Merge "Notify NetworkStats only when interfaces changed in updateLinkProperties"

This commit is contained in:
Junyu Lai 2022-10-27 06:49:33 +00:00 • committed by Gerrit Code Review
commit 0f4cb380f0
3 changed files with 23 additions and 4 deletions

View file

@ -7500,7 +7500,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
private void updateLinkProperties(NetworkAgentInfo networkAgent, @NonNull LinkProperties newLp,
@NonNull LinkProperties oldLp) {
@Nullable LinkProperties oldLp) {
int netId = networkAgent.network.getNetId();
// The NetworkAgent does not know whether clatd is running on its network or not, or whether
@ -7552,7 +7552,13 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
// Start or stop DNS64 detection and 464xlat according to network state.
networkAgent.clatd.update();
notifyIfacesChangedForNetworkStats();
// Notify NSS when relevant events happened. Currently, NSS only cares about
// interface changed to update clat interfaces accounting.
final boolean interfacesChanged = oldLp == null
|| !Objects.equals(newLp.getAllInterfaceNames(), oldLp.getAllInterfaceNames());
if (interfacesChanged) {
notifyIfacesChangedForNetworkStats();
}
networkAgent.networkMonitor().notifyLinkPropertiesChanged(
new LinkProperties(newLp, true /* parcelSensitiveFields */));
notifyNetworkCallbacks(networkAgent, ConnectivityManager.CALLBACK_IP_CHANGED);
@ -8315,7 +8321,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
}
public void handleUpdateLinkProperties(NetworkAgentInfo nai, LinkProperties newLp) {
public void handleUpdateLinkProperties(@NonNull NetworkAgentInfo nai,
@NonNull LinkProperties newLp) {
ensureRunningOnConnectivityServiceThread();
if (!mNetworkAgentInfos.contains(nai)) {

View file

@ -22,6 +22,7 @@ import static android.net.NetworkCapabilities.TRANSPORT_TEST;
import static com.android.net.module.util.CollectionUtils.contains;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.net.ConnectivityManager;
import android.net.IDnsResolver;
import android.net.INetd;
@ -420,7 +421,7 @@ public class Nat464Xlat {
* This is necessary because the LinkProperties in mNetwork come from the transport layer, which
* has no idea that 464xlat is running on top of it.
*/
public void fixupLinkProperties(@NonNull LinkProperties oldLp, @NonNull LinkProperties lp) {
public void fixupLinkProperties(@Nullable LinkProperties oldLp, @NonNull LinkProperties lp) {
// This must be done even if clatd is not running, because otherwise shouldStartClat would
// never return true.
lp.setNat64Prefix(selectNat64Prefix());
@ -433,6 +434,8 @@ public class Nat464Xlat {
}
Log.d(TAG, "clatd running, updating NAI for " + mIface);
// oldLp can't be null here since shouldStartClat checks null LinkProperties to start clat.
// Thus, the status won't pass isRunning check if the oldLp is null.
for (LinkProperties stacked: oldLp.getStackedLinks()) {
if (Objects.equals(mIface, stacked.getInterfaceName())) {
lp.addStackedLink(stacked);

View file

@ -7236,6 +7236,15 @@ public class ConnectivityServiceTest {
expectNotifyNetworkStatus(onlyCell(), onlyCell(), MOBILE_IFNAME);
reset(mStatsManager);
// Verify change fields other than interfaces does not trigger a notification to NSS.
cellLp.addLinkAddress(new LinkAddress("192.0.2.4/24"));
cellLp.addRoute(new RouteInfo((IpPrefix) null, InetAddress.getByName("192.0.2.4"),
MOBILE_IFNAME));
cellLp.setDnsServers(List.of(InetAddress.getAllByName("8.8.8.8")));
mCellNetworkAgent.sendLinkProperties(cellLp);
verifyNoMoreInteractions(mStatsManager);
reset(mStatsManager);
// Default network switch should update ifaces.
mWiFiNetworkAgent.connect(false);
mWiFiNetworkAgent.sendLinkProperties(wifiLp);