summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaciej Żenczykowski <maze@google.com>2022-06-21 09:05:33 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2022-06-21 09:05:33 +0000
commit55cb48d2b0ebee661a5cc9bb66608fed51647d22 (patch)
tree20e11893ee4c1038033d319efa3f98e44fee93b0
parent99908c25bad14dd9a3626bdd1b24c48a9ccb03b4 (diff)
parent5d99d148f170cae5aa442c19cb0b6b5f6a7a955a (diff)
downloadnet-55cb48d2b0ebee661a5cc9bb66608fed51647d22.tar.gz
BpfMap - add BpfMapRO.init() support am: 5d99d148f1
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/libs/net/+/18992757 Change-Id: I4b338e533ede4cdf45044684af90f2b32e8e206d Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r--common/native/bpf_headers/include/bpf/BpfMap.h47
1 files changed, 29 insertions, 18 deletions
diff --git a/common/native/bpf_headers/include/bpf/BpfMap.h b/common/native/bpf_headers/include/bpf/BpfMap.h
index a7720eab..2bee2ee4 100644
--- a/common/native/bpf_headers/include/bpf/BpfMap.h
+++ b/common/native/bpf_headers/include/bpf/BpfMap.h
@@ -103,8 +103,29 @@ class BpfMap {
return {};
}
+ protected:
+ [[clang::reinitializes]] base::Result<void> init(const char* path, int fd) {
+ mMapFd.reset(fd);
+ if (mMapFd == -1) {
+ return ErrnoErrorf("Pinned map not accessible or does not exist: ({})", path);
+ }
+ if (isAtLeastKernelVersion(4, 14, 0)) {
+ // Normally we should return an error here instead of calling abort,
+ // but this cannot happen at runtime without a massive code bug (K/V type mismatch)
+ // and as such it's better to just blow the system up and let the developer fix it.
+ // Crashes are much more likely to be noticed than logs and missing functionality.
+ if (bpfGetFdKeySize(mMapFd) != sizeof(Key)) abort();
+ if (bpfGetFdValueSize(mMapFd) != sizeof(Value)) abort();
+ }
+ return {};
+ }
+
+ public:
// Function that tries to get map from a pinned path.
- [[clang::reinitializes]] base::Result<void> init(const char* path);
+ [[clang::reinitializes]] base::Result<void> init(const char* path) {
+ return init(path, mapRetrieveRW(path));
+ }
+
#ifdef TEST_BPF_MAP
// due to Android SELinux limitations which prevent map creation by anyone besides the bpfloader
@@ -210,23 +231,6 @@ class BpfMap {
};
template <class Key, class Value>
-base::Result<void> BpfMap<Key, Value>::init(const char* path) {
- mMapFd.reset(mapRetrieveRW(path));
- if (mMapFd == -1) {
- return ErrnoErrorf("Pinned map not accessible or does not exist: ({})", path);
- }
- if (isAtLeastKernelVersion(4, 14, 0)) {
- // Normally we should return an error here instead of calling abort,
- // but this cannot happen at runtime without a massive code bug (K/V type mismatch)
- // and as such it's better to just blow the system up and let the developer fix it.
- // Crashes are much more likely to be noticed than logs and missing functionality.
- if (bpfGetFdKeySize(mMapFd) != sizeof(Key)) abort();
- if (bpfGetFdValueSize(mMapFd) != sizeof(Value)) abort();
- }
- return {};
-}
-
-template <class Key, class Value>
base::Result<void> BpfMap<Key, Value>::iterate(
const std::function<base::Result<void>(const Key& key, const BpfMap<Key, Value>& map)>&
filter) const {
@@ -292,8 +296,15 @@ base::Result<void> BpfMap<Key, Value>::iterateWithValue(
template <class Key, class Value>
class BpfMapRO : public BpfMap<Key, Value> {
public:
+ BpfMapRO<Key, Value>() {};
+
explicit BpfMapRO<Key, Value>(const char* pathname)
: BpfMap<Key, Value>(pathname, BPF_F_RDONLY) {}
+
+ // Function that tries to get map from a pinned path.
+ [[clang::reinitializes]] base::Result<void> init(const char* path) {
+ return BpfMap<Key,Value>::init(path, mapRetrieveRO(path));
+ }
};
} // namespace bpf