Merge "Use IDnsResolverUnsolicitedEventListener"

This commit is contained in:
Paul Hu
2021-03-03 01:08:27 +00:00
committed by Gerrit Code Review
4 changed files with 121 additions and 87 deletions

View File

@@ -142,10 +142,13 @@ import android.net.UnderlyingNetworkInfo;
import android.net.Uri; import android.net.Uri;
import android.net.VpnManager; import android.net.VpnManager;
import android.net.VpnTransportInfo; import android.net.VpnTransportInfo;
import android.net.metrics.INetdEventListener;
import android.net.metrics.IpConnectivityLog; import android.net.metrics.IpConnectivityLog;
import android.net.metrics.NetworkEvent; import android.net.metrics.NetworkEvent;
import android.net.netlink.InetDiagMessage; import android.net.netlink.InetDiagMessage;
import android.net.resolv.aidl.DnsHealthEventParcel;
import android.net.resolv.aidl.IDnsResolverUnsolicitedEventListener;
import android.net.resolv.aidl.Nat64PrefixEventParcel;
import android.net.resolv.aidl.PrivateDnsValidationEventParcel;
import android.net.shared.PrivateDnsConfig; import android.net.shared.PrivateDnsConfig;
import android.net.util.MultinetworkPolicyTracker; import android.net.util.MultinetworkPolicyTracker;
import android.net.util.NetdService; import android.net.util.NetdService;
@@ -2037,25 +2040,24 @@ public class ConnectivityService extends IConnectivityManager.Stub
return true; return true;
} }
private class NetdEventCallback extends INetdEventListener.Stub { class DnsResolverUnsolicitedEventCallback extends
IDnsResolverUnsolicitedEventListener.Stub {
@Override @Override
public void onPrivateDnsValidationEvent(int netId, String ipAddress, public void onPrivateDnsValidationEvent(final PrivateDnsValidationEventParcel event) {
String hostname, boolean validated) {
try { try {
mHandler.sendMessage(mHandler.obtainMessage( mHandler.sendMessage(mHandler.obtainMessage(
EVENT_PRIVATE_DNS_VALIDATION_UPDATE, EVENT_PRIVATE_DNS_VALIDATION_UPDATE,
new PrivateDnsValidationUpdate(netId, new PrivateDnsValidationUpdate(event.netId,
InetAddresses.parseNumericAddress(ipAddress), InetAddresses.parseNumericAddress(event.ipAddress),
hostname, validated))); event.hostname, event.validation)));
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
loge("Error parsing ip address in validation event"); loge("Error parsing ip address in validation event");
} }
} }
@Override @Override
public void onDnsEvent(int netId, int eventType, int returnCode, int latencyMs, public void onDnsHealthEvent(final DnsHealthEventParcel event) {
String hostname, String[] ipAddresses, int ipAddressesCount, int uid) { NetworkAgentInfo nai = getNetworkAgentInfoForNetId(event.netId);
NetworkAgentInfo nai = getNetworkAgentInfoForNetId(netId);
// Netd event only allow registrants from system. Each NetworkMonitor thread is under // Netd event only allow registrants from system. Each NetworkMonitor thread is under
// the caller thread of registerNetworkAgent. Thus, it's not allowed to register netd // the caller thread of registerNetworkAgent. Thus, it's not allowed to register netd
// event callback for certain nai. e.g. cellular. Register here to pass to // event callback for certain nai. e.g. cellular. Register here to pass to
@@ -2064,34 +2066,18 @@ public class ConnectivityService extends IConnectivityManager.Stub
// callback from each caller type. Need to re-factor NetdEventListenerService to allow // callback from each caller type. Need to re-factor NetdEventListenerService to allow
// multiple NetworkMonitor registrants. // multiple NetworkMonitor registrants.
if (nai != null && nai.satisfies(mDefaultRequest.mRequests.get(0))) { if (nai != null && nai.satisfies(mDefaultRequest.mRequests.get(0))) {
nai.networkMonitor().notifyDnsResponse(returnCode); nai.networkMonitor().notifyDnsResponse(event.healthResult);
} }
} }
@Override @Override
public void onNat64PrefixEvent(int netId, boolean added, public void onNat64PrefixEvent(final Nat64PrefixEventParcel event) {
String prefixString, int prefixLength) { mHandler.post(() -> handleNat64PrefixEvent(event.netId, event.prefixOperation,
mHandler.post(() -> handleNat64PrefixEvent(netId, added, prefixString, prefixLength)); event.prefixAddress, event.prefixLength));
} }
@Override @Override
public void onConnectEvent(int netId, int error, int latencyMs, String ipAddr, int port, public int getInterfaceVersion() {
int uid) {
}
@Override
public void onWakeupEvent(String prefix, int uid, int ethertype, int ipNextHeader,
byte[] dstHw, String srcIp, String dstIp, int srcPort, int dstPort,
long timestampNs) {
}
@Override
public void onTcpSocketStatsEvent(int[] networkIds, int[] sentPackets, int[] lostPackets,
int[] rttsUs, int[] sentAckDiffsMs) {
}
@Override
public int getInterfaceVersion() throws RemoteException {
return this.VERSION; return this.VERSION;
} }
@@ -2099,16 +2085,17 @@ public class ConnectivityService extends IConnectivityManager.Stub
public String getInterfaceHash() { public String getInterfaceHash() {
return this.HASH; return this.HASH;
} }
}; }
@VisibleForTesting @VisibleForTesting
protected final INetdEventListener mNetdEventCallback = new NetdEventCallback(); protected final DnsResolverUnsolicitedEventCallback mResolverUnsolEventCallback =
new DnsResolverUnsolicitedEventCallback();
private void registerNetdEventCallback() { private void registerDnsResolverUnsolicitedEventListener() {
try { try {
mDnsResolver.registerEventListener(mNetdEventCallback); mDnsResolver.registerUnsolicitedEventListener(mResolverUnsolEventCallback);
} catch (Exception e) { } catch (Exception e) {
loge("Error registering DnsResolver callback: " + e); loge("Error registering DnsResolver unsolicited event callback: " + e);
} }
} }
@@ -2439,7 +2426,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
// to ensure the tracking will be initialized correctly. // to ensure the tracking will be initialized correctly.
mPermissionMonitor.startMonitoring(); mPermissionMonitor.startMonitoring();
mProxyTracker.loadGlobalProxy(); mProxyTracker.loadGlobalProxy();
registerNetdEventCallback(); registerDnsResolverUnsolicitedEventListener();
synchronized (this) { synchronized (this) {
mSystemReady = true; mSystemReady = true;
@@ -3370,21 +3357,21 @@ public class ConnectivityService extends IConnectivityManager.Stub
handleUpdateLinkProperties(nai, new LinkProperties(nai.linkProperties)); handleUpdateLinkProperties(nai, new LinkProperties(nai.linkProperties));
} }
private void handleNat64PrefixEvent(int netId, boolean added, String prefixString, private void handleNat64PrefixEvent(int netId, int operation, String prefixAddress,
int prefixLength) { int prefixLength) {
NetworkAgentInfo nai = mNetworkForNetId.get(netId); NetworkAgentInfo nai = mNetworkForNetId.get(netId);
if (nai == null) return; if (nai == null) return;
log(String.format("NAT64 prefix %s on netId %d: %s/%d", log(String.format("NAT64 prefix changed on netId %d: operation=%d, %s/%d",
(added ? "added" : "removed"), netId, prefixString, prefixLength)); netId, operation, prefixAddress, prefixLength));
IpPrefix prefix = null; IpPrefix prefix = null;
if (added) { if (operation == IDnsResolverUnsolicitedEventListener.PREFIX_OPERATION_ADDED) {
try { try {
prefix = new IpPrefix(InetAddresses.parseNumericAddress(prefixString), prefix = new IpPrefix(InetAddresses.parseNumericAddress(prefixAddress),
prefixLength); prefixLength);
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
loge("Invalid NAT64 prefix " + prefixString + "/" + prefixLength); loge("Invalid NAT64 prefix " + prefixAddress + "/" + prefixLength);
return; return;
} }
} }

View File

@@ -19,6 +19,8 @@ package com.android.server.connectivity;
import static android.net.ConnectivityManager.PRIVATE_DNS_DEFAULT_MODE_FALLBACK; import static android.net.ConnectivityManager.PRIVATE_DNS_DEFAULT_MODE_FALLBACK;
import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OFF; import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OFF;
import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME; import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME;
import static android.net.resolv.aidl.IDnsResolverUnsolicitedEventListener.VALIDATION_RESULT_FAILURE;
import static android.net.resolv.aidl.IDnsResolverUnsolicitedEventListener.VALIDATION_RESULT_SUCCESS;
import static android.provider.Settings.Global.DNS_RESOLVER_MAX_SAMPLES; import static android.provider.Settings.Global.DNS_RESOLVER_MAX_SAMPLES;
import static android.provider.Settings.Global.DNS_RESOLVER_MIN_SAMPLES; import static android.provider.Settings.Global.DNS_RESOLVER_MIN_SAMPLES;
import static android.provider.Settings.Global.DNS_RESOLVER_SAMPLE_VALIDITY_SECONDS; import static android.provider.Settings.Global.DNS_RESOLVER_SAMPLE_VALIDITY_SECONDS;
@@ -147,17 +149,18 @@ public class DnsManager {
} }
public static class PrivateDnsValidationUpdate { public static class PrivateDnsValidationUpdate {
final public int netId; public final int netId;
final public InetAddress ipAddress; public final InetAddress ipAddress;
final public String hostname; public final String hostname;
final public boolean validated; // Refer to IDnsResolverUnsolicitedEventListener.VALIDATION_RESULT_*.
public final int validationResult;
public PrivateDnsValidationUpdate(int netId, InetAddress ipAddress, public PrivateDnsValidationUpdate(int netId, InetAddress ipAddress,
String hostname, boolean validated) { String hostname, int validationResult) {
this.netId = netId; this.netId = netId;
this.ipAddress = ipAddress; this.ipAddress = ipAddress;
this.hostname = hostname; this.hostname = hostname;
this.validated = validated; this.validationResult = validationResult;
} }
} }
@@ -216,10 +219,13 @@ public class DnsManager {
if (!mValidationMap.containsKey(p)) { if (!mValidationMap.containsKey(p)) {
return; return;
} }
if (update.validated) { if (update.validationResult == VALIDATION_RESULT_SUCCESS) {
mValidationMap.put(p, ValidationStatus.SUCCEEDED); mValidationMap.put(p, ValidationStatus.SUCCEEDED);
} else { } else if (update.validationResult == VALIDATION_RESULT_FAILURE) {
mValidationMap.put(p, ValidationStatus.FAILED); mValidationMap.put(p, ValidationStatus.FAILED);
} else {
Log.e(TAG, "Unknown private dns validation operation="
+ update.validationResult);
} }
} }

View File

@@ -90,6 +90,10 @@ import static android.net.OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PAID_
import static android.net.OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PRIVATE_ONLY; import static android.net.OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PRIVATE_ONLY;
import static android.net.OemNetworkPreferences.OEM_NETWORK_PREFERENCE_UNINITIALIZED; import static android.net.OemNetworkPreferences.OEM_NETWORK_PREFERENCE_UNINITIALIZED;
import static android.net.RouteInfo.RTN_UNREACHABLE; import static android.net.RouteInfo.RTN_UNREACHABLE;
import static android.net.resolv.aidl.IDnsResolverUnsolicitedEventListener.PREFIX_OPERATION_ADDED;
import static android.net.resolv.aidl.IDnsResolverUnsolicitedEventListener.PREFIX_OPERATION_REMOVED;
import static android.net.resolv.aidl.IDnsResolverUnsolicitedEventListener.VALIDATION_RESULT_FAILURE;
import static android.net.resolv.aidl.IDnsResolverUnsolicitedEventListener.VALIDATION_RESULT_SUCCESS;
import static android.os.Process.INVALID_UID; import static android.os.Process.INVALID_UID;
import static android.system.OsConstants.IPPROTO_TCP; import static android.system.OsConstants.IPPROTO_TCP;
@@ -217,6 +221,8 @@ import android.net.Uri;
import android.net.VpnManager; import android.net.VpnManager;
import android.net.VpnTransportInfo; import android.net.VpnTransportInfo;
import android.net.metrics.IpConnectivityLog; import android.net.metrics.IpConnectivityLog;
import android.net.resolv.aidl.Nat64PrefixEventParcel;
import android.net.resolv.aidl.PrivateDnsValidationEventParcel;
import android.net.shared.NetworkMonitorUtils; import android.net.shared.NetworkMonitorUtils;
import android.net.shared.PrivateDnsConfig; import android.net.shared.PrivateDnsConfig;
import android.net.util.MultinetworkPolicyTracker; import android.net.util.MultinetworkPolicyTracker;
@@ -5919,6 +5925,16 @@ public class ConnectivityServiceTest {
assertEquals("strict.example.com", cbi.getLp().getPrivateDnsServerName()); assertEquals("strict.example.com", cbi.getLp().getPrivateDnsServerName());
} }
private PrivateDnsValidationEventParcel makePrivateDnsValidationEvent(
final int netId, final String ipAddress, final String hostname, final int validation) {
final PrivateDnsValidationEventParcel event = new PrivateDnsValidationEventParcel();
event.netId = netId;
event.ipAddress = ipAddress;
event.hostname = hostname;
event.validation = validation;
return event;
}
@Test @Test
public void testLinkPropertiesWithPrivateDnsValidationEvents() throws Exception { public void testLinkPropertiesWithPrivateDnsValidationEvents() throws Exception {
// The default on Android is opportunistic mode ("Automatic"). // The default on Android is opportunistic mode ("Automatic").
@@ -5949,8 +5965,9 @@ public class ConnectivityServiceTest {
// Send a validation event for a server that is not part of the current // Send a validation event for a server that is not part of the current
// resolver config. The validation event should be ignored. // resolver config. The validation event should be ignored.
mService.mNetdEventCallback.onPrivateDnsValidationEvent( mService.mResolverUnsolEventCallback.onPrivateDnsValidationEvent(
mCellNetworkAgent.getNetwork().netId, "", "145.100.185.18", true); makePrivateDnsValidationEvent(mCellNetworkAgent.getNetwork().netId, "",
"145.100.185.18", VALIDATION_RESULT_SUCCESS));
cellNetworkCallback.assertNoCallback(); cellNetworkCallback.assertNoCallback();
// Add a dns server to the LinkProperties. // Add a dns server to the LinkProperties.
@@ -5967,20 +5984,23 @@ public class ConnectivityServiceTest {
// Send a validation event containing a hostname that is not part of // Send a validation event containing a hostname that is not part of
// the current resolver config. The validation event should be ignored. // the current resolver config. The validation event should be ignored.
mService.mNetdEventCallback.onPrivateDnsValidationEvent( mService.mResolverUnsolEventCallback.onPrivateDnsValidationEvent(
mCellNetworkAgent.getNetwork().netId, "145.100.185.16", "hostname", true); makePrivateDnsValidationEvent(mCellNetworkAgent.getNetwork().netId,
"145.100.185.16", "hostname", VALIDATION_RESULT_SUCCESS));
cellNetworkCallback.assertNoCallback(); cellNetworkCallback.assertNoCallback();
// Send a validation event where validation failed. // Send a validation event where validation failed.
mService.mNetdEventCallback.onPrivateDnsValidationEvent( mService.mResolverUnsolEventCallback.onPrivateDnsValidationEvent(
mCellNetworkAgent.getNetwork().netId, "145.100.185.16", "", false); makePrivateDnsValidationEvent(mCellNetworkAgent.getNetwork().netId,
"145.100.185.16", "", VALIDATION_RESULT_FAILURE));
cellNetworkCallback.assertNoCallback(); cellNetworkCallback.assertNoCallback();
// Send a validation event where validation succeeded for a server in // Send a validation event where validation succeeded for a server in
// the current resolver config. A LinkProperties callback with updated // the current resolver config. A LinkProperties callback with updated
// private dns fields should be sent. // private dns fields should be sent.
mService.mNetdEventCallback.onPrivateDnsValidationEvent( mService.mResolverUnsolEventCallback.onPrivateDnsValidationEvent(
mCellNetworkAgent.getNetwork().netId, "145.100.185.16", "", true); makePrivateDnsValidationEvent(mCellNetworkAgent.getNetwork().netId,
"145.100.185.16", "", VALIDATION_RESULT_SUCCESS));
cbi = cellNetworkCallback.expectCallback(CallbackEntry.LINK_PROPERTIES_CHANGED, cbi = cellNetworkCallback.expectCallback(CallbackEntry.LINK_PROPERTIES_CHANGED,
mCellNetworkAgent); mCellNetworkAgent);
cellNetworkCallback.assertNoCallback(); cellNetworkCallback.assertNoCallback();
@@ -7824,6 +7844,16 @@ public class ConnectivityServiceTest {
return stacked; return stacked;
} }
private Nat64PrefixEventParcel makeNat64PrefixEvent(final int netId, final int prefixOperation,
final String prefixAddress, final int prefixLength) {
final Nat64PrefixEventParcel event = new Nat64PrefixEventParcel();
event.netId = netId;
event.prefixOperation = prefixOperation;
event.prefixAddress = prefixAddress;
event.prefixLength = prefixLength;
return event;
}
@Test @Test
public void testStackedLinkProperties() throws Exception { public void testStackedLinkProperties() throws Exception {
final LinkAddress myIpv4 = new LinkAddress("1.2.3.4/24"); final LinkAddress myIpv4 = new LinkAddress("1.2.3.4/24");
@@ -7908,8 +7938,8 @@ public class ConnectivityServiceTest {
// When NAT64 prefix discovery succeeds, LinkProperties are updated and clatd is started. // When NAT64 prefix discovery succeeds, LinkProperties are updated and clatd is started.
Nat464Xlat clat = getNat464Xlat(mCellNetworkAgent); Nat464Xlat clat = getNat464Xlat(mCellNetworkAgent);
assertNull(mCm.getLinkProperties(mCellNetworkAgent.getNetwork()).getNat64Prefix()); assertNull(mCm.getLinkProperties(mCellNetworkAgent.getNetwork()).getNat64Prefix());
mService.mNetdEventCallback.onNat64PrefixEvent(cellNetId, true /* added */, mService.mResolverUnsolEventCallback.onNat64PrefixEvent(
kNat64PrefixString, 96); makeNat64PrefixEvent(cellNetId, PREFIX_OPERATION_ADDED, kNat64PrefixString, 96));
LinkProperties lpBeforeClat = networkCallback.expectCallback( LinkProperties lpBeforeClat = networkCallback.expectCallback(
CallbackEntry.LINK_PROPERTIES_CHANGED, mCellNetworkAgent).getLp(); CallbackEntry.LINK_PROPERTIES_CHANGED, mCellNetworkAgent).getLp();
assertEquals(0, lpBeforeClat.getStackedLinks().size()); assertEquals(0, lpBeforeClat.getStackedLinks().size());
@@ -7949,8 +7979,8 @@ public class ConnectivityServiceTest {
.thenReturn(getClatInterfaceConfigParcel(myIpv4)); .thenReturn(getClatInterfaceConfigParcel(myIpv4));
// Change the NAT64 prefix without first removing it. // Change the NAT64 prefix without first removing it.
// Expect clatd to be stopped and started with the new prefix. // Expect clatd to be stopped and started with the new prefix.
mService.mNetdEventCallback.onNat64PrefixEvent(cellNetId, true /* added */, mService.mResolverUnsolEventCallback.onNat64PrefixEvent(makeNat64PrefixEvent(
kOtherNat64PrefixString, 96); cellNetId, PREFIX_OPERATION_ADDED, kOtherNat64PrefixString, 96));
networkCallback.expectLinkPropertiesThat(mCellNetworkAgent, networkCallback.expectLinkPropertiesThat(mCellNetworkAgent,
(lp) -> lp.getStackedLinks().size() == 0); (lp) -> lp.getStackedLinks().size() == 0);
verify(mMockNetd, times(1)).clatdStop(MOBILE_IFNAME); verify(mMockNetd, times(1)).clatdStop(MOBILE_IFNAME);
@@ -7998,8 +8028,8 @@ public class ConnectivityServiceTest {
.thenReturn(getClatInterfaceConfigParcel(myIpv4)); .thenReturn(getClatInterfaceConfigParcel(myIpv4));
// Stopping prefix discovery causes netd to tell us that the NAT64 prefix is gone. // Stopping prefix discovery causes netd to tell us that the NAT64 prefix is gone.
mService.mNetdEventCallback.onNat64PrefixEvent(cellNetId, false /* added */, mService.mResolverUnsolEventCallback.onNat64PrefixEvent(makeNat64PrefixEvent(
kOtherNat64PrefixString, 96); cellNetId, PREFIX_OPERATION_REMOVED, kOtherNat64PrefixString, 96));
networkCallback.expectLinkPropertiesThat(mCellNetworkAgent, networkCallback.expectLinkPropertiesThat(mCellNetworkAgent,
(lp) -> lp.getNat64Prefix() == null); (lp) -> lp.getNat64Prefix() == null);
@@ -8011,8 +8041,8 @@ public class ConnectivityServiceTest {
networkCallback.expectCallback(CallbackEntry.LINK_PROPERTIES_CHANGED, mCellNetworkAgent); networkCallback.expectCallback(CallbackEntry.LINK_PROPERTIES_CHANGED, mCellNetworkAgent);
assertRoutesRemoved(cellNetId, ipv4Subnet); // Directly-connected routes auto-added. assertRoutesRemoved(cellNetId, ipv4Subnet); // Directly-connected routes auto-added.
verify(mMockDnsResolver, times(1)).startPrefix64Discovery(cellNetId); verify(mMockDnsResolver, times(1)).startPrefix64Discovery(cellNetId);
mService.mNetdEventCallback.onNat64PrefixEvent(cellNetId, true /* added */, mService.mResolverUnsolEventCallback.onNat64PrefixEvent(makeNat64PrefixEvent(
kNat64PrefixString, 96); cellNetId, PREFIX_OPERATION_ADDED, kNat64PrefixString, 96));
networkCallback.expectCallback(CallbackEntry.LINK_PROPERTIES_CHANGED, mCellNetworkAgent); networkCallback.expectCallback(CallbackEntry.LINK_PROPERTIES_CHANGED, mCellNetworkAgent);
verify(mMockNetd, times(1)).clatdStart(MOBILE_IFNAME, kNat64Prefix.toString()); verify(mMockNetd, times(1)).clatdStart(MOBILE_IFNAME, kNat64Prefix.toString());
@@ -8024,8 +8054,8 @@ public class ConnectivityServiceTest {
verify(mMockNetd, times(1)).networkAddInterface(cellNetId, CLAT_PREFIX + MOBILE_IFNAME); verify(mMockNetd, times(1)).networkAddInterface(cellNetId, CLAT_PREFIX + MOBILE_IFNAME);
// NAT64 prefix is removed. Expect that clat is stopped. // NAT64 prefix is removed. Expect that clat is stopped.
mService.mNetdEventCallback.onNat64PrefixEvent(cellNetId, false /* added */, mService.mResolverUnsolEventCallback.onNat64PrefixEvent(makeNat64PrefixEvent(
kNat64PrefixString, 96); cellNetId, PREFIX_OPERATION_REMOVED, kNat64PrefixString, 96));
networkCallback.expectLinkPropertiesThat(mCellNetworkAgent, networkCallback.expectLinkPropertiesThat(mCellNetworkAgent,
(lp) -> lp.getStackedLinks().size() == 0 && lp.getNat64Prefix() == null); (lp) -> lp.getStackedLinks().size() == 0 && lp.getNat64Prefix() == null);
assertRoutesRemoved(cellNetId, ipv4Subnet, stackedDefault); assertRoutesRemoved(cellNetId, ipv4Subnet, stackedDefault);
@@ -8113,8 +8143,8 @@ public class ConnectivityServiceTest {
inOrder.verify(mMockDnsResolver).setPrefix64(netId, ""); inOrder.verify(mMockDnsResolver).setPrefix64(netId, "");
inOrder.verify(mMockDnsResolver).startPrefix64Discovery(netId); inOrder.verify(mMockDnsResolver).startPrefix64Discovery(netId);
mService.mNetdEventCallback.onNat64PrefixEvent(netId, true /* added */, mService.mResolverUnsolEventCallback.onNat64PrefixEvent(
pref64FromDnsStr, 96); makeNat64PrefixEvent(netId, PREFIX_OPERATION_ADDED, pref64FromDnsStr, 96));
expectNat64PrefixChange(callback, mWiFiNetworkAgent, pref64FromDns); expectNat64PrefixChange(callback, mWiFiNetworkAgent, pref64FromDns);
inOrder.verify(mMockNetd).clatdStart(iface, pref64FromDns.toString()); inOrder.verify(mMockNetd).clatdStart(iface, pref64FromDns.toString());
@@ -8147,8 +8177,8 @@ public class ConnectivityServiceTest {
inOrder.verify(mMockDnsResolver).stopPrefix64Discovery(netId); inOrder.verify(mMockDnsResolver).stopPrefix64Discovery(netId);
// Stopping prefix discovery results in a prefix removed notification. // Stopping prefix discovery results in a prefix removed notification.
mService.mNetdEventCallback.onNat64PrefixEvent(netId, false /* added */, mService.mResolverUnsolEventCallback.onNat64PrefixEvent(
pref64FromDnsStr, 96); makeNat64PrefixEvent(netId, PREFIX_OPERATION_REMOVED, pref64FromDnsStr, 96));
inOrder.verify(mMockNetd).clatdStart(iface, pref64FromRa.toString()); inOrder.verify(mMockNetd).clatdStart(iface, pref64FromRa.toString());
inOrder.verify(mMockDnsResolver).setPrefix64(netId, pref64FromRa.toString()); inOrder.verify(mMockDnsResolver).setPrefix64(netId, pref64FromRa.toString());
@@ -8186,8 +8216,8 @@ public class ConnectivityServiceTest {
inOrder.verify(mMockNetd).clatdStop(iface); inOrder.verify(mMockNetd).clatdStop(iface);
inOrder.verify(mMockDnsResolver).setPrefix64(netId, ""); inOrder.verify(mMockDnsResolver).setPrefix64(netId, "");
inOrder.verify(mMockDnsResolver).startPrefix64Discovery(netId); inOrder.verify(mMockDnsResolver).startPrefix64Discovery(netId);
mService.mNetdEventCallback.onNat64PrefixEvent(netId, true /* added */, mService.mResolverUnsolEventCallback.onNat64PrefixEvent(
pref64FromDnsStr, 96); makeNat64PrefixEvent(netId, PREFIX_OPERATION_ADDED, pref64FromDnsStr, 96));
expectNat64PrefixChange(callback, mWiFiNetworkAgent, pref64FromDns); expectNat64PrefixChange(callback, mWiFiNetworkAgent, pref64FromDns);
inOrder.verify(mMockNetd).clatdStart(iface, pref64FromDns.toString()); inOrder.verify(mMockNetd).clatdStart(iface, pref64FromDns.toString());
inOrder.verify(mMockDnsResolver, never()).setPrefix64(eq(netId), any()); inOrder.verify(mMockDnsResolver, never()).setPrefix64(eq(netId), any());

View File

@@ -22,6 +22,8 @@ import static android.net.NetworkCapabilities.MAX_TRANSPORT;
import static android.net.NetworkCapabilities.MIN_TRANSPORT; import static android.net.NetworkCapabilities.MIN_TRANSPORT;
import static android.net.NetworkCapabilities.TRANSPORT_VPN; import static android.net.NetworkCapabilities.TRANSPORT_VPN;
import static android.net.NetworkCapabilities.TRANSPORT_WIFI; import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
import static android.net.resolv.aidl.IDnsResolverUnsolicitedEventListener.VALIDATION_RESULT_FAILURE;
import static android.net.resolv.aidl.IDnsResolverUnsolicitedEventListener.VALIDATION_RESULT_SUCCESS;
import static android.provider.Settings.Global.PRIVATE_DNS_DEFAULT_MODE; import static android.provider.Settings.Global.PRIVATE_DNS_DEFAULT_MODE;
import static android.provider.Settings.Global.PRIVATE_DNS_MODE; import static android.provider.Settings.Global.PRIVATE_DNS_MODE;
import static android.provider.Settings.Global.PRIVATE_DNS_SPECIFIER; import static android.provider.Settings.Global.PRIVATE_DNS_SPECIFIER;
@@ -164,7 +166,8 @@ public class DnsManagerTest {
mDnsManager.flushVmDnsCache(); mDnsManager.flushVmDnsCache();
mDnsManager.updatePrivateDnsValidation( mDnsManager.updatePrivateDnsValidation(
new DnsManager.PrivateDnsValidationUpdate(TEST_NETID_ALTERNATE, new DnsManager.PrivateDnsValidationUpdate(TEST_NETID_ALTERNATE,
InetAddress.parseNumericAddress("4.4.4.4"), "", true)); InetAddress.parseNumericAddress("4.4.4.4"), "",
VALIDATION_RESULT_SUCCESS));
LinkProperties fixedLp = new LinkProperties(lp); LinkProperties fixedLp = new LinkProperties(lp);
mDnsManager.updatePrivateDnsStatus(TEST_NETID, fixedLp); mDnsManager.updatePrivateDnsStatus(TEST_NETID, fixedLp);
assertFalse(fixedLp.isPrivateDnsActive()); assertFalse(fixedLp.isPrivateDnsActive());
@@ -204,7 +207,8 @@ public class DnsManagerTest {
// Validate one. // Validate one.
mDnsManager.updatePrivateDnsValidation( mDnsManager.updatePrivateDnsValidation(
new DnsManager.PrivateDnsValidationUpdate(TEST_NETID, new DnsManager.PrivateDnsValidationUpdate(TEST_NETID,
InetAddress.parseNumericAddress("6.6.6.6"), "strictmode.com", true)); InetAddress.parseNumericAddress("6.6.6.6"), "strictmode.com",
VALIDATION_RESULT_SUCCESS));
fixedLp = new LinkProperties(lp); fixedLp = new LinkProperties(lp);
mDnsManager.updatePrivateDnsStatus(TEST_NETID, fixedLp); mDnsManager.updatePrivateDnsStatus(TEST_NETID, fixedLp);
assertEquals(Arrays.asList(InetAddress.parseNumericAddress("6.6.6.6")), assertEquals(Arrays.asList(InetAddress.parseNumericAddress("6.6.6.6")),
@@ -212,7 +216,8 @@ public class DnsManagerTest {
// Validate the 2nd one. // Validate the 2nd one.
mDnsManager.updatePrivateDnsValidation( mDnsManager.updatePrivateDnsValidation(
new DnsManager.PrivateDnsValidationUpdate(TEST_NETID, new DnsManager.PrivateDnsValidationUpdate(TEST_NETID,
InetAddress.parseNumericAddress("2001:db8:66:66::1"), "strictmode.com", true)); InetAddress.parseNumericAddress("2001:db8:66:66::1"), "strictmode.com",
VALIDATION_RESULT_SUCCESS));
fixedLp = new LinkProperties(lp); fixedLp = new LinkProperties(lp);
mDnsManager.updatePrivateDnsStatus(TEST_NETID, fixedLp); mDnsManager.updatePrivateDnsStatus(TEST_NETID, fixedLp);
assertEquals(Arrays.asList( assertEquals(Arrays.asList(
@@ -232,7 +237,8 @@ public class DnsManagerTest {
mDnsManager.flushVmDnsCache(); mDnsManager.flushVmDnsCache();
mDnsManager.updatePrivateDnsValidation( mDnsManager.updatePrivateDnsValidation(
new DnsManager.PrivateDnsValidationUpdate(TEST_NETID, new DnsManager.PrivateDnsValidationUpdate(TEST_NETID,
InetAddress.parseNumericAddress("3.3.3.3"), "", true)); InetAddress.parseNumericAddress("3.3.3.3"), "",
VALIDATION_RESULT_SUCCESS));
mDnsManager.updatePrivateDnsStatus(TEST_NETID, lp); mDnsManager.updatePrivateDnsStatus(TEST_NETID, lp);
assertFalse(lp.isPrivateDnsActive()); assertFalse(lp.isPrivateDnsActive());
assertNull(lp.getPrivateDnsServerName()); assertNull(lp.getPrivateDnsServerName());
@@ -245,7 +251,8 @@ public class DnsManagerTest {
mDnsManager.flushVmDnsCache(); mDnsManager.flushVmDnsCache();
mDnsManager.updatePrivateDnsValidation( mDnsManager.updatePrivateDnsValidation(
new DnsManager.PrivateDnsValidationUpdate(TEST_NETID_UNTRACKED, new DnsManager.PrivateDnsValidationUpdate(TEST_NETID_UNTRACKED,
InetAddress.parseNumericAddress("3.3.3.3"), "", true)); InetAddress.parseNumericAddress("3.3.3.3"), "",
VALIDATION_RESULT_SUCCESS));
mDnsManager.updatePrivateDnsStatus(TEST_NETID, lp); mDnsManager.updatePrivateDnsStatus(TEST_NETID, lp);
assertFalse(lp.isPrivateDnsActive()); assertFalse(lp.isPrivateDnsActive());
assertNull(lp.getPrivateDnsServerName()); assertNull(lp.getPrivateDnsServerName());
@@ -253,7 +260,8 @@ public class DnsManagerTest {
// Validation event has untracked ipAddress // Validation event has untracked ipAddress
mDnsManager.updatePrivateDnsValidation( mDnsManager.updatePrivateDnsValidation(
new DnsManager.PrivateDnsValidationUpdate(TEST_NETID, new DnsManager.PrivateDnsValidationUpdate(TEST_NETID,
InetAddress.parseNumericAddress("4.4.4.4"), "", true)); InetAddress.parseNumericAddress("4.4.4.4"), "",
VALIDATION_RESULT_SUCCESS));
mDnsManager.updatePrivateDnsStatus(TEST_NETID, lp); mDnsManager.updatePrivateDnsStatus(TEST_NETID, lp);
assertFalse(lp.isPrivateDnsActive()); assertFalse(lp.isPrivateDnsActive());
assertNull(lp.getPrivateDnsServerName()); assertNull(lp.getPrivateDnsServerName());
@@ -261,8 +269,8 @@ public class DnsManagerTest {
// Validation event has untracked hostname // Validation event has untracked hostname
mDnsManager.updatePrivateDnsValidation( mDnsManager.updatePrivateDnsValidation(
new DnsManager.PrivateDnsValidationUpdate(TEST_NETID, new DnsManager.PrivateDnsValidationUpdate(TEST_NETID,
InetAddress.parseNumericAddress("3.3.3.3"), "hostname", InetAddress.parseNumericAddress("3.3.3.3"), "hostname",
true)); VALIDATION_RESULT_SUCCESS));
mDnsManager.updatePrivateDnsStatus(TEST_NETID, lp); mDnsManager.updatePrivateDnsStatus(TEST_NETID, lp);
assertFalse(lp.isPrivateDnsActive()); assertFalse(lp.isPrivateDnsActive());
assertNull(lp.getPrivateDnsServerName()); assertNull(lp.getPrivateDnsServerName());
@@ -270,7 +278,8 @@ public class DnsManagerTest {
// Validation event failed // Validation event failed
mDnsManager.updatePrivateDnsValidation( mDnsManager.updatePrivateDnsValidation(
new DnsManager.PrivateDnsValidationUpdate(TEST_NETID, new DnsManager.PrivateDnsValidationUpdate(TEST_NETID,
InetAddress.parseNumericAddress("3.3.3.3"), "", false)); InetAddress.parseNumericAddress("3.3.3.3"), "",
VALIDATION_RESULT_FAILURE));
mDnsManager.updatePrivateDnsStatus(TEST_NETID, lp); mDnsManager.updatePrivateDnsStatus(TEST_NETID, lp);
assertFalse(lp.isPrivateDnsActive()); assertFalse(lp.isPrivateDnsActive());
assertNull(lp.getPrivateDnsServerName()); assertNull(lp.getPrivateDnsServerName());
@@ -279,7 +288,7 @@ public class DnsManagerTest {
mDnsManager.removeNetwork(new Network(TEST_NETID)); mDnsManager.removeNetwork(new Network(TEST_NETID));
mDnsManager.updatePrivateDnsValidation( mDnsManager.updatePrivateDnsValidation(
new DnsManager.PrivateDnsValidationUpdate(TEST_NETID, new DnsManager.PrivateDnsValidationUpdate(TEST_NETID,
InetAddress.parseNumericAddress("3.3.3.3"), "", true)); InetAddress.parseNumericAddress("3.3.3.3"), "", VALIDATION_RESULT_SUCCESS));
mDnsManager.updatePrivateDnsStatus(TEST_NETID, lp); mDnsManager.updatePrivateDnsStatus(TEST_NETID, lp);
assertFalse(lp.isPrivateDnsActive()); assertFalse(lp.isPrivateDnsActive());
assertNull(lp.getPrivateDnsServerName()); assertNull(lp.getPrivateDnsServerName());
@@ -293,7 +302,8 @@ public class DnsManagerTest {
mDnsManager.flushVmDnsCache(); mDnsManager.flushVmDnsCache();
mDnsManager.updatePrivateDnsValidation( mDnsManager.updatePrivateDnsValidation(
new DnsManager.PrivateDnsValidationUpdate(TEST_NETID, new DnsManager.PrivateDnsValidationUpdate(TEST_NETID,
InetAddress.parseNumericAddress("3.3.3.3"), "", true)); InetAddress.parseNumericAddress("3.3.3.3"), "",
VALIDATION_RESULT_SUCCESS));
mDnsManager.updatePrivateDnsStatus(TEST_NETID, lp); mDnsManager.updatePrivateDnsStatus(TEST_NETID, lp);
assertFalse(lp.isPrivateDnsActive()); assertFalse(lp.isPrivateDnsActive());
assertNull(lp.getPrivateDnsServerName()); assertNull(lp.getPrivateDnsServerName());
@@ -398,7 +408,8 @@ public class DnsManagerTest {
mDnsManager.updatePrivateDns(network, mDnsManager.getPrivateDnsConfig()); mDnsManager.updatePrivateDns(network, mDnsManager.getPrivateDnsConfig());
mDnsManager.noteDnsServersForNetwork(TEST_NETID, lp); mDnsManager.noteDnsServersForNetwork(TEST_NETID, lp);
mDnsManager.updatePrivateDnsValidation( mDnsManager.updatePrivateDnsValidation(
new DnsManager.PrivateDnsValidationUpdate(TEST_NETID, dnsAddr, "", true)); new DnsManager.PrivateDnsValidationUpdate(TEST_NETID, dnsAddr, "",
VALIDATION_RESULT_SUCCESS));
mDnsManager.updatePrivateDnsStatus(TEST_NETID, lp); mDnsManager.updatePrivateDnsStatus(TEST_NETID, lp);
privateDnsCfg = mDnsManager.getPrivateDnsConfig(network); privateDnsCfg = mDnsManager.getPrivateDnsConfig(network);
assertTrue(privateDnsCfg.useTls); assertTrue(privateDnsCfg.useTls);