Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions test/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ CXXFLAGS = -g -D__GTEST__ -DBUILTIN -MMD \
-I$(PROJ_ROOT)/build/policy \
-I$(PROJ_ROOT)/bpf/export

LDFLAGS = -Wl,-rpath=$(PROJ_ROOT)/googletest/build/lib/
LDFLAGS = -Wl,-rpath='$$ORIGIN/../../googletest/build/lib'
LDLIBS = -lbpf -lpthread -lelf -lz

GTEST_LIBS = $(PROJ_ROOT)/googletest/build/lib/libgtest_main.so \
$(PROJ_ROOT)/googletest/build/lib/libgtest.so
Expand All @@ -43,9 +44,9 @@ $(TARGET): $(OBJS) $(GTEST_LIBS) \
$(BUILD_DIR)/kmemleak.o \
$(BUILD_DIR)/irqsnoop.o \
$(BUILD_DIR)/mountsnoop.o \
$(BUILD_DIR)/frtp.o \
$(BUILD_DIR)/syscall-stat.o \
$(BUILD_DIR)/elfverify.o
$(CXX) $^ $(LDFLAGS) -o $@
$(CXX) $^ $(LDFLAGS) $(LDLIBS) -o $@

$(BUILD_DIR):
@mkdir -p $@
Expand Down
100 changes: 78 additions & 22 deletions test/mock.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ struct bpf_map
size_t value_size;
size_t max_entries;
size_t sz;
size_t mmap_sz;
void *mem;
bpf_map_type type;
std::string name;
Expand All @@ -81,6 +82,15 @@ struct bpf_object
std::vector<bpf_link> links;
};

struct skeleton_offsets
{
size_t map_base;
size_t prog_base;
size_t link_base;
int map_cnt;
int prog_cnt;
};

struct ring_buffer
{
int map_fd;
Expand All @@ -90,6 +100,7 @@ struct ring_buffer
};

static bpf_object g_obj;
static std::map<const bpf_object_skeleton *, skeleton_offsets> g_skeleton_offsets;

std::string fd_path(int fd)
{
Expand Down Expand Up @@ -293,22 +304,52 @@ void bpf_object__destroy_skeleton(struct bpf_object_skeleton *s)
return;
}

int fd;
char buf[PATH_MAX];

for (int i = 0; i < s->prog_cnt; i++)
auto offset_it = g_skeleton_offsets.find(s);
if (offset_it == g_skeleton_offsets.end())
{
close(g_obj.progs[i].fd);
close(g_obj.links[i].fd);
free(s->maps);
free(s->progs);
free(s);
return;
}
g_obj.progs.clear();
g_obj.links.clear();
const skeleton_offsets offsets = offset_it->second;

for (int i = 0; i < s->map_cnt; i++)
{
munmap(g_obj.maps[i].mem, g_obj.maps[i].sz);
close(g_obj.maps[i].fd);
if (s->maps[i].mmaped && *s->maps[i].mmaped)
{
free(*s->maps[i].mmaped);
*s->maps[i].mmaped = nullptr;
}
}
g_obj.maps.clear();

for (int i = 0; i < offsets.prog_cnt; i++)
{
close(g_obj.progs[offsets.prog_base + i].fd);
close(g_obj.links[offsets.link_base + i].fd);
}
g_obj.progs.erase(
g_obj.progs.begin() + offsets.prog_base,
g_obj.progs.begin() + offsets.prog_base + offsets.prog_cnt
);
g_obj.links.erase(
g_obj.links.begin() + offsets.link_base,
g_obj.links.begin() + offsets.link_base + offsets.prog_cnt
);
for (int i = 0; i < offsets.map_cnt; i++)
{
bpf_map &map = g_obj.maps[offsets.map_base + i];
if (map.mem)
{
munmap(map.mem, map.mmap_sz ? map.mmap_sz : map.sz);
}
close(map.fd);
}
g_obj.maps.erase(
g_obj.maps.begin() + offsets.map_base,
g_obj.maps.begin() + offsets.map_base + offsets.map_cnt
);
g_skeleton_offsets.erase(offset_it);
free(s->maps);
free(s->progs);
free(s);
Expand All @@ -319,7 +360,7 @@ int bpf_object__find_map_fd_by_name(
const char *name
)
{
for (int i = 0; i < obj->maps.size(); i++)
for (int i = (int)obj->maps.size() - 1; i >= 0; i--)
{
if (obj->maps[i].name == name)
{
Expand All @@ -345,15 +386,21 @@ int bpf_object__open_skeleton(

*s->obj = &g_obj;

const size_t map_base = g_obj.maps.size();
const size_t prog_base = g_obj.progs.size();
const size_t link_base = g_obj.links.size();
g_obj.maps.reserve(map_base + s->map_cnt);
g_obj.progs.reserve(prog_base + s->prog_cnt);
g_obj.links.reserve(link_base + s->prog_cnt);
g_skeleton_offsets[s] = {map_base, prog_base, link_base, s->map_cnt, s->prog_cnt};

int fd;
bpf_program prog;
bpf_map map;
bpf_link link;
const char *name;
char buf[PATH_MAX];

for (int i = 0; i < s->map_cnt; i++)
{
bpf_map map {};
name = s->maps[i].name;
snprintf(buf, PATH_MAX, "%s/map-%s", BPF_PIN_PATH, name);
fd = open(buf, O_RDWR | O_TRUNC | O_CREAT, 0600);
Expand All @@ -378,35 +425,43 @@ int bpf_object__open_skeleton(
map.sz = RB_MAP_SIZE;
map.type = BPF_MAP_TYPE_UNSPEC;
}
map.mmap_sz = 0;
int page_size = getpagesize();
if (strcmp(name, "dk_shared_mem") == 0 ||
map.type == BPF_MAP_TYPE_RINGBUF)
{
int ret = 0;
ret = ftruncate(fd, page_size * 2 + RB_MAP_SIZE);
map.mmap_sz = page_size * 2 + RB_MAP_SIZE;
ret = ftruncate(fd, map.mmap_sz);
assert(ret == 0);
map.type = BPF_MAP_TYPE_RINGBUF;
map.mem = mmap(
NULL,
page_size * 2 + RB_MAP_SIZE,
map.mmap_sz,
PROT_READ | PROT_WRITE,
MAP_SHARED,
fd,
0
);
assert(map.mem != MAP_FAILED);
memset(map.mem, 0, page_size * 2 + RB_MAP_SIZE);
memset(map.mem, 0, map.mmap_sz);
}
else
{
map.mem = nullptr;
}
g_obj.maps.push_back(std::move(map));
*s->maps[i].map = &g_obj.maps[i];
*s->maps[i].map = &g_obj.maps[map_base + i];
if (s->maps[i].mmaped)
{
*s->maps[i].mmaped = calloc(1, getpagesize());
assert(*s->maps[i].mmaped != nullptr);
}
}

for (int i = 0; i < s->prog_cnt; i++)
{
bpf_program prog {};
name = s->progs[i].name;
snprintf(buf, PATH_MAX, "%s/prog-%s", BPF_PIN_PATH, name);
fd = open(buf, O_RDWR | O_TRUNC | O_CREAT, 0600);
Expand All @@ -432,8 +487,9 @@ int bpf_object__open_skeleton(
}
}
g_obj.progs.push_back(std::move(prog));
*s->progs[i].prog = &g_obj.progs[i];
*s->progs[i].prog = &g_obj.progs[prog_base + i];

bpf_link link {};
snprintf(buf, PATH_MAX, "%s/link-%s", BPF_PIN_PATH, name);
fd = open(buf, O_RDWR | O_TRUNC | O_CREAT, 0600);
if (fd < 0)
Expand All @@ -442,9 +498,9 @@ int bpf_object__open_skeleton(
}
link.fd = fd;
link.pin_path = buf;
link.prog = &g_obj.progs[i];
link.prog = &g_obj.progs[prog_base + i];
g_obj.links.push_back(std::move(link));
*s->progs[i].link = &g_obj.links[i];
*s->progs[i].link = &g_obj.links[link_base + i];
}
return 0;
}
Expand Down
Loading
Loading