diff --git a/service/src/com/android/server/ConnectivityService.java b/service/src/com/android/server/ConnectivityService.java index 195f0466d3..6ef239d2d4 100755 --- a/service/src/com/android/server/ConnectivityService.java +++ b/service/src/com/android/server/ConnectivityService.java @@ -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)) { diff --git a/service/src/com/android/server/connectivity/Nat464Xlat.java b/service/src/com/android/server/connectivity/Nat464Xlat.java index 4e19781bdd..2ac2ad3e45 100644 --- a/service/src/com/android/server/connectivity/Nat464Xlat.java +++ b/service/src/com/android/server/connectivity/Nat464Xlat.java @@ -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); diff --git a/tests/unit/java/com/android/server/ConnectivityServiceTest.java b/tests/unit/java/com/android/server/ConnectivityServiceTest.java index 2d8cf80246..65e0b10406 100755 --- a/tests/unit/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/unit/java/com/android/server/ConnectivityServiceTest.java @@ -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);