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