Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests, bpf: Add test for veth native XDP

Add a test case for veth native XDP. It checks if XDP_PASS, XDP_TX and
XDP_REDIRECT work properly.

$ cd tools/testing/selftests/bpf
$ make \
TEST_CUSTOM_PROGS= \
TEST_GEN_PROGS= \
TEST_GEN_PROGS_EXTENDED= \
TEST_PROGS_EXTENDED= \
TEST_PROGS="test_xdp_veth.sh" \
run_tests
TAP version 13
1..1
# selftests: bpf: test_xdp_veth.sh
# PING 10.1.1.33 (10.1.1.33) 56(84) bytes of data.
# 64 bytes from 10.1.1.33: icmp_seq=1 ttl=64 time=0.073 ms
#
# --- 10.1.1.33 ping statistics ---
# 1 packets transmitted, 1 received, 0% packet loss, time 0ms
# rtt min/avg/max/mdev = 0.073/0.073/0.073/0.000 ms
# selftests: xdp_veth [PASS]
ok 1 selftests: bpf: test_xdp_veth.sh

Signed-off-by: Toshiaki Makita <toshiaki.makita1@gmail.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>

authored by

Toshiaki Makita and committed by
Alexei Starovoitov
88091ff5 0bed6137

+162
+1
tools/testing/selftests/bpf/Makefile
··· 46 46 test_libbpf.sh \ 47 47 test_xdp_redirect.sh \ 48 48 test_xdp_meta.sh \ 49 + test_xdp_veth.sh \ 49 50 test_offload.py \ 50 51 test_sock_addr.sh \ 51 52 test_tunnel.sh \
+31
tools/testing/selftests/bpf/progs/xdp_redirect_map.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + 3 + #include <linux/bpf.h> 4 + #include "bpf_helpers.h" 5 + 6 + struct bpf_map_def SEC("maps") tx_port = { 7 + .type = BPF_MAP_TYPE_DEVMAP, 8 + .key_size = sizeof(int), 9 + .value_size = sizeof(int), 10 + .max_entries = 8, 11 + }; 12 + 13 + SEC("redirect_map_0") 14 + int xdp_redirect_map_0(struct xdp_md *xdp) 15 + { 16 + return bpf_redirect_map(&tx_port, 0, 0); 17 + } 18 + 19 + SEC("redirect_map_1") 20 + int xdp_redirect_map_1(struct xdp_md *xdp) 21 + { 22 + return bpf_redirect_map(&tx_port, 1, 0); 23 + } 24 + 25 + SEC("redirect_map_2") 26 + int xdp_redirect_map_2(struct xdp_md *xdp) 27 + { 28 + return bpf_redirect_map(&tx_port, 2, 0); 29 + } 30 + 31 + char _license[] SEC("license") = "GPL";
+12
tools/testing/selftests/bpf/progs/xdp_tx.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + 3 + #include <linux/bpf.h> 4 + #include "bpf_helpers.h" 5 + 6 + SEC("tx") 7 + int xdp_tx(struct xdp_md *xdp) 8 + { 9 + return XDP_TX; 10 + } 11 + 12 + char _license[] SEC("license") = "GPL";
+118
tools/testing/selftests/bpf/test_xdp_veth.sh
··· 1 + #!/bin/sh 2 + # SPDX-License-Identifier: GPL-2.0 3 + # 4 + # Create 3 namespaces with 3 veth peers, and 5 + # forward packets in-between using native XDP 6 + # 7 + # XDP_TX 8 + # NS1(veth11) NS2(veth22) NS3(veth33) 9 + # | | | 10 + # | | | 11 + # (veth1, (veth2, (veth3, 12 + # id:111) id:122) id:133) 13 + # ^ | ^ | ^ | 14 + # | | XDP_REDIRECT | | XDP_REDIRECT | | 15 + # | ------------------ ------------------ | 16 + # ----------------------------------------- 17 + # XDP_REDIRECT 18 + 19 + # Kselftest framework requirement - SKIP code is 4. 20 + ksft_skip=4 21 + 22 + TESTNAME=xdp_veth 23 + BPF_FS=$(awk '$3 == "bpf" {print $2; exit}' /proc/mounts) 24 + BPF_DIR=$BPF_FS/test_$TESTNAME 25 + 26 + _cleanup() 27 + { 28 + set +e 29 + ip link del veth1 2> /dev/null 30 + ip link del veth2 2> /dev/null 31 + ip link del veth3 2> /dev/null 32 + ip netns del ns1 2> /dev/null 33 + ip netns del ns2 2> /dev/null 34 + ip netns del ns3 2> /dev/null 35 + rm -rf $BPF_DIR 2> /dev/null 36 + } 37 + 38 + cleanup_skip() 39 + { 40 + echo "selftests: $TESTNAME [SKIP]" 41 + _cleanup 42 + 43 + exit $ksft_skip 44 + } 45 + 46 + cleanup() 47 + { 48 + if [ "$?" = 0 ]; then 49 + echo "selftests: $TESTNAME [PASS]" 50 + else 51 + echo "selftests: $TESTNAME [FAILED]" 52 + fi 53 + _cleanup 54 + } 55 + 56 + if [ $(id -u) -ne 0 ]; then 57 + echo "selftests: $TESTNAME [SKIP] Need root privileges" 58 + exit $ksft_skip 59 + fi 60 + 61 + if ! ip link set dev lo xdp off > /dev/null 2>&1; then 62 + echo "selftests: $TESTNAME [SKIP] Could not run test without the ip xdp support" 63 + exit $ksft_skip 64 + fi 65 + 66 + if [ -z "$BPF_FS" ]; then 67 + echo "selftests: $TESTNAME [SKIP] Could not run test without bpffs mounted" 68 + exit $ksft_skip 69 + fi 70 + 71 + if ! bpftool version > /dev/null 2>&1; then 72 + echo "selftests: $TESTNAME [SKIP] Could not run test without bpftool" 73 + exit $ksft_skip 74 + fi 75 + 76 + set -e 77 + 78 + trap cleanup_skip EXIT 79 + 80 + ip netns add ns1 81 + ip netns add ns2 82 + ip netns add ns3 83 + 84 + ip link add veth1 index 111 type veth peer name veth11 netns ns1 85 + ip link add veth2 index 122 type veth peer name veth22 netns ns2 86 + ip link add veth3 index 133 type veth peer name veth33 netns ns3 87 + 88 + ip link set veth1 up 89 + ip link set veth2 up 90 + ip link set veth3 up 91 + 92 + ip -n ns1 addr add 10.1.1.11/24 dev veth11 93 + ip -n ns3 addr add 10.1.1.33/24 dev veth33 94 + 95 + ip -n ns1 link set dev veth11 up 96 + ip -n ns2 link set dev veth22 up 97 + ip -n ns3 link set dev veth33 up 98 + 99 + mkdir $BPF_DIR 100 + bpftool prog loadall \ 101 + xdp_redirect_map.o $BPF_DIR/progs type xdp \ 102 + pinmaps $BPF_DIR/maps 103 + bpftool map update pinned $BPF_DIR/maps/tx_port key 0 0 0 0 value 122 0 0 0 104 + bpftool map update pinned $BPF_DIR/maps/tx_port key 1 0 0 0 value 133 0 0 0 105 + bpftool map update pinned $BPF_DIR/maps/tx_port key 2 0 0 0 value 111 0 0 0 106 + ip link set dev veth1 xdp pinned $BPF_DIR/progs/redirect_map_0 107 + ip link set dev veth2 xdp pinned $BPF_DIR/progs/redirect_map_1 108 + ip link set dev veth3 xdp pinned $BPF_DIR/progs/redirect_map_2 109 + 110 + ip -n ns1 link set dev veth11 xdp obj xdp_dummy.o sec xdp_dummy 111 + ip -n ns2 link set dev veth22 xdp obj xdp_tx.o sec tx 112 + ip -n ns3 link set dev veth33 xdp obj xdp_dummy.o sec xdp_dummy 113 + 114 + trap cleanup EXIT 115 + 116 + ip netns exec ns1 ping -c 1 -W 1 10.1.1.33 117 + 118 + exit 0