pkt-loop-filter: Switch to using BPF skeletons

This makes it easier to populate the global variables we'll need for
handling multicast, and also means we don't have to worry about keeping the
BPF object file around (since it'll be statically linked).

Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com>
This commit is contained in:
Toke Høiland-Jørgensen
2022-06-14 17:15:42 +02:00
parent c57a5bc169
commit 50f3609658
2 changed files with 12 additions and 19 deletions

View File

@@ -2,6 +2,7 @@
USER_TARGETS += pkt-loop-filter
BPF_TARGETS += pkt-loop-filter.kern
BPF_SKEL_OBJ := pkt-loop-filter.kern.o
EXTRA_DEPS := pkt-loop-filter.h
LIB_DIR = ../lib

View File

@@ -11,15 +11,15 @@
#include <bpf/libbpf.h>
#include "pkt-loop-filter.kern.skel.h"
#define MAX_IFINDEXES 10
int main(int argc, char *argv[])
{
int err = 0, i, num_ifindexes = 0, _err, ingress_fd, egress_fd;
const char *filename = "pkt-loop-filter.kern.o";
struct pkt_loop_filter_kern *skel = NULL;
struct bpf_link *trace_link = NULL;
struct bpf_program *trace_prog;
struct bpf_object *obj = NULL;
int ifindex[MAX_IFINDEXES];
bool unload = false;
char pin_path[100];
@@ -60,40 +60,33 @@ int main(int argc, char *argv[])
if (unload)
goto unload;
obj = bpf_object__open(filename);
err = libbpf_get_error(obj);
skel = pkt_loop_filter_kern__open();
err = libbpf_get_error(skel);
if (err) {
fprintf(stderr, "Couldn't open file: %s\n", filename);
fprintf(stderr, "Couldn't open BPF skeleton: %s\n", strerror(errno));
return err;
}
err = bpf_object__load(obj);
err = pkt_loop_filter_kern__load(skel);
if (err) {
fprintf(stderr, "Failed to load object\n");
goto out;
}
egress_fd = bpf_program__fd(bpf_object__find_program_by_name(obj, "record_egress_pkt"));
egress_fd = bpf_program__fd(skel->progs.record_egress_pkt);
if (egress_fd < 0) {
fprintf(stderr, "Couldn't find program 'record_egress_pkt'\n");
err = -ENOENT;
goto out;
}
ingress_fd = bpf_program__fd(bpf_object__find_program_by_name(obj, "filter_ingress_pkt"));
ingress_fd = bpf_program__fd(skel->progs.filter_ingress_pkt);
if (ingress_fd < 0) {
fprintf(stderr, "Couldn't find program 'filter_ingress_pkt'\n");
err = -ENOENT;
goto out;
}
trace_prog = bpf_object__find_program_by_name(obj, "handle_device_notify");
if (!trace_prog) {
fprintf(stderr, "Couldn't find program 'handle_device_notify'\n");
err = -ENOENT;
goto out;
}
for (i = 0; i < num_ifindexes; i++) {
DECLARE_LIBBPF_OPTS(bpf_tc_opts, attach_egress,
.prog_fd = egress_fd);
@@ -130,14 +123,13 @@ int main(int argc, char *argv[])
}
}
trace_link = bpf_program__attach(trace_prog);
trace_link = bpf_program__attach(skel->progs.handle_device_notify);
if (!trace_link) {
fprintf(stderr, "Couldn't attach tracing prog: %s\n", strerror(errno));
err = -EFAULT;
goto unload;
}
err = bpf_link__pin(trace_link, pin_path);
if (err) {
fprintf(stderr, "Couldn't pin bpf_link: %s\n", strerror(errno));
@@ -146,7 +138,7 @@ int main(int argc, char *argv[])
out:
bpf_link__destroy(trace_link);
bpf_object__close(obj);
pkt_loop_filter_kern__destroy(skel);
return err;
unload: