xref: /linux/tools/testing/selftests/net/big_tcp_tunnels.sh (revision 91ec2035134982b98fab0609a9fd8480e8217dc1)
1*5cb53743SAlice Mikityanska#!/usr/bin/env bash
2*5cb53743SAlice Mikityanska# SPDX-License-Identifier: GPL-2.0
3*5cb53743SAlice Mikityanska#
4*5cb53743SAlice Mikityanska# Testing for IPv4 and IPv6 BIG TCP over VXLAN and GENEVE tunnels.
5*5cb53743SAlice Mikityanska
6*5cb53743SAlice MikityanskaSERVER_NS=$(mktemp -u server-XXXXXXXX)
7*5cb53743SAlice MikityanskaSERVER_IP4="192.168.1.1"
8*5cb53743SAlice MikityanskaSERVER_IP6="2001:db8::1:1"
9*5cb53743SAlice MikityanskaSERVER_IP4_TUN="192.168.2.1"
10*5cb53743SAlice MikityanskaSERVER_IP6_TUN="2001:db8::2:1"
11*5cb53743SAlice Mikityanska
12*5cb53743SAlice MikityanskaCLIENT_NS=$(mktemp -u client-XXXXXXXX)
13*5cb53743SAlice MikityanskaCLIENT_IP4="192.168.1.2"
14*5cb53743SAlice MikityanskaCLIENT_IP6="2001:db8::1:2"
15*5cb53743SAlice MikityanskaCLIENT_IP4_TUN="192.168.2.2"
16*5cb53743SAlice MikityanskaCLIENT_IP6_TUN="2001:db8::2:2"
17*5cb53743SAlice Mikityanska
18*5cb53743SAlice Mikityanska: "${PACKETS_THRESHOLD:=1000}"
19*5cb53743SAlice Mikityanska
20*5cb53743SAlice Mikityanska# Kselftest framework requirement - SKIP code is 4.
21*5cb53743SAlice Mikityanskaksft_skip=4
22*5cb53743SAlice Mikityanska
23*5cb53743SAlice Mikityanskasetup() {
24*5cb53743SAlice Mikityanska	ip netns add "$SERVER_NS"
25*5cb53743SAlice Mikityanska	ip netns add "$CLIENT_NS"
26*5cb53743SAlice Mikityanska	ip -netns "$SERVER_NS" link add link1 type veth peer name link0 netns "$CLIENT_NS"
27*5cb53743SAlice Mikityanska
28*5cb53743SAlice Mikityanska	ip -netns "$CLIENT_NS" link set link0 up
29*5cb53743SAlice Mikityanska	ip -netns "$CLIENT_NS" addr replace "$CLIENT_IP4/24" dev link0
30*5cb53743SAlice Mikityanska	ip -netns "$CLIENT_NS" addr replace "$CLIENT_IP6/112" dev link0 nodad
31*5cb53743SAlice Mikityanska	ip -netns "$CLIENT_NS" link set link0 \
32*5cb53743SAlice Mikityanska		gso_max_size 196608 gso_ipv4_max_size 196608 \
33*5cb53743SAlice Mikityanska		gro_max_size 196608 gro_ipv4_max_size 196608
34*5cb53743SAlice Mikityanska	ip -netns "$SERVER_NS" link set link1 up
35*5cb53743SAlice Mikityanska	ip -netns "$SERVER_NS" addr replace "$SERVER_IP4/24" dev link1
36*5cb53743SAlice Mikityanska	ip -netns "$SERVER_NS" addr replace "$SERVER_IP6/112" dev link1 nodad
37*5cb53743SAlice Mikityanska	ip -netns "$SERVER_NS" link set link1 \
38*5cb53743SAlice Mikityanska		gso_max_size 196608 gso_ipv4_max_size 196608 \
39*5cb53743SAlice Mikityanska		gro_max_size 196608 gro_ipv4_max_size 196608
40*5cb53743SAlice Mikityanska
41*5cb53743SAlice Mikityanska	ip netns exec "$SERVER_NS" netserver >/dev/null
42*5cb53743SAlice Mikityanska}
43*5cb53743SAlice Mikityanska
44*5cb53743SAlice Mikityanskasetup_tunnel() {
45*5cb53743SAlice Mikityanska	if [ "$2" = 4 ]; then
46*5cb53743SAlice Mikityanska		SERVER_IP="$SERVER_IP4"
47*5cb53743SAlice Mikityanska		CLIENT_IP="$CLIENT_IP4"
48*5cb53743SAlice Mikityanska		echo "Setting up ${1^^} over IPv4, veth tx csum offload $3"
49*5cb53743SAlice Mikityanska	else
50*5cb53743SAlice Mikityanska		SERVER_IP="$SERVER_IP6"
51*5cb53743SAlice Mikityanska		CLIENT_IP="$CLIENT_IP6"
52*5cb53743SAlice Mikityanska		echo "Setting up ${1^^} over IPv6, veth tx csum offload $3"
53*5cb53743SAlice Mikityanska	fi
54*5cb53743SAlice Mikityanska
55*5cb53743SAlice Mikityanska	if [ "$1" = vxlan ]; then
56*5cb53743SAlice Mikityanska		ip -netns "$CLIENT_NS" link add tun0 type vxlan \
57*5cb53743SAlice Mikityanska			id 5001 remote "$SERVER_IP" local "$CLIENT_IP" dev link0 dstport 4789
58*5cb53743SAlice Mikityanska	else
59*5cb53743SAlice Mikityanska		ip -netns "$CLIENT_NS" link add tun0 type geneve \
60*5cb53743SAlice Mikityanska			id 5001 remote "$SERVER_IP"
61*5cb53743SAlice Mikityanska	fi
62*5cb53743SAlice Mikityanska	ip -netns "$CLIENT_NS" link set tun0 up
63*5cb53743SAlice Mikityanska	ip -netns "$CLIENT_NS" addr replace "$CLIENT_IP4_TUN/24" dev tun0
64*5cb53743SAlice Mikityanska	ip -netns "$CLIENT_NS" addr replace "$CLIENT_IP6_TUN/112" dev tun0 nodad
65*5cb53743SAlice Mikityanska	ip -netns "$CLIENT_NS" link set tun0 \
66*5cb53743SAlice Mikityanska		gso_max_size 196608 gso_ipv4_max_size 196608 \
67*5cb53743SAlice Mikityanska		gro_max_size 196608 gro_ipv4_max_size 196608
68*5cb53743SAlice Mikityanska	if [ "$1" = vxlan ]; then
69*5cb53743SAlice Mikityanska		ip -netns "$SERVER_NS" link add tun1 type vxlan \
70*5cb53743SAlice Mikityanska			id 5001 remote "$CLIENT_IP" local "$SERVER_IP" dev link1 dstport 4789
71*5cb53743SAlice Mikityanska	else
72*5cb53743SAlice Mikityanska		ip -netns "$SERVER_NS" link add tun1 type geneve \
73*5cb53743SAlice Mikityanska			id 5001 remote "$CLIENT_IP"
74*5cb53743SAlice Mikityanska	fi
75*5cb53743SAlice Mikityanska	ip -netns "$SERVER_NS" link set tun1 up
76*5cb53743SAlice Mikityanska	ip -netns "$SERVER_NS" addr replace "$SERVER_IP4_TUN/24" dev tun1
77*5cb53743SAlice Mikityanska	ip -netns "$SERVER_NS" addr replace "$SERVER_IP6_TUN/112" dev tun1 nodad
78*5cb53743SAlice Mikityanska	ip -netns "$SERVER_NS" link set tun1 \
79*5cb53743SAlice Mikityanska		gso_max_size 196608 gso_ipv4_max_size 196608 \
80*5cb53743SAlice Mikityanska		gro_max_size 196608 gro_ipv4_max_size 196608
81*5cb53743SAlice Mikityanska
82*5cb53743SAlice Mikityanska	ip netns exec "$CLIENT_NS" ethtool -K link0 tx-checksumming "$3" > /dev/null
83*5cb53743SAlice Mikityanska	ip netns exec "$SERVER_NS" ethtool -K link1 tx-checksumming "$3" > /dev/null
84*5cb53743SAlice Mikityanska}
85*5cb53743SAlice Mikityanska
86*5cb53743SAlice Mikityanskacleanup_tunnel() {
87*5cb53743SAlice Mikityanska	ip -netns "$CLIENT_NS" link del tun0
88*5cb53743SAlice Mikityanska	ip -netns "$SERVER_NS" link del tun1
89*5cb53743SAlice Mikityanska}
90*5cb53743SAlice Mikityanska
91*5cb53743SAlice Mikityanskacleanup() {
92*5cb53743SAlice Mikityanska	ip netns pids "$SERVER_NS" | xargs -r kill
93*5cb53743SAlice Mikityanska	ip netns pids "$CLIENT_NS" | xargs -r kill
94*5cb53743SAlice Mikityanska	ip netns del "$SERVER_NS"
95*5cb53743SAlice Mikityanska	ip netns del "$CLIENT_NS"
96*5cb53743SAlice Mikityanska	rm -rf "$WORKDIR"
97*5cb53743SAlice Mikityanska}
98*5cb53743SAlice Mikityanska
99*5cb53743SAlice Mikityanskado_test() {
100*5cb53743SAlice Mikityanska	# When tx csum offload is off, software GSO is performed before passing the
101*5cb53743SAlice Mikityanska	# packet to veth. Check BIG TCP packets inside the VXLAN tunnel to verify
102*5cb53743SAlice Mikityanska	# the software checksum path: if the checksum code is broken, these packets
103*5cb53743SAlice Mikityanska	# will be dropped.
104*5cb53743SAlice Mikityanska	if [ "$3" = on ]; then
105*5cb53743SAlice Mikityanska		CAPTURE_IFACE='link'
106*5cb53743SAlice Mikityanska		if [ "$1" = 4 ]; then
107*5cb53743SAlice Mikityanska			IPTABLES=iptables
108*5cb53743SAlice Mikityanska		else
109*5cb53743SAlice Mikityanska			IPTABLES=ip6tables
110*5cb53743SAlice Mikityanska		fi
111*5cb53743SAlice Mikityanska	else
112*5cb53743SAlice Mikityanska		CAPTURE_IFACE='tun'
113*5cb53743SAlice Mikityanska		if [ "$2" = 4 ]; then
114*5cb53743SAlice Mikityanska			IPTABLES=iptables
115*5cb53743SAlice Mikityanska		else
116*5cb53743SAlice Mikityanska			IPTABLES=ip6tables
117*5cb53743SAlice Mikityanska		fi
118*5cb53743SAlice Mikityanska	fi
119*5cb53743SAlice Mikityanska	if [ "$2" = 4 ]; then
120*5cb53743SAlice Mikityanska		IPTABLES_SACK=iptables
121*5cb53743SAlice Mikityanska	else
122*5cb53743SAlice Mikityanska		IPTABLES_SACK=ip6tables
123*5cb53743SAlice Mikityanska	fi
124*5cb53743SAlice Mikityanska
125*5cb53743SAlice Mikityanska	ip netns exec "$SERVER_NS" "$IPTABLES" -w -t raw -I PREROUTING -i "${CAPTURE_IFACE}1" -m length ! --length 0:65535 -m comment --comment "bigtcp"
126*5cb53743SAlice Mikityanska	ip netns exec "$CLIENT_NS" "$IPTABLES" -w -t raw -I OUTPUT -o "${CAPTURE_IFACE}0" -m length ! --length 0:65535 -m comment --comment "bigtcp"
127*5cb53743SAlice Mikityanska	ip netns exec "$SERVER_NS" "$IPTABLES_SACK" -w -t raw -I OUTPUT -o "tun1" -p tcp -m tcp --tcp-flags ACK ACK --tcp-option 5 -m comment --comment "sack"
128*5cb53743SAlice Mikityanska
129*5cb53743SAlice Mikityanska	if [ "$2" = 4 ]; then
130*5cb53743SAlice Mikityanska		SERVER_IP="$SERVER_IP4_TUN"
131*5cb53743SAlice Mikityanska		echo "Running IPv4 traffic in the tunnel"
132*5cb53743SAlice Mikityanska	else
133*5cb53743SAlice Mikityanska		SERVER_IP="$SERVER_IP6_TUN"
134*5cb53743SAlice Mikityanska		echo "Running IPv6 traffic in the tunnel"
135*5cb53743SAlice Mikityanska	fi
136*5cb53743SAlice Mikityanska
137*5cb53743SAlice Mikityanska	ip netns exec "$CLIENT_NS" netperf -t TCP_STREAM -l 5 -H "$SERVER_IP" -- \
138*5cb53743SAlice Mikityanska		-m 80000 > /dev/null
139*5cb53743SAlice Mikityanska
140*5cb53743SAlice Mikityanska	PACKETS_SERVER=$(ip netns exec "$SERVER_NS" "$IPTABLES-save" -c -t raw | sed -rn '/ --comment bigtcp/{s/^\[([0-9]+):.*/\1/p;q}')
141*5cb53743SAlice Mikityanska	PACKETS_CLIENT=$(ip netns exec "$CLIENT_NS" "$IPTABLES-save" -c -t raw | sed -rn '/ --comment bigtcp/{s/^\[([0-9]+):.*/\1/p;q}')
142*5cb53743SAlice Mikityanska	PACKETS_SACK=$(ip netns exec "$SERVER_NS" "$IPTABLES_SACK-save" -c -t raw | sed -rn '/ --comment sack/{s/^\[([0-9]+):.*/\1/p;q}')
143*5cb53743SAlice Mikityanska	ip netns exec "$SERVER_NS" "$IPTABLES" -w -t raw -D PREROUTING -i "${CAPTURE_IFACE}1" -m length ! --length 0:65535 -m comment --comment "bigtcp"
144*5cb53743SAlice Mikityanska	ip netns exec "$CLIENT_NS" "$IPTABLES" -w -t raw -D OUTPUT -o "${CAPTURE_IFACE}0" -m length ! --length 0:65535 -m comment --comment "bigtcp"
145*5cb53743SAlice Mikityanska	ip netns exec "$SERVER_NS" "$IPTABLES_SACK" -w -t raw -D OUTPUT -o "tun1" -p tcp -m tcp --tcp-flags ACK ACK --tcp-option 5 -m comment --comment "sack"
146*5cb53743SAlice Mikityanska
147*5cb53743SAlice Mikityanska	echo "Captured BIG TCP RX packets: $PACKETS_SERVER"
148*5cb53743SAlice Mikityanska	echo "Captured BIG TCP TX packets: $PACKETS_CLIENT"
149*5cb53743SAlice Mikityanska	echo "Captured TCP SACK packets: $PACKETS_SACK"
150*5cb53743SAlice Mikityanska	[ "$PACKETS_SERVER" -gt "$PACKETS_THRESHOLD" ] || return 1
151*5cb53743SAlice Mikityanska	[ "$PACKETS_CLIENT" -gt "$PACKETS_THRESHOLD" ] || return 1
152*5cb53743SAlice Mikityanska	[ "$PACKETS_SACK" -lt "$(( PACKETS_CLIENT / 2 ))" ] || return 1
153*5cb53743SAlice Mikityanska}
154*5cb53743SAlice Mikityanska
155*5cb53743SAlice Mikityanskaif ! netperf -V &> /dev/null; then
156*5cb53743SAlice Mikityanska	echo "SKIP: Could not run test without netperf tool"
157*5cb53743SAlice Mikityanska	exit "$ksft_skip"
158*5cb53743SAlice Mikityanskafi
159*5cb53743SAlice Mikityanska
160*5cb53743SAlice Mikityanskaif ! iptables --version &> /dev/null; then
161*5cb53743SAlice Mikityanska	echo "SKIP: Could not run test without iptables tool"
162*5cb53743SAlice Mikityanska	exit "$ksft_skip"
163*5cb53743SAlice Mikityanskafi
164*5cb53743SAlice Mikityanska
165*5cb53743SAlice Mikityanskaif ! ethtool --version &> /dev/null; then
166*5cb53743SAlice Mikityanska	echo "SKIP: Could not run test without ethtool tool"
167*5cb53743SAlice Mikityanska	exit "$ksft_skip"
168*5cb53743SAlice Mikityanskafi
169*5cb53743SAlice Mikityanska
170*5cb53743SAlice Mikityanskaif ! ip link help 2>&1 | grep gso_ipv4_max_size &> /dev/null; then
171*5cb53743SAlice Mikityanska	echo "SKIP: Could not run test without gso/gro_ipv4_max_size supported in ip-link"
172*5cb53743SAlice Mikityanska	exit "$ksft_skip"
173*5cb53743SAlice Mikityanskafi
174*5cb53743SAlice Mikityanska
175*5cb53743SAlice MikityanskaWORKDIR=$(mktemp -d)
176*5cb53743SAlice Mikityanskatrap cleanup EXIT
177*5cb53743SAlice Mikityanskasetup
178*5cb53743SAlice Mikityanskafor tunnel in vxlan geneve; do
179*5cb53743SAlice Mikityanska	for tun_family in 4 6; do
180*5cb53743SAlice Mikityanska		for traffic_family in 4 6; do
181*5cb53743SAlice Mikityanska			for csum_offload in on off; do
182*5cb53743SAlice Mikityanska				setup_tunnel "$tunnel" "$tun_family" "$csum_offload" || exit "$?"
183*5cb53743SAlice Mikityanska				do_test "$tun_family" "$traffic_family" "$csum_offload" || exit "$?"
184*5cb53743SAlice Mikityanska				cleanup_tunnel
185*5cb53743SAlice Mikityanska			done
186*5cb53743SAlice Mikityanska		done
187*5cb53743SAlice Mikityanska	done
188*5cb53743SAlice Mikityanskadone
189