refactor bpf maps into class
Use a class object to wrap up the bpf map file descriptor and provide
some base function to look up, write and delete the map content. The map
class also have a nested iterator class to iterate over the map and two
helper function to simplify the iterating process. Removed the
mDeleteStatsMutex since it cannot prevent framework side to read the
stats while we are deleting the stats and all the other netd operation
on the stats related map doesn't need to iterate through the map anyway.
Bug: 78250686
Test: netd_unit_test libbpf_test
Change-Id: I358ba65f7022fd03f8ca573550055734052b6fd2
diff --git a/tests/bpf_base_test.cpp b/tests/bpf_base_test.cpp
index 41945e2..fa7de0d 100644
--- a/tests/bpf_base_test.cpp
+++ b/tests/bpf_base_test.cpp
@@ -33,12 +33,14 @@
#include <android-base/stringprintf.h>
#include <android-base/strings.h>
+#include "bpf/BpfMap.h"
#include "bpf/BpfUtils.h"
using namespace android::bpf;
using android::base::unique_fd;
using android::netdutils::status::ok;
+using android::netdutils::StatusOr;
namespace android {
namespace bpf {
@@ -83,57 +85,61 @@
TEST_F(BpfBasicTest, TestTagSocket) {
SKIP_IF_BPF_NOT_SUPPORTED;
- unique_fd cookieTagMap = unique_fd(mapRetrieve(COOKIE_TAG_MAP_PATH, 0));
- ASSERT_LE(0, cookieTagMap);
+ BpfMap<uint64_t, UidTag> cookieTagMap(mapRetrieve(COOKIE_TAG_MAP_PATH, 0));
+ ASSERT_LE(0, cookieTagMap.getMap());
int sock = socket(AF_INET6, SOCK_STREAM, 0);
ASSERT_LE(0, sock);
uint64_t cookie = getSocketCookie(sock);
ASSERT_NE(NONEXISTENT_COOKIE, cookie);
ASSERT_EQ(0, qtaguid_tagSocket(sock, TEST_TAG, TEST_UID));
- struct UidTag tagResult;
- ASSERT_EQ(0, findMapEntry(cookieTagMap, &cookie, &tagResult));
- ASSERT_EQ(TEST_UID, tagResult.uid);
- ASSERT_EQ(TEST_TAG, tagResult.tag);
+ StatusOr<UidTag> tagResult = cookieTagMap.readValue(cookie);
+ ASSERT_TRUE(isOk(tagResult));
+ ASSERT_EQ(TEST_UID, tagResult.value().uid);
+ ASSERT_EQ(TEST_TAG, tagResult.value().tag);
ASSERT_EQ(0, qtaguid_untagSocket(sock));
- ASSERT_EQ(-1, findMapEntry(cookieTagMap, &cookie, &tagResult));
- ASSERT_EQ(ENOENT, errno);
+ tagResult = cookieTagMap.readValue(cookie);
+ ASSERT_FALSE(isOk(tagResult));
+ ASSERT_EQ(ENOENT, tagResult.status().code());
}
TEST_F(BpfBasicTest, TestChangeCounterSet) {
SKIP_IF_BPF_NOT_SUPPORTED;
- unique_fd uidCounterSetMap = unique_fd(mapRetrieve(UID_COUNTERSET_MAP_PATH, 0));
- ASSERT_LE(0, uidCounterSetMap);
+ BpfMap<uint32_t, uint8_t> uidCounterSetMap(mapRetrieve(UID_COUNTERSET_MAP_PATH, 0));
+ ASSERT_LE(0, uidCounterSetMap.getMap());
ASSERT_EQ(0, qtaguid_setCounterSet(TEST_COUNTERSET, TEST_UID));
uid_t uid = TEST_UID;
- int counterSetResult;
- ASSERT_EQ(0, findMapEntry(uidCounterSetMap, &uid, &counterSetResult));
- ASSERT_EQ(TEST_COUNTERSET, counterSetResult);
+ StatusOr<uint8_t> counterSetResult = uidCounterSetMap.readValue(uid);
+ ASSERT_TRUE(isOk(counterSetResult));
+ ASSERT_EQ(TEST_COUNTERSET, counterSetResult.value());
ASSERT_EQ(0, qtaguid_setCounterSet(DEFAULT_COUNTERSET, TEST_UID));
- ASSERT_EQ(-1, findMapEntry(uidCounterSetMap, &uid, &counterSetResult));
- ASSERT_EQ(ENOENT, errno);
+ counterSetResult = uidCounterSetMap.readValue(uid);
+ ASSERT_FALSE(isOk(counterSetResult));
+ ASSERT_EQ(ENOENT, counterSetResult.status().code());
}
TEST_F(BpfBasicTest, TestDeleteTagData) {
SKIP_IF_BPF_NOT_SUPPORTED;
- unique_fd uidStatsMap = unique_fd(mapRetrieve(UID_STATS_MAP_PATH, 0));
- ASSERT_LE(0, uidStatsMap);
- unique_fd tagStatsMap = unique_fd(mapRetrieve(TAG_STATS_MAP_PATH, 0));
- ASSERT_LE(0, tagStatsMap);
+ BpfMap<StatsKey, StatsValue> uidStatsMap(mapRetrieve(UID_STATS_MAP_PATH, 0));
+ ASSERT_LE(0, uidStatsMap.getMap());
+ BpfMap<StatsKey, StatsValue> tagStatsMap(mapRetrieve(TAG_STATS_MAP_PATH, 0));
+ ASSERT_LE(0, tagStatsMap.getMap());
StatsKey key = {.uid = TEST_UID, .tag = TEST_TAG, .counterSet = TEST_COUNTERSET,
.ifaceIndex = 1};
StatsValue statsMapValue = {.rxPackets = 1, .rxBytes = 100};
- EXPECT_EQ(0, writeToMapEntry(tagStatsMap, &key, &statsMapValue, BPF_ANY));
+ EXPECT_TRUE(isOk(tagStatsMap.writeValue(key, statsMapValue, BPF_ANY)));
key.tag = 0;
- EXPECT_EQ(0, writeToMapEntry(uidStatsMap, &key, &statsMapValue, BPF_ANY));
+ EXPECT_TRUE(isOk(uidStatsMap.writeValue(key, statsMapValue, BPF_ANY)));
ASSERT_EQ(0, qtaguid_deleteTagData(0, TEST_UID));
- ASSERT_EQ(-1, findMapEntry(uidStatsMap, &key, &statsMapValue));
- ASSERT_EQ(ENOENT, errno);
+ StatusOr<StatsValue> statsResult = uidStatsMap.readValue(key);
+ ASSERT_FALSE(isOk(statsResult));
+ ASSERT_EQ(ENOENT, statsResult.status().code());
key.tag = TEST_TAG;
- ASSERT_EQ(-1, findMapEntry(tagStatsMap, &key, &statsMapValue));
- ASSERT_EQ(ENOENT, errno);
+ statsResult = tagStatsMap.readValue(key);
+ ASSERT_FALSE(isOk(statsResult));
+ ASSERT_EQ(ENOENT, statsResult.status().code());
}
}