Move NetworkMonitor to NetworkStack
Bug: b/112869080 Test: atest FrameworksNetTests NetworkStackTests Change-Id: I1b8b6a3f4390adbabf92fb9e48da61c47b08b2ec
This commit is contained in:
@@ -2051,6 +2051,16 @@ public class ConnectivityManager {
|
|||||||
return (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
|
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
|
/* TODO: These permissions checks don't belong in client-side code. Move them to
|
||||||
* services.jar, possibly in com.android.server.net. */
|
* services.jar, possibly in com.android.server.net. */
|
||||||
|
|
||||||
|
|||||||
@@ -167,6 +167,8 @@ interface IConnectivityManager
|
|||||||
|
|
||||||
int getMultipathPreference(in Network Network);
|
int getMultipathPreference(in Network Network);
|
||||||
|
|
||||||
|
NetworkRequest getDefaultRequest();
|
||||||
|
|
||||||
int getRestoreDefaultNetworkDelay(int networkType);
|
int getRestoreDefaultNetworkDelay(int networkType);
|
||||||
|
|
||||||
boolean addVpnAddress(String address, int prefixLength);
|
boolean addVpnAddress(String address, int prefixLength);
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import static android.net.ConnectivityManager.TYPE_NONE;
|
|||||||
import static android.net.ConnectivityManager.TYPE_VPN;
|
import static android.net.ConnectivityManager.TYPE_VPN;
|
||||||
import static android.net.ConnectivityManager.getNetworkTypeName;
|
import static android.net.ConnectivityManager.getNetworkTypeName;
|
||||||
import static android.net.ConnectivityManager.isNetworkTypeValid;
|
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_CAPTIVE_PORTAL;
|
||||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_FOREGROUND;
|
import static android.net.NetworkCapabilities.NET_CAPABILITY_FOREGROUND;
|
||||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET;
|
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.NetworkCapabilities.TRANSPORT_VPN;
|
||||||
import static android.net.NetworkPolicyManager.RULE_NONE;
|
import static android.net.NetworkPolicyManager.RULE_NONE;
|
||||||
import static android.net.NetworkPolicyManager.uidRulesToString;
|
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.os.Process.INVALID_UID;
|
||||||
import static android.system.OsConstants.IPPROTO_TCP;
|
import static android.system.OsConstants.IPPROTO_TCP;
|
||||||
import static android.system.OsConstants.IPPROTO_UDP;
|
import static android.system.OsConstants.IPPROTO_UDP;
|
||||||
@@ -62,6 +65,8 @@ import android.net.IIpConnectivityMetrics;
|
|||||||
import android.net.INetd;
|
import android.net.INetd;
|
||||||
import android.net.INetdEventCallback;
|
import android.net.INetdEventCallback;
|
||||||
import android.net.INetworkManagementEventObserver;
|
import android.net.INetworkManagementEventObserver;
|
||||||
|
import android.net.INetworkMonitor;
|
||||||
|
import android.net.INetworkMonitorCallbacks;
|
||||||
import android.net.INetworkPolicyListener;
|
import android.net.INetworkPolicyListener;
|
||||||
import android.net.INetworkPolicyManager;
|
import android.net.INetworkPolicyManager;
|
||||||
import android.net.INetworkStatsService;
|
import android.net.INetworkStatsService;
|
||||||
@@ -79,9 +84,11 @@ import android.net.NetworkPolicyManager;
|
|||||||
import android.net.NetworkQuotaInfo;
|
import android.net.NetworkQuotaInfo;
|
||||||
import android.net.NetworkRequest;
|
import android.net.NetworkRequest;
|
||||||
import android.net.NetworkSpecifier;
|
import android.net.NetworkSpecifier;
|
||||||
|
import android.net.NetworkStack;
|
||||||
import android.net.NetworkState;
|
import android.net.NetworkState;
|
||||||
import android.net.NetworkUtils;
|
import android.net.NetworkUtils;
|
||||||
import android.net.NetworkWatchlistManager;
|
import android.net.NetworkWatchlistManager;
|
||||||
|
import android.net.PrivateDnsConfigParcel;
|
||||||
import android.net.ProxyInfo;
|
import android.net.ProxyInfo;
|
||||||
import android.net.RouteInfo;
|
import android.net.RouteInfo;
|
||||||
import android.net.UidRange;
|
import android.net.UidRange;
|
||||||
@@ -90,12 +97,13 @@ import android.net.VpnService;
|
|||||||
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.shared.NetworkMonitorUtils;
|
||||||
|
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;
|
||||||
import android.os.Binder;
|
import android.os.Binder;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.FileUtils;
|
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.HandlerThread;
|
import android.os.HandlerThread;
|
||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
@@ -123,8 +131,8 @@ import android.telephony.TelephonyManager;
|
|||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.ArraySet;
|
import android.util.ArraySet;
|
||||||
import android.util.LocalLog;
|
import android.util.LocalLog;
|
||||||
import android.util.LocalLog.ReadOnlyLocalLog;
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
import android.util.Pair;
|
||||||
import android.util.Slog;
|
import android.util.Slog;
|
||||||
import android.util.SparseArray;
|
import android.util.SparseArray;
|
||||||
import android.util.SparseBooleanArray;
|
import android.util.SparseBooleanArray;
|
||||||
@@ -149,7 +157,6 @@ import com.android.internal.util.XmlUtils;
|
|||||||
import com.android.server.am.BatteryStatsService;
|
import com.android.server.am.BatteryStatsService;
|
||||||
import com.android.server.connectivity.DataConnectionStats;
|
import com.android.server.connectivity.DataConnectionStats;
|
||||||
import com.android.server.connectivity.DnsManager;
|
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.DnsManager.PrivateDnsValidationUpdate;
|
||||||
import com.android.server.connectivity.IpConnectivityMetrics;
|
import com.android.server.connectivity.IpConnectivityMetrics;
|
||||||
import com.android.server.connectivity.KeepaliveTracker;
|
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.MultipathPolicyTracker;
|
||||||
import com.android.server.connectivity.NetworkAgentInfo;
|
import com.android.server.connectivity.NetworkAgentInfo;
|
||||||
import com.android.server.connectivity.NetworkDiagnostics;
|
import com.android.server.connectivity.NetworkDiagnostics;
|
||||||
import com.android.server.connectivity.NetworkMonitor;
|
|
||||||
import com.android.server.connectivity.NetworkNotificationManager;
|
import com.android.server.connectivity.NetworkNotificationManager;
|
||||||
import com.android.server.connectivity.NetworkNotificationManager.NotificationType;
|
import com.android.server.connectivity.NetworkNotificationManager.NotificationType;
|
||||||
import com.android.server.connectivity.PermissionMonitor;
|
import com.android.server.connectivity.PermissionMonitor;
|
||||||
@@ -186,7 +192,6 @@ import java.io.PrintWriter;
|
|||||||
import java.net.Inet4Address;
|
import java.net.Inet4Address;
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
import java.net.UnknownHostException;
|
import java.net.UnknownHostException;
|
||||||
import java.util.ArrayDeque;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@@ -442,6 +447,43 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
*/
|
*/
|
||||||
private static final int EVENT_DATA_SAVER_CHANGED = 40;
|
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) {
|
private static String eventName(int what) {
|
||||||
return sMagicDecoderRing.get(what, Integer.toString(what));
|
return sMagicDecoderRing.get(what, Integer.toString(what));
|
||||||
}
|
}
|
||||||
@@ -506,30 +548,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
private long mMaxWakelockDurationMs = 0;
|
private long mMaxWakelockDurationMs = 0;
|
||||||
private long mLastWakeLockAcquireTimestamp = 0;
|
private long mLastWakeLockAcquireTimestamp = 0;
|
||||||
|
|
||||||
// Array of <Network,ReadOnlyLocalLogs> 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<ValidationLog> 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;
|
private final IpConnectivityLog mMetricsLog;
|
||||||
|
|
||||||
@GuardedBy("mBandwidthRequests")
|
@GuardedBy("mBandwidthRequests")
|
||||||
@@ -1684,7 +1702,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
// caller type. Need to re-factor NetdEventListenerService to allow multiple
|
// caller type. Need to re-factor NetdEventListenerService to allow multiple
|
||||||
// NetworkMonitor registrants.
|
// NetworkMonitor registrants.
|
||||||
if (nai != null && nai.satisfies(mDefaultRequest)) {
|
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);
|
mMultipathPolicyTracker.dump(pw);
|
||||||
|
|
||||||
if (ArrayUtils.contains(args, SHORT_ARG) == false) {
|
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();
|
||||||
pw.println("mNetworkRequestInfoLogs (most recent first):");
|
pw.println("mNetworkRequestInfoLogs (most recent first):");
|
||||||
pw.increaseIndent();
|
pw.increaseIndent();
|
||||||
@@ -2455,11 +2466,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
switch (msg.what) {
|
switch (msg.what) {
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
case NetworkMonitor.EVENT_NETWORK_TESTED: {
|
case EVENT_NETWORK_TESTED: {
|
||||||
final NetworkAgentInfo nai = getNetworkAgentInfoForNetId(msg.arg2);
|
final NetworkAgentInfo nai = getNetworkAgentInfoForNetId(msg.arg2);
|
||||||
if (nai == null) break;
|
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 wasValidated = nai.lastValidated;
|
||||||
final boolean wasDefault = isDefaultNetwork(nai);
|
final boolean wasDefault = isDefaultNetwork(nai);
|
||||||
|
|
||||||
@@ -2497,7 +2508,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case NetworkMonitor.EVENT_PROVISIONING_NOTIFICATION: {
|
case EVENT_PROVISIONING_NOTIFICATION: {
|
||||||
final int netId = msg.arg2;
|
final int netId = msg.arg2;
|
||||||
final boolean visible = toBool(msg.arg1);
|
final boolean visible = toBool(msg.arg1);
|
||||||
final NetworkAgentInfo nai = getNetworkAgentInfoForNetId(netId);
|
final NetworkAgentInfo nai = getNetworkAgentInfoForNetId(netId);
|
||||||
@@ -2530,7 +2541,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case NetworkMonitor.EVENT_PRIVATE_DNS_CONFIG_RESOLVED: {
|
case EVENT_PRIVATE_DNS_CONFIG_RESOLVED: {
|
||||||
final NetworkAgentInfo nai = getNetworkAgentInfoForNetId(msg.arg2);
|
final NetworkAgentInfo nai = getNetworkAgentInfoForNetId(msg.arg2);
|
||||||
if (nai == null) break;
|
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) {
|
private boolean networkRequiresValidation(NetworkAgentInfo nai) {
|
||||||
return NetworkMonitor.isValidationRequired(
|
return isValidationRequired(
|
||||||
mDefaultRequest.networkCapabilities, nai.networkCapabilities);
|
mDefaultRequest.networkCapabilities, nai.networkCapabilities);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2603,10 +2667,14 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
// Internet access and therefore also require validation.
|
// Internet access and therefore also require validation.
|
||||||
if (!networkRequiresValidation(nai)) return;
|
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
|
// schedule DNS resolutions. If a DNS resolution is required the
|
||||||
// result will be sent back to us.
|
// 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
|
// With Private DNS bypass support, we can proceed to update the
|
||||||
// Private DNS config immediately, even if we're in strict mode
|
// 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.
|
// Disable wakeup packet monitoring for each interface.
|
||||||
wakeupModifyInterface(iface, nai.networkCapabilities, false);
|
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);
|
mNetworkAgentInfos.remove(nai.messenger);
|
||||||
nai.maybeStopClat();
|
nai.maybeStopClat();
|
||||||
synchronized (mNetworkForNetId) {
|
synchronized (mNetworkForNetId) {
|
||||||
@@ -3096,7 +3168,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(network);
|
NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(network);
|
||||||
if (nai == null) return;
|
if (nai == null) return;
|
||||||
if (!nai.networkCapabilities.hasCapability(NET_CAPABILITY_CAPTIVE_PORTAL)) 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();
|
return mMultinetworkPolicyTracker.getMeteredMultipathPreference();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NetworkRequest getDefaultRequest() {
|
||||||
|
return mDefaultRequest;
|
||||||
|
}
|
||||||
|
|
||||||
private class InternalHandler extends Handler {
|
private class InternalHandler extends Handler {
|
||||||
public InternalHandler(Looper looper) {
|
public InternalHandler(Looper looper) {
|
||||||
super(looper);
|
super(looper);
|
||||||
@@ -3247,7 +3328,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case EVENT_REGISTER_NETWORK_AGENT: {
|
case EVENT_REGISTER_NETWORK_AGENT: {
|
||||||
handleRegisterNetworkAgent((NetworkAgentInfo)msg.obj);
|
final Pair<NetworkAgentInfo, INetworkMonitor> arg =
|
||||||
|
(Pair<NetworkAgentInfo, INetworkMonitor>) msg.obj;
|
||||||
|
handleRegisterNetworkAgent(arg.first, arg.second);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case EVENT_REGISTER_NETWORK_REQUEST:
|
case EVENT_REGISTER_NETWORK_REQUEST:
|
||||||
@@ -3305,7 +3388,14 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
}
|
}
|
||||||
case EVENT_SYSTEM_READY: {
|
case EVENT_SYSTEM_READY: {
|
||||||
for (NetworkAgentInfo nai : mNetworkAgentInfos.values()) {
|
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();
|
mMultipathPolicyTracker.start();
|
||||||
break;
|
break;
|
||||||
@@ -3577,7 +3667,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
if (isNetworkWithLinkPropertiesBlocked(lp, uid, false)) {
|
if (isNetworkWithLinkPropertiesBlocked(lp, uid, false)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
nai.networkMonitor.forceReevaluation(uid);
|
try {
|
||||||
|
nai.networkMonitor().forceReevaluation(uid);
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
e.rethrowFromSystemServer();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -4785,27 +4879,49 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
final NetworkCapabilities nc = new NetworkCapabilities(networkCapabilities);
|
final NetworkCapabilities nc = new NetworkCapabilities(networkCapabilities);
|
||||||
final NetworkAgentInfo nai = new NetworkAgentInfo(messenger, new AsyncChannel(),
|
final NetworkAgentInfo nai = new NetworkAgentInfo(messenger, new AsyncChannel(),
|
||||||
new Network(reserveNetId()), new NetworkInfo(networkInfo), lp, nc, currentScore,
|
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.
|
// Make sure the network capabilities reflect what the agent info says.
|
||||||
nai.networkCapabilities = mixInCapabilities(nai, nc);
|
nai.networkCapabilities = mixInCapabilities(nai, nc);
|
||||||
synchronized (this) {
|
|
||||||
nai.networkMonitor.systemReady = mSystemReady;
|
|
||||||
}
|
|
||||||
final String extraInfo = networkInfo.getExtraInfo();
|
final String extraInfo = networkInfo.getExtraInfo();
|
||||||
final String name = TextUtils.isEmpty(extraInfo)
|
final String name = TextUtils.isEmpty(extraInfo)
|
||||||
? nai.networkCapabilities.getSSID() : extraInfo;
|
? nai.networkCapabilities.getSSID() : extraInfo;
|
||||||
addValidationLogs(nai.networkMonitor.getValidationLogs(), nai.network, name);
|
|
||||||
if (DBG) log("registerNetworkAgent " + nai);
|
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;
|
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");
|
if (VDBG) log("Got NetworkAgent Messenger");
|
||||||
mNetworkAgentInfos.put(nai.messenger, nai);
|
mNetworkAgentInfos.put(nai.messenger, nai);
|
||||||
synchronized (mNetworkForNetId) {
|
synchronized (mNetworkForNetId) {
|
||||||
mNetworkForNetId.put(nai.network.netId, nai);
|
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);
|
nai.asyncChannel.connect(mContext, mTrackerHandler, nai.messenger);
|
||||||
NetworkInfo networkInfo = nai.networkInfo;
|
NetworkInfo networkInfo = nai.networkInfo;
|
||||||
nai.networkInfo = null;
|
nai.networkInfo = null;
|
||||||
@@ -4855,6 +4971,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
networkAgent.updateClat(mNMS);
|
networkAgent.updateClat(mNMS);
|
||||||
notifyIfacesChangedForNetworkStats();
|
notifyIfacesChangedForNetworkStats();
|
||||||
if (networkAgent.everConnected) {
|
if (networkAgent.everConnected) {
|
||||||
|
try {
|
||||||
|
networkAgent.networkMonitor().notifyLinkPropertiesChanged();
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
e.rethrowFromSystemServer();
|
||||||
|
}
|
||||||
notifyNetworkCallbacks(networkAgent, ConnectivityManager.CALLBACK_IP_CHANGED);
|
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
|
// 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.
|
// called by rematchNetworkAndRequests, so it's safe to start a rematch.
|
||||||
rematchAllNetworksAndRequests(nai, oldScore);
|
rematchAllNetworksAndRequests(nai, oldScore);
|
||||||
|
try {
|
||||||
|
nai.networkMonitor().notifyNetworkCapabilitiesChanged();
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
e.rethrowFromSystemServer();
|
||||||
|
}
|
||||||
notifyNetworkCallbacks(nai, ConnectivityManager.CALLBACK_CAP_CHANGED);
|
notifyNetworkCallbacks(nai, ConnectivityManager.CALLBACK_CAP_CHANGED);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5339,6 +5465,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (capabilitiesChanged) {
|
if (capabilitiesChanged) {
|
||||||
|
try {
|
||||||
|
nai.networkMonitor().notifyNetworkCapabilitiesChanged();
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
e.rethrowFromSystemServer();
|
||||||
|
}
|
||||||
notifyNetworkCallbacks(nai, ConnectivityManager.CALLBACK_CAP_CHANGED);
|
notifyNetworkCallbacks(nai, ConnectivityManager.CALLBACK_CAP_CHANGED);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5739,7 +5870,15 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
updateLinkProperties(networkAgent, new LinkProperties(networkAgent.linkProperties),
|
updateLinkProperties(networkAgent, new LinkProperties(networkAgent.linkProperties),
|
||||||
null);
|
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);
|
scheduleUnvalidatedPrompt(networkAgent);
|
||||||
|
|
||||||
if (networkAgent.isVPN()) {
|
if (networkAgent.isVPN()) {
|
||||||
@@ -6020,7 +6159,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
@Override
|
@Override
|
||||||
public String getCaptivePortalServerUrl() {
|
public String getCaptivePortalServerUrl() {
|
||||||
enforceConnectivityInternalPermission();
|
enforceConnectivityInternalPermission();
|
||||||
return NetworkMonitor.getCaptivePortalServerHttpUrl(mContext);
|
return NetworkMonitorUtils.getCaptivePortalServerHttpUrl(mContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -6112,12 +6251,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
return nwm.getWatchlistConfigHash();
|
return nwm.getWatchlistConfigHash();
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
|
||||||
public NetworkMonitor createNetworkMonitor(Context context, Handler handler,
|
|
||||||
NetworkAgentInfo nai, NetworkRequest defaultRequest) {
|
|
||||||
return new NetworkMonitor(context, handler, nai, defaultRequest);
|
|
||||||
}
|
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
MultinetworkPolicyTracker createMultinetworkPolicyTracker(Context c, Handler h, Runnable r) {
|
MultinetworkPolicyTracker createMultinetworkPolicyTracker(Context c, Handler h, Runnable r) {
|
||||||
return new MultinetworkPolicyTracker(c, h, r);
|
return new MultinetworkPolicyTracker(c, h, r);
|
||||||
|
|||||||
@@ -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_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_OPPORTUNISTIC;
|
|
||||||
import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME;
|
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_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_SAMPLE_VALIDITY_SECONDS;
|
||||||
import static android.provider.Settings.Global.DNS_RESOLVER_SUCCESS_THRESHOLD_PERCENT;
|
import static android.provider.Settings.Global.DNS_RESOLVER_SUCCESS_THRESHOLD_PERCENT;
|
||||||
import static android.provider.Settings.Global.PRIVATE_DNS_DEFAULT_MODE;
|
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.Network;
|
||||||
import android.net.NetworkUtils;
|
import android.net.NetworkUtils;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
import android.net.shared.PrivateDnsConfig;
|
||||||
import android.os.Binder;
|
import android.os.Binder;
|
||||||
import android.os.INetworkManagementService;
|
import android.os.INetworkManagementService;
|
||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
@@ -43,10 +43,7 @@ import android.text.TextUtils;
|
|||||||
import android.util.Pair;
|
import android.util.Pair;
|
||||||
import android.util.Slog;
|
import android.util.Slog;
|
||||||
|
|
||||||
import com.android.server.connectivity.MockableSystemProperties;
|
|
||||||
|
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
import java.net.UnknownHostException;
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
@@ -54,10 +51,8 @@ import java.util.HashMap;
|
|||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
import java.util.Set;
|
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_MIN_SAMPLES = 8;
|
||||||
private static final int DNS_RESOLVER_DEFAULT_MAX_SAMPLES = 64;
|
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) {
|
public static PrivateDnsConfig getPrivateDnsConfig(ContentResolver cr) {
|
||||||
final String mode = getPrivateDnsMode(cr);
|
final String mode = getPrivateDnsMode(cr);
|
||||||
|
|
||||||
|
|||||||
@@ -16,9 +16,8 @@
|
|||||||
|
|
||||||
package com.android.server.connectivity;
|
package com.android.server.connectivity;
|
||||||
|
|
||||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED;
|
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.net.INetworkMonitor;
|
||||||
import android.net.LinkProperties;
|
import android.net.LinkProperties;
|
||||||
import android.net.Network;
|
import android.net.Network;
|
||||||
import android.net.NetworkCapabilities;
|
import android.net.NetworkCapabilities;
|
||||||
@@ -29,7 +28,6 @@ import android.net.NetworkState;
|
|||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.INetworkManagementService;
|
import android.os.INetworkManagementService;
|
||||||
import android.os.Messenger;
|
import android.os.Messenger;
|
||||||
import android.os.RemoteException;
|
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.util.SparseArray;
|
import android.util.SparseArray;
|
||||||
@@ -37,11 +35,8 @@ import android.util.SparseArray;
|
|||||||
import com.android.internal.util.AsyncChannel;
|
import com.android.internal.util.AsyncChannel;
|
||||||
import com.android.internal.util.WakeupMessage;
|
import com.android.internal.util.WakeupMessage;
|
||||||
import com.android.server.ConnectivityService;
|
import com.android.server.ConnectivityService;
|
||||||
import com.android.server.connectivity.NetworkMonitor;
|
|
||||||
|
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.SortedSet;
|
import java.util.SortedSet;
|
||||||
import java.util.TreeSet;
|
import java.util.TreeSet;
|
||||||
@@ -126,7 +121,6 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> {
|
|||||||
public LinkProperties linkProperties;
|
public LinkProperties linkProperties;
|
||||||
// This should only be modified via ConnectivityService.updateCapabilities().
|
// This should only be modified via ConnectivityService.updateCapabilities().
|
||||||
public NetworkCapabilities networkCapabilities;
|
public NetworkCapabilities networkCapabilities;
|
||||||
public final NetworkMonitor networkMonitor;
|
|
||||||
public final NetworkMisc networkMisc;
|
public final NetworkMisc networkMisc;
|
||||||
// Indicates if netd has been told to create this Network. From this point on the appropriate
|
// 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.
|
// 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<NetworkAgentInfo> {
|
|||||||
// Used by ConnectivityService to keep track of 464xlat.
|
// Used by ConnectivityService to keep track of 464xlat.
|
||||||
public Nat464Xlat clatd;
|
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 String TAG = ConnectivityService.class.getSimpleName();
|
||||||
private static final boolean VDBG = false;
|
private static final boolean VDBG = false;
|
||||||
private final ConnectivityService mConnService;
|
private final ConnectivityService mConnService;
|
||||||
@@ -247,7 +244,7 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> {
|
|||||||
|
|
||||||
public NetworkAgentInfo(Messenger messenger, AsyncChannel ac, Network net, NetworkInfo info,
|
public NetworkAgentInfo(Messenger messenger, AsyncChannel ac, Network net, NetworkInfo info,
|
||||||
LinkProperties lp, NetworkCapabilities nc, int score, Context context, Handler handler,
|
LinkProperties lp, NetworkCapabilities nc, int score, Context context, Handler handler,
|
||||||
NetworkMisc misc, NetworkRequest defaultRequest, ConnectivityService connService) {
|
NetworkMisc misc, ConnectivityService connService) {
|
||||||
this.messenger = messenger;
|
this.messenger = messenger;
|
||||||
asyncChannel = ac;
|
asyncChannel = ac;
|
||||||
network = net;
|
network = net;
|
||||||
@@ -258,10 +255,16 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> {
|
|||||||
mConnService = connService;
|
mConnService = connService;
|
||||||
mContext = context;
|
mContext = context;
|
||||||
mHandler = handler;
|
mHandler = handler;
|
||||||
networkMonitor = mConnService.createNetworkMonitor(context, handler, this, defaultRequest);
|
|
||||||
networkMisc = misc;
|
networkMisc = misc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inform NetworkAgentInfo that a new NetworkMonitor was created.
|
||||||
|
*/
|
||||||
|
public void onNetworkMonitorCreated(INetworkMonitor networkMonitor) {
|
||||||
|
mNetworkMonitor = networkMonitor;
|
||||||
|
}
|
||||||
|
|
||||||
public ConnectivityService connService() {
|
public ConnectivityService connService() {
|
||||||
return mConnService;
|
return mConnService;
|
||||||
}
|
}
|
||||||
@@ -278,6 +281,15 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> {
|
|||||||
return network;
|
return network;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the INetworkMonitor in this NetworkAgentInfo.
|
||||||
|
*
|
||||||
|
* <p>This will be null before {@link #onNetworkMonitorCreated(INetworkMonitor)} is called.
|
||||||
|
*/
|
||||||
|
public INetworkMonitor networkMonitor() {
|
||||||
|
return mNetworkMonitor;
|
||||||
|
}
|
||||||
|
|
||||||
// Functions for manipulating the requests satisfied by this network.
|
// Functions for manipulating the requests satisfied by this network.
|
||||||
//
|
//
|
||||||
// These functions must only called on ConnectivityService's main thread.
|
// These functions must only called on ConnectivityService's main thread.
|
||||||
|
|||||||
@@ -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_MOBILE_MMS;
|
||||||
import static android.net.ConnectivityManager.TYPE_NONE;
|
import static android.net.ConnectivityManager.TYPE_NONE;
|
||||||
import static android.net.ConnectivityManager.TYPE_WIFI;
|
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_CAPTIVE_PORTAL;
|
||||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_CBS;
|
import static android.net.NetworkCapabilities.NET_CAPABILITY_CBS;
|
||||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_DUN;
|
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.Matchers.anyInt;
|
||||||
import static org.mockito.Mockito.any;
|
import static org.mockito.Mockito.any;
|
||||||
import static org.mockito.Mockito.atLeastOnce;
|
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.eq;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.never;
|
import static org.mockito.Mockito.never;
|
||||||
import static org.mockito.Mockito.reset;
|
import static org.mockito.Mockito.reset;
|
||||||
import static org.mockito.Mockito.spy;
|
import static org.mockito.Mockito.spy;
|
||||||
|
import static org.mockito.Mockito.timeout;
|
||||||
import static org.mockito.Mockito.times;
|
import static org.mockito.Mockito.times;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.verifyNoMoreInteractions;
|
import static org.mockito.Mockito.verifyNoMoreInteractions;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
|
||||||
import android.app.NotificationManager;
|
import android.app.NotificationManager;
|
||||||
import android.app.PendingIntent;
|
import android.app.PendingIntent;
|
||||||
import android.content.BroadcastReceiver;
|
import android.content.BroadcastReceiver;
|
||||||
@@ -89,7 +93,6 @@ import android.content.Context;
|
|||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
import android.net.CaptivePortal;
|
|
||||||
import android.net.ConnectivityManager;
|
import android.net.ConnectivityManager;
|
||||||
import android.net.ConnectivityManager.NetworkCallback;
|
import android.net.ConnectivityManager.NetworkCallback;
|
||||||
import android.net.ConnectivityManager.PacketKeepalive;
|
import android.net.ConnectivityManager.PacketKeepalive;
|
||||||
@@ -97,6 +100,8 @@ import android.net.ConnectivityManager.PacketKeepaliveCallback;
|
|||||||
import android.net.ConnectivityManager.TooManyRequestsException;
|
import android.net.ConnectivityManager.TooManyRequestsException;
|
||||||
import android.net.ConnectivityThread;
|
import android.net.ConnectivityThread;
|
||||||
import android.net.INetd;
|
import android.net.INetd;
|
||||||
|
import android.net.INetworkMonitor;
|
||||||
|
import android.net.INetworkMonitorCallbacks;
|
||||||
import android.net.INetworkPolicyListener;
|
import android.net.INetworkPolicyListener;
|
||||||
import android.net.INetworkPolicyManager;
|
import android.net.INetworkPolicyManager;
|
||||||
import android.net.INetworkStatsService;
|
import android.net.INetworkStatsService;
|
||||||
@@ -114,12 +119,14 @@ import android.net.NetworkInfo.DetailedState;
|
|||||||
import android.net.NetworkMisc;
|
import android.net.NetworkMisc;
|
||||||
import android.net.NetworkRequest;
|
import android.net.NetworkRequest;
|
||||||
import android.net.NetworkSpecifier;
|
import android.net.NetworkSpecifier;
|
||||||
|
import android.net.NetworkStack;
|
||||||
import android.net.NetworkUtils;
|
import android.net.NetworkUtils;
|
||||||
import android.net.RouteInfo;
|
import android.net.RouteInfo;
|
||||||
import android.net.StringNetworkSpecifier;
|
import android.net.StringNetworkSpecifier;
|
||||||
import android.net.UidRange;
|
import android.net.UidRange;
|
||||||
import android.net.captiveportal.CaptivePortalProbeResult;
|
|
||||||
import android.net.metrics.IpConnectivityLog;
|
import android.net.metrics.IpConnectivityLog;
|
||||||
|
import android.net.shared.NetworkMonitorUtils;
|
||||||
|
import android.net.shared.PrivateDnsConfig;
|
||||||
import android.net.util.MultinetworkPolicyTracker;
|
import android.net.util.MultinetworkPolicyTracker;
|
||||||
import android.os.ConditionVariable;
|
import android.os.ConditionVariable;
|
||||||
import android.os.Handler;
|
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.internal.util.test.FakeSettingsProvider;
|
||||||
import com.android.server.connectivity.ConnectivityConstants;
|
import com.android.server.connectivity.ConnectivityConstants;
|
||||||
import com.android.server.connectivity.DefaultNetworkMetrics;
|
import com.android.server.connectivity.DefaultNetworkMetrics;
|
||||||
import com.android.server.connectivity.DnsManager;
|
|
||||||
import com.android.server.connectivity.IpConnectivityMetrics;
|
import com.android.server.connectivity.IpConnectivityMetrics;
|
||||||
import com.android.server.connectivity.MockableSystemProperties;
|
import com.android.server.connectivity.MockableSystemProperties;
|
||||||
import com.android.server.connectivity.Nat464Xlat;
|
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.Tethering;
|
||||||
import com.android.server.connectivity.Vpn;
|
import com.android.server.connectivity.Vpn;
|
||||||
import com.android.server.net.NetworkPinner;
|
import com.android.server.net.NetworkPinner;
|
||||||
@@ -168,6 +172,7 @@ import org.mockito.ArgumentCaptor;
|
|||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
import org.mockito.MockitoAnnotations;
|
import org.mockito.MockitoAnnotations;
|
||||||
import org.mockito.Spy;
|
import org.mockito.Spy;
|
||||||
|
import org.mockito.stubbing.Answer;
|
||||||
|
|
||||||
import java.net.Inet4Address;
|
import java.net.Inet4Address;
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
@@ -230,6 +235,7 @@ public class ConnectivityServiceTest {
|
|||||||
@Mock INetworkStatsService mStatsService;
|
@Mock INetworkStatsService mStatsService;
|
||||||
@Mock INetworkPolicyManager mNpm;
|
@Mock INetworkPolicyManager mNpm;
|
||||||
@Mock INetd mMockNetd;
|
@Mock INetd mMockNetd;
|
||||||
|
@Mock NetworkStack mNetworkStack;
|
||||||
|
|
||||||
private ArgumentCaptor<String[]> mStringArrayCaptor = ArgumentCaptor.forClass(String[].class);
|
private ArgumentCaptor<String[]> mStringArrayCaptor = ArgumentCaptor.forClass(String[].class);
|
||||||
|
|
||||||
@@ -299,6 +305,7 @@ public class ConnectivityServiceTest {
|
|||||||
public Object getSystemService(String name) {
|
public Object getSystemService(String name) {
|
||||||
if (Context.CONNECTIVITY_SERVICE.equals(name)) return mCm;
|
if (Context.CONNECTIVITY_SERVICE.equals(name)) return mCm;
|
||||||
if (Context.NOTIFICATION_SERVICE.equals(name)) return mock(NotificationManager.class);
|
if (Context.NOTIFICATION_SERVICE.equals(name)) return mock(NotificationManager.class);
|
||||||
|
if (Context.NETWORK_STACK_SERVICE.equals(name)) return mNetworkStack;
|
||||||
return super.getSystemService(name);
|
return super.getSystemService(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -386,7 +393,7 @@ public class ConnectivityServiceTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class MockNetworkAgent {
|
private class MockNetworkAgent {
|
||||||
private final WrappedNetworkMonitor mWrappedNetworkMonitor;
|
private final INetworkMonitor mNetworkMonitor;
|
||||||
private final NetworkInfo mNetworkInfo;
|
private final NetworkInfo mNetworkInfo;
|
||||||
private final NetworkCapabilities mNetworkCapabilities;
|
private final NetworkCapabilities mNetworkCapabilities;
|
||||||
private final HandlerThread mHandlerThread;
|
private final HandlerThread mHandlerThread;
|
||||||
@@ -402,6 +409,26 @@ public class ConnectivityServiceTest {
|
|||||||
// mNetworkStatusReceived.
|
// mNetworkStatusReceived.
|
||||||
private String mRedirectUrl;
|
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) {
|
MockNetworkAgent(int transport) {
|
||||||
this(transport, new LinkProperties());
|
this(transport, new LinkProperties());
|
||||||
}
|
}
|
||||||
@@ -434,6 +461,29 @@ public class ConnectivityServiceTest {
|
|||||||
}
|
}
|
||||||
mHandlerThread = new HandlerThread("Mock-" + typeName);
|
mHandlerThread = new HandlerThread("Mock-" + typeName);
|
||||||
mHandlerThread.start();
|
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<Network> nmNetworkCaptor =
|
||||||
|
ArgumentCaptor.forClass(Network.class);
|
||||||
|
final ArgumentCaptor<INetworkMonitorCallbacks> nmCbCaptor =
|
||||||
|
ArgumentCaptor.forClass(INetworkMonitorCallbacks.class);
|
||||||
|
doNothing().when(mNetworkStack).makeNetworkMonitor(
|
||||||
|
nmNetworkCaptor.capture(),
|
||||||
|
any() /* name */,
|
||||||
|
nmCbCaptor.capture());
|
||||||
|
|
||||||
mNetworkAgent = new NetworkAgent(mHandlerThread.getLooper(), mServiceContext,
|
mNetworkAgent = new NetworkAgent(mHandlerThread.getLooper(), mServiceContext,
|
||||||
"Mock-" + typeName, mNetworkInfo, mNetworkCapabilities,
|
"Mock-" + typeName, mNetworkInfo, mNetworkCapabilities,
|
||||||
linkProperties, mScore, new NetworkMisc()) {
|
linkProperties, mScore, new NetworkMisc()) {
|
||||||
@@ -465,10 +515,40 @@ public class ConnectivityServiceTest {
|
|||||||
mPreventReconnectReceived.open();
|
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
|
// Waits for the NetworkAgent to be registered, which includes the creation of the
|
||||||
// NetworkMonitor.
|
// NetworkMonitor.
|
||||||
waitForIdle();
|
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) {
|
public void adjustScore(int change) {
|
||||||
@@ -539,7 +619,7 @@ public class ConnectivityServiceTest {
|
|||||||
NetworkCallback callback = null;
|
NetworkCallback callback = null;
|
||||||
final ConditionVariable validatedCv = new ConditionVariable();
|
final ConditionVariable validatedCv = new ConditionVariable();
|
||||||
if (validated) {
|
if (validated) {
|
||||||
mWrappedNetworkMonitor.gen204ProbeResult = 204;
|
setNetworkValid();
|
||||||
NetworkRequest request = new NetworkRequest.Builder()
|
NetworkRequest request = new NetworkRequest.Builder()
|
||||||
.addTransportType(mNetworkCapabilities.getTransportTypes()[0])
|
.addTransportType(mNetworkCapabilities.getTransportTypes()[0])
|
||||||
.clearCapabilities()
|
.clearCapabilities()
|
||||||
@@ -564,15 +644,14 @@ public class ConnectivityServiceTest {
|
|||||||
if (validated) {
|
if (validated) {
|
||||||
// Wait for network to validate.
|
// Wait for network to validate.
|
||||||
waitFor(validatedCv);
|
waitFor(validatedCv);
|
||||||
mWrappedNetworkMonitor.gen204ProbeResult = 500;
|
setNetworkInvalid();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (callback != null) mCm.unregisterNetworkCallback(callback);
|
if (callback != null) mCm.unregisterNetworkCallback(callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void connectWithCaptivePortal(String redirectUrl) {
|
public void connectWithCaptivePortal(String redirectUrl) {
|
||||||
mWrappedNetworkMonitor.gen204ProbeResult = 200;
|
setNetworkPortal(redirectUrl);
|
||||||
mWrappedNetworkMonitor.gen204ProbeRedirectUrl = redirectUrl;
|
|
||||||
connect(false);
|
connect(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -603,10 +682,6 @@ public class ConnectivityServiceTest {
|
|||||||
return mDisconnected;
|
return mDisconnected;
|
||||||
}
|
}
|
||||||
|
|
||||||
public WrappedNetworkMonitor getWrappedNetworkMonitor() {
|
|
||||||
return mWrappedNetworkMonitor;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void sendLinkProperties(LinkProperties lp) {
|
public void sendLinkProperties(LinkProperties lp) {
|
||||||
mNetworkAgent.sendLinkProperties(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 {
|
private class WrappedMultinetworkPolicyTracker extends MultinetworkPolicyTracker {
|
||||||
public volatile boolean configRestrictsAvoidBadWifi;
|
public volatile boolean configRestrictsAvoidBadWifi;
|
||||||
public volatile int configMeteredMultipathPreference;
|
public volatile int configMeteredMultipathPreference;
|
||||||
@@ -923,7 +976,6 @@ public class ConnectivityServiceTest {
|
|||||||
|
|
||||||
private class WrappedConnectivityService extends ConnectivityService {
|
private class WrappedConnectivityService extends ConnectivityService {
|
||||||
public WrappedMultinetworkPolicyTracker wrappedMultinetworkPolicyTracker;
|
public WrappedMultinetworkPolicyTracker wrappedMultinetworkPolicyTracker;
|
||||||
private WrappedNetworkMonitor mLastCreatedNetworkMonitor;
|
|
||||||
private MockableSystemProperties mSystemProperties;
|
private MockableSystemProperties mSystemProperties;
|
||||||
|
|
||||||
public WrappedConnectivityService(Context context, INetworkManagementService netManager,
|
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) {
|
public Nat464Xlat getNat464Xlat(MockNetworkAgent mna) {
|
||||||
return getNetworkAgentInfoForNetwork(mna.getNetwork()).clatd;
|
return getNetworkAgentInfoForNetwork(mna.getNetwork()).clatd;
|
||||||
}
|
}
|
||||||
@@ -1017,10 +1060,6 @@ public class ConnectivityServiceTest {
|
|||||||
protected void registerNetdEventCallback() {
|
protected void registerNetdEventCallback() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public WrappedNetworkMonitor getLastCreatedWrappedNetworkMonitor() {
|
|
||||||
return mLastCreatedNetworkMonitor;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void mockVpn(int uid) {
|
public void mockVpn(int uid) {
|
||||||
synchronized (mVpns) {
|
synchronized (mVpns) {
|
||||||
int userId = UserHandle.getUserId(uid);
|
int userId = UserHandle.getUserId(uid);
|
||||||
@@ -2439,7 +2478,7 @@ public class ConnectivityServiceTest {
|
|||||||
|
|
||||||
// Make captive portal disappear then revalidate.
|
// Make captive portal disappear then revalidate.
|
||||||
// Expect onLost callback because network no longer provides NET_CAPABILITY_CAPTIVE_PORTAL.
|
// Expect onLost callback because network no longer provides NET_CAPABILITY_CAPTIVE_PORTAL.
|
||||||
mWiFiNetworkAgent.getWrappedNetworkMonitor().gen204ProbeResult = 204;
|
mWiFiNetworkAgent.setNetworkValid();
|
||||||
mCm.reportNetworkConnectivity(mWiFiNetworkAgent.getNetwork(), true);
|
mCm.reportNetworkConnectivity(mWiFiNetworkAgent.getNetwork(), true);
|
||||||
captivePortalCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent);
|
captivePortalCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent);
|
||||||
|
|
||||||
@@ -2448,13 +2487,13 @@ public class ConnectivityServiceTest {
|
|||||||
|
|
||||||
// Break network connectivity.
|
// Break network connectivity.
|
||||||
// Expect NET_CAPABILITY_VALIDATED onLost callback.
|
// Expect NET_CAPABILITY_VALIDATED onLost callback.
|
||||||
mWiFiNetworkAgent.getWrappedNetworkMonitor().gen204ProbeResult = 500;
|
mWiFiNetworkAgent.setNetworkInvalid();
|
||||||
mCm.reportNetworkConnectivity(mWiFiNetworkAgent.getNetwork(), false);
|
mCm.reportNetworkConnectivity(mWiFiNetworkAgent.getNetwork(), false);
|
||||||
validatedCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent);
|
validatedCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCaptivePortalApp() {
|
public void testCaptivePortalApp() throws RemoteException {
|
||||||
final TestNetworkCallback captivePortalCallback = new TestNetworkCallback();
|
final TestNetworkCallback captivePortalCallback = new TestNetworkCallback();
|
||||||
final NetworkRequest captivePortalRequest = new NetworkRequest.Builder()
|
final NetworkRequest captivePortalRequest = new NetworkRequest.Builder()
|
||||||
.addCapability(NET_CAPABILITY_CAPTIVE_PORTAL).build();
|
.addCapability(NET_CAPABILITY_CAPTIVE_PORTAL).build();
|
||||||
@@ -2477,21 +2516,19 @@ public class ConnectivityServiceTest {
|
|||||||
mServiceContext.expectNoStartActivityIntent(fastTimeoutMs);
|
mServiceContext.expectNoStartActivityIntent(fastTimeoutMs);
|
||||||
|
|
||||||
// Turn into a captive portal.
|
// Turn into a captive portal.
|
||||||
mWiFiNetworkAgent.getWrappedNetworkMonitor().gen204ProbeResult = 302;
|
mWiFiNetworkAgent.setNetworkPortal("http://example.com");
|
||||||
mCm.reportNetworkConnectivity(wifiNetwork, false);
|
mCm.reportNetworkConnectivity(wifiNetwork, false);
|
||||||
captivePortalCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent);
|
captivePortalCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent);
|
||||||
validatedCallback.expectCallback(CallbackState.LOST, 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);
|
mCm.startCaptivePortalApp(wifiNetwork);
|
||||||
Intent intent = mServiceContext.expectStartActivityIntent(TIMEOUT_MS);
|
verify(mWiFiNetworkAgent.mNetworkMonitor, timeout(TIMEOUT_MS).times(1))
|
||||||
assertEquals(ConnectivityManager.ACTION_CAPTIVE_PORTAL_SIGN_IN, intent.getAction());
|
.launchCaptivePortalApp();
|
||||||
assertEquals(wifiNetwork, intent.getExtra(ConnectivityManager.EXTRA_NETWORK));
|
|
||||||
|
|
||||||
// Have the app report that the captive portal is dismissed, and check that we revalidate.
|
// Report that the captive portal is dismissed, and check that callbacks are fired
|
||||||
mWiFiNetworkAgent.getWrappedNetworkMonitor().gen204ProbeResult = 204;
|
mWiFiNetworkAgent.setNetworkValid();
|
||||||
CaptivePortal c = (CaptivePortal) intent.getExtra(ConnectivityManager.EXTRA_CAPTIVE_PORTAL);
|
mWiFiNetworkAgent.mNetworkMonitor.forceReevaluation(Process.myUid());
|
||||||
c.reportCaptivePortalDismissed();
|
|
||||||
validatedCallback.expectAvailableCallbacksValidated(mWiFiNetworkAgent);
|
validatedCallback.expectAvailableCallbacksValidated(mWiFiNetworkAgent);
|
||||||
captivePortalCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent);
|
captivePortalCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent);
|
||||||
|
|
||||||
@@ -2524,20 +2561,6 @@ public class ConnectivityServiceTest {
|
|||||||
waitFor(avoidCv);
|
waitFor(avoidCv);
|
||||||
|
|
||||||
assertNoCallbacks(captivePortalCallback, validatedCallback);
|
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() {
|
private NetworkRequest.Builder newWifiRequestBuilder() {
|
||||||
@@ -3169,7 +3192,7 @@ public class ConnectivityServiceTest {
|
|||||||
Network wifiNetwork = mWiFiNetworkAgent.getNetwork();
|
Network wifiNetwork = mWiFiNetworkAgent.getNetwork();
|
||||||
|
|
||||||
// Fail validation on wifi.
|
// Fail validation on wifi.
|
||||||
mWiFiNetworkAgent.getWrappedNetworkMonitor().gen204ProbeResult = 599;
|
mWiFiNetworkAgent.setNetworkInvalid();
|
||||||
mCm.reportNetworkConnectivity(wifiNetwork, false);
|
mCm.reportNetworkConnectivity(wifiNetwork, false);
|
||||||
defaultCallback.expectCapabilitiesWithout(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent);
|
defaultCallback.expectCapabilitiesWithout(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent);
|
||||||
validatedWifiCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent);
|
validatedWifiCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent);
|
||||||
@@ -3213,7 +3236,7 @@ public class ConnectivityServiceTest {
|
|||||||
wifiNetwork = mWiFiNetworkAgent.getNetwork();
|
wifiNetwork = mWiFiNetworkAgent.getNetwork();
|
||||||
|
|
||||||
// Fail validation on wifi and expect the dialog to appear.
|
// Fail validation on wifi and expect the dialog to appear.
|
||||||
mWiFiNetworkAgent.getWrappedNetworkMonitor().gen204ProbeResult = 599;
|
mWiFiNetworkAgent.setNetworkInvalid();
|
||||||
mCm.reportNetworkConnectivity(wifiNetwork, false);
|
mCm.reportNetworkConnectivity(wifiNetwork, false);
|
||||||
defaultCallback.expectCapabilitiesWithout(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent);
|
defaultCallback.expectCapabilitiesWithout(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent);
|
||||||
validatedWifiCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent);
|
validatedWifiCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent);
|
||||||
@@ -4002,11 +4025,9 @@ public class ConnectivityServiceTest {
|
|||||||
final String TLS_SERVER6 = "2001:db8:53::53";
|
final String TLS_SERVER6 = "2001:db8:53::53";
|
||||||
final InetAddress[] TLS_IPS = new InetAddress[]{ InetAddress.getByName(TLS_SERVER6) };
|
final InetAddress[] TLS_IPS = new InetAddress[]{ InetAddress.getByName(TLS_SERVER6) };
|
||||||
final String[] TLS_SERVERS = new String[]{ TLS_SERVER6 };
|
final String[] TLS_SERVERS = new String[]{ TLS_SERVER6 };
|
||||||
final Handler h = mCellNetworkAgent.getWrappedNetworkMonitor().connectivityHandler;
|
mCellNetworkAgent.mNmCallbacks.notifyPrivateDnsConfigResolved(
|
||||||
h.sendMessage(h.obtainMessage(
|
new PrivateDnsConfig(TLS_SPECIFIER, TLS_IPS).toParcel());
|
||||||
NetworkMonitor.EVENT_PRIVATE_DNS_CONFIG_RESOLVED, 0,
|
|
||||||
mCellNetworkAgent.getNetwork().netId,
|
|
||||||
new DnsManager.PrivateDnsConfig(TLS_SPECIFIER, TLS_IPS)));
|
|
||||||
waitForIdle();
|
waitForIdle();
|
||||||
verify(mNetworkManagementService, atLeastOnce()).setDnsConfigurationForNetwork(
|
verify(mNetworkManagementService, atLeastOnce()).setDnsConfigurationForNetwork(
|
||||||
anyInt(), mStringArrayCaptor.capture(), any(), any(),
|
anyInt(), mStringArrayCaptor.capture(), any(), any(),
|
||||||
@@ -4294,6 +4315,12 @@ public class ConnectivityServiceTest {
|
|||||||
ranges.add(new UidRange(uid, uid));
|
ranges.add(new UidRange(uid, uid));
|
||||||
mMockVpn.setNetworkAgent(vpnNetworkAgent);
|
mMockVpn.setNetworkAgent(vpnNetworkAgent);
|
||||||
mMockVpn.setUids(ranges);
|
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);
|
vpnNetworkAgent.connect(false);
|
||||||
mMockVpn.connect();
|
mMockVpn.connect();
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
package com.android.server.connectivity;
|
package com.android.server.connectivity;
|
||||||
|
|
||||||
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_OPPORTUNISTIC;
|
|
||||||
import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME;
|
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_DEFAULT_MODE;
|
||||||
import static android.provider.Settings.Global.PRIVATE_DNS_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.junit.Assert.assertTrue;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
import android.content.ContentResolver;
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.net.IpPrefix;
|
import android.net.IpPrefix;
|
||||||
import android.net.LinkAddress;
|
import android.net.LinkAddress;
|
||||||
import android.net.LinkProperties;
|
import android.net.LinkProperties;
|
||||||
import android.net.Network;
|
import android.net.Network;
|
||||||
import android.net.RouteInfo;
|
import android.net.RouteInfo;
|
||||||
|
import android.net.shared.PrivateDnsConfig;
|
||||||
import android.os.INetworkManagementService;
|
import android.os.INetworkManagementService;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
import android.support.test.filters.SmallTest;
|
import android.support.test.filters.SmallTest;
|
||||||
@@ -43,18 +42,16 @@ import android.support.test.runner.AndroidJUnit4;
|
|||||||
import android.test.mock.MockContentResolver;
|
import android.test.mock.MockContentResolver;
|
||||||
|
|
||||||
import com.android.internal.util.test.FakeSettingsProvider;
|
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.net.InetAddress;
|
||||||
import java.util.Arrays;
|
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}.
|
* Tests for {@link DnsManager}.
|
||||||
*
|
*
|
||||||
@@ -133,7 +130,7 @@ public class DnsManagerTest {
|
|||||||
PRIVATE_DNS_MODE, PRIVATE_DNS_MODE_PROVIDER_HOSTNAME);
|
PRIVATE_DNS_MODE, PRIVATE_DNS_MODE_PROVIDER_HOSTNAME);
|
||||||
Settings.Global.putString(mContentResolver, PRIVATE_DNS_SPECIFIER, "strictmode.com");
|
Settings.Global.putString(mContentResolver, PRIVATE_DNS_SPECIFIER, "strictmode.com");
|
||||||
mDnsManager.updatePrivateDns(new Network(TEST_NETID),
|
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("6.6.6.6"),
|
||||||
InetAddress.parseNumericAddress("2001:db8:66:66::1")
|
InetAddress.parseNumericAddress("2001:db8:66:66::1")
|
||||||
}));
|
}));
|
||||||
|
|||||||
@@ -23,10 +23,10 @@ import static org.mockito.Mockito.anyBoolean;
|
|||||||
import static org.mockito.Mockito.anyInt;
|
import static org.mockito.Mockito.anyInt;
|
||||||
import static org.mockito.Mockito.eq;
|
import static org.mockito.Mockito.eq;
|
||||||
import static org.mockito.Mockito.never;
|
import static org.mockito.Mockito.never;
|
||||||
|
import static org.mockito.Mockito.reset;
|
||||||
import static org.mockito.Mockito.times;
|
import static org.mockito.Mockito.times;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
import static org.mockito.Mockito.reset;
|
|
||||||
|
|
||||||
import android.app.PendingIntent;
|
import android.app.PendingIntent;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
@@ -36,18 +36,18 @@ import android.net.Network;
|
|||||||
import android.net.NetworkCapabilities;
|
import android.net.NetworkCapabilities;
|
||||||
import android.net.NetworkInfo;
|
import android.net.NetworkInfo;
|
||||||
import android.net.NetworkMisc;
|
import android.net.NetworkMisc;
|
||||||
import android.support.test.runner.AndroidJUnit4;
|
import android.net.NetworkStack;
|
||||||
import android.support.test.filters.SmallTest;
|
import android.support.test.filters.SmallTest;
|
||||||
|
import android.support.test.runner.AndroidJUnit4;
|
||||||
import android.text.format.DateUtils;
|
import android.text.format.DateUtils;
|
||||||
|
|
||||||
import com.android.internal.R;
|
import com.android.internal.R;
|
||||||
import com.android.server.ConnectivityService;
|
import com.android.server.ConnectivityService;
|
||||||
import com.android.server.connectivity.NetworkNotificationManager;
|
|
||||||
import com.android.server.connectivity.NetworkNotificationManager.NotificationType;
|
import com.android.server.connectivity.NetworkNotificationManager.NotificationType;
|
||||||
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
import org.mockito.MockitoAnnotations;
|
import org.mockito.MockitoAnnotations;
|
||||||
|
|
||||||
@@ -70,13 +70,16 @@ public class LingerMonitorTest {
|
|||||||
@Mock NetworkMisc mMisc;
|
@Mock NetworkMisc mMisc;
|
||||||
@Mock NetworkNotificationManager mNotifier;
|
@Mock NetworkNotificationManager mNotifier;
|
||||||
@Mock Resources mResources;
|
@Mock Resources mResources;
|
||||||
|
@Mock NetworkStack mNetworkStack;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
MockitoAnnotations.initMocks(this);
|
MockitoAnnotations.initMocks(this);
|
||||||
when(mCtx.getResources()).thenReturn(mResources);
|
when(mCtx.getResources()).thenReturn(mResources);
|
||||||
when(mCtx.getPackageName()).thenReturn("com.android.server.connectivity");
|
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);
|
mMonitor = new TestableLingerMonitor(mCtx, mNotifier, HIGH_DAILY_LIMIT, HIGH_RATE_LIMIT);
|
||||||
}
|
}
|
||||||
@@ -349,7 +352,7 @@ public class LingerMonitorTest {
|
|||||||
caps.addCapability(0);
|
caps.addCapability(0);
|
||||||
caps.addTransportType(transport);
|
caps.addTransportType(transport);
|
||||||
NetworkAgentInfo nai = new NetworkAgentInfo(null, null, new Network(netId), info, null,
|
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;
|
nai.everValidated = true;
|
||||||
return nai;
|
return nai;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user