hc
2024-08-16 a24a44ff9ca902811b99aa9663d697cf452e08ef
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
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 xdp
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