xref: /aosp_15_r20/external/linux-kselftest/tools/testing/selftests/net/veth.sh (revision 053f45be4e351dfd5e965df293cd45b779f579ee)
1*053f45beSAndroid Build Coastguard Worker#!/bin/sh
2*053f45beSAndroid Build Coastguard Worker# SPDX-License-Identifier: GPL-2.0
3*053f45beSAndroid Build Coastguard Worker
4*053f45beSAndroid Build Coastguard WorkerBPF_FILE="../bpf/xdp_dummy.bpf.o"
5*053f45beSAndroid Build Coastguard Workerreadonly STATS="$(mktemp -p /tmp ns-XXXXXX)"
6*053f45beSAndroid Build Coastguard Workerreadonly BASE=`basename $STATS`
7*053f45beSAndroid Build Coastguard Workerreadonly SRC=2
8*053f45beSAndroid Build Coastguard Workerreadonly DST=1
9*053f45beSAndroid Build Coastguard Workerreadonly DST_NAT=100
10*053f45beSAndroid Build Coastguard Workerreadonly NS_SRC=$BASE$SRC
11*053f45beSAndroid Build Coastguard Workerreadonly NS_DST=$BASE$DST
12*053f45beSAndroid Build Coastguard Worker
13*053f45beSAndroid Build Coastguard Worker# "baremetal" network used for raw UDP traffic
14*053f45beSAndroid Build Coastguard Workerreadonly BM_NET_V4=192.168.1.
15*053f45beSAndroid Build Coastguard Workerreadonly BM_NET_V6=2001:db8::
16*053f45beSAndroid Build Coastguard Worker
17*053f45beSAndroid Build Coastguard Workerreadonly CPUS=`nproc`
18*053f45beSAndroid Build Coastguard Workerret=0
19*053f45beSAndroid Build Coastguard Worker
20*053f45beSAndroid Build Coastguard Workercleanup() {
21*053f45beSAndroid Build Coastguard Worker	local ns
22*053f45beSAndroid Build Coastguard Worker	local jobs
23*053f45beSAndroid Build Coastguard Worker	readonly jobs="$(jobs -p)"
24*053f45beSAndroid Build Coastguard Worker	[ -n "${jobs}" ] && kill -1 ${jobs} 2>/dev/null
25*053f45beSAndroid Build Coastguard Worker	rm -f $STATS
26*053f45beSAndroid Build Coastguard Worker
27*053f45beSAndroid Build Coastguard Worker	for ns in $NS_SRC $NS_DST; do
28*053f45beSAndroid Build Coastguard Worker		ip netns del $ns 2>/dev/null
29*053f45beSAndroid Build Coastguard Worker	done
30*053f45beSAndroid Build Coastguard Worker}
31*053f45beSAndroid Build Coastguard Worker
32*053f45beSAndroid Build Coastguard Workertrap cleanup EXIT
33*053f45beSAndroid Build Coastguard Worker
34*053f45beSAndroid Build Coastguard Workercreate_ns() {
35*053f45beSAndroid Build Coastguard Worker	local ns
36*053f45beSAndroid Build Coastguard Worker
37*053f45beSAndroid Build Coastguard Worker	for ns in $NS_SRC $NS_DST; do
38*053f45beSAndroid Build Coastguard Worker		ip netns add $ns
39*053f45beSAndroid Build Coastguard Worker		ip -n $ns link set dev lo up
40*053f45beSAndroid Build Coastguard Worker	done
41*053f45beSAndroid Build Coastguard Worker
42*053f45beSAndroid Build Coastguard Worker	ip link add name veth$SRC type veth peer name veth$DST
43*053f45beSAndroid Build Coastguard Worker
44*053f45beSAndroid Build Coastguard Worker	for ns in $SRC $DST; do
45*053f45beSAndroid Build Coastguard Worker		ip link set dev veth$ns netns $BASE$ns up
46*053f45beSAndroid Build Coastguard Worker		ip -n $BASE$ns addr add dev veth$ns $BM_NET_V4$ns/24
47*053f45beSAndroid Build Coastguard Worker		ip -n $BASE$ns addr add dev veth$ns $BM_NET_V6$ns/64 nodad
48*053f45beSAndroid Build Coastguard Worker	done
49*053f45beSAndroid Build Coastguard Worker	echo "#kernel" > $BASE
50*053f45beSAndroid Build Coastguard Worker	chmod go-rw $BASE
51*053f45beSAndroid Build Coastguard Worker}
52*053f45beSAndroid Build Coastguard Worker
53*053f45beSAndroid Build Coastguard Worker__chk_flag() {
54*053f45beSAndroid Build Coastguard Worker	local msg="$1"
55*053f45beSAndroid Build Coastguard Worker	local target=$2
56*053f45beSAndroid Build Coastguard Worker	local expected=$3
57*053f45beSAndroid Build Coastguard Worker	local flagname=$4
58*053f45beSAndroid Build Coastguard Worker
59*053f45beSAndroid Build Coastguard Worker	local flag=`ip netns exec $BASE$target ethtool -k veth$target |\
60*053f45beSAndroid Build Coastguard Worker		    grep $flagname | awk '{print $2}'`
61*053f45beSAndroid Build Coastguard Worker
62*053f45beSAndroid Build Coastguard Worker	printf "%-60s" "$msg"
63*053f45beSAndroid Build Coastguard Worker	if [ "$flag" = "$expected" ]; then
64*053f45beSAndroid Build Coastguard Worker		echo " ok "
65*053f45beSAndroid Build Coastguard Worker	else
66*053f45beSAndroid Build Coastguard Worker		echo " fail - expected $expected found $flag"
67*053f45beSAndroid Build Coastguard Worker		ret=1
68*053f45beSAndroid Build Coastguard Worker	fi
69*053f45beSAndroid Build Coastguard Worker}
70*053f45beSAndroid Build Coastguard Worker
71*053f45beSAndroid Build Coastguard Workerchk_gro_flag() {
72*053f45beSAndroid Build Coastguard Worker	__chk_flag "$1" $2 $3 generic-receive-offload
73*053f45beSAndroid Build Coastguard Worker}
74*053f45beSAndroid Build Coastguard Worker
75*053f45beSAndroid Build Coastguard Workerchk_tso_flag() {
76*053f45beSAndroid Build Coastguard Worker	__chk_flag "$1" $2 $3 tcp-segmentation-offload
77*053f45beSAndroid Build Coastguard Worker}
78*053f45beSAndroid Build Coastguard Worker
79*053f45beSAndroid Build Coastguard Workerchk_channels() {
80*053f45beSAndroid Build Coastguard Worker	local msg="$1"
81*053f45beSAndroid Build Coastguard Worker	local target=$2
82*053f45beSAndroid Build Coastguard Worker	local rx=$3
83*053f45beSAndroid Build Coastguard Worker	local tx=$4
84*053f45beSAndroid Build Coastguard Worker
85*053f45beSAndroid Build Coastguard Worker	local dev=veth$target
86*053f45beSAndroid Build Coastguard Worker
87*053f45beSAndroid Build Coastguard Worker	local cur_rx=`ip netns exec $BASE$target ethtool -l $dev |\
88*053f45beSAndroid Build Coastguard Worker		grep RX: | tail -n 1 | awk '{print $2}' `
89*053f45beSAndroid Build Coastguard Worker		local cur_tx=`ip netns exec $BASE$target ethtool -l $dev |\
90*053f45beSAndroid Build Coastguard Worker		grep TX: | tail -n 1 | awk '{print $2}'`
91*053f45beSAndroid Build Coastguard Worker	local cur_combined=`ip netns exec $BASE$target ethtool -l $dev |\
92*053f45beSAndroid Build Coastguard Worker		grep Combined: | tail -n 1 | awk '{print $2}'`
93*053f45beSAndroid Build Coastguard Worker
94*053f45beSAndroid Build Coastguard Worker	printf "%-60s" "$msg"
95*053f45beSAndroid Build Coastguard Worker	if [ "$cur_rx" = "$rx" -a "$cur_tx" = "$tx" -a "$cur_combined" = "n/a" ]; then
96*053f45beSAndroid Build Coastguard Worker		echo " ok "
97*053f45beSAndroid Build Coastguard Worker	else
98*053f45beSAndroid Build Coastguard Worker		echo " fail rx:$rx:$cur_rx tx:$tx:$cur_tx combined:n/a:$cur_combined"
99*053f45beSAndroid Build Coastguard Worker	fi
100*053f45beSAndroid Build Coastguard Worker}
101*053f45beSAndroid Build Coastguard Worker
102*053f45beSAndroid Build Coastguard Workerchk_gro() {
103*053f45beSAndroid Build Coastguard Worker	local msg="$1"
104*053f45beSAndroid Build Coastguard Worker	local expected=$2
105*053f45beSAndroid Build Coastguard Worker
106*053f45beSAndroid Build Coastguard Worker	ip netns exec $BASE$SRC ping -qc 1 $BM_NET_V4$DST >/dev/null
107*053f45beSAndroid Build Coastguard Worker	NSTAT_HISTORY=$STATS ip netns exec $NS_DST nstat -n
108*053f45beSAndroid Build Coastguard Worker
109*053f45beSAndroid Build Coastguard Worker	printf "%-60s" "$msg"
110*053f45beSAndroid Build Coastguard Worker	ip netns exec $BASE$DST ./udpgso_bench_rx -C 1000 -R 10 &
111*053f45beSAndroid Build Coastguard Worker	local spid=$!
112*053f45beSAndroid Build Coastguard Worker	sleep 0.1
113*053f45beSAndroid Build Coastguard Worker
114*053f45beSAndroid Build Coastguard Worker	ip netns exec $NS_SRC ./udpgso_bench_tx -4 -s 13000 -S 1300 -M 1 -D $BM_NET_V4$DST
115*053f45beSAndroid Build Coastguard Worker	local retc=$?
116*053f45beSAndroid Build Coastguard Worker	wait $spid
117*053f45beSAndroid Build Coastguard Worker	local rets=$?
118*053f45beSAndroid Build Coastguard Worker	if [ ${rets} -ne 0 ] || [ ${retc} -ne 0 ]; then
119*053f45beSAndroid Build Coastguard Worker		echo " fail client exit code $retc, server $rets"
120*053f45beSAndroid Build Coastguard Worker		ret=1
121*053f45beSAndroid Build Coastguard Worker		return
122*053f45beSAndroid Build Coastguard Worker	fi
123*053f45beSAndroid Build Coastguard Worker
124*053f45beSAndroid Build Coastguard Worker	local pkts=`NSTAT_HISTORY=$STATS ip netns exec $NS_DST nstat IpInReceives | \
125*053f45beSAndroid Build Coastguard Worker		    awk '{print $2}' | tail -n 1`
126*053f45beSAndroid Build Coastguard Worker	if [ "$pkts" = "$expected" ]; then
127*053f45beSAndroid Build Coastguard Worker		echo " ok "
128*053f45beSAndroid Build Coastguard Worker	else
129*053f45beSAndroid Build Coastguard Worker		echo " fail - got $pkts packets, expected $expected "
130*053f45beSAndroid Build Coastguard Worker		ret=1
131*053f45beSAndroid Build Coastguard Worker	fi
132*053f45beSAndroid Build Coastguard Worker}
133*053f45beSAndroid Build Coastguard Worker
134*053f45beSAndroid Build Coastguard Worker__change_channels()
135*053f45beSAndroid Build Coastguard Worker{
136*053f45beSAndroid Build Coastguard Worker	local cur_cpu
137*053f45beSAndroid Build Coastguard Worker	local end=$1
138*053f45beSAndroid Build Coastguard Worker	local cur
139*053f45beSAndroid Build Coastguard Worker	local i
140*053f45beSAndroid Build Coastguard Worker
141*053f45beSAndroid Build Coastguard Worker	while true; do
142*053f45beSAndroid Build Coastguard Worker		printf -v cur '%(%s)T'
143*053f45beSAndroid Build Coastguard Worker		[ $cur -le $end ] || break
144*053f45beSAndroid Build Coastguard Worker
145*053f45beSAndroid Build Coastguard Worker		for i in `seq 1 $CPUS`; do
146*053f45beSAndroid Build Coastguard Worker			ip netns exec $NS_SRC ethtool -L veth$SRC rx $i tx $i
147*053f45beSAndroid Build Coastguard Worker			ip netns exec $NS_DST ethtool -L veth$DST rx $i tx $i
148*053f45beSAndroid Build Coastguard Worker		done
149*053f45beSAndroid Build Coastguard Worker
150*053f45beSAndroid Build Coastguard Worker		for i in `seq 1 $((CPUS - 1))`; do
151*053f45beSAndroid Build Coastguard Worker			cur_cpu=$((CPUS - $i))
152*053f45beSAndroid Build Coastguard Worker			ip netns exec $NS_SRC ethtool -L veth$SRC rx $cur_cpu tx $cur_cpu
153*053f45beSAndroid Build Coastguard Worker			ip netns exec $NS_DST ethtool -L veth$DST rx $cur_cpu tx $cur_cpu
154*053f45beSAndroid Build Coastguard Worker		done
155*053f45beSAndroid Build Coastguard Worker	done
156*053f45beSAndroid Build Coastguard Worker}
157*053f45beSAndroid Build Coastguard Worker
158*053f45beSAndroid Build Coastguard Worker__send_data() {
159*053f45beSAndroid Build Coastguard Worker	local end=$1
160*053f45beSAndroid Build Coastguard Worker
161*053f45beSAndroid Build Coastguard Worker	while true; do
162*053f45beSAndroid Build Coastguard Worker		printf -v cur '%(%s)T'
163*053f45beSAndroid Build Coastguard Worker		[ $cur -le $end ] || break
164*053f45beSAndroid Build Coastguard Worker
165*053f45beSAndroid Build Coastguard Worker		ip netns exec $NS_SRC ./udpgso_bench_tx -4 -s 1000 -M 300 -D $BM_NET_V4$DST
166*053f45beSAndroid Build Coastguard Worker	done
167*053f45beSAndroid Build Coastguard Worker}
168*053f45beSAndroid Build Coastguard Worker
169*053f45beSAndroid Build Coastguard Workerdo_stress() {
170*053f45beSAndroid Build Coastguard Worker	local end
171*053f45beSAndroid Build Coastguard Worker	printf -v end '%(%s)T'
172*053f45beSAndroid Build Coastguard Worker	end=$((end + $STRESS))
173*053f45beSAndroid Build Coastguard Worker
174*053f45beSAndroid Build Coastguard Worker	ip netns exec $NS_SRC ethtool -L veth$SRC rx 3 tx 3
175*053f45beSAndroid Build Coastguard Worker	ip netns exec $NS_DST ethtool -L veth$DST rx 3 tx 3
176*053f45beSAndroid Build Coastguard Worker
177*053f45beSAndroid Build Coastguard Worker	ip netns exec $NS_DST ./udpgso_bench_rx &
178*053f45beSAndroid Build Coastguard Worker	local rx_pid=$!
179*053f45beSAndroid Build Coastguard Worker
180*053f45beSAndroid Build Coastguard Worker	echo "Running stress test for $STRESS seconds..."
181*053f45beSAndroid Build Coastguard Worker	__change_channels $end &
182*053f45beSAndroid Build Coastguard Worker	local ch_pid=$!
183*053f45beSAndroid Build Coastguard Worker	__send_data $end &
184*053f45beSAndroid Build Coastguard Worker	local data_pid_1=$!
185*053f45beSAndroid Build Coastguard Worker	__send_data $end &
186*053f45beSAndroid Build Coastguard Worker	local data_pid_2=$!
187*053f45beSAndroid Build Coastguard Worker	__send_data $end &
188*053f45beSAndroid Build Coastguard Worker	local data_pid_3=$!
189*053f45beSAndroid Build Coastguard Worker	__send_data $end &
190*053f45beSAndroid Build Coastguard Worker	local data_pid_4=$!
191*053f45beSAndroid Build Coastguard Worker
192*053f45beSAndroid Build Coastguard Worker	wait $ch_pid $data_pid_1 $data_pid_2 $data_pid_3 $data_pid_4
193*053f45beSAndroid Build Coastguard Worker	kill -9 $rx_pid
194*053f45beSAndroid Build Coastguard Worker	echo "done"
195*053f45beSAndroid Build Coastguard Worker
196*053f45beSAndroid Build Coastguard Worker	# restore previous setting
197*053f45beSAndroid Build Coastguard Worker	ip netns exec $NS_SRC ethtool -L veth$SRC rx 2 tx 2
198*053f45beSAndroid Build Coastguard Worker	ip netns exec $NS_DST ethtool -L veth$DST rx 2 tx 1
199*053f45beSAndroid Build Coastguard Worker}
200*053f45beSAndroid Build Coastguard Worker
201*053f45beSAndroid Build Coastguard Workerusage() {
202*053f45beSAndroid Build Coastguard Worker	echo "Usage: $0 [-h] [-s <seconds>]"
203*053f45beSAndroid Build Coastguard Worker	echo -e "\t-h: show this help"
204*053f45beSAndroid Build Coastguard Worker	echo -e "\t-s: run optional stress tests for the given amount of seconds"
205*053f45beSAndroid Build Coastguard Worker}
206*053f45beSAndroid Build Coastguard Worker
207*053f45beSAndroid Build Coastguard WorkerSTRESS=0
208*053f45beSAndroid Build Coastguard Workerwhile getopts "hs:" option; do
209*053f45beSAndroid Build Coastguard Worker	case "$option" in
210*053f45beSAndroid Build Coastguard Worker	"h")
211*053f45beSAndroid Build Coastguard Worker		usage $0
212*053f45beSAndroid Build Coastguard Worker		exit 0
213*053f45beSAndroid Build Coastguard Worker		;;
214*053f45beSAndroid Build Coastguard Worker	"s")
215*053f45beSAndroid Build Coastguard Worker		STRESS=$OPTARG
216*053f45beSAndroid Build Coastguard Worker		;;
217*053f45beSAndroid Build Coastguard Worker	esac
218*053f45beSAndroid Build Coastguard Workerdone
219*053f45beSAndroid Build Coastguard Worker
220*053f45beSAndroid Build Coastguard Workerif [ ! -f ${BPF_FILE} ]; then
221*053f45beSAndroid Build Coastguard Worker	echo "Missing ${BPF_FILE}. Build bpf selftest first"
222*053f45beSAndroid Build Coastguard Worker	exit 1
223*053f45beSAndroid Build Coastguard Workerfi
224*053f45beSAndroid Build Coastguard Worker
225*053f45beSAndroid Build Coastguard Worker[ $CPUS -lt 2 ] && echo "Only one CPU available, some tests will be skipped"
226*053f45beSAndroid Build Coastguard Worker[ $STRESS -gt 0 -a $CPUS -lt 3 ] && echo " stress test will be skipped, too"
227*053f45beSAndroid Build Coastguard Worker
228*053f45beSAndroid Build Coastguard Workercreate_ns
229*053f45beSAndroid Build Coastguard Workerchk_gro_flag "default - gro flag" $SRC off
230*053f45beSAndroid Build Coastguard Workerchk_gro_flag "        - peer gro flag" $DST off
231*053f45beSAndroid Build Coastguard Workerchk_tso_flag "        - tso flag" $SRC on
232*053f45beSAndroid Build Coastguard Workerchk_tso_flag "        - peer tso flag" $DST on
233*053f45beSAndroid Build Coastguard Workerchk_gro "        - aggregation" 1
234*053f45beSAndroid Build Coastguard Workerip netns exec $NS_SRC ethtool -K veth$SRC tx-udp-segmentation off
235*053f45beSAndroid Build Coastguard Workerchk_gro "        - aggregation with TSO off" 10
236*053f45beSAndroid Build Coastguard Workercleanup
237*053f45beSAndroid Build Coastguard Worker
238*053f45beSAndroid Build Coastguard Workercreate_ns
239*053f45beSAndroid Build Coastguard Workerip netns exec $NS_DST ethtool -K veth$DST gro on
240*053f45beSAndroid Build Coastguard Workerchk_gro_flag "with gro on - gro flag" $DST on
241*053f45beSAndroid Build Coastguard Workerchk_gro_flag "        - peer gro flag" $SRC off
242*053f45beSAndroid Build Coastguard Workerchk_tso_flag "        - tso flag" $SRC on
243*053f45beSAndroid Build Coastguard Workerchk_tso_flag "        - peer tso flag" $DST on
244*053f45beSAndroid Build Coastguard Workerip netns exec $NS_SRC ethtool -K veth$SRC tx-udp-segmentation off
245*053f45beSAndroid Build Coastguard Workerip netns exec $NS_DST ethtool -K veth$DST rx-udp-gro-forwarding on
246*053f45beSAndroid Build Coastguard Workerchk_gro "        - aggregation with TSO off" 1
247*053f45beSAndroid Build Coastguard Workercleanup
248*053f45beSAndroid Build Coastguard Worker
249*053f45beSAndroid Build Coastguard Workercreate_ns
250*053f45beSAndroid Build Coastguard Workerchk_channels "default channels" $DST 1 1
251*053f45beSAndroid Build Coastguard Worker
252*053f45beSAndroid Build Coastguard Workerip -n $NS_DST link set dev veth$DST down
253*053f45beSAndroid Build Coastguard Workerip netns exec $NS_DST ethtool -K veth$DST gro on
254*053f45beSAndroid Build Coastguard Workerchk_gro_flag "with gro enabled on link down - gro flag" $DST on
255*053f45beSAndroid Build Coastguard Workerchk_gro_flag "        - peer gro flag" $SRC off
256*053f45beSAndroid Build Coastguard Workerchk_tso_flag "        - tso flag" $SRC on
257*053f45beSAndroid Build Coastguard Workerchk_tso_flag "        - peer tso flag" $DST on
258*053f45beSAndroid Build Coastguard Workerip -n $NS_DST link set dev veth$DST up
259*053f45beSAndroid Build Coastguard Workerip netns exec $NS_SRC ethtool -K veth$SRC tx-udp-segmentation off
260*053f45beSAndroid Build Coastguard Workerip netns exec $NS_DST ethtool -K veth$DST rx-udp-gro-forwarding on
261*053f45beSAndroid Build Coastguard Workerchk_gro "        - aggregation with TSO off" 1
262*053f45beSAndroid Build Coastguard Workercleanup
263*053f45beSAndroid Build Coastguard Worker
264*053f45beSAndroid Build Coastguard Workercreate_ns
265*053f45beSAndroid Build Coastguard Worker
266*053f45beSAndroid Build Coastguard WorkerCUR_TX=1
267*053f45beSAndroid Build Coastguard WorkerCUR_RX=1
268*053f45beSAndroid Build Coastguard Workerif [ $CPUS -gt 1 ]; then
269*053f45beSAndroid Build Coastguard Worker	ip netns exec $NS_DST ethtool -L veth$DST tx 2
270*053f45beSAndroid Build Coastguard Worker	chk_channels "setting tx channels" $DST 1 2
271*053f45beSAndroid Build Coastguard Worker	CUR_TX=2
272*053f45beSAndroid Build Coastguard Workerfi
273*053f45beSAndroid Build Coastguard Worker
274*053f45beSAndroid Build Coastguard Workerif [ $CPUS -gt 2 ]; then
275*053f45beSAndroid Build Coastguard Worker	ip netns exec $NS_DST ethtool -L veth$DST rx 3 tx 3
276*053f45beSAndroid Build Coastguard Worker	chk_channels "setting both rx and tx channels" $DST 3 3
277*053f45beSAndroid Build Coastguard Worker	CUR_RX=3
278*053f45beSAndroid Build Coastguard Worker	CUR_TX=3
279*053f45beSAndroid Build Coastguard Workerfi
280*053f45beSAndroid Build Coastguard Worker
281*053f45beSAndroid Build Coastguard Workerip netns exec $NS_DST ethtool -L veth$DST combined 2 2>/dev/null
282*053f45beSAndroid Build Coastguard Workerchk_channels "bad setting: combined channels" $DST $CUR_RX $CUR_TX
283*053f45beSAndroid Build Coastguard Worker
284*053f45beSAndroid Build Coastguard Workerip netns exec $NS_DST ethtool -L veth$DST tx $((CPUS + 1)) 2>/dev/null
285*053f45beSAndroid Build Coastguard Workerchk_channels "setting invalid channels nr" $DST $CUR_RX $CUR_TX
286*053f45beSAndroid Build Coastguard Worker
287*053f45beSAndroid Build Coastguard Workerif [ $CPUS -gt 1 ]; then
288*053f45beSAndroid Build Coastguard Worker	# this also tests queues nr reduction
289*053f45beSAndroid Build Coastguard Worker	ip netns exec $NS_DST ethtool -L veth$DST rx 1 tx 2 2>/dev/null
290*053f45beSAndroid Build Coastguard Worker	ip netns exec $NS_SRC ethtool -L veth$SRC rx 1 tx 2 2>/dev/null
291*053f45beSAndroid Build Coastguard Worker	printf "%-60s" "bad setting: XDP with RX nr less than TX"
292*053f45beSAndroid Build Coastguard Worker	ip -n $NS_DST link set dev veth$DST xdp object ${BPF_FILE} \
293*053f45beSAndroid Build Coastguard Worker		section xdp 2>/dev/null &&\
294*053f45beSAndroid Build Coastguard Worker		echo "fail - set operation successful ?!?" || echo " ok "
295*053f45beSAndroid Build Coastguard Worker
296*053f45beSAndroid Build Coastguard Worker	# the following tests will run with multiple channels active
297*053f45beSAndroid Build Coastguard Worker	ip netns exec $NS_SRC ethtool -L veth$SRC rx 2
298*053f45beSAndroid Build Coastguard Worker	ip netns exec $NS_DST ethtool -L veth$DST rx 2
299*053f45beSAndroid Build Coastguard Worker	ip -n $NS_DST link set dev veth$DST xdp object ${BPF_FILE} \
300*053f45beSAndroid Build Coastguard Worker		section xdp 2>/dev/null
301*053f45beSAndroid Build Coastguard Worker	printf "%-60s" "bad setting: reducing RX nr below peer TX with XDP set"
302*053f45beSAndroid Build Coastguard Worker	ip netns exec $NS_DST ethtool -L veth$DST rx 1 2>/dev/null &&\
303*053f45beSAndroid Build Coastguard Worker		echo "fail - set operation successful ?!?" || echo " ok "
304*053f45beSAndroid Build Coastguard Worker	CUR_RX=2
305*053f45beSAndroid Build Coastguard Worker	CUR_TX=2
306*053f45beSAndroid Build Coastguard Workerfi
307*053f45beSAndroid Build Coastguard Worker
308*053f45beSAndroid Build Coastguard Workerif [ $CPUS -gt 2 ]; then
309*053f45beSAndroid Build Coastguard Worker	printf "%-60s" "bad setting: increasing peer TX nr above RX with XDP set"
310*053f45beSAndroid Build Coastguard Worker	ip netns exec $NS_SRC ethtool -L veth$SRC tx 3 2>/dev/null &&\
311*053f45beSAndroid Build Coastguard Worker		echo "fail - set operation successful ?!?" || echo " ok "
312*053f45beSAndroid Build Coastguard Worker	chk_channels "setting invalid channels nr" $DST 2 2
313*053f45beSAndroid Build Coastguard Workerfi
314*053f45beSAndroid Build Coastguard Worker
315*053f45beSAndroid Build Coastguard Workerip -n $NS_DST link set dev veth$DST xdp object ${BPF_FILE} section xdp 2>/dev/null
316*053f45beSAndroid Build Coastguard Workerchk_gro_flag "with xdp attached - gro flag" $DST on
317*053f45beSAndroid Build Coastguard Workerchk_gro_flag "        - peer gro flag" $SRC off
318*053f45beSAndroid Build Coastguard Workerchk_tso_flag "        - tso flag" $SRC off
319*053f45beSAndroid Build Coastguard Workerchk_tso_flag "        - peer tso flag" $DST on
320*053f45beSAndroid Build Coastguard Workerip netns exec $NS_DST ethtool -K veth$DST rx-udp-gro-forwarding on
321*053f45beSAndroid Build Coastguard Workerchk_gro "        - aggregation" 1
322*053f45beSAndroid Build Coastguard Worker
323*053f45beSAndroid Build Coastguard Worker
324*053f45beSAndroid Build Coastguard Workerip -n $NS_DST link set dev veth$DST down
325*053f45beSAndroid Build Coastguard Workerip -n $NS_SRC link set dev veth$SRC down
326*053f45beSAndroid Build Coastguard Workerchk_gro_flag "        - after dev off, flag" $DST on
327*053f45beSAndroid Build Coastguard Workerchk_gro_flag "        - peer flag" $SRC off
328*053f45beSAndroid Build Coastguard Worker
329*053f45beSAndroid Build Coastguard Workerip netns exec $NS_DST ethtool -K veth$DST gro on
330*053f45beSAndroid Build Coastguard Workerip -n $NS_DST link set dev veth$DST xdp off
331*053f45beSAndroid Build Coastguard Workerchk_gro_flag "        - after gro on xdp off, gro flag" $DST on
332*053f45beSAndroid Build Coastguard Workerchk_gro_flag "        - peer gro flag" $SRC off
333*053f45beSAndroid Build Coastguard Workerchk_tso_flag "        - tso flag" $SRC on
334*053f45beSAndroid Build Coastguard Workerchk_tso_flag "        - peer tso flag" $DST on
335*053f45beSAndroid Build Coastguard Worker
336*053f45beSAndroid Build Coastguard Workerif [ $CPUS -gt 1 ]; then
337*053f45beSAndroid Build Coastguard Worker	ip netns exec $NS_DST ethtool -L veth$DST tx 1
338*053f45beSAndroid Build Coastguard Worker	chk_channels "decreasing tx channels with device down" $DST 2 1
339*053f45beSAndroid Build Coastguard Workerfi
340*053f45beSAndroid Build Coastguard Worker
341*053f45beSAndroid Build Coastguard Workerip -n $NS_DST link set dev veth$DST up
342*053f45beSAndroid Build Coastguard Workerip -n $NS_SRC link set dev veth$SRC up
343*053f45beSAndroid Build Coastguard Workerchk_gro "        - aggregation" 1
344*053f45beSAndroid Build Coastguard Worker
345*053f45beSAndroid Build Coastguard Workerif [ $CPUS -gt 1 ]; then
346*053f45beSAndroid Build Coastguard Worker	[ $STRESS -gt 0 -a $CPUS -gt 2 ] && do_stress
347*053f45beSAndroid Build Coastguard Worker
348*053f45beSAndroid Build Coastguard Worker	ip -n $NS_DST link set dev veth$DST down
349*053f45beSAndroid Build Coastguard Worker	ip -n $NS_SRC link set dev veth$SRC down
350*053f45beSAndroid Build Coastguard Worker	ip netns exec $NS_DST ethtool -L veth$DST tx 2
351*053f45beSAndroid Build Coastguard Worker	chk_channels "increasing tx channels with device down" $DST 2 2
352*053f45beSAndroid Build Coastguard Worker	ip -n $NS_DST link set dev veth$DST up
353*053f45beSAndroid Build Coastguard Worker	ip -n $NS_SRC link set dev veth$SRC up
354*053f45beSAndroid Build Coastguard Workerfi
355*053f45beSAndroid Build Coastguard Worker
356*053f45beSAndroid Build Coastguard Workerip netns exec $NS_DST ethtool -K veth$DST gro off
357*053f45beSAndroid Build Coastguard Workerip netns exec $NS_SRC ethtool -K veth$SRC tx-udp-segmentation off
358*053f45beSAndroid Build Coastguard Workerchk_gro "aggregation again with default and TSO off" 10
359*053f45beSAndroid Build Coastguard Worker
360*053f45beSAndroid Build Coastguard Workerexit $ret
361