From 8539129ad9043ed1ee863a1de36179f6f81e523d Mon Sep 17 00:00:00 2001 From: Remi NGUYEN VAN Date: Thu, 27 Dec 2018 16:43:56 +0900 Subject: [PATCH] Move NetworkMonitor to NetworkStack Bug: b/112869080 Test: atest FrameworksNetTests NetworkStackTests Change-Id: I1b8b6a3f4390adbabf92fb9e48da61c47b08b2ec --- .../java/android/net/ConnectivityManager.java | 10 + .../android/net/IConnectivityManager.aidl | 2 + .../android/server/ConnectivityService.java | 269 +++++++++++++----- .../server/connectivity/DnsManager.java | 48 +--- .../server/connectivity/NetworkAgentInfo.java | 30 +- .../server/ConnectivityServiceTest.java | 197 +++++++------ .../server/connectivity/DnsManagerTest.java | 19 +- .../connectivity/LingerMonitorTest.java | 15 +- 8 files changed, 366 insertions(+), 224 deletions(-) diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index 436b4a15e7..abc00feeb2 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -2051,6 +2051,16 @@ public class ConnectivityManager { return (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); } + /** @hide */ + public NetworkRequest getDefaultRequest() { + try { + // This is not racy as the default request is final in ConnectivityService. + return mService.getDefaultRequest(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + /* TODO: These permissions checks don't belong in client-side code. Move them to * services.jar, possibly in com.android.server.net. */ diff --git a/core/java/android/net/IConnectivityManager.aidl b/core/java/android/net/IConnectivityManager.aidl index e7d441df82..da5d96e49d 100644 --- a/core/java/android/net/IConnectivityManager.aidl +++ b/core/java/android/net/IConnectivityManager.aidl @@ -167,6 +167,8 @@ interface IConnectivityManager int getMultipathPreference(in Network Network); + NetworkRequest getDefaultRequest(); + int getRestoreDefaultNetworkDelay(int networkType); boolean addVpnAddress(String address, int prefixLength); diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 66ceae432c..d0666b98c0 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -25,6 +25,7 @@ import static android.net.ConnectivityManager.TYPE_NONE; import static android.net.ConnectivityManager.TYPE_VPN; import static android.net.ConnectivityManager.getNetworkTypeName; import static android.net.ConnectivityManager.isNetworkTypeValid; +import static android.net.INetworkMonitor.NETWORK_TEST_RESULT_VALID; import static android.net.NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL; import static android.net.NetworkCapabilities.NET_CAPABILITY_FOREGROUND; import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET; @@ -37,6 +38,8 @@ import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED; import static android.net.NetworkCapabilities.TRANSPORT_VPN; import static android.net.NetworkPolicyManager.RULE_NONE; import static android.net.NetworkPolicyManager.uidRulesToString; +import static android.net.NetworkStack.NETWORKSTACK_PACKAGE_NAME; +import static android.net.shared.NetworkMonitorUtils.isValidationRequired; import static android.os.Process.INVALID_UID; import static android.system.OsConstants.IPPROTO_TCP; import static android.system.OsConstants.IPPROTO_UDP; @@ -62,6 +65,8 @@ import android.net.IIpConnectivityMetrics; import android.net.INetd; import android.net.INetdEventCallback; import android.net.INetworkManagementEventObserver; +import android.net.INetworkMonitor; +import android.net.INetworkMonitorCallbacks; import android.net.INetworkPolicyListener; import android.net.INetworkPolicyManager; import android.net.INetworkStatsService; @@ -79,9 +84,11 @@ import android.net.NetworkPolicyManager; import android.net.NetworkQuotaInfo; import android.net.NetworkRequest; import android.net.NetworkSpecifier; +import android.net.NetworkStack; import android.net.NetworkState; import android.net.NetworkUtils; import android.net.NetworkWatchlistManager; +import android.net.PrivateDnsConfigParcel; import android.net.ProxyInfo; import android.net.RouteInfo; import android.net.UidRange; @@ -90,12 +97,13 @@ import android.net.VpnService; import android.net.metrics.IpConnectivityLog; import android.net.metrics.NetworkEvent; import android.net.netlink.InetDiagMessage; +import android.net.shared.NetworkMonitorUtils; +import android.net.shared.PrivateDnsConfig; import android.net.util.MultinetworkPolicyTracker; import android.net.util.NetdService; import android.os.Binder; import android.os.Build; import android.os.Bundle; -import android.os.FileUtils; import android.os.Handler; import android.os.HandlerThread; import android.os.IBinder; @@ -123,8 +131,8 @@ import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.ArraySet; import android.util.LocalLog; -import android.util.LocalLog.ReadOnlyLocalLog; import android.util.Log; +import android.util.Pair; import android.util.Slog; import android.util.SparseArray; import android.util.SparseBooleanArray; @@ -149,7 +157,6 @@ import com.android.internal.util.XmlUtils; import com.android.server.am.BatteryStatsService; import com.android.server.connectivity.DataConnectionStats; import com.android.server.connectivity.DnsManager; -import com.android.server.connectivity.DnsManager.PrivateDnsConfig; import com.android.server.connectivity.DnsManager.PrivateDnsValidationUpdate; import com.android.server.connectivity.IpConnectivityMetrics; import com.android.server.connectivity.KeepaliveTracker; @@ -158,7 +165,6 @@ import com.android.server.connectivity.MockableSystemProperties; import com.android.server.connectivity.MultipathPolicyTracker; import com.android.server.connectivity.NetworkAgentInfo; import com.android.server.connectivity.NetworkDiagnostics; -import com.android.server.connectivity.NetworkMonitor; import com.android.server.connectivity.NetworkNotificationManager; import com.android.server.connectivity.NetworkNotificationManager.NotificationType; import com.android.server.connectivity.PermissionMonitor; @@ -186,7 +192,6 @@ import java.io.PrintWriter; import java.net.Inet4Address; import java.net.InetAddress; import java.net.UnknownHostException; -import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -442,6 +447,43 @@ public class ConnectivityService extends IConnectivityManager.Stub */ private static final int EVENT_DATA_SAVER_CHANGED = 40; + /** + * Event for NetworkMonitor/NetworkAgentInfo to inform ConnectivityService that the network has + * been tested. + * obj = String representing URL that Internet probe was redirect to, if it was redirected. + * arg1 = One of the NETWORK_TESTED_RESULT_* constants. + * arg2 = NetID. + */ + public static final int EVENT_NETWORK_TESTED = 41; + + /** + * Event for NetworkMonitor/NetworkAgentInfo to inform ConnectivityService that the private DNS + * config was resolved. + * obj = PrivateDnsConfig + * arg2 = netid + */ + public static final int EVENT_PRIVATE_DNS_CONFIG_RESOLVED = 42; + + /** + * Request ConnectivityService display provisioning notification. + * arg1 = Whether to make the notification visible. + * arg2 = NetID. + * obj = Intent to be launched when notification selected by user, null if !arg1. + */ + public static final int EVENT_PROVISIONING_NOTIFICATION = 43; + + /** + * Argument for {@link #EVENT_PROVISIONING_NOTIFICATION} to indicate that the notification + * should be shown. + */ + public static final int PROVISIONING_NOTIFICATION_SHOW = 1; + + /** + * Argument for {@link #EVENT_PROVISIONING_NOTIFICATION} to indicate that the notification + * should be hidden. + */ + public static final int PROVISIONING_NOTIFICATION_HIDE = 0; + private static String eventName(int what) { return sMagicDecoderRing.get(what, Integer.toString(what)); } @@ -506,30 +548,6 @@ public class ConnectivityService extends IConnectivityManager.Stub private long mMaxWakelockDurationMs = 0; private long mLastWakeLockAcquireTimestamp = 0; - // Array of tracking network validation and results - private static final int MAX_VALIDATION_LOGS = 10; - private static class ValidationLog { - final Network mNetwork; - final String mName; - final ReadOnlyLocalLog mLog; - - ValidationLog(Network network, String name, ReadOnlyLocalLog log) { - mNetwork = network; - mName = name; - mLog = log; - } - } - private final ArrayDeque mValidationLogs = new ArrayDeque<>(MAX_VALIDATION_LOGS); - - private void addValidationLogs(ReadOnlyLocalLog log, Network network, String name) { - synchronized (mValidationLogs) { - while (mValidationLogs.size() >= MAX_VALIDATION_LOGS) { - mValidationLogs.removeLast(); - } - mValidationLogs.addFirst(new ValidationLog(network, name, log)); - } - } - private final IpConnectivityLog mMetricsLog; @GuardedBy("mBandwidthRequests") @@ -1684,7 +1702,11 @@ public class ConnectivityService extends IConnectivityManager.Stub // caller type. Need to re-factor NetdEventListenerService to allow multiple // NetworkMonitor registrants. if (nai != null && nai.satisfies(mDefaultRequest)) { - nai.networkMonitor.sendMessage(NetworkMonitor.EVENT_DNS_NOTIFICATION, returnCode); + try { + nai.networkMonitor().notifyDnsResponse(returnCode); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } } } }; @@ -2265,17 +2287,6 @@ public class ConnectivityService extends IConnectivityManager.Stub mMultipathPolicyTracker.dump(pw); if (ArrayUtils.contains(args, SHORT_ARG) == false) { - pw.println(); - synchronized (mValidationLogs) { - pw.println("mValidationLogs (most recent first):"); - for (ValidationLog p : mValidationLogs) { - pw.println(p.mNetwork + " - " + p.mName); - pw.increaseIndent(); - p.mLog.dump(fd, pw, args); - pw.decreaseIndent(); - } - } - pw.println(); pw.println("mNetworkRequestInfoLogs (most recent first):"); pw.increaseIndent(); @@ -2455,11 +2466,11 @@ public class ConnectivityService extends IConnectivityManager.Stub switch (msg.what) { default: return false; - case NetworkMonitor.EVENT_NETWORK_TESTED: { + case EVENT_NETWORK_TESTED: { final NetworkAgentInfo nai = getNetworkAgentInfoForNetId(msg.arg2); if (nai == null) break; - final boolean valid = (msg.arg1 == NetworkMonitor.NETWORK_TEST_RESULT_VALID); + final boolean valid = (msg.arg1 == NETWORK_TEST_RESULT_VALID); final boolean wasValidated = nai.lastValidated; final boolean wasDefault = isDefaultNetwork(nai); @@ -2497,7 +2508,7 @@ public class ConnectivityService extends IConnectivityManager.Stub } break; } - case NetworkMonitor.EVENT_PROVISIONING_NOTIFICATION: { + case EVENT_PROVISIONING_NOTIFICATION: { final int netId = msg.arg2; final boolean visible = toBool(msg.arg1); final NetworkAgentInfo nai = getNetworkAgentInfoForNetId(netId); @@ -2530,7 +2541,7 @@ public class ConnectivityService extends IConnectivityManager.Stub } break; } - case NetworkMonitor.EVENT_PRIVATE_DNS_CONFIG_RESOLVED: { + case EVENT_PRIVATE_DNS_CONFIG_RESOLVED: { final NetworkAgentInfo nai = getNetworkAgentInfoForNetId(msg.arg2); if (nai == null) break; @@ -2572,8 +2583,61 @@ public class ConnectivityService extends IConnectivityManager.Stub } } + private class NetworkMonitorCallbacks extends INetworkMonitorCallbacks.Stub { + private final NetworkAgentInfo mNai; + + private NetworkMonitorCallbacks(NetworkAgentInfo nai) { + mNai = nai; + } + + @Override + public void onNetworkMonitorCreated(INetworkMonitor networkMonitor) { + mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_AGENT, + new Pair<>(mNai, networkMonitor))); + } + + @Override + public void notifyNetworkTested(int testResult, @Nullable String redirectUrl) { + mTrackerHandler.sendMessage(mTrackerHandler.obtainMessage(EVENT_NETWORK_TESTED, + testResult, mNai.network.netId, redirectUrl)); + } + + @Override + public void notifyPrivateDnsConfigResolved(PrivateDnsConfigParcel config) { + mTrackerHandler.sendMessage(mTrackerHandler.obtainMessage( + EVENT_PRIVATE_DNS_CONFIG_RESOLVED, + 0, mNai.network.netId, PrivateDnsConfig.fromParcel(config))); + } + + @Override + public void showProvisioningNotification(String action) { + final Intent intent = new Intent(action); + intent.setPackage(NETWORKSTACK_PACKAGE_NAME); + + final PendingIntent pendingIntent; + // Only the system server can register notifications with package "android" + final long token = Binder.clearCallingIdentity(); + try { + pendingIntent = PendingIntent.getBroadcast(mContext, 0, intent, 0); + } finally { + Binder.restoreCallingIdentity(token); + } + mTrackerHandler.sendMessage(mTrackerHandler.obtainMessage( + EVENT_PROVISIONING_NOTIFICATION, PROVISIONING_NOTIFICATION_SHOW, + mNai.network.netId, + pendingIntent)); + } + + @Override + public void hideProvisioningNotification() { + mTrackerHandler.sendMessage(mTrackerHandler.obtainMessage( + EVENT_PROVISIONING_NOTIFICATION, PROVISIONING_NOTIFICATION_HIDE, + mNai.network.netId)); + } + } + private boolean networkRequiresValidation(NetworkAgentInfo nai) { - return NetworkMonitor.isValidationRequired( + return isValidationRequired( mDefaultRequest.networkCapabilities, nai.networkCapabilities); } @@ -2603,10 +2667,14 @@ public class ConnectivityService extends IConnectivityManager.Stub // Internet access and therefore also require validation. if (!networkRequiresValidation(nai)) return; - // Notify the NetworkMonitor thread in case it needs to cancel or + // Notify the NetworkAgentInfo/NetworkMonitor in case NetworkMonitor needs to cancel or // schedule DNS resolutions. If a DNS resolution is required the // result will be sent back to us. - nai.networkMonitor.notifyPrivateDnsSettingsChanged(cfg); + try { + nai.networkMonitor().notifyPrivateDnsChanged(cfg.toParcel()); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } // With Private DNS bypass support, we can proceed to update the // Private DNS config immediately, even if we're in strict mode @@ -2736,7 +2804,11 @@ public class ConnectivityService extends IConnectivityManager.Stub // Disable wakeup packet monitoring for each interface. wakeupModifyInterface(iface, nai.networkCapabilities, false); } - nai.networkMonitor.sendMessage(NetworkMonitor.CMD_NETWORK_DISCONNECTED); + try { + nai.networkMonitor().notifyNetworkDisconnected(); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } mNetworkAgentInfos.remove(nai.messenger); nai.maybeStopClat(); synchronized (mNetworkForNetId) { @@ -3096,7 +3168,11 @@ public class ConnectivityService extends IConnectivityManager.Stub NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(network); if (nai == null) return; if (!nai.networkCapabilities.hasCapability(NET_CAPABILITY_CAPTIVE_PORTAL)) return; - nai.networkMonitor.sendMessage(NetworkMonitor.CMD_LAUNCH_CAPTIVE_PORTAL_APP); + try { + nai.networkMonitor().launchCaptivePortalApp(); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } }); } @@ -3217,6 +3293,11 @@ public class ConnectivityService extends IConnectivityManager.Stub return mMultinetworkPolicyTracker.getMeteredMultipathPreference(); } + @Override + public NetworkRequest getDefaultRequest() { + return mDefaultRequest; + } + private class InternalHandler extends Handler { public InternalHandler(Looper looper) { super(looper); @@ -3247,7 +3328,9 @@ public class ConnectivityService extends IConnectivityManager.Stub break; } case EVENT_REGISTER_NETWORK_AGENT: { - handleRegisterNetworkAgent((NetworkAgentInfo)msg.obj); + final Pair arg = + (Pair) msg.obj; + handleRegisterNetworkAgent(arg.first, arg.second); break; } case EVENT_REGISTER_NETWORK_REQUEST: @@ -3305,7 +3388,14 @@ public class ConnectivityService extends IConnectivityManager.Stub } case EVENT_SYSTEM_READY: { for (NetworkAgentInfo nai : mNetworkAgentInfos.values()) { - nai.networkMonitor.systemReady = true; + // Might have been called already in handleRegisterNetworkAgent since + // mSystemReady is set before sending EVENT_SYSTEM_READY, but calling + // this several times is fine. + try { + nai.networkMonitor().notifySystemReady(); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } } mMultipathPolicyTracker.start(); break; @@ -3577,7 +3667,11 @@ public class ConnectivityService extends IConnectivityManager.Stub if (isNetworkWithLinkPropertiesBlocked(lp, uid, false)) { return; } - nai.networkMonitor.forceReevaluation(uid); + try { + nai.networkMonitor().forceReevaluation(uid); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } } @Override @@ -4785,27 +4879,49 @@ public class ConnectivityService extends IConnectivityManager.Stub final NetworkCapabilities nc = new NetworkCapabilities(networkCapabilities); final NetworkAgentInfo nai = new NetworkAgentInfo(messenger, new AsyncChannel(), new Network(reserveNetId()), new NetworkInfo(networkInfo), lp, nc, currentScore, - mContext, mTrackerHandler, new NetworkMisc(networkMisc), mDefaultRequest, this); + mContext, mTrackerHandler, new NetworkMisc(networkMisc), this); // Make sure the network capabilities reflect what the agent info says. nai.networkCapabilities = mixInCapabilities(nai, nc); - synchronized (this) { - nai.networkMonitor.systemReady = mSystemReady; - } final String extraInfo = networkInfo.getExtraInfo(); final String name = TextUtils.isEmpty(extraInfo) ? nai.networkCapabilities.getSSID() : extraInfo; - addValidationLogs(nai.networkMonitor.getValidationLogs(), nai.network, name); if (DBG) log("registerNetworkAgent " + nai); - mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_AGENT, nai)); + final long token = Binder.clearCallingIdentity(); + try { + mContext.getSystemService(NetworkStack.class) + .makeNetworkMonitor(nai.network, name, new NetworkMonitorCallbacks(nai)); + } finally { + Binder.restoreCallingIdentity(token); + } + // NetworkAgentInfo registration will finish when the NetworkMonitor is created. + // If the network disconnects or sends any other event before that, messages are deferred by + // NetworkAgent until nai.asyncChannel.connect(), which will be called when finalizing the + // registration. return nai.network.netId; } - private void handleRegisterNetworkAgent(NetworkAgentInfo nai) { + private void handleRegisterNetworkAgent(NetworkAgentInfo nai, INetworkMonitor networkMonitor) { + nai.onNetworkMonitorCreated(networkMonitor); if (VDBG) log("Got NetworkAgent Messenger"); mNetworkAgentInfos.put(nai.messenger, nai); synchronized (mNetworkForNetId) { mNetworkForNetId.put(nai.network.netId, nai); } + synchronized (this) { + if (mSystemReady) { + try { + networkMonitor.notifySystemReady(); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } + } + } + + try { + networkMonitor.start(); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } nai.asyncChannel.connect(mContext, mTrackerHandler, nai.messenger); NetworkInfo networkInfo = nai.networkInfo; nai.networkInfo = null; @@ -4855,6 +4971,11 @@ public class ConnectivityService extends IConnectivityManager.Stub networkAgent.updateClat(mNMS); notifyIfacesChangedForNetworkStats(); if (networkAgent.everConnected) { + try { + networkAgent.networkMonitor().notifyLinkPropertiesChanged(); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } notifyNetworkCallbacks(networkAgent, ConnectivityManager.CALLBACK_IP_CHANGED); } } @@ -5092,6 +5213,11 @@ public class ConnectivityService extends IConnectivityManager.Stub // If the requestable capabilities have changed or the score changed, we can't have been // called by rematchNetworkAndRequests, so it's safe to start a rematch. rematchAllNetworksAndRequests(nai, oldScore); + try { + nai.networkMonitor().notifyNetworkCapabilitiesChanged(); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } notifyNetworkCallbacks(nai, ConnectivityManager.CALLBACK_CAP_CHANGED); } @@ -5339,6 +5465,11 @@ public class ConnectivityService extends IConnectivityManager.Stub } if (capabilitiesChanged) { + try { + nai.networkMonitor().notifyNetworkCapabilitiesChanged(); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } notifyNetworkCallbacks(nai, ConnectivityManager.CALLBACK_CAP_CHANGED); } @@ -5739,7 +5870,15 @@ public class ConnectivityService extends IConnectivityManager.Stub updateLinkProperties(networkAgent, new LinkProperties(networkAgent.linkProperties), null); - networkAgent.networkMonitor.sendMessage(NetworkMonitor.CMD_NETWORK_CONNECTED); + // Until parceled LinkProperties are sent directly to NetworkMonitor, the connect + // command must be sent after updating LinkProperties to maximize chances of + // NetworkMonitor seeing the correct LinkProperties when starting. + // TODO: pass LinkProperties to the NetworkMonitor in the notifyNetworkConnected call. + try { + networkAgent.networkMonitor().notifyNetworkConnected(); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } scheduleUnvalidatedPrompt(networkAgent); if (networkAgent.isVPN()) { @@ -6020,7 +6159,7 @@ public class ConnectivityService extends IConnectivityManager.Stub @Override public String getCaptivePortalServerUrl() { enforceConnectivityInternalPermission(); - return NetworkMonitor.getCaptivePortalServerHttpUrl(mContext); + return NetworkMonitorUtils.getCaptivePortalServerHttpUrl(mContext); } @Override @@ -6112,12 +6251,6 @@ public class ConnectivityService extends IConnectivityManager.Stub return nwm.getWatchlistConfigHash(); } - @VisibleForTesting - public NetworkMonitor createNetworkMonitor(Context context, Handler handler, - NetworkAgentInfo nai, NetworkRequest defaultRequest) { - return new NetworkMonitor(context, handler, nai, defaultRequest); - } - @VisibleForTesting MultinetworkPolicyTracker createMultinetworkPolicyTracker(Context c, Handler h, Runnable r) { return new MultinetworkPolicyTracker(c, h, r); diff --git a/services/core/java/com/android/server/connectivity/DnsManager.java b/services/core/java/com/android/server/connectivity/DnsManager.java index b8f057db29..d8bb635f2c 100644 --- a/services/core/java/com/android/server/connectivity/DnsManager.java +++ b/services/core/java/com/android/server/connectivity/DnsManager.java @@ -18,10 +18,9 @@ package com.android.server.connectivity; 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_OPPORTUNISTIC; import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME; -import static android.provider.Settings.Global.DNS_RESOLVER_MIN_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_SAMPLE_VALIDITY_SECONDS; import static android.provider.Settings.Global.DNS_RESOLVER_SUCCESS_THRESHOLD_PERCENT; import static android.provider.Settings.Global.PRIVATE_DNS_DEFAULT_MODE; @@ -35,6 +34,7 @@ import android.net.LinkProperties; import android.net.Network; import android.net.NetworkUtils; import android.net.Uri; +import android.net.shared.PrivateDnsConfig; import android.os.Binder; import android.os.INetworkManagementService; import android.os.UserHandle; @@ -43,10 +43,7 @@ import android.text.TextUtils; import android.util.Pair; import android.util.Slog; -import com.android.server.connectivity.MockableSystemProperties; - import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.Arrays; import java.util.Collection; import java.util.Collections; @@ -54,10 +51,8 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map; -import java.util.Objects; -import java.util.stream.Collectors; import java.util.Set; -import java.util.StringJoiner; +import java.util.stream.Collectors; /** @@ -123,43 +118,6 @@ public class DnsManager { private static final int DNS_RESOLVER_DEFAULT_MIN_SAMPLES = 8; private static final int DNS_RESOLVER_DEFAULT_MAX_SAMPLES = 64; - public static class PrivateDnsConfig { - public final boolean useTls; - public final String hostname; - public final InetAddress[] ips; - - public PrivateDnsConfig() { - this(false); - } - - public PrivateDnsConfig(boolean useTls) { - this.useTls = useTls; - this.hostname = ""; - this.ips = new InetAddress[0]; - } - - public PrivateDnsConfig(String hostname, InetAddress[] ips) { - this.useTls = !TextUtils.isEmpty(hostname); - this.hostname = useTls ? hostname : ""; - this.ips = (ips != null) ? ips : new InetAddress[0]; - } - - public PrivateDnsConfig(PrivateDnsConfig cfg) { - useTls = cfg.useTls; - hostname = cfg.hostname; - ips = cfg.ips; - } - - public boolean inStrictMode() { - return useTls && !TextUtils.isEmpty(hostname); - } - - public String toString() { - return PrivateDnsConfig.class.getSimpleName() + - "{" + useTls + ":" + hostname + "/" + Arrays.toString(ips) + "}"; - } - } - public static PrivateDnsConfig getPrivateDnsConfig(ContentResolver cr) { final String mode = getPrivateDnsMode(cr); diff --git a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java index 262184b0b1..54c89aa041 100644 --- a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java +++ b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java @@ -16,9 +16,8 @@ package com.android.server.connectivity; -import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED; - import android.content.Context; +import android.net.INetworkMonitor; import android.net.LinkProperties; import android.net.Network; import android.net.NetworkCapabilities; @@ -29,7 +28,6 @@ import android.net.NetworkState; import android.os.Handler; import android.os.INetworkManagementService; import android.os.Messenger; -import android.os.RemoteException; import android.os.SystemClock; import android.util.Log; import android.util.SparseArray; @@ -37,11 +35,8 @@ import android.util.SparseArray; import com.android.internal.util.AsyncChannel; import com.android.internal.util.WakeupMessage; import com.android.server.ConnectivityService; -import com.android.server.connectivity.NetworkMonitor; import java.io.PrintWriter; -import java.util.ArrayList; -import java.util.Comparator; import java.util.Objects; import java.util.SortedSet; import java.util.TreeSet; @@ -126,7 +121,6 @@ public class NetworkAgentInfo implements Comparable { public LinkProperties linkProperties; // This should only be modified via ConnectivityService.updateCapabilities(). public NetworkCapabilities networkCapabilities; - public final NetworkMonitor networkMonitor; public final NetworkMisc networkMisc; // Indicates if netd has been told to create this Network. From this point on the appropriate // routing rules are setup and routes are added so packets can begin flowing over the Network. @@ -239,6 +233,9 @@ public class NetworkAgentInfo implements Comparable { // Used by ConnectivityService to keep track of 464xlat. public Nat464Xlat clatd; + // Set after asynchronous creation of the NetworkMonitor. + private volatile INetworkMonitor mNetworkMonitor; + private static final String TAG = ConnectivityService.class.getSimpleName(); private static final boolean VDBG = false; private final ConnectivityService mConnService; @@ -247,7 +244,7 @@ public class NetworkAgentInfo implements Comparable { public NetworkAgentInfo(Messenger messenger, AsyncChannel ac, Network net, NetworkInfo info, LinkProperties lp, NetworkCapabilities nc, int score, Context context, Handler handler, - NetworkMisc misc, NetworkRequest defaultRequest, ConnectivityService connService) { + NetworkMisc misc, ConnectivityService connService) { this.messenger = messenger; asyncChannel = ac; network = net; @@ -258,10 +255,16 @@ public class NetworkAgentInfo implements Comparable { mConnService = connService; mContext = context; mHandler = handler; - networkMonitor = mConnService.createNetworkMonitor(context, handler, this, defaultRequest); networkMisc = misc; } + /** + * Inform NetworkAgentInfo that a new NetworkMonitor was created. + */ + public void onNetworkMonitorCreated(INetworkMonitor networkMonitor) { + mNetworkMonitor = networkMonitor; + } + public ConnectivityService connService() { return mConnService; } @@ -278,6 +281,15 @@ public class NetworkAgentInfo implements Comparable { return network; } + /** + * Get the INetworkMonitor in this NetworkAgentInfo. + * + *

This will be null before {@link #onNetworkMonitorCreated(INetworkMonitor)} is called. + */ + public INetworkMonitor networkMonitor() { + return mNetworkMonitor; + } + // Functions for manipulating the requests satisfied by this network. // // These functions must only called on ConnectivityService's main thread. diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 71529fdffd..bf3964416e 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -26,6 +26,8 @@ import static android.net.ConnectivityManager.TYPE_MOBILE_FOTA; import static android.net.ConnectivityManager.TYPE_MOBILE_MMS; import static android.net.ConnectivityManager.TYPE_NONE; import static android.net.ConnectivityManager.TYPE_WIFI; +import static android.net.INetworkMonitor.NETWORK_TEST_RESULT_INVALID; +import static android.net.INetworkMonitor.NETWORK_TEST_RESULT_VALID; import static android.net.NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL; import static android.net.NetworkCapabilities.NET_CAPABILITY_CBS; import static android.net.NetworkCapabilities.NET_CAPABILITY_DUN; @@ -69,17 +71,19 @@ import static org.junit.Assert.fail; import static org.mockito.Matchers.anyInt; import static org.mockito.Mockito.any; import static org.mockito.Mockito.atLeastOnce; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.timeout; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; - import android.app.NotificationManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; @@ -89,7 +93,6 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.res.Resources; -import android.net.CaptivePortal; import android.net.ConnectivityManager; import android.net.ConnectivityManager.NetworkCallback; import android.net.ConnectivityManager.PacketKeepalive; @@ -97,6 +100,8 @@ import android.net.ConnectivityManager.PacketKeepaliveCallback; import android.net.ConnectivityManager.TooManyRequestsException; import android.net.ConnectivityThread; import android.net.INetd; +import android.net.INetworkMonitor; +import android.net.INetworkMonitorCallbacks; import android.net.INetworkPolicyListener; import android.net.INetworkPolicyManager; import android.net.INetworkStatsService; @@ -114,12 +119,14 @@ import android.net.NetworkInfo.DetailedState; import android.net.NetworkMisc; import android.net.NetworkRequest; import android.net.NetworkSpecifier; +import android.net.NetworkStack; import android.net.NetworkUtils; import android.net.RouteInfo; import android.net.StringNetworkSpecifier; import android.net.UidRange; -import android.net.captiveportal.CaptivePortalProbeResult; import android.net.metrics.IpConnectivityLog; +import android.net.shared.NetworkMonitorUtils; +import android.net.shared.PrivateDnsConfig; import android.net.util.MultinetworkPolicyTracker; import android.os.ConditionVariable; import android.os.Handler; @@ -148,12 +155,9 @@ import com.android.internal.util.test.BroadcastInterceptingContext; import com.android.internal.util.test.FakeSettingsProvider; import com.android.server.connectivity.ConnectivityConstants; import com.android.server.connectivity.DefaultNetworkMetrics; -import com.android.server.connectivity.DnsManager; import com.android.server.connectivity.IpConnectivityMetrics; import com.android.server.connectivity.MockableSystemProperties; import com.android.server.connectivity.Nat464Xlat; -import com.android.server.connectivity.NetworkAgentInfo; -import com.android.server.connectivity.NetworkMonitor; import com.android.server.connectivity.Tethering; import com.android.server.connectivity.Vpn; import com.android.server.net.NetworkPinner; @@ -168,6 +172,7 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.Spy; +import org.mockito.stubbing.Answer; import java.net.Inet4Address; import java.net.InetAddress; @@ -230,6 +235,7 @@ public class ConnectivityServiceTest { @Mock INetworkStatsService mStatsService; @Mock INetworkPolicyManager mNpm; @Mock INetd mMockNetd; + @Mock NetworkStack mNetworkStack; private ArgumentCaptor mStringArrayCaptor = ArgumentCaptor.forClass(String[].class); @@ -299,6 +305,7 @@ public class ConnectivityServiceTest { public Object getSystemService(String name) { if (Context.CONNECTIVITY_SERVICE.equals(name)) return mCm; if (Context.NOTIFICATION_SERVICE.equals(name)) return mock(NotificationManager.class); + if (Context.NETWORK_STACK_SERVICE.equals(name)) return mNetworkStack; return super.getSystemService(name); } @@ -386,7 +393,7 @@ public class ConnectivityServiceTest { } private class MockNetworkAgent { - private final WrappedNetworkMonitor mWrappedNetworkMonitor; + private final INetworkMonitor mNetworkMonitor; private final NetworkInfo mNetworkInfo; private final NetworkCapabilities mNetworkCapabilities; private final HandlerThread mHandlerThread; @@ -402,6 +409,26 @@ public class ConnectivityServiceTest { // mNetworkStatusReceived. private String mRedirectUrl; + private INetworkMonitorCallbacks mNmCallbacks; + private int mNmValidationResult = NETWORK_TEST_RESULT_INVALID; + private String mNmValidationRedirectUrl = null; + private boolean mNmProvNotificationRequested = false; + + void setNetworkValid() { + mNmValidationResult = NETWORK_TEST_RESULT_VALID; + mNmValidationRedirectUrl = null; + } + + void setNetworkInvalid() { + mNmValidationResult = NETWORK_TEST_RESULT_INVALID; + mNmValidationRedirectUrl = null; + } + + void setNetworkPortal(String redirectUrl) { + setNetworkInvalid(); + mNmValidationRedirectUrl = redirectUrl; + } + MockNetworkAgent(int transport) { this(transport, new LinkProperties()); } @@ -434,6 +461,29 @@ public class ConnectivityServiceTest { } mHandlerThread = new HandlerThread("Mock-" + typeName); mHandlerThread.start(); + + mNetworkMonitor = mock(INetworkMonitor.class); + final Answer validateAnswer = inv -> { + new Thread(this::onValidationRequested).start(); + return null; + }; + + try { + doAnswer(validateAnswer).when(mNetworkMonitor).notifyNetworkConnected(); + doAnswer(validateAnswer).when(mNetworkMonitor).forceReevaluation(anyInt()); + } catch (RemoteException e) { + fail(e.getMessage()); + } + + final ArgumentCaptor nmNetworkCaptor = + ArgumentCaptor.forClass(Network.class); + final ArgumentCaptor nmCbCaptor = + ArgumentCaptor.forClass(INetworkMonitorCallbacks.class); + doNothing().when(mNetworkStack).makeNetworkMonitor( + nmNetworkCaptor.capture(), + any() /* name */, + nmCbCaptor.capture()); + mNetworkAgent = new NetworkAgent(mHandlerThread.getLooper(), mServiceContext, "Mock-" + typeName, mNetworkInfo, mNetworkCapabilities, linkProperties, mScore, new NetworkMisc()) { @@ -465,10 +515,40 @@ public class ConnectivityServiceTest { mPreventReconnectReceived.open(); } }; + + assertEquals(mNetworkAgent.netId, nmNetworkCaptor.getValue().netId); + mNmCallbacks = nmCbCaptor.getValue(); + + try { + mNmCallbacks.onNetworkMonitorCreated(mNetworkMonitor); + } catch (RemoteException e) { + fail(e.getMessage()); + } + // Waits for the NetworkAgent to be registered, which includes the creation of the // NetworkMonitor. waitForIdle(); - mWrappedNetworkMonitor = mService.getLastCreatedWrappedNetworkMonitor(); + } + + private void onValidationRequested() { + try { + if (mNmProvNotificationRequested + && mNmValidationResult == NETWORK_TEST_RESULT_VALID) { + mNmCallbacks.hideProvisioningNotification(); + mNmProvNotificationRequested = false; + } + + mNmCallbacks.notifyNetworkTested( + mNmValidationResult, mNmValidationRedirectUrl); + + if (mNmValidationRedirectUrl != null) { + mNmCallbacks.showProvisioningNotification( + "test_provisioning_notif_action"); + mNmProvNotificationRequested = true; + } + } catch (RemoteException e) { + fail(e.getMessage()); + } } public void adjustScore(int change) { @@ -539,7 +619,7 @@ public class ConnectivityServiceTest { NetworkCallback callback = null; final ConditionVariable validatedCv = new ConditionVariable(); if (validated) { - mWrappedNetworkMonitor.gen204ProbeResult = 204; + setNetworkValid(); NetworkRequest request = new NetworkRequest.Builder() .addTransportType(mNetworkCapabilities.getTransportTypes()[0]) .clearCapabilities() @@ -564,15 +644,14 @@ public class ConnectivityServiceTest { if (validated) { // Wait for network to validate. waitFor(validatedCv); - mWrappedNetworkMonitor.gen204ProbeResult = 500; + setNetworkInvalid(); } if (callback != null) mCm.unregisterNetworkCallback(callback); } public void connectWithCaptivePortal(String redirectUrl) { - mWrappedNetworkMonitor.gen204ProbeResult = 200; - mWrappedNetworkMonitor.gen204ProbeRedirectUrl = redirectUrl; + setNetworkPortal(redirectUrl); connect(false); } @@ -603,10 +682,6 @@ public class ConnectivityServiceTest { return mDisconnected; } - public WrappedNetworkMonitor getWrappedNetworkMonitor() { - return mWrappedNetworkMonitor; - } - public void sendLinkProperties(LinkProperties lp) { mNetworkAgent.sendLinkProperties(lp); } @@ -880,28 +955,6 @@ public class ConnectivityServiceTest { } } - // NetworkMonitor implementation allowing overriding of Internet connectivity probe result. - private class WrappedNetworkMonitor extends NetworkMonitor { - public final Handler connectivityHandler; - // HTTP response code fed back to NetworkMonitor for Internet connectivity probe. - public int gen204ProbeResult = 500; - public String gen204ProbeRedirectUrl = null; - - public WrappedNetworkMonitor(Context context, Handler handler, - NetworkAgentInfo networkAgentInfo, NetworkRequest defaultRequest, - IpConnectivityLog log) { - super(context, handler, networkAgentInfo, defaultRequest, log, - NetworkMonitor.Dependencies.DEFAULT); - connectivityHandler = handler; - } - - @Override - protected CaptivePortalProbeResult isCaptivePortal() { - if (!mIsCaptivePortalCheckEnabled) { return new CaptivePortalProbeResult(204); } - return new CaptivePortalProbeResult(gen204ProbeResult, gen204ProbeRedirectUrl, null); - } - } - private class WrappedMultinetworkPolicyTracker extends MultinetworkPolicyTracker { public volatile boolean configRestrictsAvoidBadWifi; public volatile int configMeteredMultipathPreference; @@ -923,7 +976,6 @@ public class ConnectivityServiceTest { private class WrappedConnectivityService extends ConnectivityService { public WrappedMultinetworkPolicyTracker wrappedMultinetworkPolicyTracker; - private WrappedNetworkMonitor mLastCreatedNetworkMonitor; private MockableSystemProperties mSystemProperties; public WrappedConnectivityService(Context context, INetworkManagementService netManager, @@ -971,15 +1023,6 @@ public class ConnectivityServiceTest { } } - @Override - public NetworkMonitor createNetworkMonitor(Context context, Handler handler, - NetworkAgentInfo nai, NetworkRequest defaultRequest) { - final WrappedNetworkMonitor monitor = new WrappedNetworkMonitor( - context, handler, nai, defaultRequest, mock(IpConnectivityLog.class)); - mLastCreatedNetworkMonitor = monitor; - return monitor; - } - public Nat464Xlat getNat464Xlat(MockNetworkAgent mna) { return getNetworkAgentInfoForNetwork(mna.getNetwork()).clatd; } @@ -1017,10 +1060,6 @@ public class ConnectivityServiceTest { protected void registerNetdEventCallback() { } - public WrappedNetworkMonitor getLastCreatedWrappedNetworkMonitor() { - return mLastCreatedNetworkMonitor; - } - public void mockVpn(int uid) { synchronized (mVpns) { int userId = UserHandle.getUserId(uid); @@ -2439,7 +2478,7 @@ public class ConnectivityServiceTest { // Make captive portal disappear then revalidate. // Expect onLost callback because network no longer provides NET_CAPABILITY_CAPTIVE_PORTAL. - mWiFiNetworkAgent.getWrappedNetworkMonitor().gen204ProbeResult = 204; + mWiFiNetworkAgent.setNetworkValid(); mCm.reportNetworkConnectivity(mWiFiNetworkAgent.getNetwork(), true); captivePortalCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); @@ -2448,13 +2487,13 @@ public class ConnectivityServiceTest { // Break network connectivity. // Expect NET_CAPABILITY_VALIDATED onLost callback. - mWiFiNetworkAgent.getWrappedNetworkMonitor().gen204ProbeResult = 500; + mWiFiNetworkAgent.setNetworkInvalid(); mCm.reportNetworkConnectivity(mWiFiNetworkAgent.getNetwork(), false); validatedCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); } @Test - public void testCaptivePortalApp() { + public void testCaptivePortalApp() throws RemoteException { final TestNetworkCallback captivePortalCallback = new TestNetworkCallback(); final NetworkRequest captivePortalRequest = new NetworkRequest.Builder() .addCapability(NET_CAPABILITY_CAPTIVE_PORTAL).build(); @@ -2477,21 +2516,19 @@ public class ConnectivityServiceTest { mServiceContext.expectNoStartActivityIntent(fastTimeoutMs); // Turn into a captive portal. - mWiFiNetworkAgent.getWrappedNetworkMonitor().gen204ProbeResult = 302; + mWiFiNetworkAgent.setNetworkPortal("http://example.com"); mCm.reportNetworkConnectivity(wifiNetwork, false); captivePortalCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); validatedCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); - // Check that startCaptivePortalApp sends the expected intent. + // Check that startCaptivePortalApp sends the expected command to NetworkMonitor. mCm.startCaptivePortalApp(wifiNetwork); - Intent intent = mServiceContext.expectStartActivityIntent(TIMEOUT_MS); - assertEquals(ConnectivityManager.ACTION_CAPTIVE_PORTAL_SIGN_IN, intent.getAction()); - assertEquals(wifiNetwork, intent.getExtra(ConnectivityManager.EXTRA_NETWORK)); + verify(mWiFiNetworkAgent.mNetworkMonitor, timeout(TIMEOUT_MS).times(1)) + .launchCaptivePortalApp(); - // Have the app report that the captive portal is dismissed, and check that we revalidate. - mWiFiNetworkAgent.getWrappedNetworkMonitor().gen204ProbeResult = 204; - CaptivePortal c = (CaptivePortal) intent.getExtra(ConnectivityManager.EXTRA_CAPTIVE_PORTAL); - c.reportCaptivePortalDismissed(); + // Report that the captive portal is dismissed, and check that callbacks are fired + mWiFiNetworkAgent.setNetworkValid(); + mWiFiNetworkAgent.mNetworkMonitor.forceReevaluation(Process.myUid()); validatedCallback.expectAvailableCallbacksValidated(mWiFiNetworkAgent); captivePortalCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); @@ -2524,20 +2561,6 @@ public class ConnectivityServiceTest { waitFor(avoidCv); assertNoCallbacks(captivePortalCallback, validatedCallback); - - // Now test ignore mode. - setCaptivePortalMode(Settings.Global.CAPTIVE_PORTAL_MODE_IGNORE); - - // Bring up a network with a captive portal. - // Since we're ignoring captive portals, the network will validate. - mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); - String secondRedirectUrl = "http://example.com/secondPath"; - mWiFiNetworkAgent.connectWithCaptivePortal(secondRedirectUrl); - - // Expect NET_CAPABILITY_VALIDATED onAvailable callback. - validatedCallback.expectAvailableCallbacksValidated(mWiFiNetworkAgent); - // But there should be no CaptivePortal callback. - captivePortalCallback.assertNoCallback(); } private NetworkRequest.Builder newWifiRequestBuilder() { @@ -3169,7 +3192,7 @@ public class ConnectivityServiceTest { Network wifiNetwork = mWiFiNetworkAgent.getNetwork(); // Fail validation on wifi. - mWiFiNetworkAgent.getWrappedNetworkMonitor().gen204ProbeResult = 599; + mWiFiNetworkAgent.setNetworkInvalid(); mCm.reportNetworkConnectivity(wifiNetwork, false); defaultCallback.expectCapabilitiesWithout(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); validatedWifiCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); @@ -3213,7 +3236,7 @@ public class ConnectivityServiceTest { wifiNetwork = mWiFiNetworkAgent.getNetwork(); // Fail validation on wifi and expect the dialog to appear. - mWiFiNetworkAgent.getWrappedNetworkMonitor().gen204ProbeResult = 599; + mWiFiNetworkAgent.setNetworkInvalid(); mCm.reportNetworkConnectivity(wifiNetwork, false); defaultCallback.expectCapabilitiesWithout(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); validatedWifiCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); @@ -4002,11 +4025,9 @@ public class ConnectivityServiceTest { final String TLS_SERVER6 = "2001:db8:53::53"; final InetAddress[] TLS_IPS = new InetAddress[]{ InetAddress.getByName(TLS_SERVER6) }; final String[] TLS_SERVERS = new String[]{ TLS_SERVER6 }; - final Handler h = mCellNetworkAgent.getWrappedNetworkMonitor().connectivityHandler; - h.sendMessage(h.obtainMessage( - NetworkMonitor.EVENT_PRIVATE_DNS_CONFIG_RESOLVED, 0, - mCellNetworkAgent.getNetwork().netId, - new DnsManager.PrivateDnsConfig(TLS_SPECIFIER, TLS_IPS))); + mCellNetworkAgent.mNmCallbacks.notifyPrivateDnsConfigResolved( + new PrivateDnsConfig(TLS_SPECIFIER, TLS_IPS).toParcel()); + waitForIdle(); verify(mNetworkManagementService, atLeastOnce()).setDnsConfigurationForNetwork( anyInt(), mStringArrayCaptor.capture(), any(), any(), @@ -4294,6 +4315,12 @@ public class ConnectivityServiceTest { ranges.add(new UidRange(uid, uid)); mMockVpn.setNetworkAgent(vpnNetworkAgent); mMockVpn.setUids(ranges); + // VPN networks do not satisfy the default request and are automatically validated + // by NetworkMonitor + assertFalse(NetworkMonitorUtils.isValidationRequired( + mCm.getDefaultRequest().networkCapabilities, vpnNetworkAgent.mNetworkCapabilities)); + vpnNetworkAgent.setNetworkValid(); + vpnNetworkAgent.connect(false); mMockVpn.connect(); diff --git a/tests/net/java/com/android/server/connectivity/DnsManagerTest.java b/tests/net/java/com/android/server/connectivity/DnsManagerTest.java index 01b468af94..38322e925a 100644 --- a/tests/net/java/com/android/server/connectivity/DnsManagerTest.java +++ b/tests/net/java/com/android/server/connectivity/DnsManagerTest.java @@ -17,7 +17,6 @@ package com.android.server.connectivity; 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.provider.Settings.Global.PRIVATE_DNS_DEFAULT_MODE; import static android.provider.Settings.Global.PRIVATE_DNS_MODE; @@ -29,13 +28,13 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.when; -import android.content.ContentResolver; import android.content.Context; import android.net.IpPrefix; import android.net.LinkAddress; import android.net.LinkProperties; import android.net.Network; import android.net.RouteInfo; +import android.net.shared.PrivateDnsConfig; import android.os.INetworkManagementService; import android.provider.Settings; import android.support.test.filters.SmallTest; @@ -43,18 +42,16 @@ import android.support.test.runner.AndroidJUnit4; import android.test.mock.MockContentResolver; import com.android.internal.util.test.FakeSettingsProvider; -import com.android.server.connectivity.DnsManager.PrivateDnsConfig; -import com.android.server.connectivity.MockableSystemProperties; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; import java.net.InetAddress; import java.util.Arrays; -import org.junit.runner.RunWith; -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - /** * Tests for {@link DnsManager}. * @@ -133,7 +130,7 @@ public class DnsManagerTest { PRIVATE_DNS_MODE, PRIVATE_DNS_MODE_PROVIDER_HOSTNAME); Settings.Global.putString(mContentResolver, PRIVATE_DNS_SPECIFIER, "strictmode.com"); mDnsManager.updatePrivateDns(new Network(TEST_NETID), - new DnsManager.PrivateDnsConfig("strictmode.com", new InetAddress[] { + new PrivateDnsConfig("strictmode.com", new InetAddress[] { InetAddress.parseNumericAddress("6.6.6.6"), InetAddress.parseNumericAddress("2001:db8:66:66::1") })); diff --git a/tests/net/java/com/android/server/connectivity/LingerMonitorTest.java b/tests/net/java/com/android/server/connectivity/LingerMonitorTest.java index 354cf2f223..4c52d81826 100644 --- a/tests/net/java/com/android/server/connectivity/LingerMonitorTest.java +++ b/tests/net/java/com/android/server/connectivity/LingerMonitorTest.java @@ -23,10 +23,10 @@ import static org.mockito.Mockito.anyBoolean; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.never; +import static org.mockito.Mockito.reset; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.mockito.Mockito.reset; import android.app.PendingIntent; import android.content.Context; @@ -36,18 +36,18 @@ import android.net.Network; import android.net.NetworkCapabilities; import android.net.NetworkInfo; import android.net.NetworkMisc; -import android.support.test.runner.AndroidJUnit4; +import android.net.NetworkStack; import android.support.test.filters.SmallTest; +import android.support.test.runner.AndroidJUnit4; import android.text.format.DateUtils; import com.android.internal.R; import com.android.server.ConnectivityService; -import com.android.server.connectivity.NetworkNotificationManager; import com.android.server.connectivity.NetworkNotificationManager.NotificationType; -import org.junit.runner.RunWith; import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @@ -70,13 +70,16 @@ public class LingerMonitorTest { @Mock NetworkMisc mMisc; @Mock NetworkNotificationManager mNotifier; @Mock Resources mResources; + @Mock NetworkStack mNetworkStack; @Before public void setUp() { MockitoAnnotations.initMocks(this); when(mCtx.getResources()).thenReturn(mResources); when(mCtx.getPackageName()).thenReturn("com.android.server.connectivity"); - when(mConnService.createNetworkMonitor(any(), any(), any(), any())).thenReturn(null); + when(mCtx.getSystemServiceName(NetworkStack.class)) + .thenReturn(Context.NETWORK_STACK_SERVICE); + when(mCtx.getSystemService(Context.NETWORK_STACK_SERVICE)).thenReturn(mNetworkStack); mMonitor = new TestableLingerMonitor(mCtx, mNotifier, HIGH_DAILY_LIMIT, HIGH_RATE_LIMIT); } @@ -349,7 +352,7 @@ public class LingerMonitorTest { caps.addCapability(0); caps.addTransportType(transport); NetworkAgentInfo nai = new NetworkAgentInfo(null, null, new Network(netId), info, null, - caps, 50, mCtx, null, mMisc, null, mConnService); + caps, 50, mCtx, null, mMisc, mConnService); nai.everValidated = true; return nai; }