Merge "Don't start clatd if disabled by vendor property."
This commit is contained in:
@@ -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;
|
||||
@@ -1069,10 +1070,14 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
*/
|
||||
public void reportNetworkInterfaceForTransports(Context context, String iface,
|
||||
int[] transportTypes) {
|
||||
final BatteryStatsManager batteryStats =
|
||||
final BatteryStatsManager batteryStats =
|
||||
context.getSystemService(BatteryStatsManager.class);
|
||||
batteryStats.reportNetworkInterfaceForTransports(iface, transportTypes);
|
||||
}
|
||||
|
||||
public boolean getCellular464XlatEnabled() {
|
||||
return NetworkProperties.isCellular464XlatEnabled().orElse(true);
|
||||
}
|
||||
}
|
||||
|
||||
public ConnectivityService(Context context) {
|
||||
@@ -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) {
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -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());
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -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;
|
||||
}
|
||||
@@ -507,4 +515,9 @@ public class Nat464Xlat {
|
||||
protected int getNetId() {
|
||||
return mNetwork.network.getNetId();
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
protected boolean isCellular464XlatEnabled() {
|
||||
return mEnableClatOnCellular;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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();
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -16,11 +16,15 @@
|
||||
|
||||
package com.android.server.connectivity;
|
||||
|
||||
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.mockito.Mockito.anyString;
|
||||
import static org.mockito.Mockito.eq;
|
||||
import static org.mockito.Mockito.inOrder;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.verifyNoMoreInteractions;
|
||||
@@ -34,6 +38,7 @@ import android.net.IpPrefix;
|
||||
import android.net.LinkAddress;
|
||||
import android.net.LinkProperties;
|
||||
import android.net.NetworkAgentConfig;
|
||||
import android.net.NetworkCapabilities;
|
||||
import android.net.NetworkInfo;
|
||||
import android.os.Handler;
|
||||
import android.os.test.TestLooper;
|
||||
@@ -72,11 +77,15 @@ public class Nat464XlatTest {
|
||||
Handler mHandler;
|
||||
NetworkAgentConfig mAgentConfig = new NetworkAgentConfig();
|
||||
|
||||
Nat464Xlat makeNat464Xlat() {
|
||||
return new Nat464Xlat(mNai, mNetd, mDnsResolver) {
|
||||
Nat464Xlat makeNat464Xlat(boolean isCellular464XlatEnabled) {
|
||||
return new Nat464Xlat(mNai, mNetd, mDnsResolver, new ConnectivityService.Dependencies()) {
|
||||
@Override protected int getNetId() {
|
||||
return NETID;
|
||||
}
|
||||
|
||||
@Override protected boolean isCellular464XlatEnabled() {
|
||||
return isCellular464XlatEnabled;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -99,6 +108,7 @@ public class Nat464XlatTest {
|
||||
mNai.linkProperties.setInterfaceName(BASE_IFACE);
|
||||
mNai.networkInfo = new NetworkInfo(null);
|
||||
mNai.networkInfo.setType(ConnectivityManager.TYPE_WIFI);
|
||||
mNai.networkCapabilities = new NetworkCapabilities();
|
||||
markNetworkConnected();
|
||||
when(mNai.connService()).thenReturn(mConnectivity);
|
||||
when(mNai.netAgentConfig()).thenReturn(mAgentConfig);
|
||||
@@ -110,21 +120,23 @@ public class Nat464XlatTest {
|
||||
}
|
||||
|
||||
private void assertRequiresClat(boolean expected, NetworkAgentInfo nai) {
|
||||
Nat464Xlat nat = makeNat464Xlat(true);
|
||||
String msg = String.format("requiresClat expected %b for type=%d state=%s skip=%b "
|
||||
+ "nat64Prefix=%s addresses=%s", expected, nai.networkInfo.getType(),
|
||||
nai.networkInfo.getDetailedState(),
|
||||
mAgentConfig.skip464xlat, nai.linkProperties.getNat64Prefix(),
|
||||
nai.linkProperties.getLinkAddresses());
|
||||
assertEquals(msg, expected, Nat464Xlat.requiresClat(nai));
|
||||
assertEquals(msg, expected, nat.requiresClat(nai));
|
||||
}
|
||||
|
||||
private void assertShouldStartClat(boolean expected, NetworkAgentInfo nai) {
|
||||
Nat464Xlat nat = makeNat464Xlat(true);
|
||||
String msg = String.format("shouldStartClat expected %b for type=%d state=%s skip=%b "
|
||||
+ "nat64Prefix=%s addresses=%s", expected, nai.networkInfo.getType(),
|
||||
nai.networkInfo.getDetailedState(),
|
||||
mAgentConfig.skip464xlat, nai.linkProperties.getNat64Prefix(),
|
||||
nai.linkProperties.getLinkAddresses());
|
||||
assertEquals(msg, expected, Nat464Xlat.shouldStartClat(nai));
|
||||
assertEquals(msg, expected, nat.shouldStartClat(nai));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -194,7 +206,7 @@ public class Nat464XlatTest {
|
||||
}
|
||||
|
||||
private void checkNormalStartAndStop(boolean dueToDisconnect) throws Exception {
|
||||
Nat464Xlat nat = makeNat464Xlat();
|
||||
Nat464Xlat nat = makeNat464Xlat(true);
|
||||
ArgumentCaptor<LinkProperties> c = ArgumentCaptor.forClass(LinkProperties.class);
|
||||
|
||||
mNai.linkProperties.addLinkAddress(V6ADDR);
|
||||
@@ -245,7 +257,7 @@ public class Nat464XlatTest {
|
||||
}
|
||||
|
||||
private void checkStartStopStart(boolean interfaceRemovedFirst) throws Exception {
|
||||
Nat464Xlat nat = makeNat464Xlat();
|
||||
Nat464Xlat nat = makeNat464Xlat(true);
|
||||
ArgumentCaptor<LinkProperties> c = ArgumentCaptor.forClass(LinkProperties.class);
|
||||
InOrder inOrder = inOrder(mNetd, mConnectivity);
|
||||
|
||||
@@ -335,7 +347,7 @@ public class Nat464XlatTest {
|
||||
|
||||
@Test
|
||||
public void testClatdCrashWhileRunning() throws Exception {
|
||||
Nat464Xlat nat = makeNat464Xlat();
|
||||
Nat464Xlat nat = makeNat464Xlat(true);
|
||||
ArgumentCaptor<LinkProperties> c = ArgumentCaptor.forClass(LinkProperties.class);
|
||||
|
||||
nat.setNat64PrefixFromDns(new IpPrefix(NAT64_PREFIX));
|
||||
@@ -372,7 +384,7 @@ public class Nat464XlatTest {
|
||||
}
|
||||
|
||||
private void checkStopBeforeClatdStarts(boolean dueToDisconnect) throws Exception {
|
||||
Nat464Xlat nat = makeNat464Xlat();
|
||||
Nat464Xlat nat = makeNat464Xlat(true);
|
||||
|
||||
mNai.linkProperties.addLinkAddress(new LinkAddress("2001:db8::1/64"));
|
||||
|
||||
@@ -414,7 +426,7 @@ public class Nat464XlatTest {
|
||||
}
|
||||
|
||||
private void checkStopAndClatdNeverStarts(boolean dueToDisconnect) throws Exception {
|
||||
Nat464Xlat nat = makeNat464Xlat();
|
||||
Nat464Xlat nat = makeNat464Xlat(true);
|
||||
|
||||
mNai.linkProperties.addLinkAddress(new LinkAddress("2001:db8::1/64"));
|
||||
|
||||
@@ -450,7 +462,7 @@ public class Nat464XlatTest {
|
||||
final IpPrefix prefixFromDns = new IpPrefix(NAT64_PREFIX);
|
||||
final IpPrefix prefixFromRa = new IpPrefix(OTHER_NAT64_PREFIX);
|
||||
|
||||
Nat464Xlat nat = makeNat464Xlat();
|
||||
Nat464Xlat nat = makeNat464Xlat(true);
|
||||
|
||||
final LinkProperties emptyLp = new LinkProperties();
|
||||
LinkProperties fixedupLp;
|
||||
@@ -486,10 +498,57 @@ public class Nat464XlatTest {
|
||||
assertEquals(null, fixedupLp.getNat64Prefix());
|
||||
}
|
||||
|
||||
private void checkClatDisabledOnCellular(boolean onCellular) throws Exception {
|
||||
// Disable 464xlat on cellular networks.
|
||||
Nat464Xlat nat = makeNat464Xlat(false);
|
||||
mNai.linkProperties.addLinkAddress(V6ADDR);
|
||||
mNai.networkCapabilities.setTransportType(TRANSPORT_CELLULAR, onCellular);
|
||||
nat.update();
|
||||
|
||||
final IpPrefix nat64Prefix = new IpPrefix(NAT64_PREFIX);
|
||||
if (onCellular) {
|
||||
// Prefix discovery is never started.
|
||||
verify(mDnsResolver, never()).startPrefix64Discovery(eq(NETID));
|
||||
assertIdle(nat);
|
||||
|
||||
// If a NAT64 prefix comes in from an RA, clat is not started either.
|
||||
mNai.linkProperties.setNat64Prefix(nat64Prefix);
|
||||
nat.setNat64PrefixFromRa(nat64Prefix);
|
||||
nat.update();
|
||||
verify(mNetd, never()).clatdStart(anyString(), anyString());
|
||||
assertIdle(nat);
|
||||
} else {
|
||||
// Prefix discovery is started.
|
||||
verify(mDnsResolver).startPrefix64Discovery(eq(NETID));
|
||||
assertIdle(nat);
|
||||
|
||||
// If a NAT64 prefix comes in from an RA, clat is started.
|
||||
mNai.linkProperties.setNat64Prefix(nat64Prefix);
|
||||
nat.setNat64PrefixFromRa(nat64Prefix);
|
||||
nat.update();
|
||||
verify(mNetd).clatdStart(BASE_IFACE, NAT64_PREFIX);
|
||||
assertStarting(nat);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testClatDisabledOnCellular() throws Exception {
|
||||
checkClatDisabledOnCellular(true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testClatDisabledOnNonCellular() throws Exception {
|
||||
checkClatDisabledOnCellular(false);
|
||||
}
|
||||
|
||||
static void assertIdle(Nat464Xlat nat) {
|
||||
assertTrue("Nat464Xlat was not IDLE", !nat.isStarted());
|
||||
}
|
||||
|
||||
static void assertStarting(Nat464Xlat nat) {
|
||||
assertTrue("Nat464Xlat was not STARTING", nat.isStarting());
|
||||
}
|
||||
|
||||
static void assertRunning(Nat464Xlat nat) {
|
||||
assertTrue("Nat464Xlat was not RUNNING", nat.isRunning());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user