diff options
Diffstat (limited to 'common/native/bpfmapjni')
-rw-r--r-- | common/native/bpfmapjni/Android.bp | 52 | ||||
-rw-r--r-- | common/native/bpfmapjni/com_android_net_module_util_BpfMap.cpp | 144 | ||||
-rw-r--r-- | common/native/bpfmapjni/com_android_net_module_util_TcUtils.cpp | 121 |
3 files changed, 0 insertions, 317 deletions
diff --git a/common/native/bpfmapjni/Android.bp b/common/native/bpfmapjni/Android.bp deleted file mode 100644 index 8babcce3..00000000 --- a/common/native/bpfmapjni/Android.bp +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright (C) 2021 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 { - default_applicable_licenses: ["Android-Apache-2.0"], -} - -cc_library_static { - name: "libnet_utils_device_common_bpfjni", - srcs: [ - "com_android_net_module_util_BpfMap.cpp", - "com_android_net_module_util_TcUtils.cpp", - ], - header_libs: [ - "bpf_headers", - "jni_headers", - ], - shared_libs: [ - "liblog", - "libnativehelper_compat_libc++", - ], - whole_static_libs: [ - "libtcutils", - ], - cflags: [ - "-Wall", - "-Werror", - "-Wno-unused-parameter", - ], - sdk_version: "30", - min_sdk_version: "30", - apex_available: [ - "com.android.tethering", - "//apex_available:platform", - ], - visibility: [ - "//packages/modules/Connectivity:__subpackages__", - // TODO: remove after NetworkStatsService moves to the module. - "//frameworks/base/packages/ConnectivityT/service", - ], -} diff --git a/common/native/bpfmapjni/com_android_net_module_util_BpfMap.cpp b/common/native/bpfmapjni/com_android_net_module_util_BpfMap.cpp deleted file mode 100644 index f93d6e17..00000000 --- a/common/native/bpfmapjni/com_android_net_module_util_BpfMap.cpp +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright (C) 2020 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. - */ - -#include <errno.h> -#include <jni.h> -#include <nativehelper/JNIHelp.h> -#include <nativehelper/ScopedLocalRef.h> - -#include "nativehelper/scoped_primitive_array.h" -#include "nativehelper/scoped_utf_chars.h" - -#define BPF_FD_JUST_USE_INT -#include "BpfSyscallWrappers.h" - -#include "bpf/KernelUtils.h" - -namespace android { - -static jint com_android_net_module_util_BpfMap_nativeBpfFdGet(JNIEnv *env, jclass clazz, - jstring path, jint mode, jint keySize, jint valueSize) { - ScopedUtfChars pathname(env, path); - - jint fd = bpf::bpfFdGet(pathname.c_str(), static_cast<unsigned>(mode)); - - if (fd < 0) { - jniThrowErrnoException(env, "nativeBpfFdGet", errno); - return -1; - } - - if (bpf::isAtLeastKernelVersion(4, 14, 0)) { - // These likely fail with -1 and set errno to EINVAL on <4.14 - if (bpf::bpfGetFdKeySize(fd) != keySize) { - close(fd); - jniThrowErrnoException(env, "nativeBpfFdGet KeySize", EBADFD); - return -1; - } - if (bpf::bpfGetFdValueSize(fd) != valueSize) { - close(fd); - jniThrowErrnoException(env, "nativeBpfFdGet ValueSize", EBADFD); - return -1; - } - } - - return fd; -} - -static void com_android_net_module_util_BpfMap_nativeWriteToMapEntry(JNIEnv *env, jobject self, - jint fd, jbyteArray key, jbyteArray value, jint flags) { - ScopedByteArrayRO keyRO(env, key); - ScopedByteArrayRO valueRO(env, value); - - int ret = bpf::writeToMapEntry(static_cast<int>(fd), keyRO.get(), valueRO.get(), - static_cast<int>(flags)); - - if (ret) jniThrowErrnoException(env, "nativeWriteToMapEntry", errno); -} - -static jboolean throwIfNotEnoent(JNIEnv *env, const char* functionName, int ret, int err) { - if (ret == 0) return true; - - if (err != ENOENT) jniThrowErrnoException(env, functionName, err); - return false; -} - -static jboolean com_android_net_module_util_BpfMap_nativeDeleteMapEntry(JNIEnv *env, jobject self, - jint fd, jbyteArray key) { - ScopedByteArrayRO keyRO(env, key); - - // On success, zero is returned. If the element is not found, -1 is returned and errno is set - // to ENOENT. - int ret = bpf::deleteMapEntry(static_cast<int>(fd), keyRO.get()); - - return throwIfNotEnoent(env, "nativeDeleteMapEntry", ret, errno); -} - -static jboolean com_android_net_module_util_BpfMap_nativeGetNextMapKey(JNIEnv *env, jobject self, - jint fd, jbyteArray key, jbyteArray nextKey) { - // If key is found, the operation returns zero and sets the next key pointer to the key of the - // next element. If key is not found, the operation returns zero and sets the next key pointer - // to the key of the first element. If key is the last element, -1 is returned and errno is - // set to ENOENT. Other possible errno values are ENOMEM, EFAULT, EPERM, and EINVAL. - ScopedByteArrayRW nextKeyRW(env, nextKey); - int ret; - if (key == nullptr) { - // Called by getFirstKey. Find the first key in the map. - ret = bpf::getNextMapKey(static_cast<int>(fd), nullptr, nextKeyRW.get()); - } else { - ScopedByteArrayRO keyRO(env, key); - ret = bpf::getNextMapKey(static_cast<int>(fd), keyRO.get(), nextKeyRW.get()); - } - - return throwIfNotEnoent(env, "nativeGetNextMapKey", ret, errno); -} - -static jboolean com_android_net_module_util_BpfMap_nativeFindMapEntry(JNIEnv *env, jobject self, - jint fd, jbyteArray key, jbyteArray value) { - ScopedByteArrayRO keyRO(env, key); - ScopedByteArrayRW valueRW(env, value); - - // If an element is found, the operation returns zero and stores the element's value into - // "value". If no element is found, the operation returns -1 and sets errno to ENOENT. - int ret = bpf::findMapEntry(static_cast<int>(fd), keyRO.get(), valueRW.get()); - - return throwIfNotEnoent(env, "nativeFindMapEntry", ret, errno); -} - -/* - * JNI registration. - */ -static const JNINativeMethod gMethods[] = { - /* name, signature, funcPtr */ - { "nativeBpfFdGet", "(Ljava/lang/String;III)I", - (void*) com_android_net_module_util_BpfMap_nativeBpfFdGet }, - { "nativeWriteToMapEntry", "(I[B[BI)V", - (void*) com_android_net_module_util_BpfMap_nativeWriteToMapEntry }, - { "nativeDeleteMapEntry", "(I[B)Z", - (void*) com_android_net_module_util_BpfMap_nativeDeleteMapEntry }, - { "nativeGetNextMapKey", "(I[B[B)Z", - (void*) com_android_net_module_util_BpfMap_nativeGetNextMapKey }, - { "nativeFindMapEntry", "(I[B[B)Z", - (void*) com_android_net_module_util_BpfMap_nativeFindMapEntry }, - -}; - -int register_com_android_net_module_util_BpfMap(JNIEnv* env, char const* class_name) { - return jniRegisterNativeMethods(env, - class_name, - gMethods, NELEM(gMethods)); -} - -}; // namespace android diff --git a/common/native/bpfmapjni/com_android_net_module_util_TcUtils.cpp b/common/native/bpfmapjni/com_android_net_module_util_TcUtils.cpp deleted file mode 100644 index cb06afbd..00000000 --- a/common/native/bpfmapjni/com_android_net_module_util_TcUtils.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (C) 2022 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. - */ - -#include <jni.h> -#include <nativehelper/JNIHelp.h> -#include <nativehelper/scoped_utf_chars.h> -#include <tcutils/tcutils.h> - -namespace android { - -static void throwIOException(JNIEnv *env, const char *msg, int error) { - jniThrowExceptionFmt(env, "java/io/IOException", "%s: %s", msg, - strerror(error)); -} - -static jboolean com_android_net_module_util_TcUtils_isEthernet(JNIEnv *env, - jobject clazz, - jstring iface) { - ScopedUtfChars interface(env, iface); - bool result = false; - int error = isEthernet(interface.c_str(), result); - if (error) { - throwIOException( - env, "com_android_net_module_util_TcUtils_isEthernet error: ", -error); - } - // result is not touched when error is returned; leave false. - return result; -} - -// tc filter add dev .. in/egress prio 1 protocol ipv6/ip bpf object-pinned -// /sys/fs/bpf/... direct-action -static void com_android_net_module_util_TcUtils_tcFilterAddDevBpf( - JNIEnv *env, jobject clazz, jint ifIndex, jboolean ingress, jshort prio, - jshort proto, jstring bpfProgPath) { - ScopedUtfChars pathname(env, bpfProgPath); - int error = tcAddBpfFilter(ifIndex, ingress, prio, proto, pathname.c_str()); - if (error) { - throwIOException( - env, - "com_android_net_module_util_TcUtils_tcFilterAddDevBpf error: ", -error); - } -} - -// tc filter add dev .. ingress prio .. protocol .. matchall \ -// action police rate .. burst .. conform-exceed pipe/continue \ -// action bpf object-pinned .. \ -// drop -static void com_android_net_module_util_TcUtils_tcFilterAddDevIngressPolice( - JNIEnv *env, jobject clazz, jint ifIndex, jshort prio, jshort proto, - jint rateInBytesPerSec, jstring bpfProgPath) { - ScopedUtfChars pathname(env, bpfProgPath); - int error = tcAddIngressPoliceFilter(ifIndex, prio, proto, rateInBytesPerSec, - pathname.c_str()); - if (error) { - throwIOException(env, - "com_android_net_module_util_TcUtils_" - "tcFilterAddDevIngressPolice error: ", - -error); - } -} - -// tc filter del dev .. in/egress prio .. protocol .. -static void com_android_net_module_util_TcUtils_tcFilterDelDev( - JNIEnv *env, jobject clazz, jint ifIndex, jboolean ingress, jshort prio, - jshort proto) { - int error = tcDeleteFilter(ifIndex, ingress, prio, proto); - if (error) { - throwIOException( - env, - "com_android_net_module_util_TcUtils_tcFilterDelDev error: ", -error); - } -} - -// tc qdisc add dev .. clsact -static void com_android_net_module_util_TcUtils_tcQdiscAddDevClsact(JNIEnv *env, - jobject clazz, - jint ifIndex) { - int error = tcAddQdiscClsact(ifIndex); - if (error) { - throwIOException( - env, - "com_android_net_module_util_TcUtils_tcQdiscAddDevClsact error: ", -error); - } -} - -/* - * JNI registration. - */ -static const JNINativeMethod gMethods[] = { - /* name, signature, funcPtr */ - {"isEthernet", "(Ljava/lang/String;)Z", - (void *)com_android_net_module_util_TcUtils_isEthernet}, - {"tcFilterAddDevBpf", "(IZSSLjava/lang/String;)V", - (void *)com_android_net_module_util_TcUtils_tcFilterAddDevBpf}, - {"tcFilterAddDevIngressPolice", "(ISSILjava/lang/String;)V", - (void *)com_android_net_module_util_TcUtils_tcFilterAddDevIngressPolice}, - {"tcFilterDelDev", "(IZSS)V", - (void *)com_android_net_module_util_TcUtils_tcFilterDelDev}, - {"tcQdiscAddDevClsact", "(I)V", - (void *)com_android_net_module_util_TcUtils_tcQdiscAddDevClsact}, -}; - -int register_com_android_net_module_util_TcUtils(JNIEnv *env, - char const *class_name) { - return jniRegisterNativeMethods(env, class_name, gMethods, NELEM(gMethods)); -} - -}; // namespace android |