Skip to content

Commit b7cc6d3

Browse files
idoschdavem330
authored andcommitted
selftests: net: Add drop monitor test
Test that drop monitor correctly captures both software and hardware originated packet drops. # ./drop_monitor_tests.sh Software drops test TEST: Capturing active software drops [ OK ] TEST: Capturing inactive software drops [ OK ] Hardware drops test TEST: Capturing active hardware drops [ OK ] TEST: Capturing inactive hardware drops [ OK ] Tests passed: 4 Tests failed: 0 Signed-off-by: Ido Schimmel <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 93e1559 commit b7cc6d3

File tree

3 files changed

+219
-0
lines changed

3 files changed

+219
-0
lines changed

tools/testing/selftests/net/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ TEST_PROGS += txtimestamp.sh
1919
TEST_PROGS += vrf-xfrm-tests.sh
2020
TEST_PROGS += rxtimestamp.sh
2121
TEST_PROGS += devlink_port_split.py
22+
TEST_PROGS += drop_monitor_tests.sh
2223
TEST_PROGS_EXTENDED := in_netns.sh
2324
TEST_GEN_FILES = socket nettest
2425
TEST_GEN_FILES += psock_fanout psock_tpacket msg_zerocopy reuseport_addr_any

tools/testing/selftests/net/config

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,6 @@ CONFIG_NET_SCH_ETF=m
3030
CONFIG_NET_SCH_NETEM=y
3131
CONFIG_TEST_BLACKHOLE_DEV=m
3232
CONFIG_KALLSYMS=y
33+
CONFIG_TRACEPOINTS=y
34+
CONFIG_NET_DROP_MONITOR=m
35+
CONFIG_NETDEVSIM=m
Lines changed: 215 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,215 @@
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

0 commit comments

Comments
 (0)