2 # SPDX-License-Identifier: GPL-2.0
6 # must match the port that the bpf program filters on
9 readonly ns_prefix
="ns-$$-"
10 readonly ns1
="${ns_prefix}1"
11 readonly ns2
="${ns_prefix}2"
13 readonly ns1_v4
=192.168.1.1
14 readonly ns2_v4
=192.168.1.2
18 # Must match port used by bpf program
21 readonly mplsudpport
=6635
22 readonly mplsproto
=137
24 readonly infile
="$(mktemp)"
25 readonly outfile
="$(mktemp)"
31 ip link add dev veth1 mtu
1500 netns
"${ns1}" type veth \
32 peer name veth2 mtu
1500 netns
"${ns2}"
34 ip netns
exec "${ns1}" ethtool
-K veth1 tso off
36 ip
-netns "${ns1}" link
set veth1 up
37 ip
-netns "${ns2}" link
set veth2 up
39 ip
-netns "${ns1}" -4 addr add
"${ns1_v4}/24" dev veth1
40 ip
-netns "${ns2}" -4 addr add
"${ns2_v4}/24" dev veth2
41 ip
-netns "${ns1}" -6 addr add
"${ns1_v6}/64" dev veth1 nodad
42 ip
-netns "${ns2}" -6 addr add
"${ns2_v6}/64" dev veth2 nodad
44 # clamp route to reserve room for tunnel headers
45 ip
-netns "${ns1}" -4 route flush table main
46 ip
-netns "${ns1}" -6 route flush table main
47 ip
-netns "${ns1}" -4 route add
"${ns2_v4}" mtu
1458 dev veth1
48 ip
-netns "${ns1}" -6 route add
"${ns2_v6}" mtu
1438 dev veth1
52 dd if=/dev
/urandom of
="${infile}" bs
="${datalen}" count
=1 status
=none
59 if [[ -f "${outfile}" ]]; then
62 if [[ -f "${infile}" ]]; then
66 if [[ -n $server_pid ]]; then
67 kill $server_pid 2> /dev
/null
72 ip netns
exec "${ns2}" nc "${netcat_opt}" -l -p "${port}" > "${outfile}" &
78 ip netns
exec "${ns1}" timeout 2 nc "${netcat_opt}" -w 1 "${addr2}" "${port}" < "${infile}"
85 # sha1sum returns two fields [sha1] [filepath]
86 # convert to bash array and access first elem
87 insum
=($
(sha1sum ${infile}))
88 outsum
=($
(sha1sum ${outfile}))
89 if [[ "${insum[0]}" != "${outsum[0]}" ]]; then
97 # no arguments: automated test, run all
98 if [[ "$#" -eq "0" ]]; then
100 $0 ipv4 ipip none
100
103 $0 ipv6 ip6tnl none
100
108 for mac
in none mpls eth
; do
113 $0 ipv6 ip6gre
$mac 100
115 echo "ip gre $mac gso"
116 $0 ipv4 gre
$mac 2000
118 echo "ip6 gre $mac gso"
119 $0 ipv6 ip6gre
$mac 2000
125 $0 ipv6 ip6udp
$mac 100
127 echo "ip udp $mac gso"
128 $0 ipv4 udp
$mac 2000
130 echo "ip6 udp $mac gso"
131 $0 ipv6 ip6udp
$mac 2000
134 echo "OK. All tests passed"
138 if [[ "$#" -ne "4" ]]; then
140 echo " or: $0 <ipv4|ipv6> <tuntype> <none|mpls|eth> <data_len>"
146 readonly addr1
="${ns1_v4}"
147 readonly addr2
="${ns2_v4}"
149 readonly netcat_opt
=-${ipproto}
151 readonly foutype
=ipip
153 readonly fouproto_mpls
=${mplsproto}
154 readonly gretaptype
=gretap
157 readonly addr1
="${ns1_v6}"
158 readonly addr2
="${ns2_v6}"
160 readonly netcat_opt
=-${ipproto}
162 readonly foutype
=ip6tnl
163 readonly fouproto
="41 -6"
164 readonly fouproto_mpls
="${mplsproto} -6"
165 readonly gretaptype
=ip6gretap
168 echo "unknown arg: $1"
177 echo "encap ${addr1} to ${addr2}, type ${tuntype}, mac ${mac} len ${datalen}"
183 # basic communication works
184 echo "test basic connectivity"
189 # clientside, insert bpf program to encap all TCP to port ${port}
190 # client can no longer connect
191 ip netns
exec "${ns1}" tc qdisc add dev veth1 clsact
192 ip netns
exec "${ns1}" tc filter add dev veth1 egress \
193 bpf direct-action object-file .
/test_tc_tunnel.o \
194 section
"encap_${tuntype}_${mac}"
195 echo "test bpf encap without decap (expect failure)"
199 if [[ "$tuntype" =~
"udp" ]]; then
202 targs
="encap fou encap-sport auto encap-dport $udpport"
203 # fou may be a module; allow this to fail.
204 modprobe
"${foumod}" ||true
205 if [[ "$mac" == "mpls" ]]; then
207 dproto
=${fouproto_mpls}
208 tmode
="mode any ttl 255"
213 ip netns
exec "${ns2}" ip fou add port
$dport ipproto
${dproto}
214 targs
="encap fou encap-sport auto encap-dport $dport"
215 elif [[ "$tuntype" =~
"gre" && "$mac" == "eth" ]]; then
222 # tunnel address family differs from inner for SIT
223 if [[ "${tuntype}" == "sit" ]]; then
224 link_addr1
="${ns1_v4}"
225 link_addr2
="${ns2_v4}"
227 link_addr1
="${addr1}"
228 link_addr2
="${addr2}"
231 # serverside, insert decap module
232 # server is still running
233 # client can connect again
234 ip netns
exec "${ns2}" ip link add name testtun0
type "${ttype}" \
235 ${tmode} remote "${link_addr1}" local "${link_addr2}" $targs
239 if [[ "$tuntype" == "ip6udp
" && "$mac" == "mpls
" ]]; then
240 # No support for MPLS IPv6 fou tunnel; expect failure.
242 elif [[ "$tuntype" =~ "udp
" && "$mac" == "eth
" ]]; then
243 # No support for TEB fou tunnel; expect failure.
245 elif [[ "$tuntype" =~ "gre
" && "$mac" == "eth
" ]]; then
246 # Share ethernet address between tunnel/veth2 so L2 decap works.
247 ethaddr=$(ip netns exec "${ns2}" ip link show veth2 | \
248 awk '/ether/ { print $2 }')
249 ip netns exec "${ns2}" ip link set testtun0 address $ethaddr
250 elif [[ "$mac" == "mpls
" ]]; then
251 modprobe mpls_iptunnel ||true
252 modprobe mpls_gso ||true
253 ip netns exec "${ns2}" sysctl -qw net.mpls.platform_labels=65536
254 ip netns exec "${ns2}" ip -f mpls route add 1000 dev lo
255 ip netns exec "${ns2}" ip link set lo up
256 ip netns exec "${ns2}" sysctl -qw net.mpls.conf.testtun0.input=1
257 ip netns exec "${ns2}" sysctl -qw net.ipv4.conf.lo.rp_filter=0
260 # Because packets are decapped by the tunnel they arrive on testtun0 from
261 # the IP stack perspective. Ensure reverse path filtering is disabled
262 # otherwise we drop the TCP SYN as arriving on testtun0 instead of the
263 # expected veth2 (veth2 is where 192.168.1.2 is configured).
264 ip netns exec "${ns2}" sysctl -qw net.ipv4.conf.all.rp_filter=0
265 # rp needs to be disabled for both all and testtun0 as the rp value is
266 # selected as the max of the "all
" and device-specific values.
267 ip netns exec "${ns2}" sysctl -qw net.ipv4.conf.testtun0.rp_filter=0
268 ip netns exec "${ns2}" ip link set dev testtun0 up
269 if [[ "$expect_tun_fail" == 1 ]]; then
270 # This tunnel mode is not supported, so we expect failure.
271 echo "test bpf encap with tunnel device decap
(expect failure
)"
274 echo "test bpf encap with tunnel device decap
"
280 # bpf_skb_net_shrink does not take tunnel flags yet, cannot update L3.
281 if [[ "${tuntype}" == "sit
" ]]; then
286 # serverside, use BPF for decap
287 ip netns exec "${ns2}" ip link del dev testtun0
288 ip netns exec "${ns2}" tc qdisc add dev veth2 clsact
289 ip netns exec "${ns2}" tc filter add dev veth2 ingress \
290 bpf direct-action object-file ./test_tc_tunnel.o section decap
291 echo "test bpf encap with bpf decap
"