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