lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20220620152647.2498927-5-dchumak@nvidia.com>
Date:   Mon, 20 Jun 2022 18:26:46 +0300
From:   Dima Chumak <dchumak@...dia.com>
To:     Jakub Kicinski <kuba@...nel.org>
CC:     Jiri Pirko <jiri@...dia.com>,
        "David S. Miller" <davem@...emloft.net>,
        Eric Dumazet <edumazet@...gle.com>,
        Paolo Abeni <pabeni@...hat.com>, <netdev@...r.kernel.org>,
        Dima Chumak <dchumak@...dia.com>
Subject: [PATCH net-next 4/5] selftest: netdevsim: Add devlink rate police sub-test

Test verifies that netdevsim VFs and groups can set and retrieve
the new rate limit_type police attributes via devlink API.

Signed-off-by: Dima Chumak <dchumak@...dia.com>
---
 .../drivers/net/netdevsim/devlink.sh          | 215 ++++++++++++++++--
 1 file changed, 200 insertions(+), 15 deletions(-)

diff --git a/tools/testing/selftests/drivers/net/netdevsim/devlink.sh b/tools/testing/selftests/drivers/net/netdevsim/devlink.sh
index 9de1d123f4f5..40392dcbb30e 100755
--- a/tools/testing/selftests/drivers/net/netdevsim/devlink.sh
+++ b/tools/testing/selftests/drivers/net/netdevsim/devlink.sh
@@ -534,6 +534,15 @@ rate_attr_set()
 	devlink port function rate set $handle $name $value$units
 }
 
+rate_police_attr_set()
+{
+	local handle=$1
+	local name=$2
+	local value=$3
+
+	devlink port function rate set $handle limit_type police $name $value
+}
+
 rate_attr_get()
 {
 	local handle=$1
@@ -542,7 +551,7 @@ rate_attr_get()
 	cmd_jq "devlink port function rate show $handle -j" '.[][].'$name
 }
 
-rate_attr_tx_rate_check()
+rate_attr_shaping_rate_check()
 {
 	local handle=$1
 	local name=$2
@@ -563,6 +572,35 @@ rate_attr_tx_rate_check()
 	check_err $? "Unexpected $name attr value $api_value != $rate"
 }
 
+rate_attr_police_rate_check()
+{
+	local handle=$1
+	local name=$2
+	local rate=$3
+	local debug_file=$4
+
+	rate_police_attr_set $handle $name $rate
+	check_err $? "Failed to set $name value"
+
+	local debug_value=$(cat $debug_file)
+	check_err $? "Failed to read $name value from debugfs"
+
+	# undo bits->bytes conversion forced by devlink
+	case $name in ([rt]x_max) debug_value=$((debug_value * 8)) ;; esac
+
+	[ "$debug_value" == "$rate" ]
+	check_err $? "Unexpected $name debug value $debug_value != $rate"
+
+	local api_value=$(rate_attr_get $handle $name)
+	check_err $? "Failed to get $name attr value"
+
+	# undo bits->bytes conversion forced by devlink
+	case $name in ([rt]x_max) api_value=$((api_value * 8)) ;; esac
+
+	[ "$api_value" == "$rate" ]
+	check_err $? "Unexpected $name attr value $api_value != $rate"
+}
+
 rate_attr_parent_check()
 {
 	local handle=$1
@@ -586,8 +624,9 @@ rate_attr_parent_check()
 rate_node_add()
 {
 	local handle=$1
+	local limit_type=${2:+limit_type $2}
 
-	devlink port function rate add $handle
+	devlink port function rate add $handle $limit_type
 }
 
 rate_node_del()
@@ -597,21 +636,14 @@ rate_node_del()
 	devlink port function rate del $handle
 }
 
-rate_test()
+rate_shaping_test()
 {
-	RET=0
-
-	echo $VF_COUNT > /sys/bus/netdevsim/devices/$DEV_NAME/sriov_numvfs
-	devlink dev eswitch set $DL_HANDLE mode switchdev
-	local leafs=`rate_leafs_get $DL_HANDLE`
-	local num_leafs=`echo $leafs | wc -w`
-	[ "$num_leafs" == "$VF_COUNT" ]
-	check_err $? "Expected $VF_COUNT rate leafs but got $num_leafs"
+	local leafs=$1
 
 	rate=10
 	for r_obj in $leafs
 	do
-		rate_attr_tx_rate_check $r_obj tx_share $rate \
+		rate_attr_shaping_rate_check $r_obj tx_share $rate \
 			$DEBUGFS_DIR/ports/${r_obj##*/}/tx_share
 		rate=$(($rate+10))
 	done
@@ -619,11 +651,19 @@ rate_test()
 	rate=100
 	for r_obj in $leafs
 	do
-		rate_attr_tx_rate_check $r_obj tx_max $rate \
+		rate_attr_shaping_rate_check $r_obj tx_max $rate \
 			$DEBUGFS_DIR/ports/${r_obj##*/}/tx_max
 		rate=$(($rate+100))
 	done
 
+	for r_obj in $leafs
+	do
+		rate_attr_shaping_rate_check $r_obj tx_share 0 \
+			$DEBUGFS_DIR/ports/${r_obj##*/}/tx_share
+		rate_attr_shaping_rate_check $r_obj tx_max 0 \
+			$DEBUGFS_DIR/ports/${r_obj##*/}/tx_max
+	done
+
 	local node1_name='group1'
 	local node1="$DL_HANDLE/$node1_name"
 	rate_node_add "$node1"
@@ -634,11 +674,11 @@ rate_test()
 	check_err $? "Expected 1 rate node in output but got $num_nodes"
 
 	local node_tx_share=10
-	rate_attr_tx_rate_check $node1 tx_share $node_tx_share \
+	rate_attr_shaping_rate_check $node1 tx_share $node_tx_share \
 		$DEBUGFS_DIR/rate_nodes/${node1##*/}/tx_share
 
 	local node_tx_max=100
-	rate_attr_tx_rate_check $node1 tx_max $node_tx_max \
+	rate_attr_shaping_rate_check $node1 tx_max $node_tx_max \
 		$DEBUGFS_DIR/rate_nodes/${node1##*/}/tx_max
 
 	rate_node_del "$node1"
@@ -668,6 +708,151 @@ rate_test()
 	check_err $? "Failed to unset $r_obj parent node"
 	rate_node_del "$node1"
 	check_err $? "Failed to delete node $node1"
+}
+
+rate_police_test()
+{
+	local leafs=$1
+
+	local rate=$((100 * 1000**2 * 8))
+	for r_obj in $leafs
+	do
+		rate_attr_police_rate_check $r_obj tx_max $rate \
+			$DEBUGFS_DIR/ports/${r_obj##*/}/tx_max
+		rate=$(($rate + 10 * 1000**2 * 8))
+	done
+
+	local size=$((1024**2))
+	for r_obj in $leafs
+	do
+		rate_attr_police_rate_check $r_obj tx_burst $size \
+			$DEBUGFS_DIR/ports/${r_obj##*/}/tx_burst
+		size=$(($size * 2))
+	done
+
+	rate=$((100 * 1000**2 * 8))
+	for r_obj in $leafs
+	do
+		rate_attr_police_rate_check $r_obj rx_max $rate \
+			$DEBUGFS_DIR/ports/${r_obj##*/}/rx_max
+		rate=$(($rate + 10 * 1000**2 * 8))
+	done
+
+	size=$((1024**2))
+	for r_obj in $leafs
+	do
+		rate_attr_police_rate_check $r_obj rx_burst $size \
+			$DEBUGFS_DIR/ports/${r_obj##*/}/rx_burst
+		size=$(($size * 2))
+	done
+
+	local packets=1000
+	for r_obj in $leafs
+	do
+		rate_attr_police_rate_check $r_obj tx_pkts $packets \
+			$DEBUGFS_DIR/ports/${r_obj##*/}/tx_pkts
+		packets=$(($packets * 2))
+	done
+
+	size=$((1024**2))
+	for r_obj in $leafs
+	do
+		rate_attr_police_rate_check $r_obj tx_pkts_burst $size \
+			$DEBUGFS_DIR/ports/${r_obj##*/}/tx_pkts_burst
+		size=$(($size * 2))
+	done
+
+	packets=1000
+	for r_obj in $leafs
+	do
+		rate_attr_police_rate_check $r_obj rx_pkts $packets \
+			$DEBUGFS_DIR/ports/${r_obj##*/}/rx_pkts
+		packets=$(($packets * 2))
+	done
+
+	size=$((1024**2))
+	for r_obj in $leafs
+	do
+		rate_attr_police_rate_check $r_obj rx_pkts_burst $size \
+			$DEBUGFS_DIR/ports/${r_obj##*/}/rx_pkts_burst
+		size=$(($size * 2))
+	done
+
+	local node1_name='group1'
+	local node1="$DL_HANDLE/$node1_name"
+	rate_node_add "$node1" police
+	check_err $? "Failed to add node $node1"
+
+	local num_nodes=`rate_nodes_get $DL_HANDLE | wc -w`
+	[ $num_nodes == 1 ]
+	check_err $? "Expected 1 rate node in output but got $num_nodes"
+
+	rate_attr_police_rate_check $node1 tx_max $((200 * 1000**2 * 8)) \
+		$DEBUGFS_DIR/rate_nodes/${node1##*/}/tx_max
+
+	rate_attr_police_rate_check $node1 tx_burst $((2 * 1024**2)) \
+		$DEBUGFS_DIR/rate_nodes/${node1##*/}/tx_burst
+
+	rate_attr_police_rate_check $node1 rx_max $((300 * 1000**2 * 8)) \
+		$DEBUGFS_DIR/rate_nodes/${node1##*/}/rx_max
+
+	rate_attr_police_rate_check $node1 rx_burst $((3 * 1024**2)) \
+		$DEBUGFS_DIR/rate_nodes/${node1##*/}/rx_burst
+
+	rate_attr_police_rate_check $node1 tx_pkts 4000 \
+		$DEBUGFS_DIR/rate_nodes/${node1##*/}/tx_pkts
+
+	rate_attr_police_rate_check $node1 tx_pkts_burst $((4 * 1024**2)) \
+		$DEBUGFS_DIR/rate_nodes/${node1##*/}/tx_pkts_burst
+
+	rate_attr_police_rate_check $node1 rx_pkts 5000 \
+		$DEBUGFS_DIR/rate_nodes/${node1##*/}/rx_pkts
+
+	rate_attr_police_rate_check $node1 rx_pkts_burst $((5 * 1024**2)) \
+		$DEBUGFS_DIR/rate_nodes/${node1##*/}/rx_pkts_burst
+
+	rate_node_del "$node1"
+	check_err $? "Failed to delete node $node1"
+	num_nodes=`rate_nodes_get $DL_HANDLE | wc -w`
+	[ $num_nodes == 0 ]
+	check_err $? "Expected 0 rate node but got $num_nodes"
+
+	rate_node_add "$node1" police
+	check_err $? "Failed to add node $node1"
+
+	rate_attr_parent_check $r_obj $node1_name \
+		$DEBUGFS_DIR/ports/${r_obj##*/}/rate_parent
+
+	local node2_name='group2'
+	local node2="$DL_HANDLE/$node2_name"
+	rate_node_add "$node2" police
+	check_err $? "Failed to add node $node2"
+
+	rate_attr_parent_check $node2 $node1_name \
+		$DEBUGFS_DIR/rate_nodes/$node2_name/rate_parent
+	rate_node_del "$node2"
+	check_err $? "Failed to delete node $node2"
+	rate_attr_set "$r_obj" noparent
+	check_err $? "Failed to unset $r_obj parent node"
+	rate_node_del "$node1"
+	check_err $? "Failed to delete node $node1"
+}
+
+rate_test()
+{
+	RET=0
+
+	echo $VF_COUNT > /sys/bus/netdevsim/devices/$DEV_NAME/sriov_numvfs
+	devlink dev eswitch set $DL_HANDLE mode switchdev
+	local leafs=`rate_leafs_get $DL_HANDLE`
+	local num_leafs=`echo $leafs | wc -w`
+	[ "$num_leafs" == "$VF_COUNT" ]
+	check_err $? "Expected $VF_COUNT rate leafs but got $num_leafs"
+
+	rate_shaping_test "$leafs"
+	if devlink port function rate help |& grep -qF 'limit_type police' ; then
+		rate_police_test "$leafs"
+	fi
 
 	log_test "rate test"
 }
-- 
2.36.1

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ