Add DEFAULT_NETWORK_PRIORITY constants

- Add default network priority to NetworkRequestInfo.
- The default network priority value is used when issue uid
  ranges rules to netd. Netd will use the priority value and uid
  ranges to generate corresponding ip rules specific to the given
  network preference.

Bug: 171872461
Test: atest FrameworksNetTests
Merged-In: I0ea71b348492aeb4784d487bed4cfd5d387426ba

Change-Id: I0ea71b348492aeb4784d487bed4cfd5d387426ba
This commit is contained in:
paulhu
2021-05-26 15:19:20 +08:00
parent 01f52e7cce
commit e99137226e
2 changed files with 81 additions and 21 deletions

View File

@@ -397,6 +397,32 @@ public class ConnectivityService extends IConnectivityManager.Stub
TEARDOWN, // Determine whether this network is unneeded and should be torn down.
}
/**
* The priority value is used when issue uid ranges rules to netd. Netd will use the priority
* value and uid ranges to generate corresponding ip rules specific to the given preference.
* Thus, any device originated data traffic of the applied uids can be routed to the altered
* default network which has highest priority.
*
* Note: The priority value should be in 0~1000. Larger value means lower priority, see
* {@link NativeUidRangeConfig}.
*/
// This is default priority value for those NetworkRequests which doesn't have preference to
// alter default network and use the global one.
@VisibleForTesting
static final int DEFAULT_NETWORK_PRIORITY_NONE = 0;
// Used by automotive devices to set the network preferences used to direct traffic at an
// application level. See {@link #setOemNetworkPreference}.
@VisibleForTesting
static final int DEFAULT_NETWORK_PRIORITY_OEM = 10;
// Request that a user profile is put by default on a network matching a given preference.
// See {@link #setProfileNetworkPreference}.
@VisibleForTesting
static final int DEFAULT_NETWORK_PRIORITY_PROFILE = 20;
// Set by MOBILE_DATA_PREFERRED_UIDS setting. Use mobile data in preference even when
// higher-priority networks are connected.
@VisibleForTesting
static final int DEFAULT_NETWORK_PRIORITY_MOBILE_DATA_PREFERRED = 30;
/**
* used internally to clear a wakelock when transitioning
* from one net to another. Clear happens when we get a new
@@ -4146,8 +4172,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
final NetworkAgentInfo satisfier = nri.getSatisfier();
if (null != satisfier) {
try {
// TODO: Passing default network priority to netd.
mNetd.networkRemoveUidRanges(satisfier.network.getNetId(),
toUidRangeStableParcels(nri.getUids()));
toUidRangeStableParcels(nri.getUids())
/* nri.getDefaultNetworkPriority() */);
} catch (RemoteException e) {
loge("Exception setting network preference default network", e);
}
@@ -5592,6 +5620,13 @@ public class ConnectivityService extends IConnectivityManager.Stub
// maximum limit of registered callbacks per UID.
final int mAsUid;
// Default network priority of this request.
private final int mDefaultNetworkPriority;
int getDefaultNetworkPriority() {
return mDefaultNetworkPriority;
}
// In order to preserve the mapping of NetworkRequest-to-callback when apps register
// callbacks using a returned NetworkRequest, the original NetworkRequest needs to be
// maintained for keying off of. This is only a concern when the original nri
@@ -5621,12 +5656,13 @@ public class ConnectivityService extends IConnectivityManager.Stub
NetworkRequestInfo(int asUid, @NonNull final NetworkRequest r,
@Nullable final PendingIntent pi, @Nullable String callingAttributionTag) {
this(asUid, Collections.singletonList(r), r, pi, callingAttributionTag);
this(asUid, Collections.singletonList(r), r, pi, callingAttributionTag,
DEFAULT_NETWORK_PRIORITY_NONE);
}
NetworkRequestInfo(int asUid, @NonNull final List<NetworkRequest> r,
@NonNull final NetworkRequest requestForCallback, @Nullable final PendingIntent pi,
@Nullable String callingAttributionTag) {
@Nullable String callingAttributionTag, final int defaultNetworkPriority) {
ensureAllNetworkRequestsHaveType(r);
mRequests = initializeRequests(r);
mNetworkRequestForCallback = requestForCallback;
@@ -5644,6 +5680,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
*/
mCallbackFlags = NetworkCallback.FLAG_NONE;
mCallingAttributionTag = callingAttributionTag;
mDefaultNetworkPriority = defaultNetworkPriority;
}
NetworkRequestInfo(int asUid, @NonNull final NetworkRequest r, @Nullable final Messenger m,
@@ -5673,6 +5710,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
mPerUidCounter.incrementCountOrThrow(mUid);
mCallbackFlags = callbackFlags;
mCallingAttributionTag = callingAttributionTag;
mDefaultNetworkPriority = DEFAULT_NETWORK_PRIORITY_NONE;
linkDeathRecipient();
}
@@ -5712,15 +5750,18 @@ public class ConnectivityService extends IConnectivityManager.Stub
mPerUidCounter.incrementCountOrThrow(mUid);
mCallbackFlags = nri.mCallbackFlags;
mCallingAttributionTag = nri.mCallingAttributionTag;
mDefaultNetworkPriority = DEFAULT_NETWORK_PRIORITY_NONE;
linkDeathRecipient();
}
NetworkRequestInfo(int asUid, @NonNull final NetworkRequest r) {
this(asUid, Collections.singletonList(r));
this(asUid, Collections.singletonList(r), DEFAULT_NETWORK_PRIORITY_NONE);
}
NetworkRequestInfo(int asUid, @NonNull final List<NetworkRequest> r) {
this(asUid, r, r.get(0), null /* pi */, null /* callingAttributionTag */);
NetworkRequestInfo(int asUid, @NonNull final List<NetworkRequest> r,
final int defaultNetworkPriority) {
this(asUid, r, r.get(0), null /* pi */, null /* callingAttributionTag */,
defaultNetworkPriority);
}
// True if this NRI is being satisfied. It also accounts for if the nri has its satisifer
@@ -7377,9 +7418,13 @@ public class ConnectivityService extends IConnectivityManager.Stub
maybeCloseSockets(nai, ranges, exemptUids);
try {
if (add) {
mNetd.networkAddUidRanges(nai.network.netId, ranges);
// TODO: Passing default network priority to netd.
mNetd.networkAddUidRanges(nai.network.netId, ranges
/* DEFAULT_NETWORK_PRIORITY_NONE */);
} else {
mNetd.networkRemoveUidRanges(nai.network.netId, ranges);
// TODO: Passing default network priority to netd.
mNetd.networkRemoveUidRanges(nai.network.netId, ranges
/* DEFAULT_NETWORK_PRIORITY_NONE */);
}
} catch (Exception e) {
loge("Exception while " + (add ? "adding" : "removing") + " uid ranges " + uidRanges +
@@ -7690,14 +7735,18 @@ public class ConnectivityService extends IConnectivityManager.Stub
+ " any applications to set as the default." + nri);
}
if (null != newDefaultNetwork) {
// TODO: Passing default network priority to netd.
mNetd.networkAddUidRanges(
newDefaultNetwork.network.getNetId(),
toUidRangeStableParcels(nri.getUids()));
toUidRangeStableParcels(nri.getUids())
/* nri.getDefaultNetworkPriority() */);
}
if (null != oldDefaultNetwork) {
// TODO: Passing default network priority to netd.
mNetd.networkRemoveUidRanges(
oldDefaultNetwork.network.getNetId(),
toUidRangeStableParcels(nri.getUids()));
toUidRangeStableParcels(nri.getUids())
/* nri.getDefaultNetworkPriority() */);
}
} catch (RemoteException | ServiceSpecificException e) {
loge("Exception setting app default network", e);
@@ -9755,7 +9804,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
nrs.add(createDefaultInternetRequestForTransport(
TYPE_NONE, NetworkRequest.Type.TRACK_DEFAULT));
setNetworkRequestUids(nrs, UidRange.fromIntRanges(pref.capabilities.getUids()));
final NetworkRequestInfo nri = new NetworkRequestInfo(Process.myUid(), nrs);
final NetworkRequestInfo nri = new NetworkRequestInfo(Process.myUid(), nrs,
DEFAULT_NETWORK_PRIORITY_PROFILE);
result.add(nri);
}
return result;
@@ -9825,7 +9875,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
ranges.add(new UidRange(uid, uid));
}
setNetworkRequestUids(requests, ranges);
nris.add(new NetworkRequestInfo(Process.myUid(), requests));
nris.add(new NetworkRequestInfo(Process.myUid(), requests,
DEFAULT_NETWORK_PRIORITY_MOBILE_DATA_PREFERRED));
return nris;
}
@@ -10135,7 +10186,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
ranges.add(new UidRange(uid, uid));
}
setNetworkRequestUids(requests, ranges);
return new NetworkRequestInfo(Process.myUid(), requests);
return new NetworkRequestInfo(
Process.myUid(), requests, DEFAULT_NETWORK_PRIORITY_OEM);
}
private NetworkRequest createUnmeteredNetworkRequest() {

View File

@@ -118,6 +118,8 @@ import static android.net.resolv.aidl.IDnsResolverUnsolicitedEventListener.VALID
import static android.os.Process.INVALID_UID;
import static android.system.OsConstants.IPPROTO_TCP;
import static com.android.server.ConnectivityService.DEFAULT_NETWORK_PRIORITY_MOBILE_DATA_PREFERRED;
import static com.android.server.ConnectivityService.DEFAULT_NETWORK_PRIORITY_OEM;
import static com.android.server.ConnectivityServiceTestUtils.transportToLegacyType;
import static com.android.testutils.ConcurrentUtils.await;
import static com.android.testutils.ConcurrentUtils.durationOf;
@@ -10622,8 +10624,9 @@ public class ConnectivityServiceTest {
mService.new OemNetworkRequestFactory()
.createNrisFromOemNetworkPreferences(
createDefaultOemNetworkPreferences(prefToTest));
final List<NetworkRequest> mRequests = nris.iterator().next().mRequests;
final NetworkRequestInfo nri = nris.iterator().next();
assertEquals(DEFAULT_NETWORK_PRIORITY_OEM, nri.getDefaultNetworkPriority());
final List<NetworkRequest> mRequests = nri.mRequests;
assertEquals(expectedNumOfNris, nris.size());
assertEquals(expectedNumOfRequests, mRequests.size());
assertTrue(mRequests.get(0).isListen());
@@ -10651,8 +10654,9 @@ public class ConnectivityServiceTest {
mService.new OemNetworkRequestFactory()
.createNrisFromOemNetworkPreferences(
createDefaultOemNetworkPreferences(prefToTest));
final List<NetworkRequest> mRequests = nris.iterator().next().mRequests;
final NetworkRequestInfo nri = nris.iterator().next();
assertEquals(DEFAULT_NETWORK_PRIORITY_OEM, nri.getDefaultNetworkPriority());
final List<NetworkRequest> mRequests = nri.mRequests;
assertEquals(expectedNumOfNris, nris.size());
assertEquals(expectedNumOfRequests, mRequests.size());
assertTrue(mRequests.get(0).isListen());
@@ -10677,8 +10681,9 @@ public class ConnectivityServiceTest {
mService.new OemNetworkRequestFactory()
.createNrisFromOemNetworkPreferences(
createDefaultOemNetworkPreferences(prefToTest));
final List<NetworkRequest> mRequests = nris.iterator().next().mRequests;
final NetworkRequestInfo nri = nris.iterator().next();
assertEquals(DEFAULT_NETWORK_PRIORITY_OEM, nri.getDefaultNetworkPriority());
final List<NetworkRequest> mRequests = nri.mRequests;
assertEquals(expectedNumOfNris, nris.size());
assertEquals(expectedNumOfRequests, mRequests.size());
assertTrue(mRequests.get(0).isRequest());
@@ -10700,8 +10705,9 @@ public class ConnectivityServiceTest {
mService.new OemNetworkRequestFactory()
.createNrisFromOemNetworkPreferences(
createDefaultOemNetworkPreferences(prefToTest));
final List<NetworkRequest> mRequests = nris.iterator().next().mRequests;
final NetworkRequestInfo nri = nris.iterator().next();
assertEquals(DEFAULT_NETWORK_PRIORITY_OEM, nri.getDefaultNetworkPriority());
final List<NetworkRequest> mRequests = nri.mRequests;
assertEquals(expectedNumOfNris, nris.size());
assertEquals(expectedNumOfRequests, mRequests.size());
assertTrue(mRequests.get(0).isRequest());
@@ -12892,6 +12898,8 @@ public class ConnectivityServiceTest {
assertEquals(1, nris.size());
assertTrue(nri.isMultilayerRequest());
assertEquals(nri.getUids(), uidRangesForUids(uids));
assertEquals(DEFAULT_NETWORK_PRIORITY_MOBILE_DATA_PREFERRED,
nri.getDefaultNetworkPriority());
}
/**