-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathloader.c
More file actions
90 lines (73 loc) · 2.12 KB
/
Copy pathloader.c
File metadata and controls
90 lines (73 loc) · 2.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <stdio.h>
#include <unistd.h>
#include <bpf/libbpf.h>
#include <fcntl.h>
#include <signal.h>
// Auto-generated by bpftool
#include "sockmap_accel.bpf.skel.h"
#define CGROUP_PATH "/sys/fs/cgroup"
static volatile int stop = 0;
void sig_handler(int signo) {
stop = 1;
}
static int libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args) {
return vfprintf(stderr, format, args);
}
int main(int argc, char **argv) {
if (argc < 2) {
fprintf(stderr, "Usage: %s <sockperf server port>\n", argv[0]);
return 1;
}
int server_port = atoi(argv[1]);
// Setup signal handlers to ensure cleanup before termination
signal(SIGINT, sig_handler);
signal(SIGTERM, sig_handler);
// Setup logger
libbpf_set_print(libbpf_print_fn);
// (1) Open and load BPF skeleton
struct sockmap_accel_bpf *skel = sockmap_accel_bpf__open();
if (!skel) {
fprintf(stderr, "Failed to open BPF skeleton\n");
return 1;
}
int err = sockmap_accel_bpf__load(skel);
if (err) {
fprintf(stderr, "Failed to load BPF skeleton: %d\n", err);
goto out_bpf_destroy;
}
// Set server port in the BPF program
skel->bss->server_port = server_port;
// (2) Attach SOCK_OPS to Cgroup
int cgroup_fd = open(CGROUP_PATH, O_RDONLY);
if (cgroup_fd < 0) {
fprintf(stderr, "Failed to open cgroup: %s\n", CGROUP_PATH);
goto out_bpf_destroy;
}
skel->links.bpf_sockmap_handler = bpf_program__attach_cgroup(
skel->progs.bpf_sockmap_handler, cgroup_fd);
if (!skel->links.bpf_sockmap_handler) {
fprintf(stderr, "Failed to attach SOCK_OPS to cgroup\n");
goto out_cgroup_close;
}
printf("SOCK_OPS attached.\n");
// (3) Attach SK_MSG to SOCKMAP
skel->links.bpf_redir_handler = bpf_program__attach_sockmap(
skel->progs.bpf_redir_handler,
bpf_map__fd(skel->maps.sock_map)
);
if (!skel->links.bpf_redir_handler) {
fprintf(stderr, "Failed to attach SK_MSG to map\n");
goto out_cgroup_close;
}
printf("SK_MSG attached.\n");
printf("=== SOCKMAP Acceleration Running ===\n");
printf("Press Ctrl+c to stop.\n");
while (!stop) {
sleep(1);
}
out_cgroup_close:
close(cgroup_fd);
out_bpf_destroy:
sockmap_accel_bpf__destroy(skel);
return 0;
}