summaryrefslogtreecommitdiffstats
path: root/tools/testing/selftests/bpf/progs/xsk_xdp_progs.c
diff options
context:
space:
mode:
authorTushar Vyavahare <tushar.vyavahare@intel.com>2023-09-27 19:22:41 +0530
committerDaniel Borkmann <daniel@iogearbox.net>2023-10-04 15:26:02 +0200
commit6d198a89c004723d9d2fff469fdcb1074c9642d6 (patch)
treed98df1dfe90f189683585d513d95fc6172c03ba4 /tools/testing/selftests/bpf/progs/xsk_xdp_progs.c
parentfc2cb86495da6b67518bedbf1a2d49af220d1521 (diff)
downloadlinux-stable-6d198a89c004723d9d2fff469fdcb1074c9642d6.tar.gz
linux-stable-6d198a89c004723d9d2fff469fdcb1074c9642d6.tar.bz2
linux-stable-6d198a89c004723d9d2fff469fdcb1074c9642d6.zip
selftests/xsk: Add a test for shared umem feature
Add a new test for testing shared umem feature. This is accomplished by adding a new XDP program and using the multiple sockets. The new XDP program redirects the packets based on the destination MAC address. Signed-off-by: Tushar Vyavahare <tushar.vyavahare@intel.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Acked-by: Magnus Karlsson <magnus.karlsson@intel.com> Link: https://lore.kernel.org/bpf/20230927135241.2287547-9-tushar.vyavahare@intel.com
Diffstat (limited to 'tools/testing/selftests/bpf/progs/xsk_xdp_progs.c')
-rw-r--r--tools/testing/selftests/bpf/progs/xsk_xdp_progs.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/tools/testing/selftests/bpf/progs/xsk_xdp_progs.c b/tools/testing/selftests/bpf/progs/xsk_xdp_progs.c
index 734f231a8534..ccde6a4c6319 100644
--- a/tools/testing/selftests/bpf/progs/xsk_xdp_progs.c
+++ b/tools/testing/selftests/bpf/progs/xsk_xdp_progs.c
@@ -3,11 +3,12 @@
#include <linux/bpf.h>
#include <bpf/bpf_helpers.h>
+#include <linux/if_ether.h>
#include "xsk_xdp_common.h"
struct {
__uint(type, BPF_MAP_TYPE_XSKMAP);
- __uint(max_entries, 1);
+ __uint(max_entries, 2);
__uint(key_size, sizeof(int));
__uint(value_size, sizeof(int));
} xsk SEC(".maps");
@@ -52,4 +53,21 @@ SEC("xdp.frags") int xsk_xdp_populate_metadata(struct xdp_md *xdp)
return bpf_redirect_map(&xsk, 0, XDP_DROP);
}
+SEC("xdp") int xsk_xdp_shared_umem(struct xdp_md *xdp)
+{
+ void *data = (void *)(long)xdp->data;
+ void *data_end = (void *)(long)xdp->data_end;
+ struct ethhdr *eth = data;
+
+ if (eth + 1 > data_end)
+ return XDP_DROP;
+
+ /* Redirecting packets based on the destination MAC address */
+ idx = ((unsigned int)(eth->h_dest[5])) / 2;
+ if (idx > MAX_SOCKETS)
+ return XDP_DROP;
+
+ return bpf_redirect_map(&xsk, idx, XDP_DROP);
+}
+
char _license[] SEC("license") = "GPL";