Merge changes I1cf472bd,Ibdaf2b23,I6967ad6f,I65f522c2,I0f220d1f, ...
* changes: Make the temporary NC sanitized instead of inlining Remove the legacy int from FullScore. Remove accessors for legacy int score from NAI Log the creation time of network agents Show time taken by the rematch Address some IDE warnings in ConnectivityService Copy arguments from NetworkAgent registration early
This commit is contained in:
@@ -181,7 +181,7 @@ public final class NetworkScore implements Parcelable {
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Score(" + mLegacyInt + " ; Policies : " + mPolicies + ")";
|
||||
return "Score(Policies : " + mPolicies + ")";
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -380,7 +380,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
// See ConnectivitySettingsManager.CONNECTIVITY_RELEASE_PENDING_INTENT_DELAY_MS
|
||||
private final int mReleasePendingIntentDelayMs;
|
||||
|
||||
private MockableSystemProperties mSystemProperties;
|
||||
private final MockableSystemProperties mSystemProperties;
|
||||
|
||||
@VisibleForTesting
|
||||
protected final PermissionMonitor mPermissionMonitor;
|
||||
@@ -396,7 +396,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
* Stale copy of uid blocked reasons provided by NPMS. As long as they are accessed only in
|
||||
* internal handler thread, they don't need a lock.
|
||||
*/
|
||||
private SparseIntArray mUidBlockedReasons = new SparseIntArray();
|
||||
private final SparseIntArray mUidBlockedReasons = new SparseIntArray();
|
||||
|
||||
private final Context mContext;
|
||||
private final ConnectivityResources mResources;
|
||||
@@ -412,9 +412,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
@VisibleForTesting
|
||||
protected INetd mNetd;
|
||||
private DscpPolicyTracker mDscpPolicyTracker = null;
|
||||
private NetworkStatsManager mStatsManager;
|
||||
private NetworkPolicyManager mPolicyManager;
|
||||
private final NetdCallback mNetdCallback;
|
||||
private final NetworkStatsManager mStatsManager;
|
||||
private final NetworkPolicyManager mPolicyManager;
|
||||
private final BpfNetMaps mBpfNetMaps;
|
||||
|
||||
/**
|
||||
@@ -780,7 +779,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
private boolean mSystemReady;
|
||||
private Intent mInitialBroadcast;
|
||||
|
||||
private PowerManager.WakeLock mNetTransitionWakeLock;
|
||||
private final PowerManager.WakeLock mNetTransitionWakeLock;
|
||||
private final PowerManager.WakeLock mPendingIntentWakeLock;
|
||||
|
||||
// A helper object to track the current default HTTP proxy. ConnectivityService needs to tell
|
||||
@@ -790,10 +789,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
|
||||
final private SettingsObserver mSettingsObserver;
|
||||
|
||||
private UserManager mUserManager;
|
||||
private final UserManager mUserManager;
|
||||
|
||||
// the set of network types that can only be enabled by system/sig apps
|
||||
private List<Integer> mProtectedNetworks;
|
||||
private final List<Integer> mProtectedNetworks;
|
||||
|
||||
private Set<String> mWolSupportedInterfaces;
|
||||
|
||||
@@ -803,10 +802,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
|
||||
private final LocationPermissionChecker mLocationPermissionChecker;
|
||||
|
||||
private KeepaliveTracker mKeepaliveTracker;
|
||||
private QosCallbackTracker mQosCallbackTracker;
|
||||
private NetworkNotificationManager mNotifier;
|
||||
private LingerMonitor mLingerMonitor;
|
||||
private final KeepaliveTracker mKeepaliveTracker;
|
||||
private final QosCallbackTracker mQosCallbackTracker;
|
||||
private final NetworkNotificationManager mNotifier;
|
||||
private final LingerMonitor mLingerMonitor;
|
||||
|
||||
// sequence number of NetworkRequests
|
||||
private int mNextNetworkRequestId = NetworkRequest.FIRST_REQUEST_ID;
|
||||
@@ -834,7 +833,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
private final IpConnectivityLog mMetricsLog;
|
||||
|
||||
@GuardedBy("mBandwidthRequests")
|
||||
private final SparseArray<Integer> mBandwidthRequests = new SparseArray(10);
|
||||
private final SparseArray<Integer> mBandwidthRequests = new SparseArray<>(10);
|
||||
|
||||
@VisibleForTesting
|
||||
final MultinetworkPolicyTracker mMultinetworkPolicyTracker;
|
||||
@@ -893,7 +892,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
* - getRestoreTimerForType(type) is also synchronized on mTypeLists.
|
||||
* - dump is thread-safe with respect to concurrent add and remove calls.
|
||||
*/
|
||||
private final ArrayList<NetworkAgentInfo> mTypeLists[];
|
||||
private final ArrayList<NetworkAgentInfo>[] mTypeLists;
|
||||
@NonNull
|
||||
private final ConnectivityService mService;
|
||||
|
||||
@@ -1096,8 +1095,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
}
|
||||
}
|
||||
|
||||
// send out another legacy broadcast - currently only used for suspend/unsuspend
|
||||
// toggle
|
||||
// send out another legacy broadcast - currently only used for suspend/unsuspend toggle
|
||||
public void update(NetworkAgentInfo nai) {
|
||||
final boolean isDefault = mService.isDefaultNetwork(nai);
|
||||
final DetailedState state = nai.networkInfo.getDetailedState();
|
||||
@@ -1221,31 +1219,25 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
*/
|
||||
public void incrementCountOrThrow(final int uid) {
|
||||
synchronized (mUidToNetworkRequestCount) {
|
||||
incrementCountOrThrow(uid, 1 /* numToIncrement */);
|
||||
final int newRequestCount = mUidToNetworkRequestCount.get(uid, 0) + 1;
|
||||
if (newRequestCount >= mMaxCountPerUid
|
||||
// HACK : the system server is allowed to go over the request count limit
|
||||
// when it is creating requests on behalf of another app (but not itself,
|
||||
// so it can still detect its own request leaks). This only happens in the
|
||||
// per-app API flows in which case the old requests for that particular
|
||||
// UID will be removed soon.
|
||||
// TODO : with the removal of the legacy transact() method, exempting the
|
||||
// system server UID should no longer be necessary. Make sure this is the
|
||||
// case and remove this test.
|
||||
&& (Process.myUid() == uid || Process.myUid() != Binder.getCallingUid())) {
|
||||
throw new ServiceSpecificException(
|
||||
ConnectivityManager.Errors.TOO_MANY_REQUESTS,
|
||||
"Uid " + uid + " exceeded its allotted requests limit");
|
||||
}
|
||||
mUidToNetworkRequestCount.put(uid, newRequestCount);
|
||||
}
|
||||
}
|
||||
|
||||
private void incrementCountOrThrow(final int uid, final int numToIncrement) {
|
||||
final int newRequestCount =
|
||||
mUidToNetworkRequestCount.get(uid, 0) + numToIncrement;
|
||||
if (newRequestCount >= mMaxCountPerUid
|
||||
// HACK : the system server is allowed to go over the request count limit
|
||||
// when it is creating requests on behalf of another app (but not itself,
|
||||
// so it can still detect its own request leaks). This only happens in the
|
||||
// per-app API flows in which case the old requests for that particular
|
||||
// UID will be removed soon.
|
||||
// TODO : instead of this hack, addPerAppDefaultNetworkRequests and other
|
||||
// users of transact() should unregister the requests to decrease the count
|
||||
// before they increase it again by creating a new NRI. Then remove the
|
||||
// transact() method.
|
||||
&& (Process.myUid() == uid || Process.myUid() != Binder.getCallingUid())) {
|
||||
throw new ServiceSpecificException(
|
||||
ConnectivityManager.Errors.TOO_MANY_REQUESTS,
|
||||
"Uid " + uid + " exceeded its allotted requests limit");
|
||||
}
|
||||
mUidToNetworkRequestCount.put(uid, newRequestCount);
|
||||
}
|
||||
|
||||
/**
|
||||
* Decrements the request count of the given uid.
|
||||
*
|
||||
@@ -1253,21 +1245,18 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
*/
|
||||
public void decrementCount(final int uid) {
|
||||
synchronized (mUidToNetworkRequestCount) {
|
||||
decrementCount(uid, 1 /* numToDecrement */);
|
||||
/* numToDecrement */
|
||||
final int newRequestCount = mUidToNetworkRequestCount.get(uid, 0) - 1;
|
||||
if (newRequestCount < 0) {
|
||||
logwtf("BUG: too small request count " + newRequestCount + " for UID " + uid);
|
||||
} else if (newRequestCount == 0) {
|
||||
mUidToNetworkRequestCount.delete(uid);
|
||||
} else {
|
||||
mUidToNetworkRequestCount.put(uid, newRequestCount);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void decrementCount(final int uid, final int numToDecrement) {
|
||||
final int newRequestCount =
|
||||
mUidToNetworkRequestCount.get(uid, 0) - numToDecrement;
|
||||
if (newRequestCount < 0) {
|
||||
logwtf("BUG: too small request count " + newRequestCount + " for UID " + uid);
|
||||
} else if (newRequestCount == 0) {
|
||||
mUidToNetworkRequestCount.delete(uid);
|
||||
} else {
|
||||
mUidToNetworkRequestCount.put(uid, newRequestCount);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1376,7 +1365,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
|
||||
/**
|
||||
* @see CarrierPrivilegeAuthenticator
|
||||
*
|
||||
* This method returns null in versions before T, where carrier privilege
|
||||
* authentication is not supported.
|
||||
*/
|
||||
@Nullable
|
||||
public CarrierPrivilegeAuthenticator makeCarrierPrivilegeAuthenticator(
|
||||
@NonNull final Context context, @NonNull final TelephonyManager tm) {
|
||||
if (SdkLevel.isAtLeastT()) {
|
||||
@@ -1396,7 +1389,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
|
||||
/**
|
||||
* Get the BpfNetMaps implementation to use in ConnectivityService.
|
||||
* @param netd
|
||||
* @param netd a netd binder
|
||||
* @return BpfNetMaps implementation.
|
||||
*/
|
||||
public BpfNetMaps getBpfNetMaps(Context context, INetd netd) {
|
||||
@@ -1581,9 +1574,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
|
||||
mNetworkActivityTracker = new LegacyNetworkActivityTracker(mContext, mHandler, mNetd);
|
||||
|
||||
mNetdCallback = new NetdCallback();
|
||||
final NetdCallback netdCallback = new NetdCallback();
|
||||
try {
|
||||
mNetd.registerUnsolicitedEventListener(mNetdCallback);
|
||||
mNetd.registerUnsolicitedEventListener(netdCallback);
|
||||
} catch (RemoteException | ServiceSpecificException e) {
|
||||
loge("Error registering event listener :" + e);
|
||||
}
|
||||
@@ -1722,11 +1715,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
mHandler.sendEmptyMessage(EVENT_INGRESS_RATE_LIMIT_CHANGED);
|
||||
}
|
||||
|
||||
private void handleAlwaysOnNetworkRequest(NetworkRequest networkRequest, int id) {
|
||||
final boolean enable = mContext.getResources().getBoolean(id);
|
||||
handleAlwaysOnNetworkRequest(networkRequest, enable);
|
||||
}
|
||||
|
||||
private void handleAlwaysOnNetworkRequest(
|
||||
NetworkRequest networkRequest, String settingName, boolean defaultValue) {
|
||||
final boolean enable = toBool(Settings.Global.getInt(
|
||||
@@ -1769,12 +1757,12 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
Settings.Global.getUriFor(Settings.Global.HTTP_PROXY),
|
||||
EVENT_APPLY_GLOBAL_HTTP_PROXY);
|
||||
|
||||
// Watch for whether or not to keep mobile data always on.
|
||||
// Watch for whether to keep mobile data always on.
|
||||
mSettingsObserver.observe(
|
||||
Settings.Global.getUriFor(ConnectivitySettingsManager.MOBILE_DATA_ALWAYS_ON),
|
||||
EVENT_CONFIGURE_ALWAYS_ON_NETWORKS);
|
||||
|
||||
// Watch for whether or not to keep wifi always on.
|
||||
// Watch for whether to keep wifi always on.
|
||||
mSettingsObserver.observe(
|
||||
Settings.Global.getUriFor(ConnectivitySettingsManager.WIFI_ALWAYS_REQUESTED),
|
||||
EVENT_CONFIGURE_ALWAYS_ON_NETWORKS);
|
||||
@@ -1804,6 +1792,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
@Nullable
|
||||
protected NetworkAgentInfo getNetworkAgentInfoForNetwork(Network network) {
|
||||
if (network == null) {
|
||||
return null;
|
||||
@@ -1818,6 +1807,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
}
|
||||
|
||||
// TODO: determine what to do when more than one VPN applies to |uid|.
|
||||
@Nullable
|
||||
private NetworkAgentInfo getVpnForUid(int uid) {
|
||||
synchronized (mNetworkForNetId) {
|
||||
for (int i = 0; i < mNetworkForNetId.size(); i++) {
|
||||
@@ -1830,6 +1820,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
return null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private Network[] getVpnUnderlyingNetworks(int uid) {
|
||||
if (mLockdownEnabled) return null;
|
||||
final NetworkAgentInfo nai = getVpnForUid(uid);
|
||||
@@ -1941,6 +1932,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
* active
|
||||
*/
|
||||
@Override
|
||||
@Nullable
|
||||
public NetworkInfo getActiveNetworkInfo() {
|
||||
enforceAccessPermission();
|
||||
final int uid = mDeps.getCallingUid();
|
||||
@@ -1952,17 +1944,20 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public Network getActiveNetwork() {
|
||||
enforceAccessPermission();
|
||||
return getActiveNetworkForUidInternal(mDeps.getCallingUid(), false);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public Network getActiveNetworkForUid(int uid, boolean ignoreBlocked) {
|
||||
enforceNetworkStackPermission(mContext);
|
||||
return getActiveNetworkForUidInternal(uid, ignoreBlocked);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private Network getActiveNetworkForUidInternal(final int uid, boolean ignoreBlocked) {
|
||||
final NetworkAgentInfo vpnNai = getVpnForUid(uid);
|
||||
if (vpnNai != null) {
|
||||
@@ -1981,6 +1976,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public NetworkInfo getActiveNetworkInfoForUid(int uid, boolean ignoreBlocked) {
|
||||
enforceNetworkStackPermission(mContext);
|
||||
final NetworkAgentInfo nai = getNetworkAgentInfoForUid(uid);
|
||||
@@ -2017,6 +2013,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public NetworkInfo getNetworkInfo(int networkType) {
|
||||
enforceAccessPermission();
|
||||
final int uid = mDeps.getCallingUid();
|
||||
@@ -2035,6 +2032,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public NetworkInfo getNetworkInfoForUid(Network network, int uid, boolean ignoreBlocked) {
|
||||
enforceAccessPermission();
|
||||
final NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(network);
|
||||
@@ -2057,6 +2055,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public Network getNetworkForType(int networkType) {
|
||||
enforceAccessPermission();
|
||||
if (!mLegacyTypeTracker.isTypeSupported(networkType)) {
|
||||
@@ -2074,6 +2073,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
}
|
||||
|
||||
@Override
|
||||
@NonNull
|
||||
public Network[] getAllNetworks() {
|
||||
enforceAccessPermission();
|
||||
synchronized (mNetworkForNetId) {
|
||||
@@ -2534,7 +2534,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
snapshot.getNetwork(), snapshot.getSubscriberId()));
|
||||
}
|
||||
}
|
||||
return result.toArray(new NetworkState[result.size()]);
|
||||
return result.toArray(new NetworkState[0]);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -2632,7 +2632,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
try {
|
||||
addr = InetAddress.getByAddress(hostAddress);
|
||||
} catch (UnknownHostException e) {
|
||||
if (DBG) log("requestRouteToHostAddress got " + e.toString());
|
||||
if (DBG) log("requestRouteToHostAddress got " + e);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -2643,7 +2643,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
|
||||
NetworkAgentInfo nai = mLegacyTypeTracker.getNetworkForType(networkType);
|
||||
if (nai == null) {
|
||||
if (mLegacyTypeTracker.isTypeSupported(networkType) == false) {
|
||||
if (!mLegacyTypeTracker.isTypeSupported(networkType)) {
|
||||
if (DBG) log("requestRouteToHostAddress on unsupported network: " + networkType);
|
||||
} else {
|
||||
if (DBG) log("requestRouteToHostAddress on down network: " + networkType);
|
||||
@@ -2736,7 +2736,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
// the caller thread of registerNetworkAgent. Thus, it's not allowed to register netd
|
||||
// event callback for certain nai. e.g. cellular. Register here to pass to
|
||||
// NetworkMonitor instead.
|
||||
// TODO: Move the Dns Event to NetworkMonitor. NetdEventListenerService only allow one
|
||||
// TODO: Move the Dns Event to NetworkMonitor. NetdEventListenerService only allows one
|
||||
// callback from each caller type. Need to re-factor NetdEventListenerService to allow
|
||||
// multiple NetworkMonitor registrants.
|
||||
if (nai != null && nai.satisfies(mDefaultRequest.mRequests.get(0))) {
|
||||
@@ -3101,8 +3101,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
mHandler.sendMessage(mHandler.obtainMessage(EVENT_CONFIGURE_ALWAYS_ON_NETWORKS));
|
||||
|
||||
// Update mobile data preference if necessary.
|
||||
// Note that empty uid list can be skip here only because no uid rules applied before system
|
||||
// ready. Normally, the empty uid list means to clear the uids rules on netd.
|
||||
// Note that updating can be skipped here if the list is empty only because no uid
|
||||
// rules are applied before system ready. Normally, the empty uid list means to clear
|
||||
// the uids rules on netd.
|
||||
if (!ConnectivitySettingsManager.getMobileDataPreferredUids(mContext).isEmpty()) {
|
||||
updateMobileDataPreferredUids();
|
||||
}
|
||||
@@ -3216,7 +3217,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
}
|
||||
|
||||
private void dumpNetworkDiagnostics(IndentingPrintWriter pw) {
|
||||
final List<NetworkDiagnostics> netDiags = new ArrayList<NetworkDiagnostics>();
|
||||
final List<NetworkDiagnostics> netDiags = new ArrayList<>();
|
||||
final long DIAG_TIME_MS = 5000;
|
||||
for (NetworkAgentInfo nai : networksSortedById()) {
|
||||
PrivateDnsConfig privateDnsCfg = mDnsManager.getPrivateDnsConfig(nai.network);
|
||||
@@ -3608,7 +3609,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
final NetworkCapabilities sanitized =
|
||||
nai.getDeclaredCapabilitiesSanitized(mCarrierPrivilegeAuthenticator);
|
||||
maybeUpdateWifiRoamTimestamp(nai, sanitized);
|
||||
updateCapabilities(nai.getCurrentScore(), nai, sanitized);
|
||||
updateCapabilities(nai.getScore(), nai, sanitized);
|
||||
break;
|
||||
}
|
||||
case NetworkAgent.EVENT_NETWORK_PROPERTIES_CHANGED: {
|
||||
@@ -3876,7 +3877,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
log(nai.toShortString() + " validation " + (valid ? "passed" : "failed") + logMsg);
|
||||
}
|
||||
if (valid != nai.lastValidated) {
|
||||
final int oldScore = nai.getCurrentScore();
|
||||
final FullScore oldScore = nai.getScore();
|
||||
nai.lastValidated = valid;
|
||||
nai.everValidated |= valid;
|
||||
updateCapabilities(oldScore, nai, nai.networkCapabilities);
|
||||
@@ -3952,7 +3953,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleMessage(Message msg) {
|
||||
public void handleMessage(@NonNull Message msg) {
|
||||
if (!maybeHandleNetworkMonitorMessage(msg)
|
||||
&& !maybeHandleNetworkAgentInfoMessage(msg)) {
|
||||
maybeHandleNetworkAgentMessage(msg);
|
||||
@@ -4421,12 +4422,14 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
}
|
||||
config = new NativeNetworkConfig(nai.network.getNetId(), NativeNetworkType.VIRTUAL,
|
||||
INetd.PERMISSION_NONE,
|
||||
(nai.networkAgentConfig == null || !nai.networkAgentConfig.allowBypass),
|
||||
!nai.networkAgentConfig.allowBypass /* secure */,
|
||||
getVpnType(nai), nai.networkAgentConfig.excludeLocalRouteVpn);
|
||||
} else {
|
||||
config = new NativeNetworkConfig(nai.network.getNetId(), NativeNetworkType.PHYSICAL,
|
||||
getNetworkPermission(nai.networkCapabilities), /*secure=*/ false,
|
||||
VpnManager.TYPE_VPN_NONE, /*excludeLocalRoutes=*/ false);
|
||||
getNetworkPermission(nai.networkCapabilities),
|
||||
false /* secure */,
|
||||
VpnManager.TYPE_VPN_NONE,
|
||||
false /* excludeLocalRoutes */);
|
||||
}
|
||||
mNetd.networkCreate(config);
|
||||
mDnsResolver.createNetworkCache(nai.network.getNetId());
|
||||
@@ -7259,8 +7262,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
* later : see {@link #updateLinkProperties}.
|
||||
* @param networkCapabilities the initial capabilites of this network. They can be updated
|
||||
* later : see {@link #updateCapabilities}.
|
||||
* @param initialScore the initial score of the network. See
|
||||
* {@link NetworkAgentInfo#getCurrentScore}.
|
||||
* @param initialScore the initial score of the network. See {@link NetworkAgentInfo#getScore}.
|
||||
* @param networkAgentConfig metadata about the network. This is never updated.
|
||||
* @param providerId the ID of the provider owning this NetworkAgent.
|
||||
* @return the network created for this agent.
|
||||
@@ -7295,18 +7297,23 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
NetworkScore currentScore, NetworkAgentConfig networkAgentConfig, int providerId,
|
||||
int uid) {
|
||||
|
||||
// Make a copy of the passed NI, LP, NC as the caller may hold a reference to them
|
||||
// and mutate them at any time.
|
||||
final NetworkInfo niCopy = new NetworkInfo(networkInfo);
|
||||
final NetworkCapabilities ncCopy = new NetworkCapabilities(networkCapabilities);
|
||||
final LinkProperties lpCopy = new LinkProperties(linkProperties);
|
||||
|
||||
// At this point the capabilities/properties are untrusted and unverified, e.g. checks that
|
||||
// the capabilities' access UID comply with security limitations. They will be sanitized
|
||||
// the capabilities' access UIDs comply with security limitations. They will be sanitized
|
||||
// as the NAI registration finishes, in handleRegisterNetworkAgent(). This is
|
||||
// because some of the checks must happen on the handler thread.
|
||||
final NetworkAgentInfo nai = new NetworkAgentInfo(na,
|
||||
new Network(mNetIdManager.reserveNetId()), new NetworkInfo(networkInfo),
|
||||
linkProperties, networkCapabilities,
|
||||
new Network(mNetIdManager.reserveNetId()), niCopy, lpCopy, ncCopy,
|
||||
currentScore, mContext, mTrackerHandler, new NetworkAgentConfig(networkAgentConfig),
|
||||
this, mNetd, mDnsResolver, providerId, uid, mLingerDelayMs,
|
||||
mQosCallbackTracker, mDeps);
|
||||
|
||||
final String extraInfo = networkInfo.getExtraInfo();
|
||||
final String extraInfo = niCopy.getExtraInfo();
|
||||
final String name = TextUtils.isEmpty(extraInfo)
|
||||
? nai.networkCapabilities.getSsid() : extraInfo;
|
||||
if (DBG) log("registerNetworkAgent " + nai);
|
||||
@@ -7321,19 +7328,12 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
|
||||
private void handleRegisterNetworkAgent(NetworkAgentInfo nai, INetworkMonitor networkMonitor) {
|
||||
if (VDBG) log("Network Monitor created for " + nai);
|
||||
// nai.nc and nai.lp are the same object that was passed by the network agent if the agent
|
||||
// lives in the same process as this code (e.g. wifi), so make sure this code doesn't
|
||||
// mutate their object. TODO : make this copy much earlier to avoid them mutating it
|
||||
// while the network monitor is starting.
|
||||
final LinkProperties lp = new LinkProperties(nai.linkProperties);
|
||||
// Store a copy of the declared capabilities.
|
||||
nai.setDeclaredCapabilities(nai.networkCapabilities);
|
||||
// Make sure the LinkProperties and NetworkCapabilities reflect what the agent info said.
|
||||
final NetworkCapabilities sanitized =
|
||||
nai.getDeclaredCapabilitiesSanitized(mCarrierPrivilegeAuthenticator);
|
||||
nai.getAndSetNetworkCapabilities(mixInCapabilities(nai, sanitized));
|
||||
processLinkPropertiesFromAgent(nai, lp);
|
||||
nai.linkProperties = lp;
|
||||
nai.getAndSetNetworkCapabilities(mixInCapabilities(nai,
|
||||
nai.getDeclaredCapabilitiesSanitized(mCarrierPrivilegeAuthenticator)));
|
||||
processLinkPropertiesFromAgent(nai, nai.linkProperties);
|
||||
|
||||
nai.onNetworkMonitorCreated(networkMonitor);
|
||||
|
||||
@@ -7961,7 +7961,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
* @param nai the network having its capabilities updated.
|
||||
* @param nc the new network capabilities.
|
||||
*/
|
||||
private void updateCapabilities(final int oldScore, @NonNull final NetworkAgentInfo nai,
|
||||
private void updateCapabilities(final FullScore oldScore, @NonNull final NetworkAgentInfo nai,
|
||||
@NonNull final NetworkCapabilities nc) {
|
||||
NetworkCapabilities newNc = mixInCapabilities(nai, nc);
|
||||
if (Objects.equals(nai.networkCapabilities, newNc)) return;
|
||||
@@ -7972,7 +7972,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
updateAllowedUids(nai, prevNc, newNc);
|
||||
nai.updateScoreForNetworkAgentUpdate();
|
||||
|
||||
if (nai.getCurrentScore() == oldScore && newNc.equalRequestableCapabilities(prevNc)) {
|
||||
if (nai.getScore().equals(oldScore) && newNc.equalRequestableCapabilities(prevNc)) {
|
||||
// If the requestable capabilities haven't changed, and the score hasn't changed, then
|
||||
// the change we're processing can't affect any requests, it can only affect the listens
|
||||
// on this network. We might have been called by rematchNetworkAndRequests when a
|
||||
@@ -8016,7 +8016,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
|
||||
/** Convenience method to update the capabilities for a given network. */
|
||||
private void updateCapabilitiesForNetwork(NetworkAgentInfo nai) {
|
||||
updateCapabilities(nai.getCurrentScore(), nai, nai.networkCapabilities);
|
||||
updateCapabilities(nai.getScore(), nai, nai.networkCapabilities);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -8326,8 +8326,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
releasePendingNetworkRequestWithDelay(pendingIntent);
|
||||
}
|
||||
|
||||
// networkAgent is only allowed to be null if notificationType is
|
||||
// CALLBACK_UNAVAIL. This is because UNAVAIL is about no network being
|
||||
// available, while all other cases are about some particular network.
|
||||
private void callCallbackForRequest(@NonNull final NetworkRequestInfo nri,
|
||||
@NonNull final NetworkAgentInfo networkAgent, final int notificationType,
|
||||
@Nullable final NetworkAgentInfo networkAgent, final int notificationType,
|
||||
final int arg1) {
|
||||
if (nri.mMessenger == null) {
|
||||
// Default request has no msgr. Also prevents callbacks from being invoked for
|
||||
@@ -8349,14 +8352,13 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
switch (notificationType) {
|
||||
case ConnectivityManager.CALLBACK_AVAILABLE: {
|
||||
final NetworkCapabilities nc =
|
||||
networkCapabilitiesRestrictedForCallerPermissions(
|
||||
networkAgent.networkCapabilities, nri.mPid, nri.mUid);
|
||||
putParcelable(
|
||||
bundle,
|
||||
createWithLocationInfoSanitizedIfNecessaryWhenParceled(
|
||||
nc, includeLocationSensitiveInfo, nri.mPid, nri.mUid,
|
||||
networkCapabilitiesRestrictedForCallerPermissions(
|
||||
networkAgent.networkCapabilities, nri.mPid, nri.mUid),
|
||||
includeLocationSensitiveInfo, nri.mPid, nri.mUid,
|
||||
nrForCallback.getRequestorPackageName(),
|
||||
nri.mCallingAttributionTag));
|
||||
nri.mCallingAttributionTag);
|
||||
putParcelable(bundle, nc);
|
||||
putParcelable(bundle, linkPropertiesRestrictedForCallerPermissions(
|
||||
networkAgent.linkProperties, nri.mPid, nri.mUid));
|
||||
// For this notification, arg1 contains the blocked status.
|
||||
@@ -8810,15 +8812,22 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
@NonNull final Set<NetworkRequestInfo> networkRequests) {
|
||||
ensureRunningOnConnectivityServiceThread();
|
||||
// TODO: This may be slow, and should be optimized.
|
||||
final long now = SystemClock.elapsedRealtime();
|
||||
final long start = SystemClock.elapsedRealtime();
|
||||
final NetworkReassignment changes = computeNetworkReassignment(networkRequests);
|
||||
final long computed = SystemClock.elapsedRealtime();
|
||||
applyNetworkReassignment(changes, start);
|
||||
final long applied = SystemClock.elapsedRealtime();
|
||||
issueNetworkNeeds();
|
||||
final long end = SystemClock.elapsedRealtime();
|
||||
if (VDBG || DDBG) {
|
||||
log(String.format("Rematched networks [computed %dms] [applied %dms] [issued %d]",
|
||||
computed - start, applied - computed, end - applied));
|
||||
log(changes.debugString());
|
||||
} else if (DBG) {
|
||||
log(changes.toString()); // Shorter form, only one line of log
|
||||
// Shorter form, only one line of log
|
||||
log(String.format("%s [c %d] [a %d] [i %d]", changes.toString(),
|
||||
computed - start, applied - computed, end - applied));
|
||||
}
|
||||
applyNetworkReassignment(changes, now);
|
||||
issueNetworkNeeds();
|
||||
}
|
||||
|
||||
private void applyNetworkReassignment(@NonNull final NetworkReassignment changes,
|
||||
@@ -9490,9 +9499,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
final UnderlyingNetworkInfo[] underlyingNetworkInfos = getAllVpnInfo();
|
||||
try {
|
||||
final ArrayList<NetworkStateSnapshot> snapshots = new ArrayList<>();
|
||||
for (final NetworkStateSnapshot snapshot : getAllNetworkStateSnapshots()) {
|
||||
snapshots.add(snapshot);
|
||||
}
|
||||
snapshots.addAll(getAllNetworkStateSnapshots());
|
||||
mStatsManager.notifyNetworkStatus(getDefaultNetworks(),
|
||||
snapshots, activeIface, Arrays.asList(underlyingNetworkInfos));
|
||||
} catch (Exception ignored) {
|
||||
@@ -9879,14 +9886,12 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
private static class NetworkTestedResults {
|
||||
private final int mNetId;
|
||||
private final int mTestResult;
|
||||
private final long mTimestampMillis;
|
||||
@Nullable private final String mRedirectUrl;
|
||||
|
||||
private NetworkTestedResults(
|
||||
int netId, int testResult, long timestampMillis, @Nullable String redirectUrl) {
|
||||
mNetId = netId;
|
||||
mTestResult = testResult;
|
||||
mTimestampMillis = timestampMillis;
|
||||
mRedirectUrl = redirectUrl;
|
||||
}
|
||||
}
|
||||
@@ -10310,14 +10315,14 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onInterfaceLinkStateChanged(String iface, boolean up) {
|
||||
public void onInterfaceLinkStateChanged(@NonNull String iface, boolean up) {
|
||||
for (NetworkAgentInfo nai : mNetworkAgentInfos) {
|
||||
nai.clatd.interfaceLinkStateChanged(iface, up);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onInterfaceRemoved(String iface) {
|
||||
public void onInterfaceRemoved(@NonNull String iface) {
|
||||
for (NetworkAgentInfo nai : mNetworkAgentInfos) {
|
||||
nai.clatd.interfaceRemoved(iface);
|
||||
}
|
||||
@@ -10340,10 +10345,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
@GuardedBy("mActiveIdleTimers")
|
||||
private boolean mNetworkActive;
|
||||
@GuardedBy("mActiveIdleTimers")
|
||||
private final ArrayMap<String, IdleTimerParams> mActiveIdleTimers = new ArrayMap();
|
||||
private final ArrayMap<String, IdleTimerParams> mActiveIdleTimers = new ArrayMap<>();
|
||||
private final Handler mHandler;
|
||||
|
||||
private class IdleTimerParams {
|
||||
private static class IdleTimerParams {
|
||||
public final int timeout;
|
||||
public final int transportType;
|
||||
|
||||
@@ -10389,7 +10394,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
try {
|
||||
mNetworkActivityListeners.getBroadcastItem(i).onNetworkActive();
|
||||
} catch (RemoteException | RuntimeException e) {
|
||||
loge("Fail to send network activie to listener " + e);
|
||||
loge("Fail to send network activity to listener " + e);
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
@@ -10610,8 +10615,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
@VisibleForTesting
|
||||
public void registerQosCallbackInternal(@NonNull final QosFilter filter,
|
||||
@NonNull final IQosCallback callback, @NonNull final NetworkAgentInfo nai) {
|
||||
if (filter == null) throw new IllegalArgumentException("filter must be non-null");
|
||||
if (callback == null) throw new IllegalArgumentException("callback must be non-null");
|
||||
Objects.requireNonNull(filter, "filter must be non-null");
|
||||
Objects.requireNonNull(callback, "callback must be non-null");
|
||||
|
||||
if (!nai.networkCapabilities.hasCapability(NET_CAPABILITY_NOT_RESTRICTED)) {
|
||||
// TODO: Check allowed list here and ensure that either a) any QoS callback registered
|
||||
@@ -10689,8 +10694,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
+ "or the device owner must be set. ");
|
||||
}
|
||||
|
||||
final List<ProfileNetworkPreferenceList.Preference> preferenceList =
|
||||
new ArrayList<ProfileNetworkPreferenceList.Preference>();
|
||||
final List<ProfileNetworkPreferenceList.Preference> preferenceList = new ArrayList<>();
|
||||
boolean hasDefaultPreference = false;
|
||||
for (final ProfileNetworkPreference preference : preferences) {
|
||||
final NetworkCapabilities nc;
|
||||
@@ -10771,7 +10775,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
uidRangeSet = UidRangeUtils.removeRangeSetFromUidRange(profileUids,
|
||||
disallowUidRangeSet);
|
||||
} else {
|
||||
uidRangeSet = new ArraySet<UidRange>();
|
||||
uidRangeSet = new ArraySet<>();
|
||||
uidRangeSet.add(profileUids);
|
||||
}
|
||||
}
|
||||
@@ -10780,8 +10784,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
|
||||
private boolean isEnterpriseIdentifierValid(
|
||||
@NetworkCapabilities.EnterpriseId int identifier) {
|
||||
if ((identifier >= NET_ENTERPRISE_ID_1)
|
||||
&& (identifier <= NET_ENTERPRISE_ID_5)) {
|
||||
if ((identifier >= NET_ENTERPRISE_ID_1) && (identifier <= NET_ENTERPRISE_ID_5)) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
||||
@@ -49,10 +49,6 @@ import java.util.StringJoiner;
|
||||
public class FullScore {
|
||||
private static final String TAG = FullScore.class.getSimpleName();
|
||||
|
||||
// This will be removed soon. Do *NOT* depend on it for any new code that is not part of
|
||||
// a migration.
|
||||
private final int mLegacyInt;
|
||||
|
||||
/** @hide */
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
@IntDef(prefix = {"POLICY_"}, value = {
|
||||
@@ -146,9 +142,7 @@ public class FullScore {
|
||||
|
||||
private final int mKeepConnectedReason;
|
||||
|
||||
FullScore(final int legacyInt, final long policies,
|
||||
@KeepConnectedReason final int keepConnectedReason) {
|
||||
mLegacyInt = legacyInt;
|
||||
FullScore(final long policies, @KeepConnectedReason final int keepConnectedReason) {
|
||||
mPolicies = policies;
|
||||
mKeepConnectedReason = keepConnectedReason;
|
||||
}
|
||||
@@ -170,7 +164,7 @@ public class FullScore {
|
||||
public static FullScore fromNetworkScore(@NonNull final NetworkScore score,
|
||||
@NonNull final NetworkCapabilities caps, @NonNull final NetworkAgentConfig config,
|
||||
final boolean everValidated, final boolean yieldToBadWiFi, final boolean destroyed) {
|
||||
return withPolicies(score.getLegacyInt(), score.getPolicies(),
|
||||
return withPolicies(score.getPolicies(),
|
||||
score.getKeepConnectedReason(),
|
||||
caps.hasCapability(NET_CAPABILITY_VALIDATED),
|
||||
caps.hasTransport(TRANSPORT_VPN),
|
||||
@@ -216,7 +210,7 @@ public class FullScore {
|
||||
// A prospective score is invincible if the legacy int in the filter is over the maximum
|
||||
// score.
|
||||
final boolean invincible = score.getLegacyInt() > NetworkRanker.LEGACY_INT_MAX;
|
||||
return withPolicies(score.getLegacyInt(), score.getPolicies(), KEEP_CONNECTED_NONE,
|
||||
return withPolicies(score.getPolicies(), KEEP_CONNECTED_NONE,
|
||||
mayValidate, vpn, unmetered, everValidated, everUserSelected, acceptUnvalidated,
|
||||
yieldToBadWiFi, destroyed, invincible);
|
||||
}
|
||||
@@ -236,7 +230,7 @@ public class FullScore {
|
||||
final boolean everValidated,
|
||||
final boolean yieldToBadWifi,
|
||||
final boolean destroyed) {
|
||||
return withPolicies(mLegacyInt, mPolicies, mKeepConnectedReason,
|
||||
return withPolicies(mPolicies, mKeepConnectedReason,
|
||||
caps.hasCapability(NET_CAPABILITY_VALIDATED),
|
||||
caps.hasTransport(TRANSPORT_VPN),
|
||||
caps.hasCapability(NET_CAPABILITY_NOT_METERED),
|
||||
@@ -251,8 +245,7 @@ public class FullScore {
|
||||
// TODO : this shouldn't manage bad wifi avoidance – instead this should be done by the
|
||||
// telephony factory, so that it depends on the carrier. For now this is handled by
|
||||
// connectivity for backward compatibility.
|
||||
private static FullScore withPolicies(@NonNull final int legacyInt,
|
||||
final long externalPolicies,
|
||||
private static FullScore withPolicies(final long externalPolicies,
|
||||
@KeepConnectedReason final int keepConnectedReason,
|
||||
final boolean isValidated,
|
||||
final boolean isVpn,
|
||||
@@ -263,7 +256,7 @@ public class FullScore {
|
||||
final boolean yieldToBadWiFi,
|
||||
final boolean destroyed,
|
||||
final boolean invincible) {
|
||||
return new FullScore(legacyInt, (externalPolicies & EXTERNAL_POLICIES_MASK)
|
||||
return new FullScore((externalPolicies & EXTERNAL_POLICIES_MASK)
|
||||
| (isValidated ? 1L << POLICY_IS_VALIDATED : 0)
|
||||
| (isVpn ? 1L << POLICY_IS_VPN : 0)
|
||||
| (isUnmetered ? 1L << POLICY_IS_UNMETERED : 0)
|
||||
@@ -280,8 +273,7 @@ public class FullScore {
|
||||
* Returns this score but with the specified yield to bad wifi policy.
|
||||
*/
|
||||
public FullScore withYieldToBadWiFi(final boolean newYield) {
|
||||
return new FullScore(mLegacyInt,
|
||||
newYield ? mPolicies | (1L << POLICY_YIELD_TO_BAD_WIFI)
|
||||
return new FullScore(newYield ? mPolicies | (1L << POLICY_YIELD_TO_BAD_WIFI)
|
||||
: mPolicies & ~(1L << POLICY_YIELD_TO_BAD_WIFI),
|
||||
mKeepConnectedReason);
|
||||
}
|
||||
@@ -290,49 +282,7 @@ public class FullScore {
|
||||
* Returns this score but validated.
|
||||
*/
|
||||
public FullScore asValidated() {
|
||||
return new FullScore(mLegacyInt, mPolicies | (1L << POLICY_IS_VALIDATED),
|
||||
mKeepConnectedReason);
|
||||
}
|
||||
|
||||
/**
|
||||
* For backward compatibility, get the legacy int.
|
||||
* This will be removed before S is published.
|
||||
*/
|
||||
public int getLegacyInt() {
|
||||
return getLegacyInt(false /* pretendValidated */);
|
||||
}
|
||||
|
||||
public int getLegacyIntAsValidated() {
|
||||
return getLegacyInt(true /* pretendValidated */);
|
||||
}
|
||||
|
||||
// TODO : remove these two constants
|
||||
// Penalty applied to scores of Networks that have not been validated.
|
||||
private static final int UNVALIDATED_SCORE_PENALTY = 40;
|
||||
|
||||
// Score for a network that can be used unvalidated
|
||||
private static final int ACCEPT_UNVALIDATED_NETWORK_SCORE = 100;
|
||||
|
||||
private int getLegacyInt(boolean pretendValidated) {
|
||||
// If the user has chosen this network at least once, give it the maximum score when
|
||||
// checking to pretend it's validated, or if it doesn't need to validate because the
|
||||
// user said to use it even if it doesn't validate.
|
||||
// This ensures that networks that have been selected in UI are not torn down before the
|
||||
// user gets a chance to prefer it when a higher-scoring network (e.g., Ethernet) is
|
||||
// available.
|
||||
if (hasPolicy(POLICY_EVER_USER_SELECTED)
|
||||
&& (hasPolicy(POLICY_ACCEPT_UNVALIDATED) || pretendValidated)) {
|
||||
return ACCEPT_UNVALIDATED_NETWORK_SCORE;
|
||||
}
|
||||
|
||||
int score = mLegacyInt;
|
||||
// Except for VPNs, networks are subject to a penalty for not being validated.
|
||||
// Apply the penalty unless the network is a VPN, or it's validated or pretending to be.
|
||||
if (!hasPolicy(POLICY_IS_VALIDATED) && !pretendValidated && !hasPolicy(POLICY_IS_VPN)) {
|
||||
score -= UNVALIDATED_SCORE_PENALTY;
|
||||
}
|
||||
if (score < 0) score = 0;
|
||||
return score;
|
||||
return new FullScore(mPolicies | (1L << POLICY_IS_VALIDATED), mKeepConnectedReason);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -350,15 +300,32 @@ public class FullScore {
|
||||
return mKeepConnectedReason;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
|
||||
final FullScore fullScore = (FullScore) o;
|
||||
|
||||
if (mPolicies != fullScore.mPolicies) return false;
|
||||
return mKeepConnectedReason == fullScore.mKeepConnectedReason;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return 2 * ((int) mPolicies)
|
||||
+ 3 * (int) (mPolicies >>> 32)
|
||||
+ 5 * mKeepConnectedReason;
|
||||
}
|
||||
|
||||
// Example output :
|
||||
// Score(50 ; Policies : EVER_USER_SELECTED&IS_VALIDATED)
|
||||
// Score(Policies : EVER_USER_SELECTED&IS_VALIDATED ; KeepConnected : )
|
||||
@Override
|
||||
public String toString() {
|
||||
final StringJoiner sj = new StringJoiner(
|
||||
"&", // delimiter
|
||||
"Score(" + mLegacyInt + " ; KeepConnected : " + mKeepConnectedReason
|
||||
+ " ; Policies : ", // prefix
|
||||
")"); // suffix
|
||||
"Score(Policies : ", // prefix
|
||||
" ; KeepConnected : " + mKeepConnectedReason + ")"); // suffix
|
||||
for (int i = NetworkScore.MIN_AGENT_MANAGED_POLICY;
|
||||
i <= NetworkScore.MAX_AGENT_MANAGED_POLICY; ++i) {
|
||||
if (hasPolicy(i)) sj.add(policyNameOf(i));
|
||||
|
||||
@@ -67,6 +67,7 @@ import com.android.modules.utils.build.SdkLevel;
|
||||
import com.android.server.ConnectivityService;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
import java.time.Instant;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
@@ -105,7 +106,7 @@ import java.util.TreeSet;
|
||||
// for example:
|
||||
// a. a captive portal is present, or
|
||||
// b. a WiFi router whose Internet backhaul is down, or
|
||||
// c. a wireless connection stops transfering packets temporarily (e.g. device is in elevator
|
||||
// c. a wireless connection stops transferring packets temporarily (e.g. device is in elevator
|
||||
// or tunnel) but does not disconnect from the AP/cell tower, or
|
||||
// d. a stand-alone device offering a WiFi AP without an uplink for configuration purposes.
|
||||
// 5. registered, created, connected, validated
|
||||
@@ -158,7 +159,7 @@ import java.util.TreeSet;
|
||||
// the network is no longer considered "lingering". After the linger timer expires, if the network
|
||||
// is satisfying one or more background NetworkRequests it is kept up in the background. If it is
|
||||
// not, ConnectivityService disconnects the NetworkAgent's AsyncChannel.
|
||||
public class NetworkAgentInfo implements Comparable<NetworkAgentInfo>, NetworkRanker.Scoreable {
|
||||
public class NetworkAgentInfo implements NetworkRanker.Scoreable {
|
||||
|
||||
@NonNull public NetworkInfo networkInfo;
|
||||
// This Network object should always be used if possible, so as to encourage reuse of the
|
||||
@@ -417,6 +418,8 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo>, NetworkRa
|
||||
private final Handler mHandler;
|
||||
private final QosCallbackTracker mQosCallbackTracker;
|
||||
|
||||
private final long mCreationTime;
|
||||
|
||||
public NetworkAgentInfo(INetworkAgent na, Network net, NetworkInfo info,
|
||||
@NonNull LinkProperties lp, @NonNull NetworkCapabilities nc,
|
||||
@NonNull NetworkScore score, Context context,
|
||||
@@ -449,6 +452,7 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo>, NetworkRa
|
||||
declaredUnderlyingNetworks = (nc.getUnderlyingNetworks() != null)
|
||||
? nc.getUnderlyingNetworks().toArray(new Network[0])
|
||||
: null;
|
||||
mCreationTime = System.currentTimeMillis();
|
||||
}
|
||||
|
||||
private class AgentDeathMonitor implements IBinder.DeathRecipient {
|
||||
@@ -1014,18 +1018,6 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo>, NetworkRa
|
||||
return mScore;
|
||||
}
|
||||
|
||||
// Get the current score for this Network. This may be modified from what the
|
||||
// NetworkAgent sent, as it has modifiers applied to it.
|
||||
public int getCurrentScore() {
|
||||
return mScore.getLegacyInt();
|
||||
}
|
||||
|
||||
// Get the current score for this Network as if it was validated. This may be modified from
|
||||
// what the NetworkAgent sent, as it has modifiers applied to it.
|
||||
public int getCurrentScoreAsValidated() {
|
||||
return mScore.getLegacyIntAsValidated();
|
||||
}
|
||||
|
||||
/**
|
||||
* Mix-in the ConnectivityService-managed bits in the score.
|
||||
*/
|
||||
@@ -1330,6 +1322,7 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo>, NetworkRa
|
||||
return "NetworkAgentInfo{"
|
||||
+ "network{" + network + "} handle{" + network.getNetworkHandle() + "} ni{"
|
||||
+ networkInfo.toShortString() + "} "
|
||||
+ "created=" + Instant.ofEpochMilli(mCreationTime) + " "
|
||||
+ mScore + " "
|
||||
+ (created ? " created" : "")
|
||||
+ (destroyed ? " destroyed" : "")
|
||||
@@ -1363,12 +1356,6 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo>, NetworkRa
|
||||
+ transportNamesOf(networkCapabilities.getTransportTypes()) + "]";
|
||||
}
|
||||
|
||||
// Enables sorting in descending order of score.
|
||||
@Override
|
||||
public int compareTo(NetworkAgentInfo other) {
|
||||
return other.getCurrentScore() - getCurrentScore();
|
||||
}
|
||||
|
||||
/**
|
||||
* Null-guarding version of NetworkAgentInfo#toShortString()
|
||||
*/
|
||||
|
||||
@@ -18,6 +18,8 @@ package com.android.server.connectivity
|
||||
|
||||
import android.net.NetworkAgentConfig
|
||||
import android.net.NetworkCapabilities
|
||||
import android.net.NetworkScore
|
||||
import android.net.NetworkScore.KEEP_CONNECTED_FOR_HANDOVER
|
||||
import android.net.NetworkScore.KEEP_CONNECTED_NONE
|
||||
import android.os.Build
|
||||
import android.text.TextUtils
|
||||
@@ -25,6 +27,7 @@ import android.util.ArraySet
|
||||
import android.util.Log
|
||||
import androidx.test.filters.SmallTest
|
||||
import com.android.server.connectivity.FullScore.MAX_CS_MANAGED_POLICY
|
||||
import com.android.server.connectivity.FullScore.MIN_CS_MANAGED_POLICY
|
||||
import com.android.server.connectivity.FullScore.POLICY_ACCEPT_UNVALIDATED
|
||||
import com.android.server.connectivity.FullScore.POLICY_EVER_USER_SELECTED
|
||||
import com.android.server.connectivity.FullScore.POLICY_IS_DESTROYED
|
||||
@@ -40,6 +43,7 @@ import org.junit.runner.RunWith
|
||||
import kotlin.reflect.full.staticProperties
|
||||
import kotlin.test.assertEquals
|
||||
import kotlin.test.assertFalse
|
||||
import kotlin.test.assertNotEquals
|
||||
import kotlin.test.assertTrue
|
||||
|
||||
@RunWith(DevSdkIgnoreRunner::class)
|
||||
@@ -82,34 +86,11 @@ class FullScoreTest {
|
||||
Log.setWtfHandler(wtfHandler)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testGetLegacyInt() {
|
||||
val ns = FullScore(50, 0L /* policy */, KEEP_CONNECTED_NONE)
|
||||
assertEquals(10, ns.legacyInt) // -40 penalty for not being validated
|
||||
assertEquals(50, ns.legacyIntAsValidated)
|
||||
|
||||
val vpnNs = FullScore(101, 0L /* policy */, KEEP_CONNECTED_NONE).withPolicies(vpn = true)
|
||||
assertEquals(101, vpnNs.legacyInt) // VPNs are not subject to unvalidation penalty
|
||||
assertEquals(101, vpnNs.legacyIntAsValidated)
|
||||
assertEquals(101, vpnNs.withPolicies(validated = true).legacyInt)
|
||||
assertEquals(101, vpnNs.withPolicies(validated = true).legacyIntAsValidated)
|
||||
|
||||
val validatedNs = ns.withPolicies(validated = true)
|
||||
assertEquals(50, validatedNs.legacyInt) // No penalty, this is validated
|
||||
assertEquals(50, validatedNs.legacyIntAsValidated)
|
||||
|
||||
val chosenNs = ns.withPolicies(onceChosen = true)
|
||||
assertEquals(10, chosenNs.legacyInt)
|
||||
assertEquals(100, chosenNs.legacyIntAsValidated)
|
||||
assertEquals(10, chosenNs.withPolicies(acceptUnvalidated = true).legacyInt)
|
||||
assertEquals(50, chosenNs.withPolicies(acceptUnvalidated = true).legacyIntAsValidated)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testToString() {
|
||||
val string = FullScore(10, 0L /* policy */, KEEP_CONNECTED_NONE)
|
||||
val string = FullScore(0L /* policy */, KEEP_CONNECTED_NONE)
|
||||
.withPolicies(vpn = true, acceptUnvalidated = true).toString()
|
||||
assertTrue(string.contains("Score(10"), string)
|
||||
assertTrue(string.contains("Score("), string)
|
||||
assertTrue(string.contains("ACCEPT_UNVALIDATED"), string)
|
||||
assertTrue(string.contains("IS_VPN"), string)
|
||||
assertFalse(string.contains("IS_VALIDATED"), string)
|
||||
@@ -131,7 +112,7 @@ class FullScoreTest {
|
||||
|
||||
@Test
|
||||
fun testHasPolicy() {
|
||||
val ns = FullScore(50, 0L /* policy */, KEEP_CONNECTED_NONE)
|
||||
val ns = FullScore(0L /* policy */, KEEP_CONNECTED_NONE)
|
||||
assertFalse(ns.hasPolicy(POLICY_IS_VALIDATED))
|
||||
assertFalse(ns.hasPolicy(POLICY_IS_VPN))
|
||||
assertFalse(ns.hasPolicy(POLICY_EVER_USER_SELECTED))
|
||||
@@ -148,12 +129,23 @@ class FullScoreTest {
|
||||
val policies = getAllPolicies()
|
||||
|
||||
policies.forEach { policy ->
|
||||
assertTrue(policy.get() as Int >= FullScore.MIN_CS_MANAGED_POLICY)
|
||||
assertTrue(policy.get() as Int <= FullScore.MAX_CS_MANAGED_POLICY)
|
||||
assertTrue(policy.get() as Int >= MIN_CS_MANAGED_POLICY)
|
||||
assertTrue(policy.get() as Int <= MAX_CS_MANAGED_POLICY)
|
||||
}
|
||||
assertEquals(FullScore.MIN_CS_MANAGED_POLICY,
|
||||
policies.minOfOrNull { it.get() as Int })
|
||||
assertEquals(FullScore.MAX_CS_MANAGED_POLICY,
|
||||
policies.maxOfOrNull { it.get() as Int })
|
||||
assertEquals(MIN_CS_MANAGED_POLICY, policies.minOfOrNull { it.get() as Int })
|
||||
assertEquals(MAX_CS_MANAGED_POLICY, policies.maxOfOrNull { it.get() as Int })
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testEquals() {
|
||||
val ns1 = FullScore(0L /* policy */, KEEP_CONNECTED_NONE)
|
||||
val ns2 = FullScore(0L /* policy */, KEEP_CONNECTED_NONE)
|
||||
val ns3 = FullScore(0L /* policy */, KEEP_CONNECTED_FOR_HANDOVER)
|
||||
val ns4 = NetworkScore.Builder().setLegacyInt(50).build()
|
||||
assertEquals(ns1, ns1)
|
||||
assertEquals(ns2, ns1)
|
||||
assertNotEquals(ns1.withPolicies(validated = true), ns1)
|
||||
assertNotEquals(ns3, ns1)
|
||||
assertFalse(ns1.equals(ns4))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -138,18 +138,16 @@ public class IpConnectivityMetricsTest {
|
||||
private void logDefaultNetworkEvent(long timeMs, NetworkAgentInfo nai,
|
||||
NetworkAgentInfo oldNai) {
|
||||
final Network network = (nai != null) ? nai.network() : null;
|
||||
final int score = (nai != null) ? nai.getCurrentScore() : 0;
|
||||
final boolean validated = (nai != null) ? nai.lastValidated : false;
|
||||
final LinkProperties lp = (nai != null) ? nai.linkProperties : null;
|
||||
final NetworkCapabilities nc = (nai != null) ? nai.networkCapabilities : null;
|
||||
|
||||
final Network prevNetwork = (oldNai != null) ? oldNai.network() : null;
|
||||
final int prevScore = (oldNai != null) ? oldNai.getCurrentScore() : 0;
|
||||
final LinkProperties prevLp = (oldNai != null) ? oldNai.linkProperties : null;
|
||||
final NetworkCapabilities prevNc = (oldNai != null) ? oldNai.networkCapabilities : null;
|
||||
|
||||
mService.mDefaultNetworkMetrics.logDefaultNetworkEvent(timeMs, network, score, validated,
|
||||
lp, nc, prevNetwork, prevScore, prevLp, prevNc);
|
||||
mService.mDefaultNetworkMetrics.logDefaultNetworkEvent(timeMs, network, 0 /* legacyScore */,
|
||||
validated, lp, nc, prevNetwork, 0 /* prevLegacyScore */, prevLp, prevNc);
|
||||
}
|
||||
@Test
|
||||
public void testDefaultNetworkEvents() throws Exception {
|
||||
@@ -158,15 +156,15 @@ public class IpConnectivityMetricsTest {
|
||||
|
||||
NetworkAgentInfo[][] defaultNetworks = {
|
||||
// nothing -> cell
|
||||
{null, makeNai(100, 10, false, true, cell)},
|
||||
{null, makeNai(100, false, true, cell)},
|
||||
// cell -> wifi
|
||||
{makeNai(100, 50, true, true, cell), makeNai(101, 20, true, false, wifi)},
|
||||
{makeNai(100, true, true, cell), makeNai(101, true, false, wifi)},
|
||||
// wifi -> nothing
|
||||
{makeNai(101, 60, true, false, wifi), null},
|
||||
{makeNai(101, true, false, wifi), null},
|
||||
// nothing -> cell
|
||||
{null, makeNai(102, 10, true, true, cell)},
|
||||
{null, makeNai(102, true, true, cell)},
|
||||
// cell -> wifi
|
||||
{makeNai(102, 50, true, true, cell), makeNai(103, 20, true, false, wifi)},
|
||||
{makeNai(102, true, true, cell), makeNai(103, true, false, wifi)},
|
||||
};
|
||||
|
||||
long timeMs = mService.mDefaultNetworkMetrics.creationTimeMs;
|
||||
@@ -204,8 +202,8 @@ public class IpConnectivityMetricsTest {
|
||||
" transports: 1",
|
||||
" default_network_event <",
|
||||
" default_network_duration_ms: 2002",
|
||||
" final_score: 50",
|
||||
" initial_score: 10",
|
||||
" final_score: 0",
|
||||
" initial_score: 0",
|
||||
" ip_support: 3",
|
||||
" no_default_network_duration_ms: 0",
|
||||
" previous_default_network_link_layer: 0",
|
||||
@@ -221,8 +219,8 @@ public class IpConnectivityMetricsTest {
|
||||
" transports: 2",
|
||||
" default_network_event <",
|
||||
" default_network_duration_ms: 4004",
|
||||
" final_score: 60",
|
||||
" initial_score: 20",
|
||||
" final_score: 0",
|
||||
" initial_score: 0",
|
||||
" ip_support: 1",
|
||||
" no_default_network_duration_ms: 0",
|
||||
" previous_default_network_link_layer: 2",
|
||||
@@ -255,8 +253,8 @@ public class IpConnectivityMetricsTest {
|
||||
" transports: 1",
|
||||
" default_network_event <",
|
||||
" default_network_duration_ms: 16016",
|
||||
" final_score: 50",
|
||||
" initial_score: 10",
|
||||
" final_score: 0",
|
||||
" initial_score: 0",
|
||||
" ip_support: 3",
|
||||
" no_default_network_duration_ms: 0",
|
||||
" previous_default_network_link_layer: 4",
|
||||
@@ -348,8 +346,8 @@ public class IpConnectivityMetricsTest {
|
||||
long timeMs = mService.mDefaultNetworkMetrics.creationTimeMs;
|
||||
final long cell = BitUtils.packBits(new int[]{NetworkCapabilities.TRANSPORT_CELLULAR});
|
||||
final long wifi = BitUtils.packBits(new int[]{NetworkCapabilities.TRANSPORT_WIFI});
|
||||
NetworkAgentInfo cellNai = makeNai(100, 50, false, true, cell);
|
||||
NetworkAgentInfo wifiNai = makeNai(101, 60, true, false, wifi);
|
||||
final NetworkAgentInfo cellNai = makeNai(100, false, true, cell);
|
||||
final NetworkAgentInfo wifiNai = makeNai(101, true, false, wifi);
|
||||
logDefaultNetworkEvent(timeMs + 200L, cellNai, null);
|
||||
logDefaultNetworkEvent(timeMs + 300L, wifiNai, cellNai);
|
||||
|
||||
@@ -463,8 +461,8 @@ public class IpConnectivityMetricsTest {
|
||||
" transports: 1",
|
||||
" default_network_event <",
|
||||
" default_network_duration_ms: 100",
|
||||
" final_score: 50",
|
||||
" initial_score: 50",
|
||||
" final_score: 0",
|
||||
" initial_score: 0",
|
||||
" ip_support: 2",
|
||||
" no_default_network_duration_ms: 0",
|
||||
" previous_default_network_link_layer: 0",
|
||||
@@ -611,10 +609,9 @@ public class IpConnectivityMetricsTest {
|
||||
mNetdListener.onWakeupEvent(prefix, uid, ether, ip, mac, srcIp, dstIp, sport, dport, now);
|
||||
}
|
||||
|
||||
NetworkAgentInfo makeNai(int netId, int score, boolean ipv4, boolean ipv6, long transports) {
|
||||
NetworkAgentInfo makeNai(int netId, boolean ipv4, boolean ipv6, long transports) {
|
||||
NetworkAgentInfo nai = mock(NetworkAgentInfo.class);
|
||||
when(nai.network()).thenReturn(new Network(netId));
|
||||
when(nai.getCurrentScore()).thenReturn(score);
|
||||
nai.linkProperties = new LinkProperties();
|
||||
nai.networkCapabilities = new NetworkCapabilities();
|
||||
nai.lastValidated = true;
|
||||
|
||||
@@ -42,7 +42,7 @@ class NetworkOfferTest {
|
||||
|
||||
@Test
|
||||
fun testOfferNeededUnneeded() {
|
||||
val score = FullScore(50, POLICY_NONE, KEEP_CONNECTED_NONE)
|
||||
val score = FullScore(POLICY_NONE, KEEP_CONNECTED_NONE)
|
||||
val offer = NetworkOffer(score, NetworkCapabilities.Builder().build(), mockCallback,
|
||||
1 /* providerId */)
|
||||
val request1 = mock(NetworkRequest::class.java)
|
||||
|
||||
@@ -33,7 +33,7 @@ import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
private fun score(vararg policies: Int) = FullScore(0,
|
||||
private fun score(vararg policies: Int) = FullScore(
|
||||
policies.fold(0L) { acc, e -> acc or (1L shl e) }, KEEP_CONNECTED_NONE)
|
||||
private fun caps(transport: Int) = NetworkCapabilities.Builder().addTransportType(transport).build()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user