19b18942eSPetr Machata#!/bin/bash 29b18942eSPetr Machata# SPDX-License-Identifier: GPL-2.0 39b18942eSPetr Machata 49b18942eSPetr Machatalib_dir=$(dirname $0)/../../../net/forwarding 59b18942eSPetr Machata 69b18942eSPetr MachataALL_TESTS=" 79b18942eSPetr Machata l3_reporting_test 89b18942eSPetr Machata l3_fail_next_test 99b18942eSPetr Machata l3_counter_test 109b18942eSPetr Machata l3_rollback_test 119b18942eSPetr Machata l3_monitor_test 129b18942eSPetr Machata" 139b18942eSPetr Machata 149b18942eSPetr MachataNETDEVSIM_PATH=/sys/bus/netdevsim/ 159b18942eSPetr MachataDEV_ADDR_1=1337 169b18942eSPetr MachataDEV_ADDR_2=1057 179b18942eSPetr MachataDEV_ADDR_3=5417 189b18942eSPetr MachataNUM_NETIFS=0 199b18942eSPetr Machatasource $lib_dir/lib.sh 209b18942eSPetr Machata 219b18942eSPetr MachataDUMMY_IFINDEX= 229b18942eSPetr Machata 239b18942eSPetr MachataDEV_ADDR() 249b18942eSPetr Machata{ 259b18942eSPetr Machata local n=$1; shift 269b18942eSPetr Machata local var=DEV_ADDR_$n 279b18942eSPetr Machata 289b18942eSPetr Machata echo ${!var} 299b18942eSPetr Machata} 309b18942eSPetr Machata 319b18942eSPetr MachataDEV() 329b18942eSPetr Machata{ 339b18942eSPetr Machata echo netdevsim$(DEV_ADDR $1) 349b18942eSPetr Machata} 359b18942eSPetr Machata 369b18942eSPetr MachataDEVLINK_DEV() 379b18942eSPetr Machata{ 389b18942eSPetr Machata echo netdevsim/$(DEV $1) 399b18942eSPetr Machata} 409b18942eSPetr Machata 419b18942eSPetr MachataSYSFS_NET_DIR() 429b18942eSPetr Machata{ 439b18942eSPetr Machata echo /sys/bus/netdevsim/devices/$(DEV $1)/net/ 449b18942eSPetr Machata} 459b18942eSPetr Machata 469b18942eSPetr MachataDEBUGFS_DIR() 479b18942eSPetr Machata{ 489b18942eSPetr Machata echo /sys/kernel/debug/netdevsim/$(DEV $1)/ 499b18942eSPetr Machata} 509b18942eSPetr Machata 519b18942eSPetr Machatansim_add() 529b18942eSPetr Machata{ 539b18942eSPetr Machata local n=$1; shift 549b18942eSPetr Machata 559b18942eSPetr Machata echo "$(DEV_ADDR $n) 1" > ${NETDEVSIM_PATH}/new_device 569b18942eSPetr Machata while [ ! -d $(SYSFS_NET_DIR $n) ] ; do :; done 579b18942eSPetr Machata} 589b18942eSPetr Machata 599b18942eSPetr Machatansim_reload() 609b18942eSPetr Machata{ 619b18942eSPetr Machata local n=$1; shift 629b18942eSPetr Machata local ns=$1; shift 639b18942eSPetr Machata 649b18942eSPetr Machata devlink dev reload $(DEVLINK_DEV $n) netns $ns 659b18942eSPetr Machata 669b18942eSPetr Machata if [ $? -ne 0 ]; then 679b18942eSPetr Machata echo "Failed to reload $(DEV $n) into netns \"testns1\"" 689b18942eSPetr Machata exit 1 699b18942eSPetr Machata fi 709b18942eSPetr Machata 719b18942eSPetr Machata} 729b18942eSPetr Machata 739b18942eSPetr Machatansim_del() 749b18942eSPetr Machata{ 759b18942eSPetr Machata local n=$1; shift 769b18942eSPetr Machata 779b18942eSPetr Machata echo "$(DEV_ADDR $n)" > ${NETDEVSIM_PATH}/del_device 789b18942eSPetr Machata} 799b18942eSPetr Machata 809b18942eSPetr Machatansim_hwstats_toggle() 819b18942eSPetr Machata{ 829b18942eSPetr Machata local action=$1; shift 839b18942eSPetr Machata local instance=$1; shift 849b18942eSPetr Machata local netdev=$1; shift 859b18942eSPetr Machata local type=$1; shift 869b18942eSPetr Machata 879b18942eSPetr Machata local ifindex=$($IP -j link show dev $netdev | jq '.[].ifindex') 889b18942eSPetr Machata 899b18942eSPetr Machata echo $ifindex > $(DEBUGFS_DIR $instance)/hwstats/$type/$action 909b18942eSPetr Machata} 919b18942eSPetr Machata 929b18942eSPetr Machatansim_hwstats_enable() 939b18942eSPetr Machata{ 949b18942eSPetr Machata nsim_hwstats_toggle enable_ifindex "$@" 959b18942eSPetr Machata} 969b18942eSPetr Machata 979b18942eSPetr Machatansim_hwstats_disable() 989b18942eSPetr Machata{ 999b18942eSPetr Machata nsim_hwstats_toggle disable_ifindex "$@" 1009b18942eSPetr Machata} 1019b18942eSPetr Machata 1029b18942eSPetr Machatansim_hwstats_fail_next_enable() 1039b18942eSPetr Machata{ 1049b18942eSPetr Machata nsim_hwstats_toggle fail_next_enable "$@" 1059b18942eSPetr Machata} 1069b18942eSPetr Machata 1079b18942eSPetr Machatasetup_prepare() 1089b18942eSPetr Machata{ 1099b18942eSPetr Machata modprobe netdevsim &> /dev/null 1109b18942eSPetr Machata nsim_add 1 1119b18942eSPetr Machata nsim_add 2 1129b18942eSPetr Machata nsim_add 3 1139b18942eSPetr Machata 1149b18942eSPetr Machata ip netns add testns1 1159b18942eSPetr Machata 1169b18942eSPetr Machata if [ $? -ne 0 ]; then 1179b18942eSPetr Machata echo "Failed to add netns \"testns1\"" 1189b18942eSPetr Machata exit 1 1199b18942eSPetr Machata fi 1209b18942eSPetr Machata 1219b18942eSPetr Machata nsim_reload 1 testns1 1229b18942eSPetr Machata nsim_reload 2 testns1 1239b18942eSPetr Machata nsim_reload 3 testns1 1249b18942eSPetr Machata 1259b18942eSPetr Machata IP="ip -n testns1" 1269b18942eSPetr Machata 1279b18942eSPetr Machata $IP link add name dummy1 type dummy 1289b18942eSPetr Machata $IP link set dev dummy1 up 1299b18942eSPetr Machata DUMMY_IFINDEX=$($IP -j link show dev dummy1 | jq '.[].ifindex') 1309b18942eSPetr Machata} 1319b18942eSPetr Machata 1329b18942eSPetr Machatacleanup() 1339b18942eSPetr Machata{ 1349b18942eSPetr Machata pre_cleanup 1359b18942eSPetr Machata 1369b18942eSPetr Machata $IP link del name dummy1 1379b18942eSPetr Machata ip netns del testns1 1389b18942eSPetr Machata nsim_del 3 1399b18942eSPetr Machata nsim_del 2 1409b18942eSPetr Machata nsim_del 1 1419b18942eSPetr Machata modprobe -r netdevsim &> /dev/null 1429b18942eSPetr Machata} 1439b18942eSPetr Machata 1449b18942eSPetr Machatanetdev_hwstats_used() 1459b18942eSPetr Machata{ 1469b18942eSPetr Machata local netdev=$1; shift 1479b18942eSPetr Machata local type=$1; shift 1489b18942eSPetr Machata 1499b18942eSPetr Machata $IP -j stats show dev "$netdev" group offload subgroup hw_stats_info | 1509b18942eSPetr Machata jq '.[].info.l3_stats.used' 1519b18942eSPetr Machata} 1529b18942eSPetr Machata 1539b18942eSPetr Machatanetdev_check_used() 1549b18942eSPetr Machata{ 1559b18942eSPetr Machata local netdev=$1; shift 1569b18942eSPetr Machata local type=$1; shift 1579b18942eSPetr Machata 1589b18942eSPetr Machata [[ $(netdev_hwstats_used $netdev $type) == "true" ]] 1599b18942eSPetr Machata} 1609b18942eSPetr Machata 1619b18942eSPetr Machatanetdev_check_unused() 1629b18942eSPetr Machata{ 1639b18942eSPetr Machata local netdev=$1; shift 1649b18942eSPetr Machata local type=$1; shift 1659b18942eSPetr Machata 1669b18942eSPetr Machata [[ $(netdev_hwstats_used $netdev $type) == "false" ]] 1679b18942eSPetr Machata} 1689b18942eSPetr Machata 1699b18942eSPetr Machatanetdev_hwstats_request() 1709b18942eSPetr Machata{ 1719b18942eSPetr Machata local netdev=$1; shift 1729b18942eSPetr Machata local type=$1; shift 1739b18942eSPetr Machata 1749b18942eSPetr Machata $IP -j stats show dev "$netdev" group offload subgroup hw_stats_info | 1759b18942eSPetr Machata jq ".[].info.${type}_stats.request" 1769b18942eSPetr Machata} 1779b18942eSPetr Machata 1789b18942eSPetr Machatanetdev_check_requested() 1799b18942eSPetr Machata{ 1809b18942eSPetr Machata local netdev=$1; shift 1819b18942eSPetr Machata local type=$1; shift 1829b18942eSPetr Machata 1839b18942eSPetr Machata [[ $(netdev_hwstats_request $netdev $type) == "true" ]] 1849b18942eSPetr Machata} 1859b18942eSPetr Machata 1869b18942eSPetr Machatanetdev_check_unrequested() 1879b18942eSPetr Machata{ 1889b18942eSPetr Machata local netdev=$1; shift 1899b18942eSPetr Machata local type=$1; shift 1909b18942eSPetr Machata 1919b18942eSPetr Machata [[ $(netdev_hwstats_request $netdev $type) == "false" ]] 1929b18942eSPetr Machata} 1939b18942eSPetr Machata 1949b18942eSPetr Machatareporting_test() 1959b18942eSPetr Machata{ 1969b18942eSPetr Machata local type=$1; shift 1979b18942eSPetr Machata local instance=1 1989b18942eSPetr Machata 1999b18942eSPetr Machata RET=0 2009b18942eSPetr Machata 2019b18942eSPetr Machata [[ -n $(netdev_hwstats_used dummy1 $type) ]] 2029b18942eSPetr Machata check_err $? "$type stats not reported" 2039b18942eSPetr Machata 2049b18942eSPetr Machata netdev_check_unused dummy1 $type 2059b18942eSPetr Machata check_err $? "$type stats reported as used before either device or netdevsim request" 2069b18942eSPetr Machata 2079b18942eSPetr Machata nsim_hwstats_enable $instance dummy1 $type 2089b18942eSPetr Machata netdev_check_unused dummy1 $type 2099b18942eSPetr Machata check_err $? "$type stats reported as used before device request" 2109b18942eSPetr Machata netdev_check_unrequested dummy1 $type 2119b18942eSPetr Machata check_err $? "$type stats reported as requested before device request" 2129b18942eSPetr Machata 2139b18942eSPetr Machata $IP stats set dev dummy1 ${type}_stats on 2149b18942eSPetr Machata netdev_check_used dummy1 $type 2159b18942eSPetr Machata check_err $? "$type stats reported as not used after both device and netdevsim request" 2169b18942eSPetr Machata netdev_check_requested dummy1 $type 2179b18942eSPetr Machata check_err $? "$type stats reported as not requested after device request" 2189b18942eSPetr Machata 2199b18942eSPetr Machata nsim_hwstats_disable $instance dummy1 $type 2209b18942eSPetr Machata netdev_check_unused dummy1 $type 2219b18942eSPetr Machata check_err $? "$type stats reported as used after netdevsim request withdrawn" 2229b18942eSPetr Machata 2239b18942eSPetr Machata nsim_hwstats_enable $instance dummy1 $type 2249b18942eSPetr Machata netdev_check_used dummy1 $type 2259b18942eSPetr Machata check_err $? "$type stats reported as not used after netdevsim request reenabled" 2269b18942eSPetr Machata 2279b18942eSPetr Machata $IP stats set dev dummy1 ${type}_stats off 2289b18942eSPetr Machata netdev_check_unused dummy1 $type 2299b18942eSPetr Machata check_err $? "$type stats reported as used after device request withdrawn" 2309b18942eSPetr Machata netdev_check_unrequested dummy1 $type 2319b18942eSPetr Machata check_err $? "$type stats reported as requested after device request withdrawn" 2329b18942eSPetr Machata 2339b18942eSPetr Machata nsim_hwstats_disable $instance dummy1 $type 2349b18942eSPetr Machata netdev_check_unused dummy1 $type 2359b18942eSPetr Machata check_err $? "$type stats reported as used after both requests withdrawn" 2369b18942eSPetr Machata 2379b18942eSPetr Machata log_test "Reporting of $type stats usage" 2389b18942eSPetr Machata} 2399b18942eSPetr Machata 2409b18942eSPetr Machatal3_reporting_test() 2419b18942eSPetr Machata{ 2429b18942eSPetr Machata reporting_test l3 2439b18942eSPetr Machata} 2449b18942eSPetr Machata 2459b18942eSPetr Machata__fail_next_test() 2469b18942eSPetr Machata{ 2479b18942eSPetr Machata local instance=$1; shift 2489b18942eSPetr Machata local type=$1; shift 2499b18942eSPetr Machata 2509b18942eSPetr Machata RET=0 2519b18942eSPetr Machata 2529b18942eSPetr Machata netdev_check_unused dummy1 $type 2539b18942eSPetr Machata check_err $? "$type stats reported as used before either device or netdevsim request" 2549b18942eSPetr Machata 2559b18942eSPetr Machata nsim_hwstats_enable $instance dummy1 $type 2569b18942eSPetr Machata nsim_hwstats_fail_next_enable $instance dummy1 $type 2579b18942eSPetr Machata netdev_check_unused dummy1 $type 2589b18942eSPetr Machata check_err $? "$type stats reported as used before device request" 2599b18942eSPetr Machata netdev_check_unrequested dummy1 $type 2609b18942eSPetr Machata check_err $? "$type stats reported as requested before device request" 2619b18942eSPetr Machata 2629b18942eSPetr Machata $IP stats set dev dummy1 ${type}_stats on 2>/dev/null 2639b18942eSPetr Machata check_fail $? "$type stats request not bounced as it should have been" 2649b18942eSPetr Machata netdev_check_unused dummy1 $type 2659b18942eSPetr Machata check_err $? "$type stats reported as used after bounce" 2669b18942eSPetr Machata netdev_check_unrequested dummy1 $type 2679b18942eSPetr Machata check_err $? "$type stats reported as requested after bounce" 2689b18942eSPetr Machata 2699b18942eSPetr Machata $IP stats set dev dummy1 ${type}_stats on 2709b18942eSPetr Machata check_err $? "$type stats request failed when it shouldn't have" 2719b18942eSPetr Machata netdev_check_used dummy1 $type 2729b18942eSPetr Machata check_err $? "$type stats reported as not used after both device and netdevsim request" 2739b18942eSPetr Machata netdev_check_requested dummy1 $type 2749b18942eSPetr Machata check_err $? "$type stats reported as not requested after device request" 2759b18942eSPetr Machata 2769b18942eSPetr Machata $IP stats set dev dummy1 ${type}_stats off 2779b18942eSPetr Machata nsim_hwstats_disable $instance dummy1 $type 2789b18942eSPetr Machata 2799b18942eSPetr Machata log_test "Injected failure of $type stats enablement (netdevsim #$instance)" 2809b18942eSPetr Machata} 2819b18942eSPetr Machata 2829b18942eSPetr Machatafail_next_test() 2839b18942eSPetr Machata{ 2849b18942eSPetr Machata __fail_next_test 1 "$@" 2859b18942eSPetr Machata __fail_next_test 2 "$@" 2869b18942eSPetr Machata __fail_next_test 3 "$@" 2879b18942eSPetr Machata} 2889b18942eSPetr Machata 2899b18942eSPetr Machatal3_fail_next_test() 2909b18942eSPetr Machata{ 2919b18942eSPetr Machata fail_next_test l3 2929b18942eSPetr Machata} 2939b18942eSPetr Machata 2949b18942eSPetr Machataget_hwstat() 2959b18942eSPetr Machata{ 2969b18942eSPetr Machata local netdev=$1; shift 2979b18942eSPetr Machata local type=$1; shift 2989b18942eSPetr Machata local selector=$1; shift 2999b18942eSPetr Machata 3009b18942eSPetr Machata $IP -j stats show dev $netdev group offload subgroup ${type}_stats | 3019b18942eSPetr Machata jq ".[0].stats64.${selector}" 3029b18942eSPetr Machata} 3039b18942eSPetr Machata 3049b18942eSPetr Machatacounter_test() 3059b18942eSPetr Machata{ 3069b18942eSPetr Machata local type=$1; shift 3079b18942eSPetr Machata local instance=1 3089b18942eSPetr Machata 3099b18942eSPetr Machata RET=0 3109b18942eSPetr Machata 3119b18942eSPetr Machata nsim_hwstats_enable $instance dummy1 $type 3129b18942eSPetr Machata $IP stats set dev dummy1 ${type}_stats on 3139b18942eSPetr Machata netdev_check_used dummy1 $type 3149b18942eSPetr Machata check_err $? "$type stats reported as not used after both device and netdevsim request" 3159b18942eSPetr Machata 3169b18942eSPetr Machata # Netdevsim counts 10pps on ingress. We should see maybe a couple 3179b18942eSPetr Machata # packets, unless things take a reeealy long time. 3189b18942eSPetr Machata local pkts=$(get_hwstat dummy1 l3 rx.packets) 3199b18942eSPetr Machata ((pkts < 10)) 3209b18942eSPetr Machata check_err $? "$type stats show >= 10 packets after first enablement" 3219b18942eSPetr Machata 322*7ba106fcSDanielle Ratson sleep 2.5 3239b18942eSPetr Machata 3249b18942eSPetr Machata local pkts=$(get_hwstat dummy1 l3 rx.packets) 3259b18942eSPetr Machata ((pkts >= 20)) 326*7ba106fcSDanielle Ratson check_err $? "$type stats show < 20 packets after 2.5s passed" 3279b18942eSPetr Machata 3289b18942eSPetr Machata $IP stats set dev dummy1 ${type}_stats off 3299b18942eSPetr Machata 3309b18942eSPetr Machata sleep 2 3319b18942eSPetr Machata 3329b18942eSPetr Machata $IP stats set dev dummy1 ${type}_stats on 3339b18942eSPetr Machata local pkts=$(get_hwstat dummy1 l3 rx.packets) 3349b18942eSPetr Machata ((pkts < 10)) 3359b18942eSPetr Machata check_err $? "$type stats show >= 10 packets after second enablement" 3369b18942eSPetr Machata 3379b18942eSPetr Machata $IP stats set dev dummy1 ${type}_stats off 3389b18942eSPetr Machata nsim_hwstats_fail_next_enable $instance dummy1 $type 3399b18942eSPetr Machata $IP stats set dev dummy1 ${type}_stats on 2>/dev/null 3409b18942eSPetr Machata check_fail $? "$type stats request not bounced as it should have been" 3419b18942eSPetr Machata 3429b18942eSPetr Machata sleep 2 3439b18942eSPetr Machata 3449b18942eSPetr Machata $IP stats set dev dummy1 ${type}_stats on 3459b18942eSPetr Machata local pkts=$(get_hwstat dummy1 l3 rx.packets) 3469b18942eSPetr Machata ((pkts < 10)) 3479b18942eSPetr Machata check_err $? "$type stats show >= 10 packets after post-fail enablement" 3489b18942eSPetr Machata 3499b18942eSPetr Machata $IP stats set dev dummy1 ${type}_stats off 3509b18942eSPetr Machata 3519b18942eSPetr Machata log_test "Counter values in $type stats" 3529b18942eSPetr Machata} 3539b18942eSPetr Machata 3549b18942eSPetr Machatal3_counter_test() 3559b18942eSPetr Machata{ 3569b18942eSPetr Machata counter_test l3 3579b18942eSPetr Machata} 3589b18942eSPetr Machata 3599b18942eSPetr Machatarollback_test() 3609b18942eSPetr Machata{ 3619b18942eSPetr Machata local type=$1; shift 3629b18942eSPetr Machata 3639b18942eSPetr Machata RET=0 3649b18942eSPetr Machata 3659b18942eSPetr Machata nsim_hwstats_enable 1 dummy1 l3 3669b18942eSPetr Machata nsim_hwstats_enable 2 dummy1 l3 3679b18942eSPetr Machata nsim_hwstats_enable 3 dummy1 l3 3689b18942eSPetr Machata 3699b18942eSPetr Machata # The three netdevsim instances are registered in order of their number 3709b18942eSPetr Machata # one after another. It is reasonable to expect that whatever 3719b18942eSPetr Machata # notifications take place hit no. 2 in between hitting nos. 1 and 3, 3729b18942eSPetr Machata # whatever the actual order. This allows us to test that a fail caused 3739b18942eSPetr Machata # by no. 2 does not leave the system in a partial state, and rolls 3749b18942eSPetr Machata # everything back. 3759b18942eSPetr Machata 3769b18942eSPetr Machata nsim_hwstats_fail_next_enable 2 dummy1 l3 3779b18942eSPetr Machata $IP stats set dev dummy1 ${type}_stats on 2>/dev/null 3789b18942eSPetr Machata check_fail $? "$type stats request not bounced as it should have been" 3799b18942eSPetr Machata 3809b18942eSPetr Machata netdev_check_unused dummy1 $type 3819b18942eSPetr Machata check_err $? "$type stats reported as used after bounce" 3829b18942eSPetr Machata netdev_check_unrequested dummy1 $type 3839b18942eSPetr Machata check_err $? "$type stats reported as requested after bounce" 3849b18942eSPetr Machata 3859b18942eSPetr Machata sleep 2 3869b18942eSPetr Machata 3879b18942eSPetr Machata $IP stats set dev dummy1 ${type}_stats on 3889b18942eSPetr Machata check_err $? "$type stats request not upheld as it should have been" 3899b18942eSPetr Machata 3909b18942eSPetr Machata local pkts=$(get_hwstat dummy1 l3 rx.packets) 3919b18942eSPetr Machata ((pkts < 10)) 3929b18942eSPetr Machata check_err $? "$type stats show $pkts packets after post-fail enablement" 3939b18942eSPetr Machata 3949b18942eSPetr Machata $IP stats set dev dummy1 ${type}_stats off 3959b18942eSPetr Machata 3969b18942eSPetr Machata nsim_hwstats_disable 3 dummy1 l3 3979b18942eSPetr Machata nsim_hwstats_disable 2 dummy1 l3 3989b18942eSPetr Machata nsim_hwstats_disable 1 dummy1 l3 3999b18942eSPetr Machata 4009b18942eSPetr Machata log_test "Failure in $type stats enablement rolled back" 4019b18942eSPetr Machata} 4029b18942eSPetr Machata 4039b18942eSPetr Machatal3_rollback_test() 4049b18942eSPetr Machata{ 4059b18942eSPetr Machata rollback_test l3 4069b18942eSPetr Machata} 4079b18942eSPetr Machata 4089b18942eSPetr Machatal3_monitor_test() 4099b18942eSPetr Machata{ 4109b18942eSPetr Machata hw_stats_monitor_test dummy1 l3 \ 4119b18942eSPetr Machata "nsim_hwstats_enable 1 dummy1 l3" \ 4129b18942eSPetr Machata "nsim_hwstats_disable 1 dummy1 l3" \ 4139b18942eSPetr Machata "$IP" 4149b18942eSPetr Machata} 4159b18942eSPetr Machata 4169b18942eSPetr Machatatrap cleanup EXIT 4179b18942eSPetr Machata 4189b18942eSPetr Machatasetup_prepare 4199b18942eSPetr Machatatests_run 4209b18942eSPetr Machata 4219b18942eSPetr Machataexit $EXIT_STATUS 422