Raise MAX_SOCKETS from 2 to 4 so the XSKMAP and test arrays can accommodate the upcoming 4-socket shared-UMEM test. Update the XSKMAP max_entries to use MAX_SOCKETS so the BPF and C sides stay in sync. Add xsk_xdp_shared_umem_length_based() XDP program that routes packets by total XDP-visible packet length (data_end - data): socket 0 for packets <= SHARED_UMEM_LEN_SPLIT bytes and socket 1 for packets > SHARED_UMEM_LEN_SPLIT bytes. Define SHARED_UMEM_LEN_SPLIT as 64 to avoid hardcoded length thresholds in the classifier. Co-developed-by: Magnus Karlsson Signed-off-by: Magnus Karlsson Signed-off-by: Tushar Vyavahare --- tools/testing/selftests/bpf/progs/xsk_xdp_progs.c | 15 ++++++++++++++- tools/testing/selftests/bpf/xsk_xdp_common.h | 3 ++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/bpf/progs/xsk_xdp_progs.c b/tools/testing/selftests/bpf/progs/xsk_xdp_progs.c index 023d8befd4ca..8bab2bcf52ab 100644 --- a/tools/testing/selftests/bpf/progs/xsk_xdp_progs.c +++ b/tools/testing/selftests/bpf/progs/xsk_xdp_progs.c @@ -10,7 +10,7 @@ struct { __uint(type, BPF_MAP_TYPE_XSKMAP); - __uint(max_entries, 2); + __uint(max_entries, MAX_SOCKETS); __uint(key_size, sizeof(int)); __uint(value_size, sizeof(int)); } xsk SEC(".maps"); @@ -75,6 +75,19 @@ SEC("xdp") int xsk_xdp_shared_umem(struct xdp_md *xdp) return bpf_redirect_map(&xsk, idx, XDP_DROP); } +SEC("xdp") int xsk_xdp_shared_umem_length_based(struct xdp_md *xdp) +{ + void *data = (void *)(long)xdp->data; + void *data_end = (void *)(long)xdp->data_end; + __u32 pkt_len = data_end - data; + + /* Route packets by total XDP-visible packet length. */ + if (pkt_len <= SHARED_UMEM_LEN_SPLIT) + return bpf_redirect_map(&xsk, 0, XDP_DROP); + else + return bpf_redirect_map(&xsk, 1, XDP_DROP); +} + SEC("xdp.frags") int xsk_xdp_adjust_tail(struct xdp_md *xdp) { __u32 buff_len, curr_buff_len; diff --git a/tools/testing/selftests/bpf/xsk_xdp_common.h b/tools/testing/selftests/bpf/xsk_xdp_common.h index 45810ff552da..bd9b5dcf8c8e 100644 --- a/tools/testing/selftests/bpf/xsk_xdp_common.h +++ b/tools/testing/selftests/bpf/xsk_xdp_common.h @@ -3,7 +3,8 @@ #ifndef XSK_XDP_COMMON_H_ #define XSK_XDP_COMMON_H_ -#define MAX_SOCKETS 2 +#define MAX_SOCKETS 4 +#define SHARED_UMEM_LEN_SPLIT 64 #define PKT_HDR_ALIGN (sizeof(struct ethhdr) + 2) /* Just to align the data in the packet */ struct xdp_info { -- 2.43.0