Loading services/core/java/com/android/server/ConnectivityService.java +8 −4 Original line number Diff line number Diff line Loading @@ -175,6 +175,7 @@ import android.os.SystemProperties; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; import android.sysprop.NetworkProperties; import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.ArrayMap; Loading Loading @@ -1073,6 +1074,10 @@ public class ConnectivityService extends IConnectivityManager.Stub context.getSystemService(BatteryStatsManager.class); batteryStats.reportNetworkInterfaceForTransports(iface, transportTypes); } public boolean getCellular464XlatEnabled() { return NetworkProperties.isCellular464XlatEnabled().orElse(true); } } public ConnectivityService(Context context) { Loading Loading @@ -1271,8 +1276,7 @@ public class ConnectivityService extends IConnectivityManager.Stub new NetworkInfo(TYPE_NONE, 0, "", ""), new LinkProperties(), new NetworkCapabilities(), 0, mContext, null, new NetworkAgentConfig(), this, null, null, 0, INVALID_UID, mQosCallbackTracker); null, 0, INVALID_UID, mQosCallbackTracker, mDeps); } private static NetworkCapabilities createDefaultNetworkCapabilitiesForUid(int uid) { Loading Loading @@ -6148,7 +6152,7 @@ public class ConnectivityService extends IConnectivityManager.Stub final NetworkAgentInfo nai = new NetworkAgentInfo(na, new Network(mNetIdManager.reserveNetId()), new NetworkInfo(networkInfo), lp, nc, currentScore, mContext, mTrackerHandler, new NetworkAgentConfig(networkAgentConfig), this, mNetd, mDnsResolver, providerId, uid, mQosCallbackTracker); this, mNetd, mDnsResolver, providerId, uid, mQosCallbackTracker, mDeps); // Make sure the LinkProperties and NetworkCapabilities reflect what the agent info says. processCapabilitiesFromAgent(nai, nc); Loading services/core/java/com/android/server/connectivity/Nat464Xlat.java +17 −4 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.server.connectivity; import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; import static com.android.net.module.util.CollectionUtils.contains; import android.annotation.NonNull; Loading @@ -35,6 +37,7 @@ import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.net.module.util.NetworkStackConstants; import com.android.server.ConnectivityService; import java.net.Inet6Address; import java.util.Objects; Loading Loading @@ -94,12 +97,15 @@ public class Nat464Xlat { private Inet6Address mIPv6Address; private State mState = State.IDLE; private boolean mEnableClatOnCellular; private boolean mPrefixDiscoveryRunning; public Nat464Xlat(NetworkAgentInfo nai, INetd netd, IDnsResolver dnsResolver) { public Nat464Xlat(NetworkAgentInfo nai, INetd netd, IDnsResolver dnsResolver, ConnectivityService.Dependencies deps) { mDnsResolver = dnsResolver; mNetd = netd; mNetwork = nai; mEnableClatOnCellular = deps.getCellular464XlatEnabled(); } /** Loading @@ -111,7 +117,7 @@ public class Nat464Xlat { * @return true if the network requires clat, false otherwise. */ @VisibleForTesting protected static boolean requiresClat(NetworkAgentInfo nai) { protected boolean requiresClat(NetworkAgentInfo nai) { // TODO: migrate to NetworkCapabilities.TRANSPORT_*. final boolean supported = contains(NETWORK_TYPES, nai.networkInfo.getType()); final boolean connected = contains(NETWORK_STATES, nai.networkInfo.getState()); Loading @@ -126,7 +132,9 @@ public class Nat464Xlat { final boolean skip464xlat = (nai.netAgentConfig() != null) && nai.netAgentConfig().skip464xlat; return supported && connected && isIpv6OnlyNetwork && !skip464xlat; return supported && connected && isIpv6OnlyNetwork && !skip464xlat && (nai.networkCapabilities.hasTransport(TRANSPORT_CELLULAR) ? isCellular464XlatEnabled() : true); } /** Loading @@ -137,7 +145,7 @@ public class Nat464Xlat { * @return true if the network should start clat, false otherwise. */ @VisibleForTesting protected static boolean shouldStartClat(NetworkAgentInfo nai) { protected boolean shouldStartClat(NetworkAgentInfo nai) { LinkProperties lp = nai.linkProperties; return requiresClat(nai) && lp != null && lp.getNat64Prefix() != null; } Loading Loading @@ -507,4 +515,9 @@ public class Nat464Xlat { protected int getNetId() { return mNetwork.network.getNetId(); } @VisibleForTesting protected boolean isCellular464XlatEnabled() { return mEnableClatOnCellular; } } services/core/java/com/android/server/connectivity/NetworkAgentInfo.java +2 −2 Original line number Diff line number Diff line Loading @@ -341,7 +341,7 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> { @NonNull LinkProperties lp, @NonNull NetworkCapabilities nc, int score, Context context, Handler handler, NetworkAgentConfig config, ConnectivityService connService, INetd netd, IDnsResolver dnsResolver, int factorySerialNumber, int creatorUid, QosCallbackTracker qosCallbackTracker) { QosCallbackTracker qosCallbackTracker, ConnectivityService.Dependencies deps) { Objects.requireNonNull(net); Objects.requireNonNull(info); Objects.requireNonNull(lp); Loading @@ -355,7 +355,7 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> { linkProperties = lp; networkCapabilities = nc; mScore = score; clatd = new Nat464Xlat(this, netd, dnsResolver); clatd = new Nat464Xlat(this, netd, dnsResolver, deps); mConnService = connService; mContext = context; mHandler = handler; Loading tests/net/java/com/android/server/ConnectivityServiceTest.java +42 −2 Original line number Diff line number Diff line Loading @@ -1530,6 +1530,7 @@ public class ConnectivityServiceTest { inv.getArgument(0), inv.getArgument(1), inv.getArgument(2)); return mPolicyTracker; }).when(deps).makeMultinetworkPolicyTracker(any(), any(), any()); doReturn(true).when(deps).getCellular464XlatEnabled(); return deps; } Loading Loading @@ -8323,6 +8324,45 @@ public class ConnectivityServiceTest { mCm.unregisterNetworkCallback(callback); } @Test public void testWith464XlatDisable() throws Exception { doReturn(false).when(mDeps).getCellular464XlatEnabled(); final TestNetworkCallback callback = new TestNetworkCallback(); final TestNetworkCallback defaultCallback = new TestNetworkCallback(); final NetworkRequest networkRequest = new NetworkRequest.Builder() .addCapability(NET_CAPABILITY_INTERNET) .build(); mCm.registerNetworkCallback(networkRequest, callback); mCm.registerDefaultNetworkCallback(defaultCallback); // Bring up validated cell. final LinkProperties cellLp = new LinkProperties(); cellLp.setInterfaceName(MOBILE_IFNAME); cellLp.addLinkAddress(new LinkAddress("2001:db8:1::1/64")); cellLp.addRoute(new RouteInfo(new IpPrefix("::/0"), null, MOBILE_IFNAME)); mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR); mCellNetworkAgent.sendLinkProperties(cellLp); mCellNetworkAgent.connect(true); callback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent); defaultCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent); final int cellNetId = mCellNetworkAgent.getNetwork().netId; waitForIdle(); verify(mMockDnsResolver, never()).startPrefix64Discovery(cellNetId); Nat464Xlat clat = getNat464Xlat(mCellNetworkAgent); assertTrue("Nat464Xlat was not IDLE", !clat.isStarted()); // This cannot happen because prefix discovery cannot succeed if it is never started. mService.mResolverUnsolEventCallback.onNat64PrefixEvent( makeNat64PrefixEvent(cellNetId, PREFIX_OPERATION_ADDED, "64:ff9b::", 96)); // ... but still, check that even if it did, clatd would not be started. verify(mMockNetd, never()).clatdStart(anyString(), anyString()); assertTrue("Nat464Xlat was not IDLE", !clat.isStarted()); } @Test public void testDataActivityTracking() throws Exception { final TestNetworkCallback networkCallback = new TestNetworkCallback(); Loading Loading @@ -9029,7 +9069,7 @@ public class ConnectivityServiceTest { TelephonyManager.getNetworkTypeName(TelephonyManager.NETWORK_TYPE_LTE)); return new NetworkAgentInfo(null, new Network(NET_ID), info, new LinkProperties(), nc, 0, mServiceContext, null, new NetworkAgentConfig(), mService, null, null, 0, INVALID_UID, mQosCallbackTracker); INVALID_UID, mQosCallbackTracker, new ConnectivityService.Dependencies()); } @Test Loading tests/net/java/com/android/server/connectivity/LingerMonitorTest.java +1 −1 Original line number Diff line number Diff line Loading @@ -357,7 +357,7 @@ public class LingerMonitorTest { NetworkAgentInfo nai = new NetworkAgentInfo(null, new Network(netId), info, new LinkProperties(), caps, 50, mCtx, null, new NetworkAgentConfig() /* config */, mConnService, mNetd, mDnsResolver, NetworkProvider.ID_NONE, Binder.getCallingUid(), mQosCallbackTracker); mQosCallbackTracker, new ConnectivityService.Dependencies()); nai.everValidated = true; return nai; } Loading Loading
services/core/java/com/android/server/ConnectivityService.java +8 −4 Original line number Diff line number Diff line Loading @@ -175,6 +175,7 @@ import android.os.SystemProperties; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; import android.sysprop.NetworkProperties; import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.ArrayMap; Loading Loading @@ -1073,6 +1074,10 @@ public class ConnectivityService extends IConnectivityManager.Stub context.getSystemService(BatteryStatsManager.class); batteryStats.reportNetworkInterfaceForTransports(iface, transportTypes); } public boolean getCellular464XlatEnabled() { return NetworkProperties.isCellular464XlatEnabled().orElse(true); } } public ConnectivityService(Context context) { Loading Loading @@ -1271,8 +1276,7 @@ public class ConnectivityService extends IConnectivityManager.Stub new NetworkInfo(TYPE_NONE, 0, "", ""), new LinkProperties(), new NetworkCapabilities(), 0, mContext, null, new NetworkAgentConfig(), this, null, null, 0, INVALID_UID, mQosCallbackTracker); null, 0, INVALID_UID, mQosCallbackTracker, mDeps); } private static NetworkCapabilities createDefaultNetworkCapabilitiesForUid(int uid) { Loading Loading @@ -6148,7 +6152,7 @@ public class ConnectivityService extends IConnectivityManager.Stub final NetworkAgentInfo nai = new NetworkAgentInfo(na, new Network(mNetIdManager.reserveNetId()), new NetworkInfo(networkInfo), lp, nc, currentScore, mContext, mTrackerHandler, new NetworkAgentConfig(networkAgentConfig), this, mNetd, mDnsResolver, providerId, uid, mQosCallbackTracker); this, mNetd, mDnsResolver, providerId, uid, mQosCallbackTracker, mDeps); // Make sure the LinkProperties and NetworkCapabilities reflect what the agent info says. processCapabilitiesFromAgent(nai, nc); Loading
services/core/java/com/android/server/connectivity/Nat464Xlat.java +17 −4 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.server.connectivity; import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; import static com.android.net.module.util.CollectionUtils.contains; import android.annotation.NonNull; Loading @@ -35,6 +37,7 @@ import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.net.module.util.NetworkStackConstants; import com.android.server.ConnectivityService; import java.net.Inet6Address; import java.util.Objects; Loading Loading @@ -94,12 +97,15 @@ public class Nat464Xlat { private Inet6Address mIPv6Address; private State mState = State.IDLE; private boolean mEnableClatOnCellular; private boolean mPrefixDiscoveryRunning; public Nat464Xlat(NetworkAgentInfo nai, INetd netd, IDnsResolver dnsResolver) { public Nat464Xlat(NetworkAgentInfo nai, INetd netd, IDnsResolver dnsResolver, ConnectivityService.Dependencies deps) { mDnsResolver = dnsResolver; mNetd = netd; mNetwork = nai; mEnableClatOnCellular = deps.getCellular464XlatEnabled(); } /** Loading @@ -111,7 +117,7 @@ public class Nat464Xlat { * @return true if the network requires clat, false otherwise. */ @VisibleForTesting protected static boolean requiresClat(NetworkAgentInfo nai) { protected boolean requiresClat(NetworkAgentInfo nai) { // TODO: migrate to NetworkCapabilities.TRANSPORT_*. final boolean supported = contains(NETWORK_TYPES, nai.networkInfo.getType()); final boolean connected = contains(NETWORK_STATES, nai.networkInfo.getState()); Loading @@ -126,7 +132,9 @@ public class Nat464Xlat { final boolean skip464xlat = (nai.netAgentConfig() != null) && nai.netAgentConfig().skip464xlat; return supported && connected && isIpv6OnlyNetwork && !skip464xlat; return supported && connected && isIpv6OnlyNetwork && !skip464xlat && (nai.networkCapabilities.hasTransport(TRANSPORT_CELLULAR) ? isCellular464XlatEnabled() : true); } /** Loading @@ -137,7 +145,7 @@ public class Nat464Xlat { * @return true if the network should start clat, false otherwise. */ @VisibleForTesting protected static boolean shouldStartClat(NetworkAgentInfo nai) { protected boolean shouldStartClat(NetworkAgentInfo nai) { LinkProperties lp = nai.linkProperties; return requiresClat(nai) && lp != null && lp.getNat64Prefix() != null; } Loading Loading @@ -507,4 +515,9 @@ public class Nat464Xlat { protected int getNetId() { return mNetwork.network.getNetId(); } @VisibleForTesting protected boolean isCellular464XlatEnabled() { return mEnableClatOnCellular; } }
services/core/java/com/android/server/connectivity/NetworkAgentInfo.java +2 −2 Original line number Diff line number Diff line Loading @@ -341,7 +341,7 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> { @NonNull LinkProperties lp, @NonNull NetworkCapabilities nc, int score, Context context, Handler handler, NetworkAgentConfig config, ConnectivityService connService, INetd netd, IDnsResolver dnsResolver, int factorySerialNumber, int creatorUid, QosCallbackTracker qosCallbackTracker) { QosCallbackTracker qosCallbackTracker, ConnectivityService.Dependencies deps) { Objects.requireNonNull(net); Objects.requireNonNull(info); Objects.requireNonNull(lp); Loading @@ -355,7 +355,7 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> { linkProperties = lp; networkCapabilities = nc; mScore = score; clatd = new Nat464Xlat(this, netd, dnsResolver); clatd = new Nat464Xlat(this, netd, dnsResolver, deps); mConnService = connService; mContext = context; mHandler = handler; Loading
tests/net/java/com/android/server/ConnectivityServiceTest.java +42 −2 Original line number Diff line number Diff line Loading @@ -1530,6 +1530,7 @@ public class ConnectivityServiceTest { inv.getArgument(0), inv.getArgument(1), inv.getArgument(2)); return mPolicyTracker; }).when(deps).makeMultinetworkPolicyTracker(any(), any(), any()); doReturn(true).when(deps).getCellular464XlatEnabled(); return deps; } Loading Loading @@ -8323,6 +8324,45 @@ public class ConnectivityServiceTest { mCm.unregisterNetworkCallback(callback); } @Test public void testWith464XlatDisable() throws Exception { doReturn(false).when(mDeps).getCellular464XlatEnabled(); final TestNetworkCallback callback = new TestNetworkCallback(); final TestNetworkCallback defaultCallback = new TestNetworkCallback(); final NetworkRequest networkRequest = new NetworkRequest.Builder() .addCapability(NET_CAPABILITY_INTERNET) .build(); mCm.registerNetworkCallback(networkRequest, callback); mCm.registerDefaultNetworkCallback(defaultCallback); // Bring up validated cell. final LinkProperties cellLp = new LinkProperties(); cellLp.setInterfaceName(MOBILE_IFNAME); cellLp.addLinkAddress(new LinkAddress("2001:db8:1::1/64")); cellLp.addRoute(new RouteInfo(new IpPrefix("::/0"), null, MOBILE_IFNAME)); mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR); mCellNetworkAgent.sendLinkProperties(cellLp); mCellNetworkAgent.connect(true); callback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent); defaultCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent); final int cellNetId = mCellNetworkAgent.getNetwork().netId; waitForIdle(); verify(mMockDnsResolver, never()).startPrefix64Discovery(cellNetId); Nat464Xlat clat = getNat464Xlat(mCellNetworkAgent); assertTrue("Nat464Xlat was not IDLE", !clat.isStarted()); // This cannot happen because prefix discovery cannot succeed if it is never started. mService.mResolverUnsolEventCallback.onNat64PrefixEvent( makeNat64PrefixEvent(cellNetId, PREFIX_OPERATION_ADDED, "64:ff9b::", 96)); // ... but still, check that even if it did, clatd would not be started. verify(mMockNetd, never()).clatdStart(anyString(), anyString()); assertTrue("Nat464Xlat was not IDLE", !clat.isStarted()); } @Test public void testDataActivityTracking() throws Exception { final TestNetworkCallback networkCallback = new TestNetworkCallback(); Loading Loading @@ -9029,7 +9069,7 @@ public class ConnectivityServiceTest { TelephonyManager.getNetworkTypeName(TelephonyManager.NETWORK_TYPE_LTE)); return new NetworkAgentInfo(null, new Network(NET_ID), info, new LinkProperties(), nc, 0, mServiceContext, null, new NetworkAgentConfig(), mService, null, null, 0, INVALID_UID, mQosCallbackTracker); INVALID_UID, mQosCallbackTracker, new ConnectivityService.Dependencies()); } @Test Loading
tests/net/java/com/android/server/connectivity/LingerMonitorTest.java +1 −1 Original line number Diff line number Diff line Loading @@ -357,7 +357,7 @@ public class LingerMonitorTest { NetworkAgentInfo nai = new NetworkAgentInfo(null, new Network(netId), info, new LinkProperties(), caps, 50, mCtx, null, new NetworkAgentConfig() /* config */, mConnService, mNetd, mDnsResolver, NetworkProvider.ID_NONE, Binder.getCallingUid(), mQosCallbackTracker); mQosCallbackTracker, new ConnectivityService.Dependencies()); nai.everValidated = true; return nai; } Loading