diff options
Diffstat (limited to 'samples/bpf/xdp_redirect_user.c')
-rw-r--r-- | samples/bpf/xdp_redirect_user.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/samples/bpf/xdp_redirect_user.c b/samples/bpf/xdp_redirect_user.c index f705a1905d2d..4475d837bf2c 100644 --- a/samples/bpf/xdp_redirect_user.c +++ b/samples/bpf/xdp_redirect_user.c @@ -16,6 +16,7 @@ #include <signal.h> #include <stdio.h> #include <stdlib.h> +#include <stdbool.h> #include <string.h> #include <unistd.h> #include <libgen.h> @@ -26,17 +27,18 @@ static int ifindex_in; static int ifindex_out; +static bool ifindex_out_xdp_dummy_attached = true; static __u32 xdp_flags; static void int_exit(int sig) { set_link_xdp_fd(ifindex_in, -1, xdp_flags); + if (ifindex_out_xdp_dummy_attached) + set_link_xdp_fd(ifindex_out, -1, xdp_flags); exit(0); } -/* simple per-protocol drop counter - */ static void poll_stats(int interval, int ifindex) { unsigned int nr_cpus = bpf_num_possible_cpus(); @@ -112,14 +114,21 @@ int main(int argc, char **argv) return 1; } - signal(SIGINT, int_exit); - signal(SIGTERM, int_exit); - if (set_link_xdp_fd(ifindex_in, prog_fd[0], xdp_flags) < 0) { - printf("link set xdp fd failed\n"); + printf("ERROR: link set xdp fd failed on %d\n", ifindex_in); return 1; } + /* Loading dummy XDP prog on out-device */ + if (set_link_xdp_fd(ifindex_out, prog_fd[1], + (xdp_flags | XDP_FLAGS_UPDATE_IF_NOEXIST)) < 0) { + printf("WARN: link set xdp fd failed on %d\n", ifindex_out); + ifindex_out_xdp_dummy_attached = false; + } + + signal(SIGINT, int_exit); + signal(SIGTERM, int_exit); + /* bpf redirect port */ ret = bpf_map_update_elem(map_fd[0], &key, &ifindex_out, 0); if (ret) { |