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