Support Satellite Network Preferred uid's multi layer request
- Implement handleSetSatelliteNetworkPreference() at ConnectivityService to create multi layer request with preference order PREFERENCE_ORDER_SATELLITE_FALLBACK. - unit test coverage Bug: 320514105 Test: m and atest FrameworksNetTests Change-Id: I3f71104f8c3c998599eaab71ae4076985f4bed77
This commit is contained in:
parent
33c7da3661
commit
804aa2326d
5 changed files with 331 additions and 11 deletions
|
|
@ -338,6 +338,7 @@ import com.android.server.connectivity.ProfileNetworkPreferenceInfo;
|
|||
import com.android.server.connectivity.ProxyTracker;
|
||||
import com.android.server.connectivity.QosCallbackTracker;
|
||||
import com.android.server.connectivity.RoutingCoordinatorService;
|
||||
import com.android.server.connectivity.SatelliteAccessController;
|
||||
import com.android.server.connectivity.UidRangeUtils;
|
||||
import com.android.server.connectivity.VpnNetworkPreferenceInfo;
|
||||
import com.android.server.connectivity.wear.CompanionDeviceManagerProxyService;
|
||||
|
|
@ -375,6 +376,7 @@ import java.util.StringJoiner;
|
|||
import java.util.TreeSet;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
/**
|
||||
* @hide
|
||||
|
|
@ -566,6 +568,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||
// See {@link ConnectivitySettingsManager#setMobileDataPreferredUids}
|
||||
@VisibleForTesting
|
||||
static final int PREFERENCE_ORDER_MOBILE_DATA_PREFERERRED = 30;
|
||||
// Order of setting satellite network preference fallback when default message application
|
||||
// with role_sms role and android.permission.SATELLITE_COMMUNICATION permission detected
|
||||
@VisibleForTesting
|
||||
static final int PREFERENCE_ORDER_SATELLITE_FALLBACK = 40;
|
||||
// Preference order that signifies the network shouldn't be set as a default network for
|
||||
// the UIDs, only give them access to it. TODO : replace this with a boolean
|
||||
// in NativeUidRangeConfig
|
||||
|
|
@ -929,6 +935,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||
private final QosCallbackTracker mQosCallbackTracker;
|
||||
private final NetworkNotificationManager mNotifier;
|
||||
private final LingerMonitor mLingerMonitor;
|
||||
private final SatelliteAccessController mSatelliteAccessController;
|
||||
|
||||
// sequence number of NetworkRequests
|
||||
private int mNextNetworkRequestId = NetworkRequest.FIRST_REQUEST_ID;
|
||||
|
|
@ -1526,6 +1533,18 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @see SatelliteAccessController
|
||||
*/
|
||||
@Nullable
|
||||
public SatelliteAccessController makeSatelliteAccessController(
|
||||
@NonNull final Context context,
|
||||
Consumer<Set<Integer>> updateSatelliteNetworkFallbackUidCallback,
|
||||
@NonNull final Handler connectivityServiceInternalHandler) {
|
||||
return new SatelliteAccessController(context, updateSatelliteNetworkFallbackUidCallback,
|
||||
connectivityServiceInternalHandler);
|
||||
}
|
||||
|
||||
/**
|
||||
* @see DeviceConfigUtils#isTetheringFeatureEnabled
|
||||
*/
|
||||
|
|
@ -1795,6 +1814,15 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||
mContext, mTelephonyManager, mRequestRestrictedWifiEnabled,
|
||||
mCarrierPrivilegesLostListenerImpl);
|
||||
|
||||
if (mDeps.isAtLeastU()
|
||||
&& mDeps
|
||||
.isFeatureNotChickenedOut(mContext, ALLOW_SATALLITE_NETWORK_FALLBACK)) {
|
||||
mSatelliteAccessController = mDeps.makeSatelliteAccessController(
|
||||
mContext, this::updateSatelliteNetworkPreferenceUids, mHandler);
|
||||
} else {
|
||||
mSatelliteAccessController = null;
|
||||
}
|
||||
|
||||
// To ensure uid state is synchronized with Network Policy, register for
|
||||
// NetworkPolicyManagerService events must happen prior to NetworkPolicyManagerService
|
||||
// reading existing policy from disk.
|
||||
|
|
@ -2063,6 +2091,18 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||
new Pair<>(network, proxyInfo)).sendToTarget();
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when satellite network fallback uids at {@link SatelliteAccessController}
|
||||
* cache was updated based on {@link
|
||||
* android.app.role.OnRoleHoldersChangedListener#onRoleHoldersChanged(String, UserHandle)},
|
||||
* to create multilayer request with preference order
|
||||
* {@link #PREFERENCE_ORDER_SATELLITE_FALLBACK} there on.
|
||||
*
|
||||
*/
|
||||
private void updateSatelliteNetworkPreferenceUids(Set<Integer> satelliteNetworkFallbackUids) {
|
||||
handleSetSatelliteNetworkPreference(satelliteNetworkFallbackUids);
|
||||
}
|
||||
|
||||
private void handleAlwaysOnNetworkRequest(
|
||||
NetworkRequest networkRequest, String settingName, boolean defaultValue) {
|
||||
final boolean enable = toBool(Settings.Global.getInt(
|
||||
|
|
@ -3405,6 +3445,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||
|
||||
public static final String LOG_BPF_RC = "log_bpf_rc_force_disable";
|
||||
|
||||
public static final String ALLOW_SATALLITE_NETWORK_FALLBACK =
|
||||
"allow_satallite_network_fallback";
|
||||
|
||||
private void enforceInternetPermission() {
|
||||
mContext.enforceCallingOrSelfPermission(
|
||||
android.Manifest.permission.INTERNET,
|
||||
|
|
@ -3771,6 +3814,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||
updateMobileDataPreferredUids();
|
||||
}
|
||||
|
||||
if (mSatelliteAccessController != null) {
|
||||
mSatelliteAccessController.start();
|
||||
}
|
||||
|
||||
// On T+ devices, register callback for statsd to pull NETWORK_BPF_MAP_INFO atom
|
||||
if (mDeps.isAtLeastT()) {
|
||||
mBpfNetMaps.setPullAtomCallback(mContext);
|
||||
|
|
@ -12759,16 +12806,27 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||
|
||||
@VisibleForTesting
|
||||
@NonNull
|
||||
ArraySet<NetworkRequestInfo> createNrisFromMobileDataPreferredUids(
|
||||
@NonNull final Set<Integer> uids) {
|
||||
ArraySet<NetworkRequestInfo> createNrisForPreferenceOrder(@NonNull final Set<Integer> uids,
|
||||
@NonNull final List<NetworkRequest> requests,
|
||||
final int preferenceOrder) {
|
||||
final ArraySet<NetworkRequestInfo> nris = new ArraySet<>();
|
||||
if (uids.size() == 0) {
|
||||
// Should not create NetworkRequestInfo if no preferences. Without uid range in
|
||||
// NetworkRequestInfo, makeDefaultForApps() would treat it as a illegal NRI.
|
||||
if (DBG) log("Don't create NetworkRequestInfo because no preferences");
|
||||
return nris;
|
||||
}
|
||||
|
||||
final Set<UidRange> ranges = new ArraySet<>();
|
||||
for (final int uid : uids) {
|
||||
ranges.add(new UidRange(uid, uid));
|
||||
}
|
||||
setNetworkRequestUids(requests, ranges);
|
||||
nris.add(new NetworkRequestInfo(Process.myUid(), requests, preferenceOrder));
|
||||
return nris;
|
||||
}
|
||||
|
||||
ArraySet<NetworkRequestInfo> createNrisFromMobileDataPreferredUids(
|
||||
@NonNull final Set<Integer> uids) {
|
||||
final List<NetworkRequest> requests = new ArrayList<>();
|
||||
// The NRI should be comprised of two layers:
|
||||
// - The request for the mobile network preferred.
|
||||
|
|
@ -12777,14 +12835,28 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||
TRANSPORT_CELLULAR, NetworkRequest.Type.REQUEST));
|
||||
requests.add(createDefaultInternetRequestForTransport(
|
||||
TYPE_NONE, NetworkRequest.Type.TRACK_DEFAULT));
|
||||
final Set<UidRange> ranges = new ArraySet<>();
|
||||
for (final int uid : uids) {
|
||||
ranges.add(new UidRange(uid, uid));
|
||||
}
|
||||
setNetworkRequestUids(requests, ranges);
|
||||
nris.add(new NetworkRequestInfo(Process.myUid(), requests,
|
||||
PREFERENCE_ORDER_MOBILE_DATA_PREFERERRED));
|
||||
return nris;
|
||||
return createNrisForPreferenceOrder(uids, requests, PREFERENCE_ORDER_MOBILE_DATA_PREFERERRED
|
||||
);
|
||||
}
|
||||
|
||||
ArraySet<NetworkRequestInfo> createMultiLayerNrisFromSatelliteNetworkFallbackUids(
|
||||
@NonNull final Set<Integer> uids) {
|
||||
final List<NetworkRequest> requests = new ArrayList<>();
|
||||
|
||||
// request: track default(unrestricted internet network)
|
||||
requests.add(createDefaultInternetRequestForTransport(
|
||||
TYPE_NONE, NetworkRequest.Type.TRACK_DEFAULT));
|
||||
|
||||
// request: restricted Satellite internet
|
||||
final NetworkCapabilities cap = new NetworkCapabilities.Builder()
|
||||
.addCapability(NET_CAPABILITY_INTERNET)
|
||||
.addCapability(NET_CAPABILITY_NOT_VCN_MANAGED)
|
||||
.removeCapability(NET_CAPABILITY_NOT_RESTRICTED)
|
||||
.addTransportType(NetworkCapabilities.TRANSPORT_SATELLITE)
|
||||
.build();
|
||||
requests.add(createNetworkRequest(NetworkRequest.Type.REQUEST, cap));
|
||||
|
||||
return createNrisForPreferenceOrder(uids, requests, PREFERENCE_ORDER_SATELLITE_FALLBACK);
|
||||
}
|
||||
|
||||
private void handleMobileDataPreferredUidsChanged() {
|
||||
|
|
@ -12796,6 +12868,16 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||
rematchAllNetworksAndRequests();
|
||||
}
|
||||
|
||||
private void handleSetSatelliteNetworkPreference(
|
||||
@NonNull final Set<Integer> satelliteNetworkPreferredUids) {
|
||||
removeDefaultNetworkRequestsForPreference(PREFERENCE_ORDER_SATELLITE_FALLBACK);
|
||||
addPerAppDefaultNetworkRequests(
|
||||
createMultiLayerNrisFromSatelliteNetworkFallbackUids(satelliteNetworkPreferredUids)
|
||||
);
|
||||
// Finally, rematch.
|
||||
rematchAllNetworksAndRequests();
|
||||
}
|
||||
|
||||
private void handleIngressRateLimitChanged() {
|
||||
final long oldIngressRateLimit = mIngressRateLimit;
|
||||
mIngressRateLimit = ConnectivitySettingsManager.getIngressRateLimitInBytesPerSecond(
|
||||
|
|
|
|||
|
|
@ -61,6 +61,7 @@ import com.android.server.connectivity.ConnectivityResources
|
|||
import com.android.server.connectivity.MockableSystemProperties
|
||||
import com.android.server.connectivity.MultinetworkPolicyTracker
|
||||
import com.android.server.connectivity.ProxyTracker
|
||||
import com.android.server.connectivity.SatelliteAccessController
|
||||
import com.android.testutils.DevSdkIgnoreRunner
|
||||
import com.android.testutils.DeviceInfoUtils
|
||||
import com.android.testutils.RecorderCallback.CallbackEntry.LinkPropertiesChanged
|
||||
|
|
@ -87,6 +88,7 @@ import org.mockito.Mockito.eq
|
|||
import org.mockito.Mockito.mock
|
||||
import org.mockito.MockitoAnnotations
|
||||
import org.mockito.Spy
|
||||
import java.util.function.Consumer
|
||||
|
||||
const val SERVICE_BIND_TIMEOUT_MS = 5_000L
|
||||
const val TEST_TIMEOUT_MS = 10_000L
|
||||
|
|
@ -253,6 +255,13 @@ class ConnectivityServiceIntegrationTest {
|
|||
tm, TelephonyManagerShimImpl.newInstance(tm),
|
||||
requestRestrictedWifiEnabled, listener)
|
||||
}
|
||||
|
||||
override fun makeSatelliteAccessController(
|
||||
context: Context,
|
||||
updateSatellitePreferredUid: Consumer<MutableSet<Int>>?,
|
||||
connectivityServiceInternalHandler: Handler
|
||||
): SatelliteAccessController? = mock(
|
||||
SatelliteAccessController::class.java)
|
||||
}
|
||||
|
||||
@After
|
||||
|
|
|
|||
|
|
@ -157,6 +157,7 @@ import static android.system.OsConstants.IPPROTO_TCP;
|
|||
import static android.telephony.DataConnectionRealTimeInfo.DC_POWER_STATE_HIGH;
|
||||
import static android.telephony.DataConnectionRealTimeInfo.DC_POWER_STATE_LOW;
|
||||
|
||||
import static com.android.server.ConnectivityService.ALLOW_SATALLITE_NETWORK_FALLBACK;
|
||||
import static com.android.server.ConnectivityService.DELAY_DESTROY_FROZEN_SOCKETS_VERSION;
|
||||
import static com.android.net.module.util.DeviceConfigUtils.TETHERING_MODULE_NAME;
|
||||
import static com.android.server.ConnectivityService.ALLOW_SYSUI_CONNECTIVITY_REPORTS;
|
||||
|
|
@ -421,6 +422,7 @@ import com.android.server.connectivity.NetworkNotificationManager;
|
|||
import com.android.server.connectivity.NetworkNotificationManager.NotificationType;
|
||||
import com.android.server.connectivity.ProxyTracker;
|
||||
import com.android.server.connectivity.QosCallbackTracker;
|
||||
import com.android.server.connectivity.SatelliteAccessController;
|
||||
import com.android.server.connectivity.TcpKeepaliveController;
|
||||
import com.android.server.connectivity.UidRangeUtils;
|
||||
import com.android.server.connectivity.VpnProfileStore;
|
||||
|
|
@ -642,6 +644,7 @@ public class ConnectivityServiceTest {
|
|||
@Mock DestroySocketsWrapper mDestroySocketsWrapper;
|
||||
@Mock SubscriptionManager mSubscriptionManager;
|
||||
@Mock KeepaliveTracker.Dependencies mMockKeepaliveTrackerDependencies;
|
||||
@Mock SatelliteAccessController mSatelliteAccessController;
|
||||
|
||||
// BatteryStatsManager is final and cannot be mocked with regular mockito, so just mock the
|
||||
// underlying binder calls.
|
||||
|
|
@ -2060,6 +2063,14 @@ public class ConnectivityServiceTest {
|
|||
return mDeps.isAtLeastT() ? mCarrierPrivilegeAuthenticator : null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SatelliteAccessController makeSatelliteAccessController(
|
||||
@NonNull final Context context,
|
||||
Consumer<Set<Integer>> updateSatelliteNetworkFallbackUidCallback,
|
||||
@NonNull final Handler connectivityServiceInternalHandler) {
|
||||
return mSatelliteAccessController;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean intentFilterEquals(final PendingIntent a, final PendingIntent b) {
|
||||
return runAsShell(GET_INTENT_SENDER_INTENT, () -> a.intentFilterEquals(b));
|
||||
|
|
@ -2168,6 +2179,8 @@ public class ConnectivityServiceTest {
|
|||
return true;
|
||||
case LOG_BPF_RC:
|
||||
return true;
|
||||
case ALLOW_SATALLITE_NETWORK_FALLBACK:
|
||||
return true;
|
||||
default:
|
||||
return super.isFeatureNotChickenedOut(context, name);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,202 @@
|
|||
/*
|
||||
* Copyright (C) 2023 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.server
|
||||
|
||||
import android.net.IpPrefix
|
||||
import android.net.INetd
|
||||
import android.net.LinkAddress
|
||||
import android.net.LinkProperties
|
||||
import android.net.NativeNetworkConfig
|
||||
import android.net.NativeNetworkType
|
||||
import android.net.NetworkCapabilities
|
||||
import android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET
|
||||
import android.net.NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED
|
||||
import android.net.NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING
|
||||
import android.net.NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED
|
||||
import android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED
|
||||
import android.net.NetworkScore
|
||||
import android.net.NetworkCapabilities.TRANSPORT_SATELLITE
|
||||
import android.net.NetworkScore.KEEP_CONNECTED_FOR_TEST
|
||||
import android.net.RouteInfo
|
||||
import android.net.UidRange
|
||||
import android.net.UidRangeParcel
|
||||
import android.net.VpnManager
|
||||
import android.net.netd.aidl.NativeUidRangeConfig
|
||||
import android.os.Build
|
||||
import android.os.UserHandle
|
||||
import android.util.ArraySet
|
||||
import com.android.net.module.util.CollectionUtils
|
||||
import com.android.server.ConnectivityService.PREFERENCE_ORDER_SATELLITE_FALLBACK
|
||||
import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo
|
||||
import com.android.testutils.DevSdkIgnoreRunner
|
||||
import com.android.testutils.visibleOnHandlerThread
|
||||
import org.junit.Assert
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.mockito.ArgumentMatchers.any
|
||||
import org.mockito.Mockito.inOrder
|
||||
import org.mockito.Mockito.never
|
||||
import kotlin.test.assertEquals
|
||||
import kotlin.test.assertTrue
|
||||
|
||||
private const val SECONDARY_USER = 10
|
||||
private val SECONDARY_USER_HANDLE = UserHandle(SECONDARY_USER)
|
||||
private const val TEST_PACKAGE_UID = 123
|
||||
private const val TEST_PACKAGE_UID2 = 321
|
||||
|
||||
@DevSdkIgnoreRunner.MonitorThreadLeak
|
||||
@RunWith(DevSdkIgnoreRunner::class)
|
||||
@IgnoreUpTo(Build.VERSION_CODES.TIRAMISU)
|
||||
class CSSatelliteNetworkPreferredTest : CSTest() {
|
||||
/**
|
||||
* Test createMultiLayerNrisFromSatelliteNetworkPreferredUids returns correct
|
||||
* NetworkRequestInfo.
|
||||
*/
|
||||
@Test
|
||||
fun testCreateMultiLayerNrisFromSatelliteNetworkPreferredUids() {
|
||||
// Verify that empty uid set should not create any NRI for it.
|
||||
val nrisNoUid = service.createMultiLayerNrisFromSatelliteNetworkFallbackUids(emptySet())
|
||||
Assert.assertEquals(0, nrisNoUid.size.toLong())
|
||||
val uid1 = PRIMARY_USER_HANDLE.getUid(TEST_PACKAGE_UID)
|
||||
val uid2 = PRIMARY_USER_HANDLE.getUid(TEST_PACKAGE_UID2)
|
||||
val uid3 = SECONDARY_USER_HANDLE.getUid(TEST_PACKAGE_UID)
|
||||
assertCreateMultiLayerNrisFromSatelliteNetworkPreferredUids(mutableSetOf(uid1))
|
||||
assertCreateMultiLayerNrisFromSatelliteNetworkPreferredUids(mutableSetOf(uid1, uid3))
|
||||
assertCreateMultiLayerNrisFromSatelliteNetworkPreferredUids(mutableSetOf(uid1, uid2))
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that SATELLITE_NETWORK_PREFERENCE_UIDS changes will send correct net id and uid ranges
|
||||
* to netd.
|
||||
*/
|
||||
@Test
|
||||
fun testSatelliteNetworkPreferredUidsChanged() {
|
||||
val netdInOrder = inOrder(netd)
|
||||
|
||||
val satelliteAgent = createSatelliteAgent("satellite0")
|
||||
satelliteAgent.connect()
|
||||
|
||||
val satelliteNetId = satelliteAgent.network.netId
|
||||
netdInOrder.verify(netd).networkCreate(
|
||||
nativeNetworkConfigPhysical(satelliteNetId, INetd.PERMISSION_NONE))
|
||||
|
||||
val uid1 = PRIMARY_USER_HANDLE.getUid(TEST_PACKAGE_UID)
|
||||
val uid2 = PRIMARY_USER_HANDLE.getUid(TEST_PACKAGE_UID2)
|
||||
val uid3 = SECONDARY_USER_HANDLE.getUid(TEST_PACKAGE_UID)
|
||||
|
||||
// Initial satellite network preferred uids status.
|
||||
setAndUpdateSatelliteNetworkPreferredUids(setOf())
|
||||
netdInOrder.verify(netd, never()).networkAddUidRangesParcel(any())
|
||||
netdInOrder.verify(netd, never()).networkRemoveUidRangesParcel(any())
|
||||
|
||||
// Set SATELLITE_NETWORK_PREFERENCE_UIDS setting and verify that net id and uid ranges
|
||||
// send to netd
|
||||
var uids = mutableSetOf(uid1, uid2, uid3)
|
||||
val uidRanges1 = toUidRangeStableParcels(uidRangesForUids(uids))
|
||||
val config1 = NativeUidRangeConfig(
|
||||
satelliteNetId, uidRanges1,
|
||||
PREFERENCE_ORDER_SATELLITE_FALLBACK
|
||||
)
|
||||
setAndUpdateSatelliteNetworkPreferredUids(uids)
|
||||
netdInOrder.verify(netd).networkAddUidRangesParcel(config1)
|
||||
netdInOrder.verify(netd, never()).networkRemoveUidRangesParcel(any())
|
||||
|
||||
// Set SATELLITE_NETWORK_PREFERENCE_UIDS setting again and verify that old rules are removed
|
||||
// and new rules are added.
|
||||
uids = mutableSetOf(uid1)
|
||||
val uidRanges2: Array<UidRangeParcel?> = toUidRangeStableParcels(uidRangesForUids(uids))
|
||||
val config2 = NativeUidRangeConfig(
|
||||
satelliteNetId, uidRanges2,
|
||||
PREFERENCE_ORDER_SATELLITE_FALLBACK
|
||||
)
|
||||
setAndUpdateSatelliteNetworkPreferredUids(uids)
|
||||
netdInOrder.verify(netd).networkRemoveUidRangesParcel(config1)
|
||||
netdInOrder.verify(netd).networkAddUidRangesParcel(config2)
|
||||
}
|
||||
|
||||
private fun assertCreateMultiLayerNrisFromSatelliteNetworkPreferredUids(uids: Set<Int>) {
|
||||
val nris: Set<ConnectivityService.NetworkRequestInfo> =
|
||||
service.createMultiLayerNrisFromSatelliteNetworkFallbackUids(uids)
|
||||
val nri = nris.iterator().next()
|
||||
// Verify that one NRI is created with multilayer requests. Because one NRI can contain
|
||||
// multiple uid ranges, so it only need create one NRI here.
|
||||
assertEquals(1, nris.size.toLong())
|
||||
assertTrue(nri.isMultilayerRequest)
|
||||
assertEquals(nri.uids, uidRangesForUids(uids))
|
||||
assertEquals(PREFERENCE_ORDER_SATELLITE_FALLBACK, nri.mPreferenceOrder)
|
||||
}
|
||||
|
||||
private fun setAndUpdateSatelliteNetworkPreferredUids(uids: Set<Int>) {
|
||||
visibleOnHandlerThread(csHandler) {
|
||||
deps.satelliteNetworkFallbackUidUpdate!!.accept(uids)
|
||||
}
|
||||
}
|
||||
|
||||
private fun nativeNetworkConfigPhysical(netId: Int, permission: Int) =
|
||||
NativeNetworkConfig(netId, NativeNetworkType.PHYSICAL, permission,
|
||||
false /* secure */, VpnManager.TYPE_VPN_NONE, false /* excludeLocalRoutes */)
|
||||
|
||||
private fun createSatelliteAgent(name: String): CSAgentWrapper {
|
||||
return Agent(score = keepScore(), lp = lp(name),
|
||||
nc = nc(TRANSPORT_SATELLITE, NET_CAPABILITY_INTERNET)
|
||||
)
|
||||
}
|
||||
|
||||
private fun toUidRangeStableParcels(ranges: Set<UidRange>): Array<UidRangeParcel?> {
|
||||
val stableRanges = arrayOfNulls<UidRangeParcel>(ranges.size)
|
||||
for ((index, range) in ranges.withIndex()) {
|
||||
stableRanges[index] = UidRangeParcel(range.start, range.stop)
|
||||
}
|
||||
return stableRanges
|
||||
}
|
||||
|
||||
private fun uidRangesForUids(vararg uids: Int): Set<UidRange> {
|
||||
val ranges = ArraySet<UidRange>()
|
||||
for (uid in uids) {
|
||||
ranges.add(UidRange(uid, uid))
|
||||
}
|
||||
return ranges
|
||||
}
|
||||
|
||||
private fun uidRangesForUids(uids: Collection<Int>): Set<UidRange> {
|
||||
return uidRangesForUids(*CollectionUtils.toIntArray(uids))
|
||||
}
|
||||
|
||||
private fun nc(transport: Int, vararg caps: Int) = NetworkCapabilities.Builder().apply {
|
||||
addTransportType(transport)
|
||||
caps.forEach {
|
||||
addCapability(it)
|
||||
}
|
||||
// Useful capabilities for everybody
|
||||
addCapability(NET_CAPABILITY_NOT_RESTRICTED)
|
||||
addCapability(NET_CAPABILITY_NOT_SUSPENDED)
|
||||
addCapability(NET_CAPABILITY_NOT_ROAMING)
|
||||
addCapability(NET_CAPABILITY_NOT_VCN_MANAGED)
|
||||
}.build()
|
||||
|
||||
private fun lp(iface: String) = LinkProperties().apply {
|
||||
interfaceName = iface
|
||||
addLinkAddress(LinkAddress(LOCAL_IPV4_ADDRESS, 32))
|
||||
addRoute(RouteInfo(IpPrefix("0.0.0.0/0"), null, null))
|
||||
}
|
||||
|
||||
// This allows keeping all the networks connected without having to file individual requests
|
||||
// for them.
|
||||
private fun keepScore() = FromS(
|
||||
NetworkScore.Builder().setKeepConnectedReason(KEEP_CONNECTED_FOR_TEST).build()
|
||||
)
|
||||
}
|
||||
|
|
@ -67,6 +67,7 @@ import com.android.server.connectivity.MultinetworkPolicyTracker
|
|||
import com.android.server.connectivity.MultinetworkPolicyTrackerTestDependencies
|
||||
import com.android.server.connectivity.NetworkRequestStateStatsMetrics
|
||||
import com.android.server.connectivity.ProxyTracker
|
||||
import com.android.server.connectivity.SatelliteAccessController
|
||||
import com.android.testutils.visibleOnHandlerThread
|
||||
import com.android.testutils.waitForIdle
|
||||
import java.util.concurrent.Executors
|
||||
|
|
@ -77,6 +78,7 @@ import org.mockito.AdditionalAnswers.delegatesTo
|
|||
import org.mockito.Mockito.doAnswer
|
||||
import org.mockito.Mockito.doReturn
|
||||
import org.mockito.Mockito.mock
|
||||
import java.util.function.Consumer
|
||||
|
||||
internal const val HANDLER_TIMEOUT_MS = 2_000
|
||||
internal const val BROADCAST_TIMEOUT_MS = 3_000L
|
||||
|
|
@ -138,6 +140,7 @@ open class CSTest {
|
|||
it[ConnectivityService.DELAY_DESTROY_FROZEN_SOCKETS_VERSION] = true
|
||||
it[ConnectivityService.ALLOW_SYSUI_CONNECTIVITY_REPORTS] = true
|
||||
it[ConnectivityService.LOG_BPF_RC] = true
|
||||
it[ConnectivityService.ALLOW_SATALLITE_NETWORK_FALLBACK] = true
|
||||
}
|
||||
fun enableFeature(f: String) = enabledFeatures.set(f, true)
|
||||
fun disableFeature(f: String) = enabledFeatures.set(f, false)
|
||||
|
|
@ -174,6 +177,7 @@ open class CSTest {
|
|||
}
|
||||
|
||||
val multicastRoutingCoordinatorService = mock<MulticastRoutingCoordinatorService>()
|
||||
val satelliteAccessController = mock<SatelliteAccessController>()
|
||||
|
||||
val deps = CSDeps()
|
||||
val service = makeConnectivityService(context, netd, deps).also { it.systemReadyInternal() }
|
||||
|
|
@ -206,6 +210,16 @@ open class CSTest {
|
|||
listener: CarrierPrivilegesLostListener
|
||||
) = if (SdkLevel.isAtLeastT()) mock<CarrierPrivilegeAuthenticator>() else null
|
||||
|
||||
var satelliteNetworkFallbackUidUpdate: Consumer<Set<Int>>? = null
|
||||
override fun makeSatelliteAccessController(
|
||||
context: Context,
|
||||
updateSatelliteNetworkFallackUid: Consumer<Set<Int>>?,
|
||||
csHandlerThread: Handler
|
||||
): SatelliteAccessController? {
|
||||
satelliteNetworkFallbackUidUpdate = updateSatelliteNetworkFallackUid
|
||||
return satelliteAccessController
|
||||
}
|
||||
|
||||
private inner class AOOKTDeps(c: Context) : AutomaticOnOffKeepaliveTracker.Dependencies(c) {
|
||||
override fun isTetheringFeatureNotChickenedOut(name: String): Boolean {
|
||||
return isFeatureEnabled(context, name)
|
||||
|
|
|
|||
Loading…
Reference in a new issue