From a08692f7c772bc76cb73f626eba738705766a386 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20=C5=BBenczykowski?= Date: Thu, 11 Apr 2024 19:49:28 +0000 Subject: [PATCH] Reapply "Use bpf map based isUidNetworkingBlocked on V+" This reverts commit a658220234c9e08b4ac1e142ed114d514a4287f9. Change-Id: I53acd7ff4821a65583b2ad936e22efaa21965a14 --- .../src/com/android/server/BpfNetMaps.java | 19 +++++++++++++++++++ .../android/server/ConnectivityService.java | 6 +++++- .../server/ConnectivityServiceTest.java | 2 ++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/service/src/com/android/server/BpfNetMaps.java b/service/src/com/android/server/BpfNetMaps.java index 2a4eafdca6..c9108c363c 100644 --- a/service/src/com/android/server/BpfNetMaps.java +++ b/service/src/com/android/server/BpfNetMaps.java @@ -889,6 +889,25 @@ public class BpfNetMaps { return (blockedReasons & BLOCKED_METERED_REASON_MASK) != BLOCKED_REASON_NONE; } + /* + * Return whether the network is blocked by firewall chains for the given uid. + * + * Note that {@link #getDataSaverEnabled()} has a latency before V. + * + * @param uid The target uid. + * @param isNetworkMetered Whether the target network is metered. + * + * @return True if the network is blocked. Otherwise, false. + * @throws ServiceSpecificException if the read fails. + * + * @hide + */ + @RequiresApi(Build.VERSION_CODES.TIRAMISU) + public boolean isUidNetworkingBlocked(final int uid, boolean isNetworkMetered) { + return BpfNetMapsUtils.isUidNetworkingBlocked(uid, isNetworkMetered, + sConfigurationMap, sUidOwnerMap, sDataSaverEnabledMap); + } + /** Register callback for statsd to pull atom. */ @RequiresApi(Build.VERSION_CODES.TIRAMISU) public void setPullAtomCallback(final Context context) { diff --git a/service/src/com/android/server/ConnectivityService.java b/service/src/com/android/server/ConnectivityService.java index 5b68a24e2d..637f794f1a 100755 --- a/service/src/com/android/server/ConnectivityService.java +++ b/service/src/com/android/server/ConnectivityService.java @@ -2240,7 +2240,11 @@ public class ConnectivityService extends IConnectivityManager.Stub final long ident = Binder.clearCallingIdentity(); try { final boolean metered = nc == null ? true : nc.isMetered(); - return mPolicyManager.isUidNetworkingBlocked(uid, metered); + if (mDeps.isAtLeastV()) { + return mBpfNetMaps.isUidNetworkingBlocked(uid, metered); + } else { + return mPolicyManager.isUidNetworkingBlocked(uid, metered); + } } finally { Binder.restoreCallingIdentity(ident); } diff --git a/tests/unit/java/com/android/server/ConnectivityServiceTest.java b/tests/unit/java/com/android/server/ConnectivityServiceTest.java index 9f13d799a6..878c7ff70a 100755 --- a/tests/unit/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/unit/java/com/android/server/ConnectivityServiceTest.java @@ -1727,6 +1727,8 @@ public class ConnectivityServiceTest { private void mockUidNetworkingBlocked() { doAnswer(i -> isUidBlocked(mBlockedReasons, i.getArgument(1)) ).when(mNetworkPolicyManager).isUidNetworkingBlocked(anyInt(), anyBoolean()); + doAnswer(i -> isUidBlocked(mBlockedReasons, i.getArgument(1)) + ).when(mBpfNetMaps).isUidNetworkingBlocked(anyInt(), anyBoolean()); } private boolean isUidBlocked(int blockedReasons, boolean meteredNetwork) {