diff --git a/service/jni/com_android_server_BpfNetMaps.cpp b/service/jni/com_android_server_BpfNetMaps.cpp index 49392e029c..2780044ec6 100644 --- a/service/jni/com_android_server_BpfNetMaps.cpp +++ b/service/jni/com_android_server_BpfNetMaps.cpp @@ -82,6 +82,13 @@ static jint native_removeNiceApp(JNIEnv* env, jobject self, jint uid) { return (jint)status.code(); } +static jint native_setChildChain(JNIEnv* env, jobject self, jint childChain, jboolean enable) { + auto chain = static_cast(childChain); + int res = mTc.toggleUidOwnerMap(chain, enable); + if (res) ALOGE("%s failed, error code = %d", __func__, res); + return (jint)res; +} + static jint native_replaceUidChain(JNIEnv* env, jobject self, jstring name, jboolean isAllowlist, jintArray jUids) { const ScopedUtfChars chainNameUtf8(env, name); @@ -192,6 +199,8 @@ static const JNINativeMethod gMethods[] = { (void*)native_addNiceApp}, {"native_removeNiceApp", "(I)I", (void*)native_removeNiceApp}, + {"native_setChildChain", "(IZ)I", + (void*)native_setChildChain}, {"native_replaceUidChain", "(Ljava/lang/String;Z[I)I", (void*)native_replaceUidChain}, {"native_setUidRule", "(III)I", diff --git a/service/native/TrafficController.cpp b/service/native/TrafficController.cpp index 9331548e3f..4dc056d89a 100644 --- a/service/native/TrafficController.cpp +++ b/service/native/TrafficController.cpp @@ -451,6 +451,53 @@ int TrafficController::replaceUidOwnerMap(const std::string& name, bool isAllowl return 0; } +int TrafficController::toggleUidOwnerMap(ChildChain chain, bool enable) { + std::lock_guard guard(mMutex); + uint32_t key = UID_RULES_CONFIGURATION_KEY; + auto oldConfigure = mConfigurationMap.readValue(key); + if (!oldConfigure.ok()) { + ALOGE("Cannot read the old configuration from map: %s", + oldConfigure.error().message().c_str()); + return -oldConfigure.error().code(); + } + uint32_t match; + switch (chain) { + case DOZABLE: + match = DOZABLE_MATCH; + break; + case STANDBY: + match = STANDBY_MATCH; + break; + case POWERSAVE: + match = POWERSAVE_MATCH; + break; + case RESTRICTED: + match = RESTRICTED_MATCH; + break; + case LOW_POWER_STANDBY: + match = LOW_POWER_STANDBY_MATCH; + break; + case OEM_DENY_1: + match = OEM_DENY_1_MATCH; + break; + case OEM_DENY_2: + match = OEM_DENY_2_MATCH; + break; + case OEM_DENY_3: + match = OEM_DENY_3_MATCH; + break; + default: + return -EINVAL; + } + BpfConfig newConfiguration = + enable ? (oldConfigure.value() | match) : (oldConfigure.value() & ~match); + Status res = mConfigurationMap.writeValue(key, newConfiguration, BPF_EXIST); + if (!isOk(res)) { + ALOGE("Failed to toggleUidOwnerMap(%d): %s", chain, res.msg().c_str()); + } + return -res.code(); +} + Status TrafficController::swapActiveStatsMap() { std::lock_guard guard(mMutex); diff --git a/service/native/include/TrafficController.h b/service/native/include/TrafficController.h index 14c5eaf768..8512929b8e 100644 --- a/service/native/include/TrafficController.h +++ b/service/native/include/TrafficController.h @@ -71,6 +71,8 @@ class TrafficController { netdutils::Status updateUidOwnerMap(const uint32_t uid, UidOwnerMatchType matchType, IptOp op) EXCLUDES(mMutex); + int toggleUidOwnerMap(ChildChain chain, bool enable) EXCLUDES(mMutex); + static netdutils::StatusOr> makeSkDestroyListener(); diff --git a/service/src/com/android/server/BpfNetMaps.java b/service/src/com/android/server/BpfNetMaps.java index 3befd86458..0270fc2b10 100644 --- a/service/src/com/android/server/BpfNetMaps.java +++ b/service/src/com/android/server/BpfNetMaps.java @@ -637,6 +637,7 @@ public class BpfNetMaps { private native int native_addNiceApp(int uid); @GuardedBy("sUidOwnerMap") private native int native_removeNiceApp(int uid); + private native int native_setChildChain(int childChain, boolean enable); @GuardedBy("sUidOwnerMap") private native int native_replaceUidChain(String name, boolean isAllowlist, int[] uids); @GuardedBy("sUidOwnerMap")