-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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>
- Loading branch information
Toshiaki Makita
authored and
Alexei Starovoitov
committed
Jun 25, 2019
1 parent
0bed613
commit 88091ff
Showing
4 changed files
with
162 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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"; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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"; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |