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. 20ksft_skip=4 21 22TESTNAME=xdp_veth 23BPF_FS=$(awk '$3 == "bpf" {print $2; exit}' /proc/mounts) 24BPF_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 38cleanup_skip() 39{ 40 echo "selftests: $TESTNAME [SKIP]" 41 _cleanup 42 43 exit $ksft_skip 44} 45 46cleanup() 47{ 48 if [ "$?" = 0 ]; then 49 echo "selftests: $TESTNAME [PASS]" 50 else 51 echo "selftests: $TESTNAME [FAILED]" 52 fi 53 _cleanup 54} 55 56if [ $(id -u) -ne 0 ]; then 57 echo "selftests: $TESTNAME [SKIP] Need root privileges" 58 exit $ksft_skip 59fi 60 61if ! 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 64fi 65 66if [ -z "$BPF_FS" ]; then 67 echo "selftests: $TESTNAME [SKIP] Could not run test without bpffs mounted" 68 exit $ksft_skip 69fi 70 71if ! bpftool version > /dev/null 2>&1; then 72 echo "selftests: $TESTNAME [SKIP] Could not run test without bpftool" 73 exit $ksft_skip 74fi 75 76set -e 77 78trap cleanup_skip EXIT 79 80ip netns add ns1 81ip netns add ns2 82ip netns add ns3 83 84ip link add veth1 index 111 type veth peer name veth11 netns ns1 85ip link add veth2 index 122 type veth peer name veth22 netns ns2 86ip link add veth3 index 133 type veth peer name veth33 netns ns3 87 88ip link set veth1 up 89ip link set veth2 up 90ip link set veth3 up 91 92ip -n ns1 addr add 10.1.1.11/24 dev veth11 93ip -n ns3 addr add 10.1.1.33/24 dev veth33 94 95ip -n ns1 link set dev veth11 up 96ip -n ns2 link set dev veth22 up 97ip -n ns3 link set dev veth33 up 98 99mkdir $BPF_DIR 100bpftool prog loadall \ 101 xdp_redirect_map.o $BPF_DIR/progs type xdp \ 102 pinmaps $BPF_DIR/maps 103bpftool map update pinned $BPF_DIR/maps/tx_port key 0 0 0 0 value 122 0 0 0 104bpftool map update pinned $BPF_DIR/maps/tx_port key 1 0 0 0 value 133 0 0 0 105bpftool map update pinned $BPF_DIR/maps/tx_port key 2 0 0 0 value 111 0 0 0 106ip link set dev veth1 xdp pinned $BPF_DIR/progs/redirect_map_0 107ip link set dev veth2 xdp pinned $BPF_DIR/progs/redirect_map_1 108ip link set dev veth3 xdp pinned $BPF_DIR/progs/redirect_map_2 109 110ip -n ns1 link set dev veth11 xdp obj xdp_dummy.o sec xdp_dummy 111ip -n ns2 link set dev veth22 xdp obj xdp_tx.o sec tx 112ip -n ns3 link set dev veth33 xdp obj xdp_dummy.o sec xdp_dummy 113 114trap cleanup EXIT 115 116ip netns exec ns1 ping -c 1 -W 1 10.1.1.33 117 118exit 0 119