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