Snap for 6530637 from 9de671b35b77e4bb744decb5e3024e8359c9ed62 to mainline-release
Change-Id: If4d01f670f7b4326ee951196dda390b730f84d03
This commit is contained in:
@@ -198,6 +198,9 @@ public class Nat464Xlat extends BaseNetworkObserver {
|
||||
if (mPrefixDiscoveryRunning && !isPrefixDiscoveryNeeded()) {
|
||||
stopPrefixDiscovery();
|
||||
}
|
||||
if (!mPrefixDiscoveryRunning) {
|
||||
setPrefix64(mNat64PrefixInUse);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -221,6 +224,10 @@ public class Nat464Xlat extends BaseNetworkObserver {
|
||||
mIface = null;
|
||||
mBaseIface = null;
|
||||
|
||||
if (!mPrefixDiscoveryRunning) {
|
||||
setPrefix64(null);
|
||||
}
|
||||
|
||||
if (isPrefixDiscoveryNeeded()) {
|
||||
if (!mPrefixDiscoveryRunning) {
|
||||
startPrefixDiscovery();
|
||||
@@ -308,6 +315,16 @@ public class Nat464Xlat extends BaseNetworkObserver {
|
||||
return requiresClat(mNetwork) && mNat64PrefixFromRa == null;
|
||||
}
|
||||
|
||||
private void setPrefix64(IpPrefix prefix) {
|
||||
final String prefixString = (prefix != null) ? prefix.toString() : "";
|
||||
try {
|
||||
mDnsResolver.setPrefix64(getNetId(), prefixString);
|
||||
} catch (RemoteException | ServiceSpecificException e) {
|
||||
Slog.e(TAG, "Error setting NAT64 prefix on netId " + getNetId() + " to "
|
||||
+ prefix + ": " + e);
|
||||
}
|
||||
}
|
||||
|
||||
private void maybeHandleNat64PrefixChange() {
|
||||
final IpPrefix newPrefix = selectNat64Prefix();
|
||||
if (!Objects.equals(mNat64PrefixInUse, newPrefix)) {
|
||||
|
||||
@@ -6314,6 +6314,7 @@ public class ConnectivityServiceTest {
|
||||
int netId = network.getNetId();
|
||||
callback.expectAvailableCallbacksUnvalidated(mCellNetworkAgent);
|
||||
inOrder.verify(mMockNetd).clatdStart(iface, pref64FromRa.toString());
|
||||
inOrder.verify(mMockDnsResolver).setPrefix64(netId, pref64FromRa.toString());
|
||||
inOrder.verify(mMockDnsResolver, never()).startPrefix64Discovery(netId);
|
||||
callback.assertNoCallback();
|
||||
assertEquals(pref64FromRa, mCm.getLinkProperties(network).getNat64Prefix());
|
||||
@@ -6323,6 +6324,7 @@ public class ConnectivityServiceTest {
|
||||
mCellNetworkAgent.sendLinkProperties(lp);
|
||||
expectNat64PrefixChange(callback, mCellNetworkAgent, null);
|
||||
inOrder.verify(mMockNetd).clatdStop(iface);
|
||||
inOrder.verify(mMockDnsResolver).setPrefix64(netId, "");
|
||||
inOrder.verify(mMockDnsResolver).startPrefix64Discovery(netId);
|
||||
|
||||
// If the RA prefix appears while DNS discovery is in progress, discovery is stopped and
|
||||
@@ -6332,6 +6334,7 @@ public class ConnectivityServiceTest {
|
||||
expectNat64PrefixChange(callback, mCellNetworkAgent, pref64FromRa);
|
||||
inOrder.verify(mMockNetd).clatdStart(iface, pref64FromRa.toString());
|
||||
inOrder.verify(mMockDnsResolver).stopPrefix64Discovery(netId);
|
||||
inOrder.verify(mMockDnsResolver).setPrefix64(netId, pref64FromRa.toString());
|
||||
|
||||
// Withdraw the RA prefix so we can test the case where an RA prefix appears after DNS
|
||||
// discovery has succeeded.
|
||||
@@ -6339,6 +6342,7 @@ public class ConnectivityServiceTest {
|
||||
mCellNetworkAgent.sendLinkProperties(lp);
|
||||
expectNat64PrefixChange(callback, mCellNetworkAgent, null);
|
||||
inOrder.verify(mMockNetd).clatdStop(iface);
|
||||
inOrder.verify(mMockDnsResolver).setPrefix64(netId, "");
|
||||
inOrder.verify(mMockDnsResolver).startPrefix64Discovery(netId);
|
||||
|
||||
mService.mNetdEventCallback.onNat64PrefixEvent(netId, true /* added */,
|
||||
@@ -6346,13 +6350,40 @@ public class ConnectivityServiceTest {
|
||||
expectNat64PrefixChange(callback, mCellNetworkAgent, pref64FromDns);
|
||||
inOrder.verify(mMockNetd).clatdStart(iface, pref64FromDns.toString());
|
||||
|
||||
// If the RA prefix reappears, clatd is restarted and prefix discovery is stopped.
|
||||
// If an RA advertises the same prefix that was discovered by DNS, nothing happens: prefix
|
||||
// discovery is not stopped, and there are no callbacks.
|
||||
lp.setNat64Prefix(pref64FromDns);
|
||||
mCellNetworkAgent.sendLinkProperties(lp);
|
||||
callback.assertNoCallback();
|
||||
inOrder.verify(mMockNetd, never()).clatdStop(iface);
|
||||
inOrder.verify(mMockNetd, never()).clatdStart(eq(iface), anyString());
|
||||
inOrder.verify(mMockDnsResolver, never()).stopPrefix64Discovery(netId);
|
||||
inOrder.verify(mMockDnsResolver, never()).startPrefix64Discovery(netId);
|
||||
inOrder.verify(mMockDnsResolver, never()).setPrefix64(eq(netId), anyString());
|
||||
|
||||
// If the RA is later withdrawn, nothing happens again.
|
||||
lp.setNat64Prefix(null);
|
||||
mCellNetworkAgent.sendLinkProperties(lp);
|
||||
callback.assertNoCallback();
|
||||
inOrder.verify(mMockNetd, never()).clatdStop(iface);
|
||||
inOrder.verify(mMockNetd, never()).clatdStart(eq(iface), anyString());
|
||||
inOrder.verify(mMockDnsResolver, never()).stopPrefix64Discovery(netId);
|
||||
inOrder.verify(mMockDnsResolver, never()).startPrefix64Discovery(netId);
|
||||
inOrder.verify(mMockDnsResolver, never()).setPrefix64(eq(netId), anyString());
|
||||
|
||||
// If the RA prefix changes, clatd is restarted and prefix discovery is stopped.
|
||||
lp.setNat64Prefix(pref64FromRa);
|
||||
mCellNetworkAgent.sendLinkProperties(lp);
|
||||
expectNat64PrefixChange(callback, mCellNetworkAgent, pref64FromRa);
|
||||
inOrder.verify(mMockNetd).clatdStop(iface);
|
||||
inOrder.verify(mMockDnsResolver).stopPrefix64Discovery(netId);
|
||||
|
||||
// Stopping prefix discovery results in a prefix removed notification.
|
||||
mService.mNetdEventCallback.onNat64PrefixEvent(netId, false /* added */,
|
||||
pref64FromDnsStr, 96);
|
||||
|
||||
inOrder.verify(mMockNetd).clatdStart(iface, pref64FromRa.toString());
|
||||
inOrder.verify(mMockDnsResolver).setPrefix64(netId, pref64FromRa.toString());
|
||||
inOrder.verify(mMockDnsResolver, never()).startPrefix64Discovery(netId);
|
||||
|
||||
// If the RA prefix changes, clatd is restarted and prefix discovery is not started.
|
||||
@@ -6360,7 +6391,9 @@ public class ConnectivityServiceTest {
|
||||
mCellNetworkAgent.sendLinkProperties(lp);
|
||||
expectNat64PrefixChange(callback, mCellNetworkAgent, newPref64FromRa);
|
||||
inOrder.verify(mMockNetd).clatdStop(iface);
|
||||
inOrder.verify(mMockDnsResolver).setPrefix64(netId, "");
|
||||
inOrder.verify(mMockNetd).clatdStart(iface, newPref64FromRa.toString());
|
||||
inOrder.verify(mMockDnsResolver).setPrefix64(netId, newPref64FromRa.toString());
|
||||
inOrder.verify(mMockDnsResolver, never()).stopPrefix64Discovery(netId);
|
||||
inOrder.verify(mMockDnsResolver, never()).startPrefix64Discovery(netId);
|
||||
|
||||
@@ -6373,11 +6406,45 @@ public class ConnectivityServiceTest {
|
||||
inOrder.verify(mMockNetd, never()).clatdStart(eq(iface), anyString());
|
||||
inOrder.verify(mMockDnsResolver, never()).stopPrefix64Discovery(netId);
|
||||
inOrder.verify(mMockDnsResolver, never()).startPrefix64Discovery(netId);
|
||||
inOrder.verify(mMockDnsResolver, never()).setPrefix64(eq(netId), anyString());
|
||||
|
||||
// The transition between no prefix and DNS prefix is tested in testStackedLinkProperties.
|
||||
|
||||
// If the same prefix is learned first by DNS and then by RA, and clat is later stopped,
|
||||
// (e.g., because the network disconnects) setPrefix64(netid, "") is never called.
|
||||
lp.setNat64Prefix(null);
|
||||
mCellNetworkAgent.sendLinkProperties(lp);
|
||||
expectNat64PrefixChange(callback, mCellNetworkAgent, null);
|
||||
inOrder.verify(mMockNetd).clatdStop(iface);
|
||||
inOrder.verify(mMockDnsResolver).setPrefix64(netId, "");
|
||||
inOrder.verify(mMockDnsResolver).startPrefix64Discovery(netId);
|
||||
mService.mNetdEventCallback.onNat64PrefixEvent(netId, true /* added */,
|
||||
pref64FromDnsStr, 96);
|
||||
expectNat64PrefixChange(callback, mCellNetworkAgent, pref64FromDns);
|
||||
inOrder.verify(mMockNetd).clatdStart(iface, pref64FromDns.toString());
|
||||
inOrder.verify(mMockDnsResolver, never()).setPrefix64(eq(netId), any());
|
||||
|
||||
lp.setNat64Prefix(pref64FromDns);
|
||||
mCellNetworkAgent.sendLinkProperties(lp);
|
||||
callback.assertNoCallback();
|
||||
inOrder.verify(mMockNetd, never()).clatdStop(iface);
|
||||
inOrder.verify(mMockNetd, never()).clatdStart(eq(iface), anyString());
|
||||
inOrder.verify(mMockDnsResolver, never()).stopPrefix64Discovery(netId);
|
||||
inOrder.verify(mMockDnsResolver, never()).startPrefix64Discovery(netId);
|
||||
inOrder.verify(mMockDnsResolver, never()).setPrefix64(eq(netId), anyString());
|
||||
|
||||
// When tearing down a network, clat state is only updated after CALLBACK_LOST is fired, but
|
||||
// before CONNECTIVITY_ACTION is sent. Wait for CONNECTIVITY_ACTION before verifying that
|
||||
// clat has been stopped, or the test will be flaky.
|
||||
ConditionVariable cv = registerConnectivityBroadcast(1);
|
||||
mCellNetworkAgent.disconnect();
|
||||
callback.expectCallback(CallbackEntry.LOST, mCellNetworkAgent);
|
||||
waitFor(cv);
|
||||
|
||||
inOrder.verify(mMockNetd).clatdStop(iface);
|
||||
inOrder.verify(mMockDnsResolver).stopPrefix64Discovery(netId);
|
||||
inOrder.verify(mMockDnsResolver, never()).setPrefix64(eq(netId), anyString());
|
||||
|
||||
mCm.unregisterNetworkCallback(callback);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user