Merge changes I1cf472bd,Ibdaf2b23,I6967ad6f,I65f522c2,I0f220d1f, ... am: a3340c1355
Original change: https://android-review.googlesource.com/c/platform/packages/modules/Connectivity/+/2001790 Change-Id: I1ab803bf751ef4dcb76c07d71ff6acd7873a2b60 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -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());
|
||||
@@ -7265,8 +7268,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.
|
||||
@@ -7301,18 +7303,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);
|
||||
@@ -7327,19 +7334,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);
|
||||
|
||||
@@ -7967,7 +7967,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;
|
||||
@@ -7978,7 +7978,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
|
||||
@@ -8022,7 +8022,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);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -8340,8 +8340,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
|
||||
@@ -8363,14 +8366,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.
|
||||
@@ -8824,15 +8826,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,
|
||||
@@ -9504,9 +9513,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) {
|
||||
@@ -9893,14 +9900,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;
|
||||
}
|
||||
}
|
||||
@@ -10324,14 +10329,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);
|
||||
}
|
||||
@@ -10354,10 +10359,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;
|
||||
|
||||
@@ -10403,7 +10408,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 {
|
||||
@@ -10624,8 +10629,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
|
||||
@@ -10703,8 +10708,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;
|
||||
@@ -10785,7 +10789,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
uidRangeSet = UidRangeUtils.removeRangeSetFromUidRange(profileUids,
|
||||
disallowUidRangeSet);
|
||||
} else {
|
||||
uidRangeSet = new ArraySet<UidRange>();
|
||||
uidRangeSet = new ArraySet<>();
|
||||
uidRangeSet.add(profileUids);
|
||||
}
|
||||
}
|
||||
@@ -10794,8 +10798,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;
|
||||
|
||||
Reference in New Issue
Block a user