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