From fbf102a88b11855e6c66bcfd5a5fe78f5a4a3952 Mon Sep 17 00:00:00 2001 From: Junyu Lai Date: Tue, 5 Aug 2025 16:25:38 +0800 Subject: [PATCH] Include NET_CAPABILITY_NOT_VCN_MANAGED for tethering local network agent Currently, NET_CAPABILITY_NOT_VCN_MANAGED is implicited added for NetworkRequest built by normal apps. However, the tethering network agent doesn't have this capability, which makes the agent being exposed to VcnManager and cannot be seen by normal apps. Add NET_CAPABILITY_NOT_VCN_MANAGED to tethering NetworkAgent. Include NET_CAPABILITY_NOT_VCN_MANAGED in local network capabilities for metrics and API utilities to ensure correct evaluation of local network connectivity. Update unit tests to reflect the new capability. Flag: EXEMPT bug fix Test: atest ConnectivityCoverageTests:android.net.connectivity.com.android.server.CSSatisfiedByLocalNetworkMetricsTest \ ConnectivityCoverageTests:android.net.connectivity.com.android.metrics.SatisfiedByLocalNetworkMetricsTest \ --update-device Test: manual generate request by CTS and statsd_testdrive -e 10247 Bug: 428098173 Change-Id: Ifa9ce0827abd22d887a0e8a2ab6f4d7391b2b8ed --- .../android/net/connectivity/ConnectivityInternalApiUtil.java | 4 ++++ .../com/android/metrics/SatisfiedByLocalNetworkMetrics.java | 3 ++- .../com/android/metrics/SatisfiedByLocalNetworkMetricsTest.kt | 3 +++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/framework/src/android/net/connectivity/ConnectivityInternalApiUtil.java b/framework/src/android/net/connectivity/ConnectivityInternalApiUtil.java index 9478e91921..dfb7844767 100644 --- a/framework/src/android/net/connectivity/ConnectivityInternalApiUtil.java +++ b/framework/src/android/net/connectivity/ConnectivityInternalApiUtil.java @@ -20,6 +20,7 @@ import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_CONGESTED; import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED; import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING; import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED; +import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED; import android.annotation.SuppressLint; import android.content.Context; @@ -86,12 +87,15 @@ public class ConnectivityInternalApiUtil { public static NetworkAgent buildTetheringNetworkAgent(@NonNull Context ctx, @NonNull Looper looper, @NonNull String logTag, int transportType, @NonNull LinkProperties lp) { + // LINT.IfChange final NetworkCapabilities.Builder builder = new NetworkCapabilities.Builder() .addCapability(NET_CAPABILITY_NOT_METERED) .addCapability(NET_CAPABILITY_NOT_ROAMING) .addCapability(NET_CAPABILITY_NOT_CONGESTED) .addCapability(NET_CAPABILITY_NOT_SUSPENDED) + .addCapability(NET_CAPABILITY_NOT_VCN_MANAGED) .addTransportType(transportType); + // LINT.ThenChange(../../../../../service/src/com/android/metrics/SatisfiedByLocalNetworkMetrics.java) // TODO: Change to use the constant definition. Flags.netCapabilityLocalNetwork() was not // fully rolled out but the service will still process this capability, set it anyway. builder.addCapability(36 /* NET_CAPABILITY_LOCAL_NETWORK */); diff --git a/service/src/com/android/metrics/SatisfiedByLocalNetworkMetrics.java b/service/src/com/android/metrics/SatisfiedByLocalNetworkMetrics.java index b256a19708..d45116e660 100644 --- a/service/src/com/android/metrics/SatisfiedByLocalNetworkMetrics.java +++ b/service/src/com/android/metrics/SatisfiedByLocalNetworkMetrics.java @@ -21,6 +21,7 @@ import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_CONGESTED; import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED; import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING; import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED; +import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED; import static com.android.net.module.util.FrameworkConnectivityStatsLog.SATISFIED_BY_LOCAL_NETWORK_REQUESTS; import static com.android.net.module.util.FrameworkConnectivityStatsLog.SATISFIED_BY_LOCAL_NETWORK_REQUESTS__TYPE__NETWORK_REQUEST_TYPE_BACKGROUND_REQUEST; @@ -107,6 +108,7 @@ public class SatisfiedByLocalNetworkMetrics implements StatsManager.StatsPullAto .addCapability(NET_CAPABILITY_NOT_ROAMING) .addCapability(NET_CAPABILITY_NOT_CONGESTED) .addCapability(NET_CAPABILITY_NOT_SUSPENDED) + .addCapability(NET_CAPABILITY_NOT_VCN_MANAGED) .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) .addTransportType(NetworkCapabilities.TRANSPORT_USB) .addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET) @@ -218,4 +220,3 @@ public class SatisfiedByLocalNetworkMetrics implements StatsManager.StatsPullAto pw.println("SatisfiedByLocalNetworkMetrics: " + mSatisfiedRequestsPerTypeAndUid); } } - diff --git a/tests/unit/java/com/android/metrics/SatisfiedByLocalNetworkMetricsTest.kt b/tests/unit/java/com/android/metrics/SatisfiedByLocalNetworkMetricsTest.kt index d664754640..d6c378fde9 100644 --- a/tests/unit/java/com/android/metrics/SatisfiedByLocalNetworkMetricsTest.kt +++ b/tests/unit/java/com/android/metrics/SatisfiedByLocalNetworkMetricsTest.kt @@ -21,6 +21,7 @@ import android.content.Context import android.net.NetworkCapabilities import android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET import android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED +import android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED import android.net.NetworkCapabilities.TRANSPORT_WIFI import android.net.NetworkRequest import android.net.NetworkRequest.Type @@ -66,7 +67,9 @@ class SatisfiedByLocalNetworkMetricsTest { // Simulate caps which can potentially be satisfied by non-thread // local networks. + // Note that requests built by NetworkRequest normally have deduced NOT_VCN_MANAGED. private val WIFI_CAPS = NetworkCapabilities.Builder() + .addCapability(NET_CAPABILITY_NOT_VCN_MANAGED) .addCapability(NET_CAPABILITY_NOT_METERED) .addTransportType(TRANSPORT_WIFI) .build()