summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-05-12 18:46:43 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-05-12 18:46:43 +0000
commit8037e486ef5a5029ca8f8a71084fdcdd449d3214 (patch)
tree54aada10011b17c300209626c15fe0ade9d0ece1
parent127b7a878ce815e3dc18164271183bdd09548eff (diff)
parentef5e791312fbed4ead02809893039d8e21b43a03 (diff)
downloadnet-main-cg-testing-release.tar.gz
Snap for 8580505 from ef5e791312fbed4ead02809893039d8e21b43a03 to main-cg-testing-releasemain-cg-testing-release
Change-Id: Ic90ec8213051ee65e913a36143b6e5588b158dac
-rw-r--r--common/device/com/android/net/module/util/BpfMap.java32
-rw-r--r--common/native/bpfmapjni/com_android_net_module_util_BpfMap.cpp11
2 files changed, 16 insertions, 27 deletions
diff --git a/common/device/com/android/net/module/util/BpfMap.java b/common/device/com/android/net/module/util/BpfMap.java
index f1420c21..0ee862ac 100644
--- a/common/device/com/android/net/module/util/BpfMap.java
+++ b/common/device/com/android/net/module/util/BpfMap.java
@@ -18,6 +18,7 @@ package com.android.net.module.util;
import static android.system.OsConstants.EEXIST;
import static android.system.OsConstants.ENOENT;
+import android.os.ParcelFileDescriptor;
import android.system.ErrnoException;
import androidx.annotation.NonNull;
@@ -26,6 +27,7 @@ import androidx.annotation.VisibleForTesting;
import com.android.net.module.util.Struct;
+import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.NoSuchElementException;
@@ -57,7 +59,7 @@ public class BpfMap<K extends Struct, V extends Struct> implements IBpfMap<K, V>
private static final int BPF_NOEXIST = 1;
private static final int BPF_EXIST = 2;
- private final int mMapFd;
+ private final ParcelFileDescriptor mMapFd;
private final Class<K> mKeyClass;
private final Class<V> mValueClass;
private final int mKeySize;
@@ -72,8 +74,7 @@ public class BpfMap<K extends Struct, V extends Struct> implements IBpfMap<K, V>
*/
public BpfMap(@NonNull final String path, final int flag, final Class<K> key,
final Class<V> value) throws ErrnoException, NullPointerException {
- mMapFd = bpfFdGet(path, flag);
-
+ mMapFd = ParcelFileDescriptor.adoptFd(bpfFdGet(path, flag));
mKeyClass = key;
mValueClass = value;
mKeySize = Struct.getSize(key);
@@ -85,10 +86,11 @@ public class BpfMap<K extends Struct, V extends Struct> implements IBpfMap<K, V>
* The derived class implements an internal mocked map. It need to implement all functions
* which are related with the native BPF map because the BPF map handler is not initialized.
* See BpfCoordinatorTest#TestBpfMap.
+ * TODO: remove once TestBpfMap derive from IBpfMap.
*/
@VisibleForTesting
protected BpfMap(final Class<K> key, final Class<V> value) {
- mMapFd = -1;
+ mMapFd = ParcelFileDescriptor.adoptFd(-1 /*invalid*/); // unused
mKeyClass = key;
mValueClass = value;
mKeySize = Struct.getSize(key);
@@ -101,7 +103,7 @@ public class BpfMap<K extends Struct, V extends Struct> implements IBpfMap<K, V>
*/
@Override
public void updateEntry(K key, V value) throws ErrnoException {
- writeToMapEntry(mMapFd, key.writeToBytes(), value.writeToBytes(), BPF_ANY);
+ writeToMapEntry(mMapFd.getFd(), key.writeToBytes(), value.writeToBytes(), BPF_ANY);
}
/**
@@ -112,7 +114,7 @@ public class BpfMap<K extends Struct, V extends Struct> implements IBpfMap<K, V>
public void insertEntry(K key, V value)
throws ErrnoException, IllegalStateException {
try {
- writeToMapEntry(mMapFd, key.writeToBytes(), value.writeToBytes(), BPF_NOEXIST);
+ writeToMapEntry(mMapFd.getFd(), key.writeToBytes(), value.writeToBytes(), BPF_NOEXIST);
} catch (ErrnoException e) {
if (e.errno == EEXIST) throw new IllegalStateException(key + " already exists");
@@ -128,7 +130,7 @@ public class BpfMap<K extends Struct, V extends Struct> implements IBpfMap<K, V>
public void replaceEntry(K key, V value)
throws ErrnoException, NoSuchElementException {
try {
- writeToMapEntry(mMapFd, key.writeToBytes(), value.writeToBytes(), BPF_EXIST);
+ writeToMapEntry(mMapFd.getFd(), key.writeToBytes(), value.writeToBytes(), BPF_EXIST);
} catch (ErrnoException e) {
if (e.errno == ENOENT) throw new NoSuchElementException(key + " not found");
@@ -146,13 +148,13 @@ public class BpfMap<K extends Struct, V extends Struct> implements IBpfMap<K, V>
public boolean insertOrReplaceEntry(K key, V value)
throws ErrnoException {
try {
- writeToMapEntry(mMapFd, key.writeToBytes(), value.writeToBytes(), BPF_NOEXIST);
+ writeToMapEntry(mMapFd.getFd(), key.writeToBytes(), value.writeToBytes(), BPF_NOEXIST);
return true; /* insert succeeded */
} catch (ErrnoException e) {
if (e.errno != EEXIST) throw e;
}
try {
- writeToMapEntry(mMapFd, key.writeToBytes(), value.writeToBytes(), BPF_EXIST);
+ writeToMapEntry(mMapFd.getFd(), key.writeToBytes(), value.writeToBytes(), BPF_EXIST);
return false; /* replace succeeded */
} catch (ErrnoException e) {
if (e.errno != ENOENT) throw e;
@@ -169,7 +171,7 @@ public class BpfMap<K extends Struct, V extends Struct> implements IBpfMap<K, V>
/** Remove existing key from eBpf map. Return false if map was not modified. */
@Override
public boolean deleteEntry(K key) throws ErrnoException {
- return deleteMapEntry(mMapFd, key.writeToBytes());
+ return deleteMapEntry(mMapFd.getFd(), key.writeToBytes());
}
/** Returns {@code true} if this map contains no elements. */
@@ -202,7 +204,7 @@ public class BpfMap<K extends Struct, V extends Struct> implements IBpfMap<K, V>
private byte[] getNextRawKey(@Nullable final byte[] key) throws ErrnoException {
byte[] nextKey = new byte[mKeySize];
- if (getNextMapKey(mMapFd, key, nextKey)) return nextKey;
+ if (getNextMapKey(mMapFd.getFd(), key, nextKey)) return nextKey;
return null;
}
@@ -237,7 +239,7 @@ public class BpfMap<K extends Struct, V extends Struct> implements IBpfMap<K, V>
private byte[] getRawValue(final byte[] key) throws ErrnoException {
byte[] value = new byte[mValueSize];
- if (findMapEntry(mMapFd, key, value)) return value;
+ if (findMapEntry(mMapFd.getFd(), key, value)) return value;
return null;
}
@@ -262,8 +264,8 @@ public class BpfMap<K extends Struct, V extends Struct> implements IBpfMap<K, V>
}
@Override
- public void close() throws ErrnoException {
- closeMap(mMapFd);
+ public void close() throws IOException {
+ mMapFd.close();
}
/**
@@ -281,8 +283,6 @@ public class BpfMap<K extends Struct, V extends Struct> implements IBpfMap<K, V>
}
}
- private static native int closeMap(int fd) throws ErrnoException;
-
private native int bpfFdGet(String path, int mode) throws ErrnoException, NullPointerException;
private native void writeToMapEntry(int fd, byte[] key, byte[] value, int flags)
diff --git a/common/native/bpfmapjni/com_android_net_module_util_BpfMap.cpp b/common/native/bpfmapjni/com_android_net_module_util_BpfMap.cpp
index e25e17de..e3f48e56 100644
--- a/common/native/bpfmapjni/com_android_net_module_util_BpfMap.cpp
+++ b/common/native/bpfmapjni/com_android_net_module_util_BpfMap.cpp
@@ -27,15 +27,6 @@
namespace android {
-static jint com_android_net_module_util_BpfMap_closeMap(JNIEnv *env, jobject clazz,
- jint fd) {
- int ret = close(fd);
-
- if (ret) jniThrowErrnoException(env, "closeMap", errno);
-
- return ret;
-}
-
static jint com_android_net_module_util_BpfMap_bpfFdGet(JNIEnv *env, jobject clazz,
jstring path, jint mode) {
ScopedUtfChars pathname(env, path);
@@ -112,8 +103,6 @@ static jboolean com_android_net_module_util_BpfMap_findMapEntry(JNIEnv *env, job
*/
static const JNINativeMethod gMethods[] = {
/* name, signature, funcPtr */
- { "closeMap", "(I)I",
- (void*) com_android_net_module_util_BpfMap_closeMap },
{ "bpfFdGet", "(Ljava/lang/String;I)I",
(void*) com_android_net_module_util_BpfMap_bpfFdGet },
{ "writeToMapEntry", "(I[B[BI)V",