1 // SPDX-License-Identifier: (LGPL-2.1-or-later OR BSD-2-Clause)
4 #include <sys/resource.h>
9 /* XDP_FLAGS_SKB_MODE */
10 #include <linux/if_link.h>
12 #include "example.skel.h"
15 static int libbpf_print(enum libbpf_print_level level, const char *format, va_list args) {
16 if (level == LIBBPF_DEBUG) {
19 return vfprintf(stderr, format, args);
23 int main(int argc, char **argv) {
25 fprintf(stderr, "usage: %s <iface>\n", argv[0]);
29 const char *iface = argv[1];
30 unsigned int ifindex = if_nametoindex(iface);
32 perror("failed to resolve iface to ifindex");
36 struct rlimit rlim = {
37 .rlim_cur = RLIM_INFINITY,
38 .rlim_max = RLIM_INFINITY,
40 if (setrlimit(RLIMIT_MEMLOCK, &rlim)) {
41 perror("failed to increase RLIMIT_MEMLOCK");
45 libbpf_set_print(libbpf_print);
48 struct example_bpf *obj;
50 obj = example_bpf__open();
52 fprintf(stderr, "failed to open BPF object\n");
55 err = example_bpf__load(obj);
57 fprintf(stderr, "failed to load BPF object: %d\n", err);
62 * Use "xdpgeneric" mode; less performance but supported by all drivers
64 int flags = XDP_FLAGS_SKB_MODE;
65 int fd = bpf_program__fd(obj->progs.xdp_prog);
67 /* Attach BPF to network interface */
68 err = bpf_set_link_xdp_fd(ifindex, fd, flags);
70 fprintf(stderr, "failed to attach BPF to iface %s (%d): %d\n",
75 // XXX: replace with actual code, e.g. loop to get data from BPF
78 /* Remove BPF from network interface */
80 err = bpf_set_link_xdp_fd(ifindex, fd, flags);
82 fprintf(stderr, "failed to detach BPF from iface %s (%d): %d\n",
88 example_bpf__destroy(obj);