Merge changes from topic "nat64"
* changes: Catch ServiceSpecificException instead of IllegalStateException. Manage NAT64 prefix discovery lifecycle in the framework. Track NAT64 in the framework and start clatd iff NAT64 detected Change Nat464Xlat lifecycle. Minor improvements to verifyTcpBufferSizeChange.
This commit is contained in:
@@ -17,10 +17,10 @@
|
||||
package com.android.server;
|
||||
|
||||
import static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
|
||||
import static android.net.ConnectivityManager.NETID_UNSET;
|
||||
import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OFF;
|
||||
import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OPPORTUNISTIC;
|
||||
import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME;
|
||||
import static android.net.ConnectivityManager.NETID_UNSET;
|
||||
import static android.net.ConnectivityManager.TYPE_ETHERNET;
|
||||
import static android.net.ConnectivityManager.TYPE_MOBILE;
|
||||
import static android.net.ConnectivityManager.TYPE_MOBILE_FOTA;
|
||||
@@ -1798,6 +1798,12 @@ public class ConnectivityServiceTest {
|
||||
fn.test((NetworkCapabilities) cbi.arg));
|
||||
}
|
||||
|
||||
void expectLinkPropertiesLike(Predicate<LinkProperties> fn, MockNetworkAgent agent) {
|
||||
CallbackInfo cbi = expectCallback(CallbackState.LINK_PROPERTIES, agent);
|
||||
assertTrue("Received LinkProperties don't match expectations : " + cbi.arg,
|
||||
fn.test((LinkProperties) cbi.arg));
|
||||
}
|
||||
|
||||
void expectBlockedStatusCallback(boolean expectBlocked, MockNetworkAgent agent) {
|
||||
CallbackInfo cbi = expectCallback(CallbackState.BLOCKED_STATUS, agent);
|
||||
boolean actualBlocked = (boolean) cbi.arg;
|
||||
@@ -5087,6 +5093,9 @@ public class ConnectivityServiceTest {
|
||||
public void testStackedLinkProperties() throws UnknownHostException, RemoteException {
|
||||
final LinkAddress myIpv4 = new LinkAddress("1.2.3.4/24");
|
||||
final LinkAddress myIpv6 = new LinkAddress("2001:db8:1::1/64");
|
||||
final String kNat64PrefixString = "2001:db8:64:64:64:64::";
|
||||
final IpPrefix kNat64Prefix = new IpPrefix(InetAddress.getByName(kNat64PrefixString), 96);
|
||||
|
||||
final NetworkRequest networkRequest = new NetworkRequest.Builder()
|
||||
.addTransportType(TRANSPORT_CELLULAR)
|
||||
.addCapability(NET_CAPABILITY_INTERNET)
|
||||
@@ -5094,8 +5103,9 @@ public class ConnectivityServiceTest {
|
||||
final TestNetworkCallback networkCallback = new TestNetworkCallback();
|
||||
mCm.registerNetworkCallback(networkRequest, networkCallback);
|
||||
|
||||
// Prepare ipv6 only link properties and connect.
|
||||
// Prepare ipv6 only link properties.
|
||||
mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR);
|
||||
final int cellNetId = mCellNetworkAgent.getNetwork().netId;
|
||||
final LinkProperties cellLp = new LinkProperties();
|
||||
cellLp.setInterfaceName(MOBILE_IFNAME);
|
||||
cellLp.addLinkAddress(myIpv6);
|
||||
@@ -5105,15 +5115,44 @@ public class ConnectivityServiceTest {
|
||||
when(mNetworkManagementService.getInterfaceConfig(CLAT_PREFIX + MOBILE_IFNAME))
|
||||
.thenReturn(getClatInterfaceConfig(myIpv4));
|
||||
|
||||
// Connect with ipv6 link properties, then expect clat setup ipv4 and update link
|
||||
// properties properly.
|
||||
// Connect with ipv6 link properties. Expect prefix discovery to be started.
|
||||
mCellNetworkAgent.sendLinkProperties(cellLp);
|
||||
mCellNetworkAgent.connect(true);
|
||||
networkCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent);
|
||||
verify(mMockNetd, times(1)).clatdStart(MOBILE_IFNAME);
|
||||
Nat464Xlat clat = mService.getNat464Xlat(mCellNetworkAgent);
|
||||
verify(mMockNetd, times(1)).resolverStartPrefix64Discovery(cellNetId);
|
||||
|
||||
// Clat iface up, expect stack link updated.
|
||||
// Switching default network updates TCP buffer sizes.
|
||||
verifyTcpBufferSizeChange(ConnectivityService.DEFAULT_TCP_BUFFER_SIZES);
|
||||
|
||||
// Add an IPv4 address. Expect prefix discovery to be stopped. Netd doesn't tell us that
|
||||
// the NAT64 prefix was removed because one was never discovered.
|
||||
cellLp.addLinkAddress(myIpv4);
|
||||
mCellNetworkAgent.sendLinkProperties(cellLp);
|
||||
networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent);
|
||||
verify(mMockNetd, times(1)).resolverStopPrefix64Discovery(cellNetId);
|
||||
|
||||
verifyNoMoreInteractions(mMockNetd);
|
||||
reset(mMockNetd);
|
||||
|
||||
// Remove IPv4 address. Expect prefix discovery to be started again.
|
||||
cellLp.removeLinkAddress(myIpv4);
|
||||
cellLp.removeRoute(new RouteInfo(myIpv4, null, MOBILE_IFNAME));
|
||||
mCellNetworkAgent.sendLinkProperties(cellLp);
|
||||
networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent);
|
||||
verify(mMockNetd, times(1)).resolverStartPrefix64Discovery(cellNetId);
|
||||
|
||||
// When NAT64 prefix discovery succeeds, LinkProperties are updated and clatd is started.
|
||||
Nat464Xlat clat = mService.getNat464Xlat(mCellNetworkAgent);
|
||||
assertNull(mCm.getLinkProperties(mCellNetworkAgent.getNetwork()).getNat64Prefix());
|
||||
mService.mNetdEventCallback.onNat64PrefixEvent(cellNetId, true /* added */,
|
||||
kNat64PrefixString, 96);
|
||||
LinkProperties lpBeforeClat = (LinkProperties) networkCallback.expectCallback(
|
||||
CallbackState.LINK_PROPERTIES, mCellNetworkAgent).arg;
|
||||
assertEquals(0, lpBeforeClat.getStackedLinks().size());
|
||||
assertEquals(kNat64Prefix, lpBeforeClat.getNat64Prefix());
|
||||
verify(mMockNetd, times(1)).clatdStart(MOBILE_IFNAME, kNat64Prefix.toString());
|
||||
|
||||
// Clat iface comes up. Expect stacked link to be added.
|
||||
clat.interfaceLinkStateChanged(CLAT_PREFIX + MOBILE_IFNAME, true);
|
||||
networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent);
|
||||
List<LinkProperties> stackedLps = mCm.getLinkProperties(mCellNetworkAgent.getNetwork())
|
||||
@@ -5130,20 +5169,66 @@ public class ConnectivityServiceTest {
|
||||
assertNotEquals(stackedLpsAfterChange, Collections.EMPTY_LIST);
|
||||
assertEquals(makeClatLinkProperties(myIpv4), stackedLpsAfterChange.get(0));
|
||||
|
||||
// Add ipv4 address, expect stacked linkproperties be cleaned up
|
||||
// Add ipv4 address, expect that clatd and prefix discovery are stopped and stacked
|
||||
// linkproperties are cleaned up.
|
||||
cellLp.addLinkAddress(myIpv4);
|
||||
cellLp.addRoute(new RouteInfo(myIpv4, null, MOBILE_IFNAME));
|
||||
mCellNetworkAgent.sendLinkProperties(cellLp);
|
||||
networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent);
|
||||
verify(mMockNetd, times(1)).clatdStop(MOBILE_IFNAME);
|
||||
verify(mMockNetd, times(1)).resolverStopPrefix64Discovery(cellNetId);
|
||||
|
||||
// Clat iface removed, expect linkproperties revert to original one
|
||||
clat.interfaceRemoved(CLAT_PREFIX + MOBILE_IFNAME);
|
||||
// As soon as stop is called, the linkproperties lose the stacked interface.
|
||||
networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent);
|
||||
LinkProperties actualLpAfterIpv4 = mCm.getLinkProperties(mCellNetworkAgent.getNetwork());
|
||||
assertEquals(cellLp, actualLpAfterIpv4);
|
||||
LinkProperties expected = new LinkProperties(cellLp);
|
||||
expected.setNat64Prefix(kNat64Prefix);
|
||||
assertEquals(expected, actualLpAfterIpv4);
|
||||
assertEquals(0, actualLpAfterIpv4.getStackedLinks().size());
|
||||
|
||||
// Clean up
|
||||
// The interface removed callback happens but has no effect after stop is called.
|
||||
clat.interfaceRemoved(CLAT_PREFIX + MOBILE_IFNAME);
|
||||
networkCallback.assertNoCallback();
|
||||
|
||||
verifyNoMoreInteractions(mMockNetd);
|
||||
reset(mMockNetd);
|
||||
|
||||
// Stopping prefix discovery causes netd to tell us that the NAT64 prefix is gone.
|
||||
mService.mNetdEventCallback.onNat64PrefixEvent(cellNetId, false /* added */,
|
||||
kNat64PrefixString, 96);
|
||||
networkCallback.expectLinkPropertiesLike((lp) -> lp.getNat64Prefix() == null,
|
||||
mCellNetworkAgent);
|
||||
|
||||
// Remove IPv4 address and expect prefix discovery and clatd to be started again.
|
||||
cellLp.removeLinkAddress(myIpv4);
|
||||
cellLp.removeRoute(new RouteInfo(myIpv4, null, MOBILE_IFNAME));
|
||||
cellLp.removeDnsServer(InetAddress.getByName("8.8.8.8"));
|
||||
mCellNetworkAgent.sendLinkProperties(cellLp);
|
||||
networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent);
|
||||
verify(mMockNetd, times(1)).resolverStartPrefix64Discovery(cellNetId);
|
||||
mService.mNetdEventCallback.onNat64PrefixEvent(cellNetId, true /* added */,
|
||||
kNat64PrefixString, 96);
|
||||
networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent);
|
||||
verify(mMockNetd, times(1)).clatdStart(MOBILE_IFNAME, kNat64Prefix.toString());
|
||||
|
||||
|
||||
// Clat iface comes up. Expect stacked link to be added.
|
||||
clat.interfaceLinkStateChanged(CLAT_PREFIX + MOBILE_IFNAME, true);
|
||||
networkCallback.expectLinkPropertiesLike(
|
||||
(lp) -> lp.getStackedLinks().size() == 1 && lp.getNat64Prefix() != null,
|
||||
mCellNetworkAgent);
|
||||
|
||||
// NAT64 prefix is removed. Expect that clat is stopped.
|
||||
mService.mNetdEventCallback.onNat64PrefixEvent(cellNetId, false /* added */,
|
||||
kNat64PrefixString, 96);
|
||||
networkCallback.expectLinkPropertiesLike(
|
||||
(lp) -> lp.getStackedLinks().size() == 0 && lp.getNat64Prefix() == null,
|
||||
mCellNetworkAgent);
|
||||
verify(mMockNetd, times(1)).clatdStop(MOBILE_IFNAME);
|
||||
networkCallback.expectLinkPropertiesLike((lp) -> lp.getStackedLinks().size() == 0,
|
||||
mCellNetworkAgent);
|
||||
|
||||
// Clean up.
|
||||
mCellNetworkAgent.disconnect();
|
||||
networkCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent);
|
||||
networkCallback.assertNoCallback();
|
||||
@@ -5224,30 +5309,34 @@ public class ConnectivityServiceTest {
|
||||
mCm.unregisterNetworkCallback(networkCallback);
|
||||
}
|
||||
|
||||
private static final String TEST_TCP_BUFFER_SIZES = "1,2,3,4,5,6";
|
||||
|
||||
private void verifyTcpBufferSizeChange(String tcpBufferSizes) throws Exception {
|
||||
private void verifyTcpBufferSizeChange(String tcpBufferSizes) {
|
||||
String[] values = tcpBufferSizes.split(",");
|
||||
String rmemValues = String.join(" ", values[0], values[1], values[2]);
|
||||
String wmemValues = String.join(" ", values[3], values[4], values[5]);
|
||||
waitForIdle();
|
||||
verify(mMockNetd, atLeastOnce()).setTcpRWmemorySize(rmemValues, wmemValues);
|
||||
try {
|
||||
verify(mMockNetd, atLeastOnce()).setTcpRWmemorySize(rmemValues, wmemValues);
|
||||
} catch (RemoteException e) {
|
||||
fail("mMockNetd should never throw RemoteException");
|
||||
}
|
||||
reset(mMockNetd);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTcpBufferReset() throws Exception {
|
||||
public void testTcpBufferReset() {
|
||||
final String testTcpBufferSizes = "1,2,3,4,5,6";
|
||||
|
||||
mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR);
|
||||
reset(mMockNetd);
|
||||
// Simple connection should have updated tcp buffer size.
|
||||
// Switching default network updates TCP buffer sizes.
|
||||
mCellNetworkAgent.connect(false);
|
||||
verifyTcpBufferSizeChange(ConnectivityService.DEFAULT_TCP_BUFFER_SIZES);
|
||||
|
||||
// Change link Properties should have updated tcp buffer size.
|
||||
LinkProperties lp = new LinkProperties();
|
||||
lp.setTcpBufferSizes(TEST_TCP_BUFFER_SIZES);
|
||||
lp.setTcpBufferSizes(testTcpBufferSizes);
|
||||
mCellNetworkAgent.sendLinkProperties(lp);
|
||||
verifyTcpBufferSizeChange(TEST_TCP_BUFFER_SIZES);
|
||||
verifyTcpBufferSizeChange(testTcpBufferSizes);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -16,9 +16,11 @@
|
||||
|
||||
package com.android.server.connectivity;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.mockito.Mockito.eq;
|
||||
import static org.mockito.Mockito.inOrder;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.verifyNoMoreInteractions;
|
||||
@@ -27,6 +29,7 @@ import static org.mockito.Mockito.when;
|
||||
import android.net.ConnectivityManager;
|
||||
import android.net.INetd;
|
||||
import android.net.InterfaceConfiguration;
|
||||
import android.net.IpPrefix;
|
||||
import android.net.LinkAddress;
|
||||
import android.net.LinkProperties;
|
||||
import android.net.NetworkInfo;
|
||||
@@ -43,6 +46,7 @@ import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
import org.mockito.InOrder;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
|
||||
@@ -53,6 +57,8 @@ public class Nat464XlatTest {
|
||||
static final String BASE_IFACE = "test0";
|
||||
static final String STACKED_IFACE = "v4-test0";
|
||||
static final LinkAddress ADDR = new LinkAddress("192.0.2.5/29");
|
||||
static final String NAT64_PREFIX = "64:ff9b::/96";
|
||||
static final int NETID = 42;
|
||||
|
||||
@Mock ConnectivityService mConnectivity;
|
||||
@Mock NetworkMisc mMisc;
|
||||
@@ -65,7 +71,11 @@ public class Nat464XlatTest {
|
||||
Handler mHandler;
|
||||
|
||||
Nat464Xlat makeNat464Xlat() {
|
||||
return new Nat464Xlat(mNai, mNetd, mNms);
|
||||
return new Nat464Xlat(mNai, mNetd, mNms) {
|
||||
@Override protected int getNetId() {
|
||||
return NETID;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Before
|
||||
@@ -87,6 +97,24 @@ public class Nat464XlatTest {
|
||||
when(mConfig.getLinkAddress()).thenReturn(ADDR);
|
||||
}
|
||||
|
||||
private void assertRequiresClat(boolean expected, NetworkAgentInfo nai) {
|
||||
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(),
|
||||
mMisc.skip464xlat, nai.linkProperties.getNat64Prefix(),
|
||||
nai.linkProperties.getLinkAddresses());
|
||||
assertEquals(msg, expected, Nat464Xlat.requiresClat(nai));
|
||||
}
|
||||
|
||||
private void assertShouldStartClat(boolean expected, NetworkAgentInfo nai) {
|
||||
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(),
|
||||
mMisc.skip464xlat, nai.linkProperties.getNat64Prefix(),
|
||||
nai.linkProperties.getLinkAddresses());
|
||||
assertEquals(msg, expected, Nat464Xlat.shouldStartClat(nai));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRequiresClat() throws Exception {
|
||||
final int[] supportedTypes = {
|
||||
@@ -102,20 +130,45 @@ public class Nat464XlatTest {
|
||||
NetworkInfo.DetailedState.SUSPENDED,
|
||||
};
|
||||
|
||||
LinkProperties oldLp = new LinkProperties(mNai.linkProperties);
|
||||
for (int type : supportedTypes) {
|
||||
mNai.networkInfo.setType(type);
|
||||
for (NetworkInfo.DetailedState state : supportedDetailedStates) {
|
||||
mNai.networkInfo.setDetailedState(state, "reason", "extraInfo");
|
||||
String msg = String.format("requiresClat expected for type=%d state=%s",
|
||||
type, state);
|
||||
|
||||
mNai.linkProperties.setNat64Prefix(new IpPrefix("2001:db8:0:64::/96"));
|
||||
assertRequiresClat(false, mNai);
|
||||
assertShouldStartClat(false, mNai);
|
||||
|
||||
mNai.linkProperties.addLinkAddress(new LinkAddress("fc00::1/64"));
|
||||
assertRequiresClat(false, mNai);
|
||||
assertShouldStartClat(false, mNai);
|
||||
|
||||
mNai.linkProperties.addLinkAddress(new LinkAddress("2001:db8::1/64"));
|
||||
assertRequiresClat(true, mNai);
|
||||
assertShouldStartClat(true, mNai);
|
||||
|
||||
mMisc.skip464xlat = true;
|
||||
String errorMsg = msg + String.format(" skip464xlat=%b", mMisc.skip464xlat);
|
||||
assertFalse(errorMsg, Nat464Xlat.requiresClat(mNai));
|
||||
assertRequiresClat(false, mNai);
|
||||
assertShouldStartClat(false, mNai);
|
||||
|
||||
mMisc.skip464xlat = false;
|
||||
errorMsg = msg + String.format(" skip464xlat=%b", mMisc.skip464xlat);
|
||||
assertTrue(errorMsg, Nat464Xlat.requiresClat(mNai));
|
||||
assertRequiresClat(true, mNai);
|
||||
assertShouldStartClat(true, mNai);
|
||||
|
||||
mNai.linkProperties.addLinkAddress(new LinkAddress("192.0.2.2/24"));
|
||||
assertRequiresClat(false, mNai);
|
||||
assertShouldStartClat(false, mNai);
|
||||
|
||||
mNai.linkProperties.removeLinkAddress(new LinkAddress("192.0.2.2/24"));
|
||||
assertRequiresClat(true, mNai);
|
||||
assertShouldStartClat(true, mNai);
|
||||
|
||||
mNai.linkProperties.setNat64Prefix(null);
|
||||
assertRequiresClat(true, mNai);
|
||||
assertShouldStartClat(false, mNai);
|
||||
|
||||
mNai.linkProperties = new LinkProperties(oldLp);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -125,11 +178,13 @@ public class Nat464XlatTest {
|
||||
Nat464Xlat nat = makeNat464Xlat();
|
||||
ArgumentCaptor<LinkProperties> c = ArgumentCaptor.forClass(LinkProperties.class);
|
||||
|
||||
// ConnectivityService starts clat.
|
||||
nat.setNat64Prefix(new IpPrefix(NAT64_PREFIX));
|
||||
|
||||
// Start clat.
|
||||
nat.start();
|
||||
|
||||
verify(mNms).registerObserver(eq(nat));
|
||||
verify(mNetd).clatdStart(eq(BASE_IFACE));
|
||||
verify(mNetd).clatdStart(eq(BASE_IFACE), eq(NAT64_PREFIX));
|
||||
|
||||
// Stacked interface up notification arrives.
|
||||
nat.interfaceLinkStateChanged(STACKED_IFACE, true);
|
||||
@@ -141,22 +196,109 @@ public class Nat464XlatTest {
|
||||
assertTrue(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE));
|
||||
assertRunning(nat);
|
||||
|
||||
// ConnectivityService stops clat (Network disconnects, IPv4 addr appears, ...).
|
||||
// Stop clat (Network disconnects, IPv4 addr appears, ...).
|
||||
nat.stop();
|
||||
|
||||
verify(mNetd).clatdStop(eq(BASE_IFACE));
|
||||
verify(mConnectivity, times(2)).handleUpdateLinkProperties(eq(mNai), c.capture());
|
||||
verify(mNms).unregisterObserver(eq(nat));
|
||||
assertTrue(c.getValue().getStackedLinks().isEmpty());
|
||||
assertFalse(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE));
|
||||
verify(mNetd).resolverStopPrefix64Discovery(eq(NETID));
|
||||
assertIdle(nat);
|
||||
|
||||
// Stacked interface removed notification arrives.
|
||||
// Stacked interface removed notification arrives and is ignored.
|
||||
nat.interfaceRemoved(STACKED_IFACE);
|
||||
mLooper.dispatchNext();
|
||||
|
||||
verify(mNms).unregisterObserver(eq(nat));
|
||||
verify(mConnectivity, times(2)).handleUpdateLinkProperties(eq(mNai), c.capture());
|
||||
verifyNoMoreInteractions(mNetd, mNms, mConnectivity);
|
||||
}
|
||||
|
||||
private void checkStartStopStart(boolean interfaceRemovedFirst) throws Exception {
|
||||
Nat464Xlat nat = makeNat464Xlat();
|
||||
ArgumentCaptor<LinkProperties> c = ArgumentCaptor.forClass(LinkProperties.class);
|
||||
InOrder inOrder = inOrder(mNetd, mConnectivity);
|
||||
|
||||
nat.setNat64Prefix(new IpPrefix(NAT64_PREFIX));
|
||||
|
||||
nat.start();
|
||||
|
||||
inOrder.verify(mNetd).clatdStart(eq(BASE_IFACE), eq(NAT64_PREFIX));
|
||||
|
||||
// Stacked interface up notification arrives.
|
||||
nat.interfaceLinkStateChanged(STACKED_IFACE, true);
|
||||
mLooper.dispatchNext();
|
||||
|
||||
inOrder.verify(mConnectivity).handleUpdateLinkProperties(eq(mNai), c.capture());
|
||||
assertFalse(c.getValue().getStackedLinks().isEmpty());
|
||||
assertTrue(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE));
|
||||
assertRunning(nat);
|
||||
|
||||
// ConnectivityService stops clat (Network disconnects, IPv4 addr appears, ...).
|
||||
nat.stop();
|
||||
|
||||
inOrder.verify(mNetd).clatdStop(eq(BASE_IFACE));
|
||||
|
||||
inOrder.verify(mConnectivity, times(1)).handleUpdateLinkProperties(eq(mNai), c.capture());
|
||||
assertTrue(c.getValue().getStackedLinks().isEmpty());
|
||||
assertFalse(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE));
|
||||
assertIdle(nat);
|
||||
|
||||
verifyNoMoreInteractions(mNetd, mNms, mConnectivity);
|
||||
if (interfaceRemovedFirst) {
|
||||
// Stacked interface removed notification arrives and is ignored.
|
||||
nat.interfaceRemoved(STACKED_IFACE);
|
||||
mLooper.dispatchNext();
|
||||
nat.interfaceLinkStateChanged(STACKED_IFACE, false);
|
||||
mLooper.dispatchNext();
|
||||
}
|
||||
|
||||
assertTrue(c.getValue().getStackedLinks().isEmpty());
|
||||
assertFalse(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE));
|
||||
assertIdle(nat);
|
||||
inOrder.verifyNoMoreInteractions();
|
||||
|
||||
nat.start();
|
||||
|
||||
inOrder.verify(mNetd).clatdStart(eq(BASE_IFACE), eq(NAT64_PREFIX));
|
||||
|
||||
if (!interfaceRemovedFirst) {
|
||||
// Stacked interface removed notification arrives and is ignored.
|
||||
nat.interfaceRemoved(STACKED_IFACE);
|
||||
mLooper.dispatchNext();
|
||||
nat.interfaceLinkStateChanged(STACKED_IFACE, false);
|
||||
mLooper.dispatchNext();
|
||||
}
|
||||
|
||||
// Stacked interface up notification arrives.
|
||||
nat.interfaceLinkStateChanged(STACKED_IFACE, true);
|
||||
mLooper.dispatchNext();
|
||||
|
||||
inOrder.verify(mConnectivity).handleUpdateLinkProperties(eq(mNai), c.capture());
|
||||
assertFalse(c.getValue().getStackedLinks().isEmpty());
|
||||
assertTrue(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE));
|
||||
assertRunning(nat);
|
||||
|
||||
// ConnectivityService stops clat again.
|
||||
nat.stop();
|
||||
|
||||
inOrder.verify(mNetd).clatdStop(eq(BASE_IFACE));
|
||||
|
||||
inOrder.verify(mConnectivity, times(1)).handleUpdateLinkProperties(eq(mNai), c.capture());
|
||||
assertTrue(c.getValue().getStackedLinks().isEmpty());
|
||||
assertFalse(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE));
|
||||
assertIdle(nat);
|
||||
|
||||
inOrder.verifyNoMoreInteractions();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testStartStopStart() throws Exception {
|
||||
checkStartStopStart(true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testStartStopStartBeforeInterfaceRemoved() throws Exception {
|
||||
checkStartStopStart(false);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -164,11 +306,12 @@ public class Nat464XlatTest {
|
||||
Nat464Xlat nat = makeNat464Xlat();
|
||||
ArgumentCaptor<LinkProperties> c = ArgumentCaptor.forClass(LinkProperties.class);
|
||||
|
||||
// ConnectivityService starts clat.
|
||||
nat.setNat64Prefix(new IpPrefix(NAT64_PREFIX));
|
||||
|
||||
nat.start();
|
||||
|
||||
verify(mNms).registerObserver(eq(nat));
|
||||
verify(mNetd).clatdStart(eq(BASE_IFACE));
|
||||
verify(mNetd).clatdStart(eq(BASE_IFACE), eq(NAT64_PREFIX));
|
||||
|
||||
// Stacked interface up notification arrives.
|
||||
nat.interfaceLinkStateChanged(STACKED_IFACE, true);
|
||||
@@ -184,9 +327,10 @@ public class Nat464XlatTest {
|
||||
nat.interfaceRemoved(STACKED_IFACE);
|
||||
mLooper.dispatchNext();
|
||||
|
||||
verify(mNms).unregisterObserver(eq(nat));
|
||||
verify(mNetd).clatdStop(eq(BASE_IFACE));
|
||||
verify(mConnectivity, times(2)).handleUpdateLinkProperties(eq(mNai), c.capture());
|
||||
verify(mNms).unregisterObserver(eq(nat));
|
||||
verify(mNetd).resolverStopPrefix64Discovery(eq(NETID));
|
||||
assertTrue(c.getValue().getStackedLinks().isEmpty());
|
||||
assertFalse(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE));
|
||||
assertIdle(nat);
|
||||
@@ -201,24 +345,25 @@ public class Nat464XlatTest {
|
||||
public void testStopBeforeClatdStarts() throws Exception {
|
||||
Nat464Xlat nat = makeNat464Xlat();
|
||||
|
||||
// ConnectivityService starts clat.
|
||||
nat.setNat64Prefix(new IpPrefix(NAT64_PREFIX));
|
||||
|
||||
nat.start();
|
||||
|
||||
verify(mNms).registerObserver(eq(nat));
|
||||
verify(mNetd).clatdStart(eq(BASE_IFACE));
|
||||
verify(mNetd).clatdStart(eq(BASE_IFACE), eq(NAT64_PREFIX));
|
||||
|
||||
// ConnectivityService immediately stops clat (Network disconnects, IPv4 addr appears, ...)
|
||||
nat.stop();
|
||||
|
||||
verify(mNms).unregisterObserver(eq(nat));
|
||||
verify(mNetd).clatdStop(eq(BASE_IFACE));
|
||||
verify(mNms).unregisterObserver(eq(nat));
|
||||
verify(mNetd).resolverStopPrefix64Discovery(eq(NETID));
|
||||
assertIdle(nat);
|
||||
|
||||
// In-flight interface up notification arrives: no-op
|
||||
nat.interfaceLinkStateChanged(STACKED_IFACE, true);
|
||||
mLooper.dispatchNext();
|
||||
|
||||
|
||||
// Interface removed notification arrives after stopClatd() takes effect: no-op.
|
||||
nat.interfaceRemoved(STACKED_IFACE);
|
||||
mLooper.dispatchNext();
|
||||
@@ -232,17 +377,19 @@ public class Nat464XlatTest {
|
||||
public void testStopAndClatdNeverStarts() throws Exception {
|
||||
Nat464Xlat nat = makeNat464Xlat();
|
||||
|
||||
// ConnectivityService starts clat.
|
||||
nat.setNat64Prefix(new IpPrefix(NAT64_PREFIX));
|
||||
|
||||
nat.start();
|
||||
|
||||
verify(mNms).registerObserver(eq(nat));
|
||||
verify(mNetd).clatdStart(eq(BASE_IFACE));
|
||||
verify(mNetd).clatdStart(eq(BASE_IFACE), eq(NAT64_PREFIX));
|
||||
|
||||
// ConnectivityService immediately stops clat (Network disconnects, IPv4 addr appears, ...)
|
||||
nat.stop();
|
||||
|
||||
verify(mNms).unregisterObserver(eq(nat));
|
||||
verify(mNetd).clatdStop(eq(BASE_IFACE));
|
||||
verify(mNms).unregisterObserver(eq(nat));
|
||||
verify(mNetd).resolverStopPrefix64Discovery(eq(NETID));
|
||||
assertIdle(nat);
|
||||
|
||||
verifyNoMoreInteractions(mNetd, mNms, mConnectivity);
|
||||
|
||||
Reference in New Issue
Block a user