diff options
Diffstat (limited to 'samples/bpf/xdp_redirect_map_user.c')
-rw-r--r-- | samples/bpf/xdp_redirect_map_user.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/samples/bpf/xdp_redirect_map_user.c b/samples/bpf/xdp_redirect_map_user.c index a1ad00fdaa8a..d4d86a273fba 100644 --- a/samples/bpf/xdp_redirect_map_user.c +++ b/samples/bpf/xdp_redirect_map_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(); @@ -70,7 +72,6 @@ static void usage(const char *prog) prog); } - int main(int argc, char **argv) { const char *optstr = "SN"; @@ -112,14 +113,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); + printf("map[0] (vports) = %i, map[1] (map) = %i, map[2] (count) = %i\n", map_fd[0], map_fd[1], map_fd[2]); |