diff --git a/service/src/com/android/server/ConnectivityService.java b/service/src/com/android/server/ConnectivityService.java index ea6d37e080..1d87121931 100755 --- a/service/src/com/android/server/ConnectivityService.java +++ b/service/src/com/android/server/ConnectivityService.java @@ -79,6 +79,8 @@ import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VPN; import static android.net.NetworkCapabilities.NET_CAPABILITY_OEM_PAID; import static android.net.NetworkCapabilities.NET_CAPABILITY_OEM_PRIVATE; import static android.net.NetworkCapabilities.NET_CAPABILITY_PARTIAL_CONNECTIVITY; +import static android.net.NetworkCapabilities.NET_CAPABILITY_PRIORITIZE_BANDWIDTH; +import static android.net.NetworkCapabilities.NET_CAPABILITY_PRIORITIZE_LATENCY; import static android.net.NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED; import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED; import static android.net.NetworkCapabilities.NET_ENTERPRISE_ID_1; @@ -1923,6 +1925,8 @@ public class ConnectivityService extends IConnectivityManager.Stub final NetworkCapabilities netCap = new NetworkCapabilities(); netCap.addCapability(NET_CAPABILITY_INTERNET); netCap.addCapability(NET_CAPABILITY_NOT_VCN_MANAGED); + netCap.addForbiddenCapability(NET_CAPABILITY_PRIORITIZE_LATENCY); + netCap.addForbiddenCapability(NET_CAPABILITY_PRIORITIZE_BANDWIDTH); netCap.setRequestorUidAndPackageName(Process.myUid(), mContext.getPackageName()); if (transportType > TYPE_NONE) { netCap.addTransportType(transportType); diff --git a/tests/unit/java/com/android/server/connectivityservice/CSDefaultNetworkTest.kt b/tests/unit/java/com/android/server/connectivityservice/CSDefaultNetworkTest.kt new file mode 100644 index 0000000000..4d214d07bc --- /dev/null +++ b/tests/unit/java/com/android/server/connectivityservice/CSDefaultNetworkTest.kt @@ -0,0 +1,78 @@ +package com.android.server.connectivityservice + +import android.net.NetworkCapabilities +import android.net.NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED +import android.net.NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED +import android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED +import android.net.NetworkCapabilities.TRANSPORT_CELLULAR +import android.net.NetworkRequest +import android.os.Build +import com.android.server.CSTest +import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo +import com.android.testutils.DevSdkIgnoreRunner +import com.android.testutils.RecorderCallback.CallbackEntry.Lost +import com.android.testutils.TestableNetworkCallback +import org.junit.Test +import org.junit.runner.RunWith +import kotlin.test.assertNull +import android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET as NET_CAP_INTERNET +import android.net.NetworkCapabilities.NET_CAPABILITY_PRIORITIZE_BANDWIDTH as NET_CAP_PRIO_BW + +private fun netCaps(transport: Int, vararg cap: Int): NetworkCapabilities = + NetworkCapabilities.Builder().apply { + addTransportType(transport) + // Standard caps that everybody in this test file needs + addCapability(NET_CAPABILITY_NOT_SUSPENDED) + addCapability(NET_CAPABILITY_NOT_VCN_MANAGED) + addCapability(NET_CAPABILITY_NOT_RESTRICTED) + cap.forEach { addCapability(it) } + }.build() + +@RunWith(DevSdkIgnoreRunner::class) +@IgnoreUpTo(Build.VERSION_CODES.R) +class CSDefaultNetworkTest : CSTest() { + @Test + fun testSlicesAreNotDefault() { + val keepSliceUpRequest = NetworkRequest.Builder().clearCapabilities() + .addCapability(NET_CAP_PRIO_BW) + .build() + val keepSliceUpCb = TestableNetworkCallback() + cm.requestNetwork(keepSliceUpRequest, keepSliceUpCb) + + val nonSlice = Agent(nc = netCaps(TRANSPORT_CELLULAR, NET_CAP_INTERNET)) + val slice = Agent(nc = netCaps(TRANSPORT_CELLULAR, NET_CAP_INTERNET, NET_CAP_PRIO_BW)) + + val allCb = TestableNetworkCallback() + val bestCb = TestableNetworkCallback() + val defaultCb = TestableNetworkCallback() + val allNetRequest = NetworkRequest.Builder().clearCapabilities().build() + cm.registerNetworkCallback(allNetRequest, allCb) + cm.registerBestMatchingNetworkCallback(allNetRequest, bestCb, csHandler) + cm.registerDefaultNetworkCallback(defaultCb) + nonSlice.connect() + + allCb.expectAvailableCallbacks(nonSlice.network, validated = false) + keepSliceUpCb.assertNoCallback() + bestCb.expectAvailableCallbacks(nonSlice.network, validated = false) + defaultCb.expectAvailableCallbacks(nonSlice.network, validated = false) + + slice.connect() + allCb.expectAvailableCallbacks(slice.network, validated = false) + keepSliceUpCb.expectAvailableCallbacks(slice.network, validated = false) + bestCb.assertNoCallback() + defaultCb.assertNoCallback() + + nonSlice.disconnect() + allCb.expect(nonSlice.network) + bestCb.expect(nonSlice.network) + bestCb.expectAvailableCallbacks(slice.network, validated = false) + defaultCb.expect(nonSlice.network) + + allCb.assertNoCallback() + keepSliceUpCb.assertNoCallback() + bestCb.assertNoCallback() + defaultCb.assertNoCallback() + + assertNull(cm.activeNetwork) + } +} diff --git a/tests/unit/java/com/android/server/connectivityservice/base/CSTest.kt b/tests/unit/java/com/android/server/connectivityservice/base/CSTest.kt index 4f5cfc03ae..6f5c2bae90 100644 --- a/tests/unit/java/com/android/server/connectivityservice/base/CSTest.kt +++ b/tests/unit/java/com/android/server/connectivityservice/base/CSTest.kt @@ -116,7 +116,8 @@ open class CSTest { init { if (!SdkLevel.isAtLeastS()) { throw UnsupportedApiLevelException("CSTest subclasses must be annotated to only " + - "run on S+, e.g. @DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.R)") + "run on S+, e.g. @DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.R) and " + + "@RunWith(DevSdkIgnoreRunner::class)") } }