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:
Nagendra Prasad Nagarle Basavaraju 2024-01-31 15:35:31 +00:00
commit 804aa2326d
5 changed files with 331 additions and 11 deletions

View file

@ -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(

View file

@ -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

View file

@ -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);
}

View file

@ -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()
)
}

View file

@ -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)