Merge "Don't start clatd if disabled by vendor property."

This commit is contained in:
Lorenzo Colitti
2021-03-11 12:22:34 +00:00
committed by Gerrit Code Review
6 changed files with 139 additions and 23 deletions

View File

@@ -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
@@ -10986,4 +11026,4 @@ public class ConnectivityServiceTest {
verifyNoNetwork();
mCm.unregisterNetworkCallback(cellCb);
}
}
}

View File

@@ -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;
}

View File

@@ -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());
}