xref: /openbmc/linux/tools/testing/selftests/net/drop_monitor_tests.sh (revision cbecf716ca618fd44feda6bd9a64a8179d031fc5)
1*b7cc6d3cSIdo Schimmel#!/bin/bash
2*b7cc6d3cSIdo Schimmel# SPDX-License-Identifier: GPL-2.0
3*b7cc6d3cSIdo Schimmel
4*b7cc6d3cSIdo Schimmel# This test is for checking drop monitor functionality.
5*b7cc6d3cSIdo Schimmel
6*b7cc6d3cSIdo Schimmelret=0
7*b7cc6d3cSIdo Schimmel# Kselftest framework requirement - SKIP code is 4.
8*b7cc6d3cSIdo Schimmelksft_skip=4
9*b7cc6d3cSIdo Schimmel
10*b7cc6d3cSIdo Schimmel# all tests in this script. Can be overridden with -t option
11*b7cc6d3cSIdo SchimmelTESTS="
12*b7cc6d3cSIdo Schimmel	sw_drops
13*b7cc6d3cSIdo Schimmel	hw_drops
14*b7cc6d3cSIdo Schimmel"
15*b7cc6d3cSIdo Schimmel
16*b7cc6d3cSIdo SchimmelIP="ip -netns ns1"
17*b7cc6d3cSIdo SchimmelTC="tc -netns ns1"
18*b7cc6d3cSIdo SchimmelDEVLINK="devlink -N ns1"
19*b7cc6d3cSIdo SchimmelNS_EXEC="ip netns exec ns1"
20*b7cc6d3cSIdo SchimmelNETDEVSIM_PATH=/sys/bus/netdevsim/
21*b7cc6d3cSIdo SchimmelDEV_ADDR=1337
22*b7cc6d3cSIdo SchimmelDEV=netdevsim${DEV_ADDR}
23*b7cc6d3cSIdo SchimmelDEVLINK_DEV=netdevsim/${DEV}
24*b7cc6d3cSIdo Schimmel
25*b7cc6d3cSIdo Schimmellog_test()
26*b7cc6d3cSIdo Schimmel{
27*b7cc6d3cSIdo Schimmel	local rc=$1
28*b7cc6d3cSIdo Schimmel	local expected=$2
29*b7cc6d3cSIdo Schimmel	local msg="$3"
30*b7cc6d3cSIdo Schimmel
31*b7cc6d3cSIdo Schimmel	if [ ${rc} -eq ${expected} ]; then
32*b7cc6d3cSIdo Schimmel		printf "    TEST: %-60s  [ OK ]\n" "${msg}"
33*b7cc6d3cSIdo Schimmel		nsuccess=$((nsuccess+1))
34*b7cc6d3cSIdo Schimmel	else
35*b7cc6d3cSIdo Schimmel		ret=1
36*b7cc6d3cSIdo Schimmel		nfail=$((nfail+1))
37*b7cc6d3cSIdo Schimmel		printf "    TEST: %-60s  [FAIL]\n" "${msg}"
38*b7cc6d3cSIdo Schimmel	fi
39*b7cc6d3cSIdo Schimmel}
40*b7cc6d3cSIdo Schimmel
41*b7cc6d3cSIdo Schimmelsetup()
42*b7cc6d3cSIdo Schimmel{
43*b7cc6d3cSIdo Schimmel	modprobe netdevsim &> /dev/null
44*b7cc6d3cSIdo Schimmel
45*b7cc6d3cSIdo Schimmel	set -e
46*b7cc6d3cSIdo Schimmel	ip netns add ns1
47*b7cc6d3cSIdo Schimmel	$IP link add dummy10 up type dummy
48*b7cc6d3cSIdo Schimmel
49*b7cc6d3cSIdo Schimmel	$NS_EXEC echo "$DEV_ADDR 1" > ${NETDEVSIM_PATH}/new_device
50*b7cc6d3cSIdo Schimmel	udevadm settle
51*b7cc6d3cSIdo Schimmel	local netdev=$($NS_EXEC ls ${NETDEVSIM_PATH}/devices/${DEV}/net/)
52*b7cc6d3cSIdo Schimmel	$IP link set dev $netdev up
53*b7cc6d3cSIdo Schimmel
54*b7cc6d3cSIdo Schimmel	set +e
55*b7cc6d3cSIdo Schimmel}
56*b7cc6d3cSIdo Schimmel
57*b7cc6d3cSIdo Schimmelcleanup()
58*b7cc6d3cSIdo Schimmel{
59*b7cc6d3cSIdo Schimmel	$NS_EXEC echo "$DEV_ADDR" > ${NETDEVSIM_PATH}/del_device
60*b7cc6d3cSIdo Schimmel	ip netns del ns1
61*b7cc6d3cSIdo Schimmel}
62*b7cc6d3cSIdo Schimmel
63*b7cc6d3cSIdo Schimmelsw_drops_test()
64*b7cc6d3cSIdo Schimmel{
65*b7cc6d3cSIdo Schimmel	echo
66*b7cc6d3cSIdo Schimmel	echo "Software drops test"
67*b7cc6d3cSIdo Schimmel
68*b7cc6d3cSIdo Schimmel	setup
69*b7cc6d3cSIdo Schimmel
70*b7cc6d3cSIdo Schimmel	local dir=$(mktemp -d)
71*b7cc6d3cSIdo Schimmel
72*b7cc6d3cSIdo Schimmel	$TC qdisc add dev dummy10 clsact
73*b7cc6d3cSIdo Schimmel	$TC filter add dev dummy10 egress pref 1 handle 101 proto ip \
74*b7cc6d3cSIdo Schimmel		flower dst_ip 192.0.2.10 action drop
75*b7cc6d3cSIdo Schimmel
76*b7cc6d3cSIdo Schimmel	$NS_EXEC mausezahn dummy10 -a 00:11:22:33:44:55 -b 00:aa:bb:cc:dd:ee \
77*b7cc6d3cSIdo Schimmel		-A 192.0.2.1 -B 192.0.2.10 -t udp sp=12345,dp=54321 -c 0 -q \
78*b7cc6d3cSIdo Schimmel		-d 100msec &
79*b7cc6d3cSIdo Schimmel	timeout 5 dwdump -o sw -w ${dir}/packets.pcap
80*b7cc6d3cSIdo Schimmel	(( $(tshark -r ${dir}/packets.pcap \
81*b7cc6d3cSIdo Schimmel		-Y 'ip.dst == 192.0.2.10' 2> /dev/null | wc -l) != 0))
82*b7cc6d3cSIdo Schimmel	log_test $? 0 "Capturing active software drops"
83*b7cc6d3cSIdo Schimmel
84*b7cc6d3cSIdo Schimmel	rm ${dir}/packets.pcap
85*b7cc6d3cSIdo Schimmel
86*b7cc6d3cSIdo Schimmel	{ kill %% && wait %%; } 2>/dev/null
87*b7cc6d3cSIdo Schimmel	timeout 5 dwdump -o sw -w ${dir}/packets.pcap
88*b7cc6d3cSIdo Schimmel	(( $(tshark -r ${dir}/packets.pcap \
89*b7cc6d3cSIdo Schimmel		-Y 'ip.dst == 192.0.2.10' 2> /dev/null | wc -l) == 0))
90*b7cc6d3cSIdo Schimmel	log_test $? 0 "Capturing inactive software drops"
91*b7cc6d3cSIdo Schimmel
92*b7cc6d3cSIdo Schimmel	rm -r $dir
93*b7cc6d3cSIdo Schimmel
94*b7cc6d3cSIdo Schimmel	cleanup
95*b7cc6d3cSIdo Schimmel}
96*b7cc6d3cSIdo Schimmel
97*b7cc6d3cSIdo Schimmelhw_drops_test()
98*b7cc6d3cSIdo Schimmel{
99*b7cc6d3cSIdo Schimmel	echo
100*b7cc6d3cSIdo Schimmel	echo "Hardware drops test"
101*b7cc6d3cSIdo Schimmel
102*b7cc6d3cSIdo Schimmel	setup
103*b7cc6d3cSIdo Schimmel
104*b7cc6d3cSIdo Schimmel	local dir=$(mktemp -d)
105*b7cc6d3cSIdo Schimmel
106*b7cc6d3cSIdo Schimmel	$DEVLINK trap set $DEVLINK_DEV trap blackhole_route action trap
107*b7cc6d3cSIdo Schimmel	timeout 5 dwdump -o hw -w ${dir}/packets.pcap
108*b7cc6d3cSIdo Schimmel	(( $(tshark -r ${dir}/packets.pcap \
109*b7cc6d3cSIdo Schimmel		-Y 'net_dm.hw_trap_name== blackhole_route' 2> /dev/null \
110*b7cc6d3cSIdo Schimmel		| wc -l) != 0))
111*b7cc6d3cSIdo Schimmel	log_test $? 0 "Capturing active hardware drops"
112*b7cc6d3cSIdo Schimmel
113*b7cc6d3cSIdo Schimmel	rm ${dir}/packets.pcap
114*b7cc6d3cSIdo Schimmel
115*b7cc6d3cSIdo Schimmel	$DEVLINK trap set $DEVLINK_DEV trap blackhole_route action drop
116*b7cc6d3cSIdo Schimmel	timeout 5 dwdump -o hw -w ${dir}/packets.pcap
117*b7cc6d3cSIdo Schimmel	(( $(tshark -r ${dir}/packets.pcap \
118*b7cc6d3cSIdo Schimmel		-Y 'net_dm.hw_trap_name== blackhole_route' 2> /dev/null \
119*b7cc6d3cSIdo Schimmel		| wc -l) == 0))
120*b7cc6d3cSIdo Schimmel	log_test $? 0 "Capturing inactive hardware drops"
121*b7cc6d3cSIdo Schimmel
122*b7cc6d3cSIdo Schimmel	rm -r $dir
123*b7cc6d3cSIdo Schimmel
124*b7cc6d3cSIdo Schimmel	cleanup
125*b7cc6d3cSIdo Schimmel}
126*b7cc6d3cSIdo Schimmel
127*b7cc6d3cSIdo Schimmel################################################################################
128*b7cc6d3cSIdo Schimmel# usage
129*b7cc6d3cSIdo Schimmel
130*b7cc6d3cSIdo Schimmelusage()
131*b7cc6d3cSIdo Schimmel{
132*b7cc6d3cSIdo Schimmel	cat <<EOF
133*b7cc6d3cSIdo Schimmelusage: ${0##*/} OPTS
134*b7cc6d3cSIdo Schimmel
135*b7cc6d3cSIdo Schimmel        -t <test>   Test(s) to run (default: all)
136*b7cc6d3cSIdo Schimmel                    (options: $TESTS)
137*b7cc6d3cSIdo SchimmelEOF
138*b7cc6d3cSIdo Schimmel}
139*b7cc6d3cSIdo Schimmel
140*b7cc6d3cSIdo Schimmel################################################################################
141*b7cc6d3cSIdo Schimmel# main
142*b7cc6d3cSIdo Schimmel
143*b7cc6d3cSIdo Schimmelwhile getopts ":t:h" opt; do
144*b7cc6d3cSIdo Schimmel	case $opt in
145*b7cc6d3cSIdo Schimmel		t) TESTS=$OPTARG;;
146*b7cc6d3cSIdo Schimmel		h) usage; exit 0;;
147*b7cc6d3cSIdo Schimmel		*) usage; exit 1;;
148*b7cc6d3cSIdo Schimmel	esac
149*b7cc6d3cSIdo Schimmeldone
150*b7cc6d3cSIdo Schimmel
151*b7cc6d3cSIdo Schimmelif [ "$(id -u)" -ne 0 ];then
152*b7cc6d3cSIdo Schimmel	echo "SKIP: Need root privileges"
153*b7cc6d3cSIdo Schimmel	exit $ksft_skip;
154*b7cc6d3cSIdo Schimmelfi
155*b7cc6d3cSIdo Schimmel
156*b7cc6d3cSIdo Schimmelif [ ! -x "$(command -v ip)" ]; then
157*b7cc6d3cSIdo Schimmel	echo "SKIP: Could not run test without ip tool"
158*b7cc6d3cSIdo Schimmel	exit $ksft_skip
159*b7cc6d3cSIdo Schimmelfi
160*b7cc6d3cSIdo Schimmel
161*b7cc6d3cSIdo Schimmelif [ ! -x "$(command -v devlink)" ]; then
162*b7cc6d3cSIdo Schimmel	echo "SKIP: Could not run test without devlink tool"
163*b7cc6d3cSIdo Schimmel	exit $ksft_skip
164*b7cc6d3cSIdo Schimmelfi
165*b7cc6d3cSIdo Schimmel
166*b7cc6d3cSIdo Schimmelif [ ! -x "$(command -v tshark)" ]; then
167*b7cc6d3cSIdo Schimmel	echo "SKIP: Could not run test without tshark tool"
168*b7cc6d3cSIdo Schimmel	exit $ksft_skip
169*b7cc6d3cSIdo Schimmelfi
170*b7cc6d3cSIdo Schimmel
171*b7cc6d3cSIdo Schimmelif [ ! -x "$(command -v dwdump)" ]; then
172*b7cc6d3cSIdo Schimmel	echo "SKIP: Could not run test without dwdump tool"
173*b7cc6d3cSIdo Schimmel	exit $ksft_skip
174*b7cc6d3cSIdo Schimmelfi
175*b7cc6d3cSIdo Schimmel
176*b7cc6d3cSIdo Schimmelif [ ! -x "$(command -v udevadm)" ]; then
177*b7cc6d3cSIdo Schimmel	echo "SKIP: Could not run test without udevadm tool"
178*b7cc6d3cSIdo Schimmel	exit $ksft_skip
179*b7cc6d3cSIdo Schimmelfi
180*b7cc6d3cSIdo Schimmel
181*b7cc6d3cSIdo Schimmelif [ ! -x "$(command -v timeout)" ]; then
182*b7cc6d3cSIdo Schimmel	echo "SKIP: Could not run test without timeout tool"
183*b7cc6d3cSIdo Schimmel	exit $ksft_skip
184*b7cc6d3cSIdo Schimmelfi
185*b7cc6d3cSIdo Schimmel
186*b7cc6d3cSIdo Schimmelif [ ! -x "$(command -v mausezahn)" ]; then
187*b7cc6d3cSIdo Schimmel	echo "SKIP: Could not run test without mausezahn tool"
188*b7cc6d3cSIdo Schimmel	exit $ksft_skip
189*b7cc6d3cSIdo Schimmelfi
190*b7cc6d3cSIdo Schimmel
191*b7cc6d3cSIdo Schimmeltshark -G fields 2> /dev/null | grep -q net_dm
192*b7cc6d3cSIdo Schimmelif [ $? -ne 0 ]; then
193*b7cc6d3cSIdo Schimmel	echo "SKIP: tshark too old, missing net_dm dissector"
194*b7cc6d3cSIdo Schimmel	exit $ksft_skip
195*b7cc6d3cSIdo Schimmelfi
196*b7cc6d3cSIdo Schimmel
197*b7cc6d3cSIdo Schimmel# start clean
198*b7cc6d3cSIdo Schimmelcleanup &> /dev/null
199*b7cc6d3cSIdo Schimmel
200*b7cc6d3cSIdo Schimmelfor t in $TESTS
201*b7cc6d3cSIdo Schimmeldo
202*b7cc6d3cSIdo Schimmel	case $t in
203*b7cc6d3cSIdo Schimmel	sw_drops|sw)			sw_drops_test;;
204*b7cc6d3cSIdo Schimmel	hw_drops|hw)			hw_drops_test;;
205*b7cc6d3cSIdo Schimmel
206*b7cc6d3cSIdo Schimmel	help) echo "Test names: $TESTS"; exit 0;;
207*b7cc6d3cSIdo Schimmel	esac
208*b7cc6d3cSIdo Schimmeldone
209*b7cc6d3cSIdo Schimmel
210*b7cc6d3cSIdo Schimmelif [ "$TESTS" != "none" ]; then
211*b7cc6d3cSIdo Schimmel	printf "\nTests passed: %3d\n" ${nsuccess}
212*b7cc6d3cSIdo Schimmel	printf "Tests failed: %3d\n"   ${nfail}
213*b7cc6d3cSIdo Schimmelfi
214*b7cc6d3cSIdo Schimmel
215*b7cc6d3cSIdo Schimmelexit $ret
216