selftests, bpf: Add test for veth native XDP
authorToshiaki Makita <toshiaki.makita1@gmail.com>
Thu, 20 Jun 2019 02:23:23 +0000 (11:23 +0900)
committerAlexei Starovoitov <ast@kernel.org>
Tue, 25 Jun 2019 01:18:30 +0000 (18:18 -0700)
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>
tools/testing/selftests/bpf/Makefile
tools/testing/selftests/bpf/progs/xdp_redirect_map.c [new file with mode: 0644]
tools/testing/selftests/bpf/progs/xdp_tx.c [new file with mode: 0644]
tools/testing/selftests/bpf/test_xdp_veth.sh [new file with mode: 0755]

index fb5ce43e28b35d555463e363ecef745100fb3b61..f2dbe20430677d5f281e770c45d84680e65385be 100644 (file)
@@ -46,6 +46,7 @@ TEST_PROGS := test_kmod.sh \
        test_libbpf.sh \
        test_xdp_redirect.sh \
        test_xdp_meta.sh \
+       test_xdp_veth.sh \
        test_offload.py \
        test_sock_addr.sh \
        test_tunnel.sh \
diff --git a/tools/testing/selftests/bpf/progs/xdp_redirect_map.c b/tools/testing/selftests/bpf/progs/xdp_redirect_map.c
new file mode 100644 (file)
index 0000000..e87a985
--- /dev/null
@@ -0,0 +1,31 @@
+// SPDX-License-Identifier: GPL-2.0
+
+#include <linux/bpf.h>
+#include "bpf_helpers.h"
+
+struct bpf_map_def SEC("maps") tx_port = {
+       .type = BPF_MAP_TYPE_DEVMAP,
+       .key_size = sizeof(int),
+       .value_size = sizeof(int),
+       .max_entries = 8,
+};
+
+SEC("redirect_map_0")
+int xdp_redirect_map_0(struct xdp_md *xdp)
+{
+       return bpf_redirect_map(&tx_port, 0, 0);
+}
+
+SEC("redirect_map_1")
+int xdp_redirect_map_1(struct xdp_md *xdp)
+{
+       return bpf_redirect_map(&tx_port, 1, 0);
+}
+
+SEC("redirect_map_2")
+int xdp_redirect_map_2(struct xdp_md *xdp)
+{
+       return bpf_redirect_map(&tx_port, 2, 0);
+}
+
+char _license[] SEC("license") = "GPL";
diff --git a/tools/testing/selftests/bpf/progs/xdp_tx.c b/tools/testing/selftests/bpf/progs/xdp_tx.c
new file mode 100644 (file)
index 0000000..57912e7
--- /dev/null
@@ -0,0 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
+
+#include <linux/bpf.h>
+#include "bpf_helpers.h"
+
+SEC("tx")
+int xdp_tx(struct xdp_md *xdp)
+{
+       return XDP_TX;
+}
+
+char _license[] SEC("license") = "GPL";
diff --git a/tools/testing/selftests/bpf/test_xdp_veth.sh b/tools/testing/selftests/bpf/test_xdp_veth.sh
new file mode 100755 (executable)
index 0000000..ba8ffcd
--- /dev/null
@@ -0,0 +1,118 @@
+#!/bin/sh
+# SPDX-License-Identifier: GPL-2.0
+#
+# Create 3 namespaces with 3 veth peers, and
+# forward packets in-between using native XDP
+#
+#                      XDP_TX
+# NS1(veth11)        NS2(veth22)        NS3(veth33)
+#      |                  |                  |
+#      |                  |                  |
+#   (veth1,            (veth2,            (veth3,
+#   id:111)            id:122)            id:133)
+#     ^ |                ^ |                ^ |
+#     | |  XDP_REDIRECT  | |  XDP_REDIRECT  | |
+#     | ------------------ ------------------ |
+#     -----------------------------------------
+#                    XDP_REDIRECT
+
+# Kselftest framework requirement - SKIP code is 4.
+ksft_skip=4
+
+TESTNAME=xdp_veth
+BPF_FS=$(awk '$3 == "bpf" {print $2; exit}' /proc/mounts)
+BPF_DIR=$BPF_FS/test_$TESTNAME
+
+_cleanup()
+{
+       set +e
+       ip link del veth1 2> /dev/null
+       ip link del veth2 2> /dev/null
+       ip link del veth3 2> /dev/null
+       ip netns del ns1 2> /dev/null
+       ip netns del ns2 2> /dev/null
+       ip netns del ns3 2> /dev/null
+       rm -rf $BPF_DIR 2> /dev/null
+}
+
+cleanup_skip()
+{
+       echo "selftests: $TESTNAME [SKIP]"
+       _cleanup
+
+       exit $ksft_skip
+}
+
+cleanup()
+{
+       if [ "$?" = 0 ]; then
+               echo "selftests: $TESTNAME [PASS]"
+       else
+               echo "selftests: $TESTNAME [FAILED]"
+       fi
+       _cleanup
+}
+
+if [ $(id -u) -ne 0 ]; then
+       echo "selftests: $TESTNAME [SKIP] Need root privileges"
+       exit $ksft_skip
+fi
+
+if ! ip link set dev lo xdp off > /dev/null 2>&1; then
+       echo "selftests: $TESTNAME [SKIP] Could not run test without the ip xdp support"
+       exit $ksft_skip
+fi
+
+if [ -z "$BPF_FS" ]; then
+       echo "selftests: $TESTNAME [SKIP] Could not run test without bpffs mounted"
+       exit $ksft_skip
+fi
+
+if ! bpftool version > /dev/null 2>&1; then
+       echo "selftests: $TESTNAME [SKIP] Could not run test without bpftool"
+       exit $ksft_skip
+fi
+
+set -e
+
+trap cleanup_skip EXIT
+
+ip netns add ns1
+ip netns add ns2
+ip netns add ns3
+
+ip link add veth1 index 111 type veth peer name veth11 netns ns1
+ip link add veth2 index 122 type veth peer name veth22 netns ns2
+ip link add veth3 index 133 type veth peer name veth33 netns ns3
+
+ip link set veth1 up
+ip link set veth2 up
+ip link set veth3 up
+
+ip -n ns1 addr add 10.1.1.11/24 dev veth11
+ip -n ns3 addr add 10.1.1.33/24 dev veth33
+
+ip -n ns1 link set dev veth11 up
+ip -n ns2 link set dev veth22 up
+ip -n ns3 link set dev veth33 up
+
+mkdir $BPF_DIR
+bpftool prog loadall \
+       xdp_redirect_map.o $BPF_DIR/progs type xdp \
+       pinmaps $BPF_DIR/maps
+bpftool map update pinned $BPF_DIR/maps/tx_port key 0 0 0 0 value 122 0 0 0
+bpftool map update pinned $BPF_DIR/maps/tx_port key 1 0 0 0 value 133 0 0 0
+bpftool map update pinned $BPF_DIR/maps/tx_port key 2 0 0 0 value 111 0 0 0
+ip link set dev veth1 xdp pinned $BPF_DIR/progs/redirect_map_0
+ip link set dev veth2 xdp pinned $BPF_DIR/progs/redirect_map_1
+ip link set dev veth3 xdp pinned $BPF_DIR/progs/redirect_map_2
+
+ip -n ns1 link set dev veth11 xdp obj xdp_dummy.o sec xdp_dummy
+ip -n ns2 link set dev veth22 xdp obj xdp_tx.o sec tx
+ip -n ns3 link set dev veth33 xdp obj xdp_dummy.o sec xdp_dummy
+
+trap cleanup EXIT
+
+ip netns exec ns1 ping -c 1 -W 1 10.1.1.33
+
+exit 0