Snap for 6279178 from 54df41a8815959772c8088e3a4da545edecbfd4e to rvc-release

Change-Id: I7a1f4f7a982cdba25cd9954cf4e2103bbcbe0621
This commit is contained in:
android-build-team Robot
2020-03-10 02:12:27 +00:00
8 changed files with 93 additions and 265 deletions

View File

@@ -53,7 +53,6 @@ import android.os.RemoteException;
import android.os.ResultReceiver; import android.os.ResultReceiver;
import android.os.ServiceManager; import android.os.ServiceManager;
import android.os.ServiceSpecificException; import android.os.ServiceSpecificException;
import android.os.SystemClock;
import android.provider.Settings; import android.provider.Settings;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
@@ -808,7 +807,7 @@ public class ConnectivityManager {
private INetworkManagementService mNMService; private INetworkManagementService mNMService;
private INetworkPolicyManager mNPManager; private INetworkPolicyManager mNPManager;
private TetheringManager mTetheringManager; private final TetheringManager mTetheringManager;
/** /**
* Tests if a given integer represents a valid network type. * Tests if a given integer represents a valid network type.
@@ -2274,6 +2273,7 @@ public class ConnectivityManager {
public ConnectivityManager(Context context, IConnectivityManager service) { public ConnectivityManager(Context context, IConnectivityManager service) {
mContext = Preconditions.checkNotNull(context, "missing context"); mContext = Preconditions.checkNotNull(context, "missing context");
mService = Preconditions.checkNotNull(service, "missing IConnectivityManager"); mService = Preconditions.checkNotNull(service, "missing IConnectivityManager");
mTetheringManager = (TetheringManager) mContext.getSystemService(Context.TETHERING_SERVICE);
sInstance = this; sInstance = this;
} }
@@ -2347,28 +2347,6 @@ public class ConnectivityManager {
return getInstanceOrNull(); return getInstanceOrNull();
} }
private static final int TETHERING_TIMEOUT_MS = 60_000;
private final Object mTetheringLock = new Object();
private TetheringManager getTetheringManager() {
synchronized (mTetheringLock) {
if (mTetheringManager != null) {
return mTetheringManager;
}
final long before = System.currentTimeMillis();
while ((mTetheringManager = (TetheringManager) mContext.getSystemService(
Context.TETHERING_SERVICE)) == null) {
if (System.currentTimeMillis() - before > TETHERING_TIMEOUT_MS) {
Log.e(TAG, "Timeout waiting tethering service not ready yet");
throw new IllegalStateException("No tethering service yet");
}
SystemClock.sleep(100);
}
return mTetheringManager;
}
}
/** /**
* Get the set of tetherable, available interfaces. This list is limited by * Get the set of tetherable, available interfaces. This list is limited by
* device configuration and current interface existence. * device configuration and current interface existence.
@@ -2382,7 +2360,7 @@ public class ConnectivityManager {
@UnsupportedAppUsage @UnsupportedAppUsage
@Deprecated @Deprecated
public String[] getTetherableIfaces() { public String[] getTetherableIfaces() {
return getTetheringManager().getTetherableIfaces(); return mTetheringManager.getTetherableIfaces();
} }
/** /**
@@ -2397,7 +2375,7 @@ public class ConnectivityManager {
@UnsupportedAppUsage @UnsupportedAppUsage
@Deprecated @Deprecated
public String[] getTetheredIfaces() { public String[] getTetheredIfaces() {
return getTetheringManager().getTetheredIfaces(); return mTetheringManager.getTetheredIfaces();
} }
/** /**
@@ -2418,7 +2396,7 @@ public class ConnectivityManager {
@UnsupportedAppUsage @UnsupportedAppUsage
@Deprecated @Deprecated
public String[] getTetheringErroredIfaces() { public String[] getTetheringErroredIfaces() {
return getTetheringManager().getTetheringErroredIfaces(); return mTetheringManager.getTetheringErroredIfaces();
} }
/** /**
@@ -2462,7 +2440,7 @@ public class ConnectivityManager {
@UnsupportedAppUsage @UnsupportedAppUsage
@Deprecated @Deprecated
public int tether(String iface) { public int tether(String iface) {
return getTetheringManager().tether(iface); return mTetheringManager.tether(iface);
} }
/** /**
@@ -2486,7 +2464,7 @@ public class ConnectivityManager {
@UnsupportedAppUsage @UnsupportedAppUsage
@Deprecated @Deprecated
public int untether(String iface) { public int untether(String iface) {
return getTetheringManager().untether(iface); return mTetheringManager.untether(iface);
} }
/** /**
@@ -2512,7 +2490,7 @@ public class ConnectivityManager {
@RequiresPermission(anyOf = {android.Manifest.permission.TETHER_PRIVILEGED, @RequiresPermission(anyOf = {android.Manifest.permission.TETHER_PRIVILEGED,
android.Manifest.permission.WRITE_SETTINGS}) android.Manifest.permission.WRITE_SETTINGS})
public boolean isTetheringSupported() { public boolean isTetheringSupported() {
return getTetheringManager().isTetheringSupported(); return mTetheringManager.isTetheringSupported();
} }
/** /**
@@ -2605,7 +2583,7 @@ public class ConnectivityManager {
final TetheringRequest request = new TetheringRequest.Builder(type) final TetheringRequest request = new TetheringRequest.Builder(type)
.setSilentProvisioning(!showProvisioningUi).build(); .setSilentProvisioning(!showProvisioningUi).build();
getTetheringManager().startTethering(request, executor, tetheringCallback); mTetheringManager.startTethering(request, executor, tetheringCallback);
} }
/** /**
@@ -2624,7 +2602,7 @@ public class ConnectivityManager {
@Deprecated @Deprecated
@RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED)
public void stopTethering(int type) { public void stopTethering(int type) {
getTetheringManager().stopTethering(type); mTetheringManager.stopTethering(type);
} }
/** /**
@@ -2682,7 +2660,7 @@ public class ConnectivityManager {
synchronized (mTetheringEventCallbacks) { synchronized (mTetheringEventCallbacks) {
mTetheringEventCallbacks.put(callback, tetherCallback); mTetheringEventCallbacks.put(callback, tetherCallback);
getTetheringManager().registerTetheringEventCallback(executor, tetherCallback); mTetheringManager.registerTetheringEventCallback(executor, tetherCallback);
} }
} }
@@ -2704,7 +2682,7 @@ public class ConnectivityManager {
synchronized (mTetheringEventCallbacks) { synchronized (mTetheringEventCallbacks) {
final TetheringEventCallback tetherCallback = final TetheringEventCallback tetherCallback =
mTetheringEventCallbacks.remove(callback); mTetheringEventCallbacks.remove(callback);
getTetheringManager().unregisterTetheringEventCallback(tetherCallback); mTetheringManager.unregisterTetheringEventCallback(tetherCallback);
} }
} }
@@ -2724,7 +2702,7 @@ public class ConnectivityManager {
@UnsupportedAppUsage @UnsupportedAppUsage
@Deprecated @Deprecated
public String[] getTetherableUsbRegexs() { public String[] getTetherableUsbRegexs() {
return getTetheringManager().getTetherableUsbRegexs(); return mTetheringManager.getTetherableUsbRegexs();
} }
/** /**
@@ -2742,7 +2720,7 @@ public class ConnectivityManager {
@UnsupportedAppUsage @UnsupportedAppUsage
@Deprecated @Deprecated
public String[] getTetherableWifiRegexs() { public String[] getTetherableWifiRegexs() {
return getTetheringManager().getTetherableWifiRegexs(); return mTetheringManager.getTetherableWifiRegexs();
} }
/** /**
@@ -2761,7 +2739,7 @@ public class ConnectivityManager {
@UnsupportedAppUsage @UnsupportedAppUsage
@Deprecated @Deprecated
public String[] getTetherableBluetoothRegexs() { public String[] getTetherableBluetoothRegexs() {
return getTetheringManager().getTetherableBluetoothRegexs(); return mTetheringManager.getTetherableBluetoothRegexs();
} }
/** /**
@@ -2785,7 +2763,7 @@ public class ConnectivityManager {
@UnsupportedAppUsage @UnsupportedAppUsage
@Deprecated @Deprecated
public int setUsbTethering(boolean enable) { public int setUsbTethering(boolean enable) {
return getTetheringManager().setUsbTethering(enable); return mTetheringManager.setUsbTethering(enable);
} }
/** /**
@@ -2902,7 +2880,7 @@ public class ConnectivityManager {
@UnsupportedAppUsage @UnsupportedAppUsage
@Deprecated @Deprecated
public int getLastTetherError(String iface) { public int getLastTetherError(String iface) {
return getTetheringManager().getLastTetherError(iface); return mTetheringManager.getLastTetherError(iface);
} }
/** @hide */ /** @hide */
@@ -2973,7 +2951,7 @@ public class ConnectivityManager {
} }
}; };
getTetheringManager().requestLatestTetheringEntitlementResult(type, wrappedListener, mTetheringManager.requestLatestTetheringEntitlementResult(type, wrappedListener,
showEntitlementUi); showEntitlementUi);
} }
@@ -4469,7 +4447,7 @@ public class ConnectivityManager {
public void factoryReset() { public void factoryReset() {
try { try {
mService.factoryReset(); mService.factoryReset();
getTetheringManager().stopAllTethering(); mTetheringManager.stopAllTethering();
} catch (RemoteException e) { } catch (RemoteException e) {
throw e.rethrowFromSystemServer(); throw e.rethrowFromSystemServer();
} }

View File

@@ -126,7 +126,7 @@ public abstract class NetworkAgent {
/** /**
* Sent by the NetworkAgent to ConnectivityService to pass the current * Sent by the NetworkAgent to ConnectivityService to pass the current
* network score. * network score.
* obj = network score Integer * arg1 = network score int
* @hide * @hide
*/ */
public static final int EVENT_NETWORK_SCORE_CHANGED = BASE + 4; public static final int EVENT_NETWORK_SCORE_CHANGED = BASE + 4;
@@ -650,18 +650,7 @@ public abstract class NetworkAgent {
if (score < 0) { if (score < 0) {
throw new IllegalArgumentException("Score must be >= 0"); throw new IllegalArgumentException("Score must be >= 0");
} }
final NetworkScore ns = new NetworkScore(); queueOrSendMessage(EVENT_NETWORK_SCORE_CHANGED, score, 0);
ns.putIntExtension(NetworkScore.LEGACY_SCORE, score);
updateScore(ns);
}
/**
* Must be called by the agent when it has a new {@link NetworkScore} for this network.
* @param ns the new score.
* @hide TODO: unhide the NetworkScore class, and rename to sendNetworkScore.
*/
public void updateScore(@NonNull NetworkScore ns) {
queueOrSendMessage(EVENT_NETWORK_SCORE_CHANGED, new NetworkScore(ns));
} }
/** /**

View File

@@ -1,162 +0,0 @@
/*
* Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.net;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import java.util.Objects;
/**
* Object representing the quality of a network as perceived by the user.
*
* A NetworkScore object represents the characteristics of a network that affects how good the
* network is considered for a particular use.
* @hide
*/
public final class NetworkScore implements Parcelable {
// The key of bundle which is used to get the legacy network score of NetworkAgentInfo.
// TODO: Remove this when the transition to NetworkScore is over.
public static final String LEGACY_SCORE = "LEGACY_SCORE";
@NonNull
private final Bundle mExtensions;
public NetworkScore() {
mExtensions = new Bundle();
}
public NetworkScore(@NonNull NetworkScore source) {
mExtensions = new Bundle(source.mExtensions);
}
/**
* Put the value of parcelable inside the bundle by key.
*/
public void putExtension(@Nullable String key, @Nullable Parcelable value) {
mExtensions.putParcelable(key, value);
}
/**
* Put the value of int inside the bundle by key.
*/
public void putIntExtension(@Nullable String key, int value) {
mExtensions.putInt(key, value);
}
/**
* Get the value of non primitive type by key.
*/
public <T extends Parcelable> T getExtension(@Nullable String key) {
return mExtensions.getParcelable(key);
}
/**
* Get the value of int by key.
*/
public int getIntExtension(@Nullable String key) {
return mExtensions.getInt(key);
}
/**
* Remove the entry by given key.
*/
public void removeExtension(@Nullable String key) {
mExtensions.remove(key);
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
synchronized (this) {
dest.writeBundle(mExtensions);
}
}
public static final @NonNull Creator<NetworkScore> CREATOR = new Creator<NetworkScore>() {
@Override
public NetworkScore createFromParcel(@NonNull Parcel in) {
return new NetworkScore(in);
}
@Override
public NetworkScore[] newArray(int size) {
return new NetworkScore[size];
}
};
private NetworkScore(@NonNull Parcel in) {
mExtensions = in.readBundle();
}
// TODO: Modify this method once new fields are added into this class.
@Override
public boolean equals(@Nullable Object obj) {
if (!(obj instanceof NetworkScore)) {
return false;
}
final NetworkScore other = (NetworkScore) obj;
return bundlesEqual(mExtensions, other.mExtensions);
}
@Override
public int hashCode() {
int result = 29;
for (String key : mExtensions.keySet()) {
final Object value = mExtensions.get(key);
// The key may be null, so call Objects.hash() is safer.
result += 31 * value.hashCode() + 37 * Objects.hash(key);
}
return result;
}
// mExtensions won't be null since the constructor will create it.
private boolean bundlesEqual(@NonNull Bundle bundle1, @NonNull Bundle bundle2) {
if (bundle1 == bundle2) {
return true;
}
// This is unlikely but it's fine to add this clause here.
if (null == bundle1 || null == bundle2) {
return false;
}
if (bundle1.size() != bundle2.size()) {
return false;
}
for (String key : bundle1.keySet()) {
final Object value1 = bundle1.get(key);
final Object value2 = bundle2.get(key);
if (!Objects.equals(value1, value2)) {
return false;
}
}
return true;
}
/** Convert to a string */
public String toString() {
return "NetworkScore[" + mExtensions.toString() + "]";
}
}

View File

@@ -101,7 +101,6 @@ import android.net.NetworkPolicyManager;
import android.net.NetworkProvider; import android.net.NetworkProvider;
import android.net.NetworkQuotaInfo; import android.net.NetworkQuotaInfo;
import android.net.NetworkRequest; import android.net.NetworkRequest;
import android.net.NetworkScore;
import android.net.NetworkSpecifier; import android.net.NetworkSpecifier;
import android.net.NetworkStack; import android.net.NetworkStack;
import android.net.NetworkStackClient; import android.net.NetworkStackClient;
@@ -2731,8 +2730,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
break; break;
} }
case NetworkAgent.EVENT_NETWORK_SCORE_CHANGED: { case NetworkAgent.EVENT_NETWORK_SCORE_CHANGED: {
final NetworkScore ns = (NetworkScore) msg.obj; updateNetworkScore(nai, msg.arg1);
updateNetworkScore(nai, ns);
break; break;
} }
case NetworkAgent.EVENT_SET_EXPLICITLY_SELECTED: { case NetworkAgent.EVENT_SET_EXPLICITLY_SELECTED: {
@@ -5819,12 +5817,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
// TODO: Instead of passing mDefaultRequest, provide an API to determine whether a Network // TODO: Instead of passing mDefaultRequest, provide an API to determine whether a Network
// satisfies mDefaultRequest. // satisfies mDefaultRequest.
final NetworkCapabilities nc = new NetworkCapabilities(networkCapabilities); final NetworkCapabilities nc = new NetworkCapabilities(networkCapabilities);
final NetworkScore ns = new NetworkScore();
ns.putIntExtension(NetworkScore.LEGACY_SCORE, currentScore);
final NetworkAgentInfo nai = new NetworkAgentInfo(messenger, new AsyncChannel(), final NetworkAgentInfo nai = new NetworkAgentInfo(messenger, new AsyncChannel(),
new Network(mNetIdManager.reserveNetId()), new NetworkInfo(networkInfo), lp, nc, new Network(mNetIdManager.reserveNetId()), new NetworkInfo(networkInfo), lp, nc,
ns, mContext, mTrackerHandler, new NetworkAgentConfig(networkAgentConfig), this, currentScore, mContext, mTrackerHandler, new NetworkAgentConfig(networkAgentConfig),
mNetd, mDnsResolver, mNMS, providerId); this, mNetd, mDnsResolver, mNMS, providerId);
// Make sure the network capabilities reflect what the agent info says. // Make sure the network capabilities reflect what the agent info says.
nai.getAndSetNetworkCapabilities(mixInCapabilities(nai, nc)); nai.getAndSetNetworkCapabilities(mixInCapabilities(nai, nc));
final String extraInfo = networkInfo.getExtraInfo(); final String extraInfo = networkInfo.getExtraInfo();
@@ -7082,9 +7078,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
} }
} }
private void updateNetworkScore(NetworkAgentInfo nai, NetworkScore ns) { private void updateNetworkScore(@NonNull final NetworkAgentInfo nai, final int score) {
if (VDBG || DDBG) log("updateNetworkScore for " + nai.toShortString() + " to " + ns); if (VDBG || DDBG) log("updateNetworkScore for " + nai.toShortString() + " to " + score);
nai.setNetworkScore(ns); nai.setScore(score);
rematchAllNetworksAndRequests(); rematchAllNetworksAndRequests();
sendUpdatedScoreToFactories(nai); sendUpdatedScoreToFactories(nai);
} }

View File

@@ -32,7 +32,6 @@ import android.net.NetworkCapabilities;
import android.net.NetworkInfo; import android.net.NetworkInfo;
import android.net.NetworkMonitorManager; import android.net.NetworkMonitorManager;
import android.net.NetworkRequest; import android.net.NetworkRequest;
import android.net.NetworkScore;
import android.net.NetworkState; import android.net.NetworkState;
import android.os.Handler; import android.os.Handler;
import android.os.INetworkManagementService; import android.os.INetworkManagementService;
@@ -236,10 +235,8 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> {
// validated). // validated).
private boolean mLingering; private boolean mLingering;
// This represents the characteristics of a network that affects how good the network is // This represents the quality of the network with no clear scale.
// considered for a particular use. private int mScore;
@NonNull
private NetworkScore mNetworkScore;
// The list of NetworkRequests being satisfied by this Network. // The list of NetworkRequests being satisfied by this Network.
private final SparseArray<NetworkRequest> mNetworkRequests = new SparseArray<>(); private final SparseArray<NetworkRequest> mNetworkRequests = new SparseArray<>();
@@ -268,7 +265,7 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> {
private final Handler mHandler; private final Handler mHandler;
public NetworkAgentInfo(Messenger messenger, AsyncChannel ac, Network net, NetworkInfo info, public NetworkAgentInfo(Messenger messenger, AsyncChannel ac, Network net, NetworkInfo info,
LinkProperties lp, NetworkCapabilities nc, @NonNull NetworkScore ns, Context context, LinkProperties lp, NetworkCapabilities nc, int score, Context context,
Handler handler, NetworkAgentConfig config, ConnectivityService connService, INetd netd, Handler handler, NetworkAgentConfig config, ConnectivityService connService, INetd netd,
IDnsResolver dnsResolver, INetworkManagementService nms, int factorySerialNumber) { IDnsResolver dnsResolver, INetworkManagementService nms, int factorySerialNumber) {
this.messenger = messenger; this.messenger = messenger;
@@ -277,7 +274,7 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> {
networkInfo = info; networkInfo = info;
linkProperties = lp; linkProperties = lp;
networkCapabilities = nc; networkCapabilities = nc;
mNetworkScore = ns; mScore = score;
clatd = new Nat464Xlat(this, netd, dnsResolver, nms); clatd = new Nat464Xlat(this, netd, dnsResolver, nms);
mConnService = connService; mConnService = connService;
mContext = context; mContext = context;
@@ -491,7 +488,7 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> {
return ConnectivityConstants.EXPLICITLY_SELECTED_NETWORK_SCORE; return ConnectivityConstants.EXPLICITLY_SELECTED_NETWORK_SCORE;
} }
int score = mNetworkScore.getIntExtension(NetworkScore.LEGACY_SCORE); int score = mScore;
if (!lastValidated && !pretendValidated && !ignoreWifiUnvalidationPenalty() && !isVPN()) { if (!lastValidated && !pretendValidated && !ignoreWifiUnvalidationPenalty() && !isVPN()) {
score -= ConnectivityConstants.UNVALIDATED_SCORE_PENALTY; score -= ConnectivityConstants.UNVALIDATED_SCORE_PENALTY;
} }
@@ -520,13 +517,8 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> {
return getCurrentScore(true); return getCurrentScore(true);
} }
public void setNetworkScore(@NonNull NetworkScore ns) { public void setScore(final int score) {
mNetworkScore = ns; mScore = score;
}
@NonNull
public NetworkScore getNetworkScore() {
return mNetworkScore;
} }
public NetworkState getNetworkState() { public NetworkState getNetworkState() {

View File

@@ -315,7 +315,7 @@ public class LinkPropertiesTest {
source.addDnsServer(DNS1); source.addDnsServer(DNS1);
source.addDnsServer(DNS2); source.addDnsServer(DNS2);
// set 2 gateways // set 2 gateways
source.addRoute(new RouteInfo(GATEWAY1)); source.addRoute(new RouteInfo(LINKADDRV4, GATEWAY1));
source.addRoute(new RouteInfo(GATEWAY2)); source.addRoute(new RouteInfo(GATEWAY2));
source.setMtu(MTU); source.setMtu(MTU);
@@ -327,7 +327,7 @@ public class LinkPropertiesTest {
target.addDnsServer(DNS2); target.addDnsServer(DNS2);
target.addDnsServer(DNS1); target.addDnsServer(DNS1);
target.addRoute(new RouteInfo(GATEWAY2)); target.addRoute(new RouteInfo(GATEWAY2));
target.addRoute(new RouteInfo(GATEWAY1)); target.addRoute(new RouteInfo(LINKADDRV4, GATEWAY1));
target.setMtu(MTU); target.setMtu(MTU);
assertLinkPropertiesEqual(source, target); assertLinkPropertiesEqual(source, target);
@@ -364,12 +364,13 @@ public class LinkPropertiesTest {
@Test @Test
public void testRouteInterfaces() { public void testRouteInterfaces() {
LinkAddress prefix = new LinkAddress(address("2001:db8::"), 32); LinkAddress prefix1 = new LinkAddress(address("2001:db8:1::"), 48);
LinkAddress prefix2 = new LinkAddress(address("2001:db8:2::"), 48);
InetAddress address = ADDRV6; InetAddress address = ADDRV6;
// Add a route with no interface to a LinkProperties with no interface. No errors. // Add a route with no interface to a LinkProperties with no interface. No errors.
LinkProperties lp = new LinkProperties(); LinkProperties lp = new LinkProperties();
RouteInfo r = new RouteInfo(prefix, address, null); RouteInfo r = new RouteInfo(prefix1, address, null);
assertTrue(lp.addRoute(r)); assertTrue(lp.addRoute(r));
assertEquals(1, lp.getRoutes().size()); assertEquals(1, lp.getRoutes().size());
assertAllRoutesHaveInterface(null, lp); assertAllRoutesHaveInterface(null, lp);
@@ -379,7 +380,7 @@ public class LinkPropertiesTest {
assertEquals(1, lp.getRoutes().size()); assertEquals(1, lp.getRoutes().size());
// Add a route with an interface. Expect an exception. // Add a route with an interface. Expect an exception.
r = new RouteInfo(prefix, address, "wlan0"); r = new RouteInfo(prefix2, address, "wlan0");
try { try {
lp.addRoute(r); lp.addRoute(r);
fail("Adding wlan0 route to LP with no interface, expect exception"); fail("Adding wlan0 route to LP with no interface, expect exception");
@@ -398,7 +399,7 @@ public class LinkPropertiesTest {
} catch (IllegalArgumentException expected) {} } catch (IllegalArgumentException expected) {}
// If the interface name matches, the route is added. // If the interface name matches, the route is added.
r = new RouteInfo(prefix, null, "wlan0"); r = new RouteInfo(prefix2, null, "wlan0");
lp.setInterfaceName("wlan0"); lp.setInterfaceName("wlan0");
lp.addRoute(r); lp.addRoute(r);
assertEquals(2, lp.getRoutes().size()); assertEquals(2, lp.getRoutes().size());
@@ -423,10 +424,12 @@ public class LinkPropertiesTest {
assertEquals(3, lp.compareAllRoutes(lp2).added.size()); assertEquals(3, lp.compareAllRoutes(lp2).added.size());
assertEquals(3, lp.compareAllRoutes(lp2).removed.size()); assertEquals(3, lp.compareAllRoutes(lp2).removed.size());
// Check remove works // Remove route with incorrect interface, no route removed.
lp.removeRoute(new RouteInfo(prefix, address, null)); lp.removeRoute(new RouteInfo(prefix2, null, null));
assertEquals(3, lp.getRoutes().size()); assertEquals(3, lp.getRoutes().size());
lp.removeRoute(new RouteInfo(prefix, address, "wlan0"));
// Check remove works when interface is correct.
lp.removeRoute(new RouteInfo(prefix2, null, "wlan0"));
assertEquals(2, lp.getRoutes().size()); assertEquals(2, lp.getRoutes().size());
assertAllRoutesHaveInterface("wlan0", lp); assertAllRoutesHaveInterface("wlan0", lp);
assertAllRoutesNotHaveInterface("p2p0", lp); assertAllRoutesNotHaveInterface("p2p0", lp);

View File

@@ -5927,6 +5927,12 @@ public class ConnectivityServiceTest {
final LinkAddress myIpv6 = new LinkAddress("2001:db8:1::1/64"); final LinkAddress myIpv6 = new LinkAddress("2001:db8:1::1/64");
final String kNat64PrefixString = "2001:db8:64:64:64:64::"; final String kNat64PrefixString = "2001:db8:64:64:64:64::";
final IpPrefix kNat64Prefix = new IpPrefix(InetAddress.getByName(kNat64PrefixString), 96); final IpPrefix kNat64Prefix = new IpPrefix(InetAddress.getByName(kNat64PrefixString), 96);
final RouteInfo defaultRoute = new RouteInfo((IpPrefix) null, myIpv6.getAddress(),
MOBILE_IFNAME);
final RouteInfo ipv6Subnet = new RouteInfo(myIpv6, null, MOBILE_IFNAME);
final RouteInfo ipv4Subnet = new RouteInfo(myIpv4, null, MOBILE_IFNAME);
final RouteInfo stackedDefault = new RouteInfo((IpPrefix) null, myIpv4.getAddress(),
CLAT_PREFIX + MOBILE_IFNAME);
final NetworkRequest networkRequest = new NetworkRequest.Builder() final NetworkRequest networkRequest = new NetworkRequest.Builder()
.addTransportType(TRANSPORT_CELLULAR) .addTransportType(TRANSPORT_CELLULAR)
@@ -5939,15 +5945,13 @@ public class ConnectivityServiceTest {
final LinkProperties cellLp = new LinkProperties(); final LinkProperties cellLp = new LinkProperties();
cellLp.setInterfaceName(MOBILE_IFNAME); cellLp.setInterfaceName(MOBILE_IFNAME);
cellLp.addLinkAddress(myIpv6); cellLp.addLinkAddress(myIpv6);
cellLp.addRoute(new RouteInfo((IpPrefix) null, myIpv6.getAddress(), MOBILE_IFNAME)); cellLp.addRoute(defaultRoute);
cellLp.addRoute(new RouteInfo(myIpv6, null, MOBILE_IFNAME)); cellLp.addRoute(ipv6Subnet);
mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR, cellLp); mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR, cellLp);
reset(mNetworkManagementService); reset(mNetworkManagementService);
reset(mMockDnsResolver); reset(mMockDnsResolver);
reset(mMockNetd); reset(mMockNetd);
reset(mBatteryStatsService); reset(mBatteryStatsService);
when(mNetworkManagementService.getInterfaceConfig(CLAT_PREFIX + MOBILE_IFNAME))
.thenReturn(getClatInterfaceConfig(myIpv4));
// Connect with ipv6 link properties. Expect prefix discovery to be started. // Connect with ipv6 link properties. Expect prefix discovery to be started.
mCellNetworkAgent.connect(true); mCellNetworkAgent.connect(true);
@@ -5955,6 +5959,7 @@ public class ConnectivityServiceTest {
waitForIdle(); waitForIdle();
verify(mMockNetd, times(1)).networkCreatePhysical(eq(cellNetId), anyInt()); verify(mMockNetd, times(1)).networkCreatePhysical(eq(cellNetId), anyInt());
assertRoutesAdded(cellNetId, ipv6Subnet, defaultRoute);
verify(mMockDnsResolver, times(1)).createNetworkCache(eq(cellNetId)); verify(mMockDnsResolver, times(1)).createNetworkCache(eq(cellNetId));
verify(mBatteryStatsService).noteNetworkInterfaceType(cellLp.getInterfaceName(), verify(mBatteryStatsService).noteNetworkInterfaceType(cellLp.getInterfaceName(),
TYPE_MOBILE); TYPE_MOBILE);
@@ -5970,6 +5975,7 @@ public class ConnectivityServiceTest {
cellLp.addLinkAddress(myIpv4); cellLp.addLinkAddress(myIpv4);
mCellNetworkAgent.sendLinkProperties(cellLp); mCellNetworkAgent.sendLinkProperties(cellLp);
networkCallback.expectCallback(CallbackEntry.LINK_PROPERTIES_CHANGED, mCellNetworkAgent); networkCallback.expectCallback(CallbackEntry.LINK_PROPERTIES_CHANGED, mCellNetworkAgent);
assertRoutesAdded(cellNetId, ipv4Subnet);
verify(mMockDnsResolver, times(1)).stopPrefix64Discovery(cellNetId); verify(mMockDnsResolver, times(1)).stopPrefix64Discovery(cellNetId);
verify(mMockDnsResolver, atLeastOnce()).setResolverConfiguration(any()); verify(mMockDnsResolver, atLeastOnce()).setResolverConfiguration(any());
@@ -5980,15 +5986,18 @@ public class ConnectivityServiceTest {
verifyNoMoreInteractions(mMockNetd); verifyNoMoreInteractions(mMockNetd);
verifyNoMoreInteractions(mMockDnsResolver); verifyNoMoreInteractions(mMockDnsResolver);
reset(mNetworkManagementService);
reset(mMockNetd); reset(mMockNetd);
reset(mMockDnsResolver); reset(mMockDnsResolver);
when(mNetworkManagementService.getInterfaceConfig(CLAT_PREFIX + MOBILE_IFNAME))
.thenReturn(getClatInterfaceConfig(myIpv4));
// Remove IPv4 address. Expect prefix discovery to be started again. // Remove IPv4 address. Expect prefix discovery to be started again.
cellLp.removeLinkAddress(myIpv4); cellLp.removeLinkAddress(myIpv4);
cellLp.removeRoute(new RouteInfo(myIpv4, null, MOBILE_IFNAME));
mCellNetworkAgent.sendLinkProperties(cellLp); mCellNetworkAgent.sendLinkProperties(cellLp);
networkCallback.expectCallback(CallbackEntry.LINK_PROPERTIES_CHANGED, mCellNetworkAgent); networkCallback.expectCallback(CallbackEntry.LINK_PROPERTIES_CHANGED, mCellNetworkAgent);
verify(mMockDnsResolver, times(1)).startPrefix64Discovery(cellNetId); verify(mMockDnsResolver, times(1)).startPrefix64Discovery(cellNetId);
assertRoutesRemoved(cellNetId, ipv4Subnet);
// When NAT64 prefix discovery succeeds, LinkProperties are updated and clatd is started. // When NAT64 prefix discovery succeeds, LinkProperties are updated and clatd is started.
Nat464Xlat clat = getNat464Xlat(mCellNetworkAgent); Nat464Xlat clat = getNat464Xlat(mCellNetworkAgent);
@@ -6007,6 +6016,7 @@ public class ConnectivityServiceTest {
List<LinkProperties> stackedLps = mCm.getLinkProperties(mCellNetworkAgent.getNetwork()) List<LinkProperties> stackedLps = mCm.getLinkProperties(mCellNetworkAgent.getNetwork())
.getStackedLinks(); .getStackedLinks();
assertEquals(makeClatLinkProperties(myIpv4), stackedLps.get(0)); assertEquals(makeClatLinkProperties(myIpv4), stackedLps.get(0));
assertRoutesAdded(cellNetId, stackedDefault);
// Change trivial linkproperties and see if stacked link is preserved. // Change trivial linkproperties and see if stacked link is preserved.
cellLp.addDnsServer(InetAddress.getByName("8.8.8.8")); cellLp.addDnsServer(InetAddress.getByName("8.8.8.8"));
@@ -6032,9 +6042,10 @@ public class ConnectivityServiceTest {
// Add ipv4 address, expect that clatd and prefix discovery are stopped and stacked // Add ipv4 address, expect that clatd and prefix discovery are stopped and stacked
// linkproperties are cleaned up. // linkproperties are cleaned up.
cellLp.addLinkAddress(myIpv4); cellLp.addLinkAddress(myIpv4);
cellLp.addRoute(new RouteInfo(myIpv4, null, MOBILE_IFNAME)); cellLp.addRoute(ipv4Subnet);
mCellNetworkAgent.sendLinkProperties(cellLp); mCellNetworkAgent.sendLinkProperties(cellLp);
networkCallback.expectCallback(CallbackEntry.LINK_PROPERTIES_CHANGED, mCellNetworkAgent); networkCallback.expectCallback(CallbackEntry.LINK_PROPERTIES_CHANGED, mCellNetworkAgent);
assertRoutesAdded(cellNetId, ipv4Subnet);
verify(mMockNetd, times(1)).clatdStop(MOBILE_IFNAME); verify(mMockNetd, times(1)).clatdStop(MOBILE_IFNAME);
verify(mMockDnsResolver, times(1)).stopPrefix64Discovery(cellNetId); verify(mMockDnsResolver, times(1)).stopPrefix64Discovery(cellNetId);
@@ -6045,6 +6056,7 @@ public class ConnectivityServiceTest {
expected.setNat64Prefix(kNat64Prefix); expected.setNat64Prefix(kNat64Prefix);
assertEquals(expected, actualLpAfterIpv4); assertEquals(expected, actualLpAfterIpv4);
assertEquals(0, actualLpAfterIpv4.getStackedLinks().size()); assertEquals(0, actualLpAfterIpv4.getStackedLinks().size());
assertRoutesRemoved(cellNetId, stackedDefault);
// The interface removed callback happens but has no effect after stop is called. // The interface removed callback happens but has no effect after stop is called.
clat.interfaceRemoved(CLAT_PREFIX + MOBILE_IFNAME); clat.interfaceRemoved(CLAT_PREFIX + MOBILE_IFNAME);
@@ -6052,8 +6064,11 @@ public class ConnectivityServiceTest {
verifyNoMoreInteractions(mMockNetd); verifyNoMoreInteractions(mMockNetd);
verifyNoMoreInteractions(mMockDnsResolver); verifyNoMoreInteractions(mMockDnsResolver);
reset(mNetworkManagementService);
reset(mMockNetd); reset(mMockNetd);
reset(mMockDnsResolver); reset(mMockDnsResolver);
when(mNetworkManagementService.getInterfaceConfig(CLAT_PREFIX + MOBILE_IFNAME))
.thenReturn(getClatInterfaceConfig(myIpv4));
// Stopping prefix discovery causes netd to tell us that the NAT64 prefix is gone. // Stopping prefix discovery causes netd to tell us that the NAT64 prefix is gone.
mService.mNetdEventCallback.onNat64PrefixEvent(cellNetId, false /* added */, mService.mNetdEventCallback.onNat64PrefixEvent(cellNetId, false /* added */,
@@ -6067,6 +6082,7 @@ public class ConnectivityServiceTest {
cellLp.removeDnsServer(InetAddress.getByName("8.8.8.8")); cellLp.removeDnsServer(InetAddress.getByName("8.8.8.8"));
mCellNetworkAgent.sendLinkProperties(cellLp); mCellNetworkAgent.sendLinkProperties(cellLp);
networkCallback.expectCallback(CallbackEntry.LINK_PROPERTIES_CHANGED, mCellNetworkAgent); networkCallback.expectCallback(CallbackEntry.LINK_PROPERTIES_CHANGED, mCellNetworkAgent);
assertRoutesRemoved(cellNetId, ipv4Subnet); // Directly-connected routes auto-added.
verify(mMockDnsResolver, times(1)).startPrefix64Discovery(cellNetId); verify(mMockDnsResolver, times(1)).startPrefix64Discovery(cellNetId);
mService.mNetdEventCallback.onNat64PrefixEvent(cellNetId, true /* added */, mService.mNetdEventCallback.onNat64PrefixEvent(cellNetId, true /* added */,
kNat64PrefixString, 96); kNat64PrefixString, 96);
@@ -6078,15 +6094,20 @@ public class ConnectivityServiceTest {
clat.interfaceLinkStateChanged(CLAT_PREFIX + MOBILE_IFNAME, true); clat.interfaceLinkStateChanged(CLAT_PREFIX + MOBILE_IFNAME, true);
networkCallback.expectLinkPropertiesThat(mCellNetworkAgent, networkCallback.expectLinkPropertiesThat(mCellNetworkAgent,
(lp) -> lp.getStackedLinks().size() == 1 && lp.getNat64Prefix() != null); (lp) -> lp.getStackedLinks().size() == 1 && lp.getNat64Prefix() != null);
assertRoutesAdded(cellNetId, stackedDefault);
// NAT64 prefix is removed. Expect that clat is stopped. // NAT64 prefix is removed. Expect that clat is stopped.
mService.mNetdEventCallback.onNat64PrefixEvent(cellNetId, false /* added */, mService.mNetdEventCallback.onNat64PrefixEvent(cellNetId, false /* added */,
kNat64PrefixString, 96); kNat64PrefixString, 96);
networkCallback.expectLinkPropertiesThat(mCellNetworkAgent, networkCallback.expectLinkPropertiesThat(mCellNetworkAgent,
(lp) -> lp.getStackedLinks().size() == 0 && lp.getNat64Prefix() == null); (lp) -> lp.getStackedLinks().size() == 0 && lp.getNat64Prefix() == null);
assertRoutesRemoved(cellNetId, ipv4Subnet, stackedDefault);
// Stop has no effect because clat is already stopped.
verify(mMockNetd, times(1)).clatdStop(MOBILE_IFNAME); verify(mMockNetd, times(1)).clatdStop(MOBILE_IFNAME);
networkCallback.expectLinkPropertiesThat(mCellNetworkAgent, networkCallback.expectLinkPropertiesThat(mCellNetworkAgent,
(lp) -> lp.getStackedLinks().size() == 0); (lp) -> lp.getStackedLinks().size() == 0);
verifyNoMoreInteractions(mMockNetd);
// Clean up. // Clean up.
mCellNetworkAgent.disconnect(); mCellNetworkAgent.disconnect();
@@ -6654,6 +6675,20 @@ public class ConnectivityServiceTest {
} }
} }
private void assertRoutesAdded(int netId, RouteInfo... routes) throws Exception {
InOrder inOrder = inOrder(mNetworkManagementService);
for (int i = 0; i < routes.length; i++) {
inOrder.verify(mNetworkManagementService).addRoute(eq(netId), eq(routes[i]));
}
}
private void assertRoutesRemoved(int netId, RouteInfo... routes) throws Exception {
InOrder inOrder = inOrder(mNetworkManagementService);
for (int i = 0; i < routes.length; i++) {
inOrder.verify(mNetworkManagementService).removeRoute(eq(netId), eq(routes[i]));
}
}
@Test @Test
public void testRegisterUnregisterConnectivityDiagnosticsCallback() throws Exception { public void testRegisterUnregisterConnectivityDiagnosticsCallback() throws Exception {
final NetworkRequest wifiRequest = final NetworkRequest wifiRequest =
@@ -6715,7 +6750,7 @@ public class ConnectivityServiceTest {
public void testCheckConnectivityDiagnosticsPermissionsNetworkStack() throws Exception { public void testCheckConnectivityDiagnosticsPermissionsNetworkStack() throws Exception {
final NetworkAgentInfo naiWithoutUid = final NetworkAgentInfo naiWithoutUid =
new NetworkAgentInfo( new NetworkAgentInfo(
null, null, null, null, null, new NetworkCapabilities(), null, null, null, null, null, null, new NetworkCapabilities(), 0,
mServiceContext, null, null, mService, null, null, null, 0); mServiceContext, null, null, mService, null, null, null, 0);
mServiceContext.setPermission( mServiceContext.setPermission(
@@ -6731,7 +6766,7 @@ public class ConnectivityServiceTest {
public void testCheckConnectivityDiagnosticsPermissionsNoLocationPermission() throws Exception { public void testCheckConnectivityDiagnosticsPermissionsNoLocationPermission() throws Exception {
final NetworkAgentInfo naiWithoutUid = final NetworkAgentInfo naiWithoutUid =
new NetworkAgentInfo( new NetworkAgentInfo(
null, null, null, null, null, new NetworkCapabilities(), null, null, null, null, null, null, new NetworkCapabilities(), 0,
mServiceContext, null, null, mService, null, null, null, 0); mServiceContext, null, null, mService, null, null, null, 0);
mServiceContext.setPermission(android.Manifest.permission.NETWORK_STACK, PERMISSION_DENIED); mServiceContext.setPermission(android.Manifest.permission.NETWORK_STACK, PERMISSION_DENIED);
@@ -6747,7 +6782,7 @@ public class ConnectivityServiceTest {
public void testCheckConnectivityDiagnosticsPermissionsActiveVpn() throws Exception { public void testCheckConnectivityDiagnosticsPermissionsActiveVpn() throws Exception {
final NetworkAgentInfo naiWithoutUid = final NetworkAgentInfo naiWithoutUid =
new NetworkAgentInfo( new NetworkAgentInfo(
null, null, null, null, null, new NetworkCapabilities(), null, null, null, null, null, null, new NetworkCapabilities(), 0,
mServiceContext, null, null, mService, null, null, null, 0); mServiceContext, null, null, mService, null, null, null, 0);
setupLocationPermissions(Build.VERSION_CODES.Q, true, AppOpsManager.OPSTR_FINE_LOCATION, setupLocationPermissions(Build.VERSION_CODES.Q, true, AppOpsManager.OPSTR_FINE_LOCATION,
@@ -6773,7 +6808,7 @@ public class ConnectivityServiceTest {
nc.setAdministratorUids(Arrays.asList(Process.myUid())); nc.setAdministratorUids(Arrays.asList(Process.myUid()));
final NetworkAgentInfo naiWithUid = final NetworkAgentInfo naiWithUid =
new NetworkAgentInfo( new NetworkAgentInfo(
null, null, null, null, null, nc, null, mServiceContext, null, null, null, null, null, null, null, nc, 0, mServiceContext, null, null,
mService, null, null, null, 0); mService, null, null, null, 0);
setupLocationPermissions(Build.VERSION_CODES.Q, true, AppOpsManager.OPSTR_FINE_LOCATION, setupLocationPermissions(Build.VERSION_CODES.Q, true, AppOpsManager.OPSTR_FINE_LOCATION,
@@ -6795,7 +6830,7 @@ public class ConnectivityServiceTest {
nc.setAdministratorUids(Arrays.asList(Process.myUid())); nc.setAdministratorUids(Arrays.asList(Process.myUid()));
final NetworkAgentInfo naiWithUid = final NetworkAgentInfo naiWithUid =
new NetworkAgentInfo( new NetworkAgentInfo(
null, null, null, null, null, nc, null, mServiceContext, null, null, null, null, null, null, null, nc, 0, mServiceContext, null, null,
mService, null, null, null, 0); mService, null, null, null, 0);
setupLocationPermissions(Build.VERSION_CODES.Q, true, AppOpsManager.OPSTR_FINE_LOCATION, setupLocationPermissions(Build.VERSION_CODES.Q, true, AppOpsManager.OPSTR_FINE_LOCATION,

View File

@@ -38,7 +38,6 @@ import android.net.Network;
import android.net.NetworkCapabilities; import android.net.NetworkCapabilities;
import android.net.NetworkInfo; import android.net.NetworkInfo;
import android.net.NetworkProvider; import android.net.NetworkProvider;
import android.net.NetworkScore;
import android.os.INetworkManagementService; import android.os.INetworkManagementService;
import android.text.format.DateUtils; import android.text.format.DateUtils;
@@ -353,10 +352,8 @@ public class LingerMonitorTest {
NetworkCapabilities caps = new NetworkCapabilities(); NetworkCapabilities caps = new NetworkCapabilities();
caps.addCapability(0); caps.addCapability(0);
caps.addTransportType(transport); caps.addTransportType(transport);
NetworkScore ns = new NetworkScore();
ns.putIntExtension(NetworkScore.LEGACY_SCORE, 50);
NetworkAgentInfo nai = new NetworkAgentInfo(null, null, new Network(netId), info, null, NetworkAgentInfo nai = new NetworkAgentInfo(null, null, new Network(netId), info, null,
caps, ns, mCtx, null, null /* config */, mConnService, mNetd, mDnsResolver, mNMS, caps, 50, mCtx, null, null /* config */, mConnService, mNetd, mDnsResolver, mNMS,
NetworkProvider.ID_NONE); NetworkProvider.ID_NONE);
nai.everValidated = true; nai.everValidated = true;
return nai; return nai;