xref: /linux/tools/testing/selftests/net/double_udp_encap.sh (revision c17ee635fd3a482b2ad2bf5e269755c2eae5f25e)
1*40146bf7SPaolo Abeni#!/bin/bash
2*40146bf7SPaolo Abeni# SPDX-License-Identifier: GPL-2.0
3*40146bf7SPaolo Abeni
4*40146bf7SPaolo Abenisource lib.sh
5*40146bf7SPaolo Abeni
6*40146bf7SPaolo Abeni# shellcheck disable=SC2155 # prefer RO variable over return value from cmd
7*40146bf7SPaolo Abenireadonly CLI="$(dirname "$(readlink -f "$0")")/../../../net/ynl/pyynl/cli.py"
8*40146bf7SPaolo Abeni
9*40146bf7SPaolo Abenireadonly SRC=1
10*40146bf7SPaolo Abenireadonly DST=2
11*40146bf7SPaolo Abeni
12*40146bf7SPaolo Abenireadonly NET_V4=192.168.1.
13*40146bf7SPaolo Abenireadonly NET_V6=2001:db8::
14*40146bf7SPaolo Abenireadonly OL1_NET_V4=172.16.1.
15*40146bf7SPaolo Abenireadonly OL1_NET_V6=2001:db8:1::
16*40146bf7SPaolo Abenireadonly OL2_NET_V4=172.16.2.
17*40146bf7SPaolo Abenireadonly OL2_NET_V6=2001:db8:2::
18*40146bf7SPaolo Abeni
19*40146bf7SPaolo Abenitrap cleanup_all_ns EXIT
20*40146bf7SPaolo Abeni
21*40146bf7SPaolo Abeni# shellcheck disable=SC2329 # can't figure out usage trough a variable
22*40146bf7SPaolo Abeniis_ipv6() {
23*40146bf7SPaolo Abeni	if [[ $1 =~ .*:.* ]]; then
24*40146bf7SPaolo Abeni		return 0
25*40146bf7SPaolo Abeni	fi
26*40146bf7SPaolo Abeni	return 1
27*40146bf7SPaolo Abeni}
28*40146bf7SPaolo Abeni
29*40146bf7SPaolo Abeni# shellcheck disable=SC2329 # can't figure out usage trough a variable
30*40146bf7SPaolo Abenicreate_gnv_endpoint() {
31*40146bf7SPaolo Abeni	local -r netns=$1
32*40146bf7SPaolo Abeni	local -r bm_rem_addr=$2
33*40146bf7SPaolo Abeni	local -r gnv_dev=$3
34*40146bf7SPaolo Abeni	local -r gnv_id=$4
35*40146bf7SPaolo Abeni	local opts=$5
36*40146bf7SPaolo Abeni	local gnv_json
37*40146bf7SPaolo Abeni	local rem
38*40146bf7SPaolo Abeni
39*40146bf7SPaolo Abeni	if is_ipv6 "$bm_rem_addr"; then
40*40146bf7SPaolo Abeni		rem=remote6
41*40146bf7SPaolo Abeni	else
42*40146bf7SPaolo Abeni		rem=remote
43*40146bf7SPaolo Abeni	fi
44*40146bf7SPaolo Abeni
45*40146bf7SPaolo Abeni	# add ynl opt separator, if needed
46*40146bf7SPaolo Abeni	[ -n "$opts" ] && opts=", $opts"
47*40146bf7SPaolo Abeni
48*40146bf7SPaolo Abeni	gnv_json="{ \"id\": $gnv_id, \"$rem\": \"$bm_rem_addr\"$opts }"
49*40146bf7SPaolo Abeni	ip netns exec "$netns" "$CLI" --family rt-link --create --excl \
50*40146bf7SPaolo Abeni	   --do newlink  --json "{\"ifname\": \"$gnv_dev\",
51*40146bf7SPaolo Abeni	       \"linkinfo\": {\"kind\":\"geneve\",
52*40146bf7SPaolo Abeni	       \"data\": $gnv_json } }" > /dev/null
53*40146bf7SPaolo Abeni	ip -n "$netns" link set dev "$gnv_dev" up
54*40146bf7SPaolo Abeni}
55*40146bf7SPaolo Abeni
56*40146bf7SPaolo Abeni# shellcheck disable=SC2329 # can't figure out usage trough a variable
57*40146bf7SPaolo Abenicreate_vxlan_endpoint() {
58*40146bf7SPaolo Abeni	local -r netns=$1
59*40146bf7SPaolo Abeni	local -r bm_rem_addr=$2
60*40146bf7SPaolo Abeni	local -r vxlan_dev=$3
61*40146bf7SPaolo Abeni	local -r vxlan_id=$4
62*40146bf7SPaolo Abeni	local -r opts_str=$5
63*40146bf7SPaolo Abeni	local oldifs
64*40146bf7SPaolo Abeni	local -a opts
65*40146bf7SPaolo Abeni	local opt
66*40146bf7SPaolo Abeni
67*40146bf7SPaolo Abeni	# convert the arguments from yaml format
68*40146bf7SPaolo Abeni	oldifs=$IFS
69*40146bf7SPaolo Abeni	IFS=','
70*40146bf7SPaolo Abeni	for opt in $opts_str; do
71*40146bf7SPaolo Abeni		local pattern='"port":'
72*40146bf7SPaolo Abeni
73*40146bf7SPaolo Abeni		[ -n "$opt" ] || continue
74*40146bf7SPaolo Abeni
75*40146bf7SPaolo Abeni		opts+=("${opt/$pattern*/dstport}" "${opt/$pattern/}")
76*40146bf7SPaolo Abeni	done
77*40146bf7SPaolo Abeni	IFS=$oldifs
78*40146bf7SPaolo Abeni	[ ${#opts[@]} -gt 0 ] || opts+=("dstport" "4789")
79*40146bf7SPaolo Abeni
80*40146bf7SPaolo Abeni	ip -n "$netns" link add "$vxlan_dev" type vxlan id "$vxlan_id" \
81*40146bf7SPaolo Abeni	   remote "$bm_rem_addr" "${opts[@]}"
82*40146bf7SPaolo Abeni	ip -n "$netns" link set dev "$vxlan_dev" up
83*40146bf7SPaolo Abeni}
84*40146bf7SPaolo Abeni
85*40146bf7SPaolo Abenicreate_ns() {
86*40146bf7SPaolo Abeni	local nested_opt='"port":6082'
87*40146bf7SPaolo Abeni	local create_endpoint
88*40146bf7SPaolo Abeni	local options="$1"
89*40146bf7SPaolo Abeni	local feature
90*40146bf7SPaolo Abeni	local dev
91*40146bf7SPaolo Abeni	local id
92*40146bf7SPaolo Abeni	local ns
93*40146bf7SPaolo Abeni
94*40146bf7SPaolo Abeni	RET=0
95*40146bf7SPaolo Abeni
96*40146bf7SPaolo Abeni	#  +-------------+    +-------------+
97*40146bf7SPaolo Abeni	#  | NS_SRC      |    | NS_NST_DST  |
98*40146bf7SPaolo Abeni	#  |             |    |             |
99*40146bf7SPaolo Abeni	#  |   gnv_nst1  |    |  gnv_nst2   |
100*40146bf7SPaolo Abeni	#  |   +         |    |         +   |
101*40146bf7SPaolo Abeni	#  |   |         |    |         |   |
102*40146bf7SPaolo Abeni	#  |   +         |    |         +   |
103*40146bf7SPaolo Abeni	#  |  gnv1       |    |        gnv2 |
104*40146bf7SPaolo Abeni	#  |   +         |    |         +   |
105*40146bf7SPaolo Abeni	#  |   |         |    |         |   |
106*40146bf7SPaolo Abeni	#  |   + veth1 +--------+ veth2 +   |
107*40146bf7SPaolo Abeni	#  |             |    |             |
108*40146bf7SPaolo Abeni	#  +-------------+    +-------------+
109*40146bf7SPaolo Abeni
110*40146bf7SPaolo Abeni	setup_ns NS_SRC NS_DST
111*40146bf7SPaolo Abeni
112*40146bf7SPaolo Abeni	# concatenate caller provided options and default one
113*40146bf7SPaolo Abeni	[ -n "$2" ] && nested_opt="$nested_opt,$2"
114*40146bf7SPaolo Abeni
115*40146bf7SPaolo Abeni	ip link add name "veth$SRC" netns "$NS_SRC" type veth \
116*40146bf7SPaolo Abeni	   peer name "veth$DST" netns "$NS_DST"
117*40146bf7SPaolo Abeni	case "$ENCAP" in
118*40146bf7SPaolo Abeni	vxlan)
119*40146bf7SPaolo Abeni		create_endpoint=create_vxlan_endpoint
120*40146bf7SPaolo Abeni		dev=vx
121*40146bf7SPaolo Abeni		;;
122*40146bf7SPaolo Abeni	geneve)
123*40146bf7SPaolo Abeni		create_endpoint=create_gnv_endpoint
124*40146bf7SPaolo Abeni		dev=gnv
125*40146bf7SPaolo Abeni		;;
126*40146bf7SPaolo Abeni	esac
127*40146bf7SPaolo Abeni
128*40146bf7SPaolo Abeni	id=1
129*40146bf7SPaolo Abeni	for ns in "${NS_LIST[@]}"; do
130*40146bf7SPaolo Abeni		ip -n "$ns" link set dev "veth$id" up
131*40146bf7SPaolo Abeni
132*40146bf7SPaolo Abeni		# ensure the sender can do large write just after 3whs
133*40146bf7SPaolo Abeni		ip netns exec "$ns" \
134*40146bf7SPaolo Abeni		   sysctl -qw net.ipv4.tcp_wmem="4096 4194304 4194304"
135*40146bf7SPaolo Abeni
136*40146bf7SPaolo Abeni		# note that 3 - $SRC == $DST and 3 - $DST == $SRC
137*40146bf7SPaolo Abeni		if [ $FAMILY = "4" ]; then
138*40146bf7SPaolo Abeni			ip -n "$ns" addr add dev "veth$id" "$NET_V4$id/24"
139*40146bf7SPaolo Abeni			$create_endpoint "$ns" "$NET_V4$((3 - id))" \
140*40146bf7SPaolo Abeni			   "$dev$id" 4 "$options"
141*40146bf7SPaolo Abeni			ip -n "$ns" addr add dev "$dev$id" "$OL1_NET_V4$id/24"
142*40146bf7SPaolo Abeni
143*40146bf7SPaolo Abeni			# nested tunnel devices
144*40146bf7SPaolo Abeni			# pmtu can't be propagated to upper layer devices;
145*40146bf7SPaolo Abeni			# need manual adjust
146*40146bf7SPaolo Abeni			$create_endpoint "$ns" "$OL1_NET_V4$((3 - id))" \
147*40146bf7SPaolo Abeni			   "$dev"_nst"$id" 40 "$nested_opt"
148*40146bf7SPaolo Abeni			ip -n "$ns" addr add dev "$dev"_nst"$id" \
149*40146bf7SPaolo Abeni			   "$OL2_NET_V4$id/24"
150*40146bf7SPaolo Abeni			ip -n "$ns" link set dev "$dev"_nst"$id" mtu 1392
151*40146bf7SPaolo Abeni		else
152*40146bf7SPaolo Abeni			ip -n "$ns" addr add dev "veth$id" "$NET_V6$id/64" \
153*40146bf7SPaolo Abeni			   nodad
154*40146bf7SPaolo Abeni			$create_endpoint "$ns" "$NET_V6$((3 - id))" \
155*40146bf7SPaolo Abeni			   "$dev"6"$id" 6 "$options"
156*40146bf7SPaolo Abeni			ip -n "$ns" addr add dev "$dev"6"$id" \
157*40146bf7SPaolo Abeni			   "$OL1_NET_V6$id/64" nodad
158*40146bf7SPaolo Abeni
159*40146bf7SPaolo Abeni			$create_endpoint "$ns" "$OL1_NET_V6$((3 - id))" \
160*40146bf7SPaolo Abeni			   "$dev"6_nst"$id" 60 "$nested_opt"
161*40146bf7SPaolo Abeni			ip -n "$ns" addr add dev "$dev"6_nst"$id" \
162*40146bf7SPaolo Abeni			   "$OL2_NET_V6$id/64" nodad
163*40146bf7SPaolo Abeni			ip -n "$ns" link set dev "$dev"6_nst"$id" mtu 1352
164*40146bf7SPaolo Abeni		fi
165*40146bf7SPaolo Abeni		id=$((id+1))
166*40146bf7SPaolo Abeni	done
167*40146bf7SPaolo Abeni
168*40146bf7SPaolo Abeni	# enable GRO heuristic on the veth peer and ensure UDP L4 over tunnel is
169*40146bf7SPaolo Abeni	# actually segmented
170*40146bf7SPaolo Abeni	for feature in tso tx-udp_tnl-segmentation; do
171*40146bf7SPaolo Abeni		ip netns exec "$NS_SRC" ethtool -K "veth$SRC" \
172*40146bf7SPaolo Abeni		   "$feature" off 2>/dev/null
173*40146bf7SPaolo Abeni	done
174*40146bf7SPaolo Abeni}
175*40146bf7SPaolo Abeni
176*40146bf7SPaolo Abenicreate_ns_gso() {
177*40146bf7SPaolo Abeni	local dev
178*40146bf7SPaolo Abeni
179*40146bf7SPaolo Abeni	create_ns "$@"
180*40146bf7SPaolo Abeni	if [ "$ENCAP" = "geneve" ]; then
181*40146bf7SPaolo Abeni		dev=gnv
182*40146bf7SPaolo Abeni	else
183*40146bf7SPaolo Abeni		dev=vx
184*40146bf7SPaolo Abeni	fi
185*40146bf7SPaolo Abeni	[ "$FAMILY" = "6" ] && dev="$dev"6
186*40146bf7SPaolo Abeni	ip netns exec "$NS_SRC" ethtool -K "$dev$SRC" \
187*40146bf7SPaolo Abeni	   tx-gso-partial on \
188*40146bf7SPaolo Abeni	   tx-udp_tnl-segmentation on \
189*40146bf7SPaolo Abeni	   tx-udp_tnl-csum-segmentation on
190*40146bf7SPaolo Abeni}
191*40146bf7SPaolo Abeni
192*40146bf7SPaolo Abenicreate_ns_gso_gro() {
193*40146bf7SPaolo Abeni	create_ns_gso "$@"
194*40146bf7SPaolo Abeni	ip netns exec "$NS_DST" ethtool -K "veth$DST" gro on
195*40146bf7SPaolo Abeni	ip netns exec "$NS_SRC" ethtool -K "veth$SRC" tx off >/dev/null 2>&1
196*40146bf7SPaolo Abeni}
197*40146bf7SPaolo Abeni
198*40146bf7SPaolo Abenirun_test() {
199*40146bf7SPaolo Abeni	local -r dst=$NET$DST
200*40146bf7SPaolo Abeni	local -r msg=$1
201*40146bf7SPaolo Abeni	local -r total_size=$2
202*40146bf7SPaolo Abeni	local -r encappkts=$3
203*40146bf7SPaolo Abeni	local inner_proto_offset=0
204*40146bf7SPaolo Abeni	local inner_maclen=14
205*40146bf7SPaolo Abeni	local rx_family="-4"
206*40146bf7SPaolo Abeni	local ipt=iptables
207*40146bf7SPaolo Abeni	local bpf_filter
208*40146bf7SPaolo Abeni	local -a rx_args
209*40146bf7SPaolo Abeni	local wire_pkts
210*40146bf7SPaolo Abeni	local rcvpkts
211*40146bf7SPaolo Abeni	local encl=8
212*40146bf7SPaolo Abeni	local dport
213*40146bf7SPaolo Abeni	local pkts
214*40146bf7SPaolo Abeni	local snd
215*40146bf7SPaolo Abeni
216*40146bf7SPaolo Abeni	if [ $FAMILY = "6" ]; then
217*40146bf7SPaolo Abeni		ipt=ip6tables
218*40146bf7SPaolo Abeni	else
219*40146bf7SPaolo Abeni		# rx program does not support '-6' and implies ipv6 usage by
220*40146bf7SPaolo Abeni		# default
221*40146bf7SPaolo Abeni		rx_args=("$rx_family")
222*40146bf7SPaolo Abeni	fi
223*40146bf7SPaolo Abeni
224*40146bf7SPaolo Abeni	# The received can only check fixed size packet
225*40146bf7SPaolo Abeni	pkts=$((total_size / GSO_SIZE))
226*40146bf7SPaolo Abeni	if [ -n "$4" ]; then
227*40146bf7SPaolo Abeni		wire_pkts=$4
228*40146bf7SPaolo Abeni	elif [ $((total_size % GSO_SIZE)) -eq 0 ]; then
229*40146bf7SPaolo Abeni		wire_pkts=1
230*40146bf7SPaolo Abeni		rx_args+=("-l" "$GSO_SIZE")
231*40146bf7SPaolo Abeni	else
232*40146bf7SPaolo Abeni		wire_pkts=2
233*40146bf7SPaolo Abeni		pkts=$((pkts + 1))
234*40146bf7SPaolo Abeni	fi
235*40146bf7SPaolo Abeni
236*40146bf7SPaolo Abeni	if [ "$ENCAP" = "geneve" ]; then
237*40146bf7SPaolo Abeni		dport=6081
238*40146bf7SPaolo Abeni	else
239*40146bf7SPaolo Abeni		dport=4789
240*40146bf7SPaolo Abeni	fi
241*40146bf7SPaolo Abeni
242*40146bf7SPaolo Abeni	# Either:
243*40146bf7SPaolo Abeni	# - IPv4, nested tunnel carries UDP over IPv4, with dport 6082,
244*40146bf7SPaolo Abeni	#   innermost is TCP over IPv4 on port 8000
245*40146bf7SPaolo Abeni	# - IPv6, nested tunnel carries UDP over IPv6, with dport 6082,
246*40146bf7SPaolo Abeni	#   innermost is TCP over IPv6 on port 8000
247*40146bf7SPaolo Abeni	# The nested tunnel port is 6082 and the nested encap len is 8
248*40146bf7SPaolo Abeni	# regardless of the encap type (no geneve opts).
249*40146bf7SPaolo Abeni	# In inherit protocol mode there is no nested mac hdr and the nested
250*40146bf7SPaolo Abeni	# l3 protocol type field belongs to the geneve hdr.
251*40146bf7SPaolo Abeni	[ "$USE_HINT" = true ] && encl=16
252*40146bf7SPaolo Abeni	[ "$INHERIT" = true ] && inner_maclen=0
253*40146bf7SPaolo Abeni	[ "$INHERIT" = true ] && inner_proto_offset=-4
254*40146bf7SPaolo Abeni	local inner=$((inner_maclen+encl))
255*40146bf7SPaolo Abeni	local proto=$((inner_maclen+encl+inner_proto_offset))
256*40146bf7SPaolo Abeni	bpf_filter=$(nfbpf_compile "(ip &&
257*40146bf7SPaolo Abeni		ip[$((40+encl))] == 0x08 && ip[$((41+encl))] == 0x00 &&
258*40146bf7SPaolo Abeni		ip[$((51+encl))] == 0x11 &&
259*40146bf7SPaolo Abeni		ip[$((64+encl))] == 0x17 && ip[$((65+encl))] == 0xc2 &&
260*40146bf7SPaolo Abeni		ip[$((76+proto))] == 0x08 && ip[$((77+proto))] == 0x00 &&
261*40146bf7SPaolo Abeni		ip[$((87+inner))] == 0x6 &&
262*40146bf7SPaolo Abeni		ip[$((100+inner))] == 0x1f && ip[$((101+inner))] == 0x40) ||
263*40146bf7SPaolo Abeni		(ip6 &&
264*40146bf7SPaolo Abeni		ip6[$((60+encl))] == 0x86 && ip6[$((61+encl))] == 0xdd &&
265*40146bf7SPaolo Abeni		ip6[$((68+encl))] == 0x11 &&
266*40146bf7SPaolo Abeni		ip6[$((104+encl))] == 0x17 && ip6[$((105+encl))] == 0xc2 &&
267*40146bf7SPaolo Abeni		ip6[$((116+proto))] == 0x86 && ip6[$((117+proto))] == 0xdd &&
268*40146bf7SPaolo Abeni		ip6[$((124+inner))] == 0x6 &&
269*40146bf7SPaolo Abeni		ip6[$((160+inner))] == 0x1f && ip6[$((161+inner))] == 0x40)")
270*40146bf7SPaolo Abeni
271*40146bf7SPaolo Abeni	# ignore shorts packet, to avoid arp/mld induced noise
272*40146bf7SPaolo Abeni	ip netns exec "$NS_SRC" "$ipt" -A OUTPUT -p udp --dport "$dport" \
273*40146bf7SPaolo Abeni	   -m length --length 600:65535 -m bpf --bytecode "$bpf_filter"
274*40146bf7SPaolo Abeni	ip netns exec "$NS_DST" "$ipt" -A INPUT -p udp --dport "$dport" \
275*40146bf7SPaolo Abeni	   -m length --length 600:65535 -m bpf --bytecode "$bpf_filter"
276*40146bf7SPaolo Abeni	ip netns exec "$NS_DST" ./udpgso_bench_rx -C 2000 -t -R 100 \
277*40146bf7SPaolo Abeni	   -n "$pkts" "${rx_args[@]}" &
278*40146bf7SPaolo Abeni	local pid=$!
279*40146bf7SPaolo Abeni	wait_local_port_listen "$NS_DST" 8000 tcp
280*40146bf7SPaolo Abeni	ip netns exec "$NS_SRC" ./udpgso_bench_tx -"$FAMILY" -t -M 1 \
281*40146bf7SPaolo Abeni	   -s "$total_size" -D "$dst"
282*40146bf7SPaolo Abeni	local ret=$?
283*40146bf7SPaolo Abeni	check_err "$ret" "client failure exit code $ret"
284*40146bf7SPaolo Abeni	wait "$pid"
285*40146bf7SPaolo Abeni	ret=$?
286*40146bf7SPaolo Abeni	check_err "$ret" "sever failure exit code $ret"
287*40146bf7SPaolo Abeni
288*40146bf7SPaolo Abeni	snd=$(ip netns exec "$NS_SRC" "$ipt"-save -c |
289*40146bf7SPaolo Abeni	    grep "dport $dport" | sed -e 's/\[//' -e 's/:.*//')
290*40146bf7SPaolo Abeni
291*40146bf7SPaolo Abeni	[ "$snd" = "$wire_pkts" ]
292*40146bf7SPaolo Abeni	# shellcheck disable=SC2319 # known false positive
293*40146bf7SPaolo Abeni	check_err $? "send $snd packets on the lowest link, expected $wire_pkts"
294*40146bf7SPaolo Abeni
295*40146bf7SPaolo Abeni	rcvpkts=$(ip netns exec "$NS_DST" "$ipt"-save -c | \
296*40146bf7SPaolo Abeni	   grep "dport $dport" | sed -e 's/\[//' -e 's/:.*//')
297*40146bf7SPaolo Abeni
298*40146bf7SPaolo Abeni	[ "$rcvpkts" = "$encappkts" ]
299*40146bf7SPaolo Abeni	check_err $? "received $rcvpkts $ENCAP packets, expected $encappkts"
300*40146bf7SPaolo Abeni	log_test "$msg"
301*40146bf7SPaolo Abeni}
302*40146bf7SPaolo Abeni
303*40146bf7SPaolo Abenirun_tests() {
304*40146bf7SPaolo Abeni	for FAMILY in 4 6; do
305*40146bf7SPaolo Abeni		NET=$OL2_NET_V4
306*40146bf7SPaolo Abeni		GSO_SIZE=1340 # 1392 - 20 - 32
307*40146bf7SPaolo Abeni
308*40146bf7SPaolo Abeni		if [ $FAMILY = 6 ]; then
309*40146bf7SPaolo Abeni			NET=$OL2_NET_V6
310*40146bf7SPaolo Abeni			GSO_SIZE=1280 # 1352 - 40 - 32
311*40146bf7SPaolo Abeni		fi
312*40146bf7SPaolo Abeni
313*40146bf7SPaolo Abeni		echo "IPv$FAMILY"
314*40146bf7SPaolo Abeni
315*40146bf7SPaolo Abeni		unset USE_HINT
316*40146bf7SPaolo Abeni		unset INHERIT
317*40146bf7SPaolo Abeni
318*40146bf7SPaolo Abeni		# "geneve" must be last encap in list, so that later
319*40146bf7SPaolo Abeni		# test cases will run on it
320*40146bf7SPaolo Abeni		for ENCAP in "vxlan" "geneve"; do
321*40146bf7SPaolo Abeni			create_ns
322*40146bf7SPaolo Abeni			run_test "No GSO - $ENCAP" $((GSO_SIZE * 4)) 4 4
323*40146bf7SPaolo Abeni			cleanup_all_ns
324*40146bf7SPaolo Abeni
325*40146bf7SPaolo Abeni			create_ns_gso
326*40146bf7SPaolo Abeni			run_test "GSO without GRO - $ENCAP" $((GSO_SIZE * 4)) \
327*40146bf7SPaolo Abeni			   4 1
328*40146bf7SPaolo Abeni			cleanup_all_ns
329*40146bf7SPaolo Abeni
330*40146bf7SPaolo Abeni			# IPv4 only test
331*40146bf7SPaolo Abeni			[ $FAMILY = "4" ] || continue
332*40146bf7SPaolo Abeni			create_ns_gso
333*40146bf7SPaolo Abeni			ip netns exec "$NS_SRC" \
334*40146bf7SPaolo Abeni			   sysctl -qw net.ipv4.ip_no_pmtu_disc=1
335*40146bf7SPaolo Abeni			run_test "GSO disable due to no fixedid - $ENCAP" \
336*40146bf7SPaolo Abeni			   $((GSO_SIZE * 4)) 4 4
337*40146bf7SPaolo Abeni			cleanup_all_ns
338*40146bf7SPaolo Abeni		done
339*40146bf7SPaolo Abeni
340*40146bf7SPaolo Abeni		# GRO tests imply/require geneve encap, the only one providing
341*40146bf7SPaolo Abeni		# GRO hints
342*40146bf7SPaolo Abeni		create_ns_gso_gro
343*40146bf7SPaolo Abeni		run_test "double tunnel GRO, no hints" $((GSO_SIZE * 4)) 4
344*40146bf7SPaolo Abeni		cleanup_all_ns
345*40146bf7SPaolo Abeni
346*40146bf7SPaolo Abeni		# hint option is expected for all the following tests in the RX
347*40146bf7SPaolo Abeni		# path
348*40146bf7SPaolo Abeni		USE_HINT=true
349*40146bf7SPaolo Abeni		create_ns_gso_gro \
350*40146bf7SPaolo Abeni		   '"gro-hint":1,"udp-zero-csum6-tx":1,"udp-zero-csum6-rx":1' \
351*40146bf7SPaolo Abeni		   '"udp-zero-csum6-tx":1,"udp-zero-csum6-rx":1'
352*40146bf7SPaolo Abeni		run_test "double tunnel GRO" $((GSO_SIZE * 4)) 1
353*40146bf7SPaolo Abeni		cleanup_all_ns
354*40146bf7SPaolo Abeni
355*40146bf7SPaolo Abeni		create_ns_gso_gro '"gro-hint":1,"udp-csum":1' '"udp-csum":1'
356*40146bf7SPaolo Abeni		run_test "double tunnel GRO - csum complete" $((GSO_SIZE * 4))\
357*40146bf7SPaolo Abeni		   1
358*40146bf7SPaolo Abeni		cleanup_all_ns
359*40146bf7SPaolo Abeni
360*40146bf7SPaolo Abeni		create_ns_gso_gro '"gro-hint":1' \
361*40146bf7SPaolo Abeni		   '"udp-csum":0,"udp-zero-csum6-tx":1,"udp-zero-csum6-rx":1'
362*40146bf7SPaolo Abeni		run_test "double tunnel GRO - no nested csum" \
363*40146bf7SPaolo Abeni		   $((GSO_SIZE * 4)) 1
364*40146bf7SPaolo Abeni		cleanup_all_ns
365*40146bf7SPaolo Abeni
366*40146bf7SPaolo Abeni		create_ns_gso_gro \
367*40146bf7SPaolo Abeni		   '"gro-hint":1,"udp-zero-csum6-tx":1,"udp-zero-csum6-rx":1' \
368*40146bf7SPaolo Abeni		   '"udp-csum":1'
369*40146bf7SPaolo Abeni		run_test "double tunnel GRO - nested csum, outer 0-csum, skip"\
370*40146bf7SPaolo Abeni		   $((GSO_SIZE * 4)) 4
371*40146bf7SPaolo Abeni		cleanup_all_ns
372*40146bf7SPaolo Abeni
373*40146bf7SPaolo Abeni		INHERIT=true
374*40146bf7SPaolo Abeni		create_ns_gso_gro '"gro-hint":1,"udp-csum":1' \
375*40146bf7SPaolo Abeni		   '"udp-csum":1,"inner-proto-inherit":1'
376*40146bf7SPaolo Abeni		run_test "double tunnel GRO - nested inherit proto" \
377*40146bf7SPaolo Abeni		   $((GSO_SIZE * 4)) 1
378*40146bf7SPaolo Abeni		cleanup_all_ns
379*40146bf7SPaolo Abeni		unset INHERIT
380*40146bf7SPaolo Abeni
381*40146bf7SPaolo Abeni		create_ns_gso_gro '"gro-hint":1'
382*40146bf7SPaolo Abeni		run_test "double tunnel GRO - short last pkt" \
383*40146bf7SPaolo Abeni		   $((GSO_SIZE * 4 + GSO_SIZE / 2)) 2
384*40146bf7SPaolo Abeni		cleanup_all_ns
385*40146bf7SPaolo Abeni	done
386*40146bf7SPaolo Abeni}
387*40146bf7SPaolo Abeni
388*40146bf7SPaolo Abenirequire_command nfbpf_compile
389*40146bf7SPaolo Abenirequire_command jq
390*40146bf7SPaolo Abeni
391*40146bf7SPaolo Abeni# tcp retransmisions will break the accounting
392*40146bf7SPaolo Abenixfail_on_slow run_tests
393*40146bf7SPaolo Abeniexit "$EXIT_STATUS"
394