13de611b5SPetr Machata# SPDX-License-Identifier: GPL-2.0
23de611b5SPetr Machata
33de611b5SPetr Machata# This test sends a >1Gbps stream of traffic from H1, to the switch, which
43de611b5SPetr Machata# forwards it to a 1Gbps port. This 1Gbps stream is then looped back to the
53de611b5SPetr Machata# switch and forwarded to the port under test $swp3, which is also 1Gbps.
63de611b5SPetr Machata#
73de611b5SPetr Machata# This way, $swp3 should be 100% filled with traffic without any of it spilling
83de611b5SPetr Machata# to the backlog. Any extra packets sent should almost 1:1 go to backlog. That
93de611b5SPetr Machata# is what H2 is used for--it sends the extra traffic to create backlog.
103de611b5SPetr Machata#
113de611b5SPetr Machata# A RED Qdisc is installed on $swp3. The configuration is such that the minimum
123de611b5SPetr Machata# and maximum size are 1 byte apart, so there is a very clear border under which
133de611b5SPetr Machata# no marking or dropping takes place, and above which everything is marked or
143de611b5SPetr Machata# dropped.
153de611b5SPetr Machata#
163de611b5SPetr Machata# The test uses the buffer build-up behavior to test the installed RED.
173de611b5SPetr Machata#
183de611b5SPetr Machata# In order to test WRED, $swp3 actually contains RED under PRIO, with two
193de611b5SPetr Machata# different configurations. Traffic is prioritized using 802.1p and relies on
203de611b5SPetr Machata# the implicit mlxsw configuration, where packet priority is taken 1:1 from the
213de611b5SPetr Machata# 802.1p marking.
223de611b5SPetr Machata#
233de611b5SPetr Machata# +--------------------------+                     +--------------------------+
243de611b5SPetr Machata# | H1                       |                     | H2                       |
253de611b5SPetr Machata# |     + $h1.10             |                     |     + $h2.10             |
263de611b5SPetr Machata# |     | 192.0.2.1/28       |                     |     | 192.0.2.2/28       |
273de611b5SPetr Machata# |     |                    |                     |     |                    |
283de611b5SPetr Machata# |     |         $h1.11 +   |                     |     |         $h2.11 +   |
293de611b5SPetr Machata# |     |  192.0.2.17/28 |   |                     |     |  192.0.2.18/28 |   |
303de611b5SPetr Machata# |     |                |   |                     |     |                |   |
313de611b5SPetr Machata# |     \______    ______/   |                     |     \______    ______/   |
323de611b5SPetr Machata# |            \ /           |                     |            \ /           |
333de611b5SPetr Machata# |             + $h1        |                     |             + $h2        |
343de611b5SPetr Machata# +-------------|------------+                     +-------------|------------+
353de611b5SPetr Machata#               | >1Gbps                                         |
363de611b5SPetr Machata# +-------------|------------------------------------------------|------------+
373de611b5SPetr Machata# | SW          + $swp1                                          + $swp2      |
383de611b5SPetr Machata# |     _______/ \___________                        ___________/ \_______    |
393de611b5SPetr Machata# |    /                     \                      /                     \   |
403de611b5SPetr Machata# |  +-|-----------------+   |                    +-|-----------------+   |   |
413de611b5SPetr Machata# |  | + $swp1.10        |   |                    | + $swp2.10        |   |   |
423de611b5SPetr Machata# |  |                   |   |        .-------------+ $swp5.10        |   |   |
433de611b5SPetr Machata# |  |     BR1_10        |   |        |           |                   |   |   |
443de611b5SPetr Machata# |  |                   |   |        |           |     BR2_10        |   |   |
453de611b5SPetr Machata# |  | + $swp2.10        |   |        |           |                   |   |   |
463de611b5SPetr Machata# |  +-|-----------------+   |        |           | + $swp3.10        |   |   |
473de611b5SPetr Machata# |    |                     |        |           +-|-----------------+   |   |
483de611b5SPetr Machata# |    |   +-----------------|-+      |             |   +-----------------|-+ |
493de611b5SPetr Machata# |    |   |        $swp1.11 + |      |             |   |        $swp2.11 + | |
503de611b5SPetr Machata# |    |   |                   |      | .-----------------+ $swp5.11        | |
513de611b5SPetr Machata# |    |   |      BR1_11       |      | |           |   |                   | |
523de611b5SPetr Machata# |    |   |                   |      | |           |   |      BR2_11       | |
533de611b5SPetr Machata# |    |   |        $swp2.11 + |      | |           |   |                   | |
543de611b5SPetr Machata# |    |   +-----------------|-+      | |           |   |        $swp3.11 + | |
553de611b5SPetr Machata# |    |                     |        | |           |   +-----------------|-+ |
563de611b5SPetr Machata# |    \_______   ___________/        | |           \___________   _______/   |
573de611b5SPetr Machata# |            \ /                    \ /                       \ /           |
583de611b5SPetr Machata# |             + $swp4                + $swp5                   + $swp3      |
593de611b5SPetr Machata# +-------------|----------------------|-------------------------|------------+
603de611b5SPetr Machata#               |                      |                         | 1Gbps
613de611b5SPetr Machata#               \________1Gbps_________/                         |
623de611b5SPetr Machata#                                   +----------------------------|------------+
633de611b5SPetr Machata#                                   | H3                         + $h3        |
643de611b5SPetr Machata#                                   |      _____________________/ \_______    |
653de611b5SPetr Machata#                                   |     /                               \   |
663de611b5SPetr Machata#                                   |     |                               |   |
673de611b5SPetr Machata#                                   |     + $h3.10                 $h3.11 +   |
683de611b5SPetr Machata#                                   |       192.0.2.3/28    192.0.2.19/28     |
693de611b5SPetr Machata#                                   +-----------------------------------------+
703de611b5SPetr Machata
713de611b5SPetr MachataNUM_NETIFS=8
723de611b5SPetr MachataCHECK_TC="yes"
733de611b5SPetr Machatalib_dir=$(dirname $0)/../../../net/forwarding
743de611b5SPetr Machatasource $lib_dir/lib.sh
753de611b5SPetr Machatasource $lib_dir/devlink_lib.sh
76b8bfafe4SPetr Machatasource mlxsw_lib.sh
773de611b5SPetr Machatasource qos_lib.sh
783de611b5SPetr Machata
793de611b5SPetr Machataipaddr()
803de611b5SPetr Machata{
813de611b5SPetr Machata	local host=$1; shift
823de611b5SPetr Machata	local vlan=$1; shift
833de611b5SPetr Machata
843de611b5SPetr Machata	echo 192.0.2.$((16 * (vlan - 10) + host))
853de611b5SPetr Machata}
863de611b5SPetr Machata
873de611b5SPetr Machatahost_create()
883de611b5SPetr Machata{
893de611b5SPetr Machata	local dev=$1; shift
903de611b5SPetr Machata	local host=$1; shift
913de611b5SPetr Machata
923de611b5SPetr Machata	simple_if_init $dev
933de611b5SPetr Machata	mtu_set $dev 10000
943de611b5SPetr Machata
953de611b5SPetr Machata	vlan_create $dev 10 v$dev $(ipaddr $host 10)/28
963de611b5SPetr Machata	ip link set dev $dev.10 type vlan egress 0:0
973de611b5SPetr Machata
983de611b5SPetr Machata	vlan_create $dev 11 v$dev $(ipaddr $host 11)/28
993de611b5SPetr Machata	ip link set dev $dev.11 type vlan egress 0:1
1003de611b5SPetr Machata}
1013de611b5SPetr Machata
1023de611b5SPetr Machatahost_destroy()
1033de611b5SPetr Machata{
1043de611b5SPetr Machata	local dev=$1; shift
1053de611b5SPetr Machata
1063de611b5SPetr Machata	vlan_destroy $dev 11
1073de611b5SPetr Machata	vlan_destroy $dev 10
1083de611b5SPetr Machata	mtu_restore $dev
1093de611b5SPetr Machata	simple_if_fini $dev
1103de611b5SPetr Machata}
1113de611b5SPetr Machata
1123de611b5SPetr Machatah1_create()
1133de611b5SPetr Machata{
1143de611b5SPetr Machata	host_create $h1 1
1153de611b5SPetr Machata}
1163de611b5SPetr Machata
1173de611b5SPetr Machatah1_destroy()
1183de611b5SPetr Machata{
1193de611b5SPetr Machata	host_destroy $h1
1203de611b5SPetr Machata}
1213de611b5SPetr Machata
1223de611b5SPetr Machatah2_create()
1233de611b5SPetr Machata{
1243de611b5SPetr Machata	host_create $h2 2
1251add9212SPetr Machata	tc qdisc add dev $h2 clsact
1263de611b5SPetr Machata
1273de611b5SPetr Machata	# Some of the tests in this suite use multicast traffic. As this traffic
1283de611b5SPetr Machata	# enters BR2_10 resp. BR2_11, it is flooded to all other ports. Thus
1293de611b5SPetr Machata	# e.g. traffic ingressing through $swp2 is flooded to $swp3 (the
1303de611b5SPetr Machata	# intended destination) and $swp5 (which is intended as ingress for
1313de611b5SPetr Machata	# another stream of traffic).
1323de611b5SPetr Machata	#
1333de611b5SPetr Machata	# This is generally not a problem, but if the $swp5 throughput is lower
1343de611b5SPetr Machata	# than $swp2 throughput, there will be a build-up at $swp5. That may
1353de611b5SPetr Machata	# cause packets to fail to queue up at $swp3 due to shared buffer
1363de611b5SPetr Machata	# quotas, and the test to spuriously fail.
1373de611b5SPetr Machata	#
138*61a00b19SAmit Cohen	# Prevent this by adding a shaper which limits the traffic in $h2 to
139*61a00b19SAmit Cohen	# 1Gbps.
1403de611b5SPetr Machata
141*61a00b19SAmit Cohen	tc qdisc replace dev $h2 root handle 10: tbf rate 1gbit \
142*61a00b19SAmit Cohen		burst 128K limit 1G
1433de611b5SPetr Machata}
1443de611b5SPetr Machata
1453de611b5SPetr Machatah2_destroy()
1463de611b5SPetr Machata{
147*61a00b19SAmit Cohen	tc qdisc del dev $h2 root handle 10:
1481add9212SPetr Machata	tc qdisc del dev $h2 clsact
1493de611b5SPetr Machata	host_destroy $h2
1503de611b5SPetr Machata}
1513de611b5SPetr Machata
1523de611b5SPetr Machatah3_create()
1533de611b5SPetr Machata{
1543de611b5SPetr Machata	host_create $h3 3
1553de611b5SPetr Machata}
1563de611b5SPetr Machata
1573de611b5SPetr Machatah3_destroy()
1583de611b5SPetr Machata{
1593de611b5SPetr Machata	host_destroy $h3
1603de611b5SPetr Machata}
1613de611b5SPetr Machata
1623de611b5SPetr Machataswitch_create()
1633de611b5SPetr Machata{
1643de611b5SPetr Machata	local intf
1653de611b5SPetr Machata	local vlan
1663de611b5SPetr Machata
1673de611b5SPetr Machata	ip link add dev br1_10 type bridge
1683de611b5SPetr Machata	ip link add dev br1_11 type bridge
1693de611b5SPetr Machata
1703de611b5SPetr Machata	ip link add dev br2_10 type bridge
1713de611b5SPetr Machata	ip link add dev br2_11 type bridge
1723de611b5SPetr Machata
1733de611b5SPetr Machata	for intf in $swp1 $swp2 $swp3 $swp4 $swp5; do
1743de611b5SPetr Machata		ip link set dev $intf up
1753de611b5SPetr Machata		mtu_set $intf 10000
1763de611b5SPetr Machata	done
1773de611b5SPetr Machata
1783de611b5SPetr Machata	for intf in $swp1 $swp4; do
1793de611b5SPetr Machata		for vlan in 10 11; do
1803de611b5SPetr Machata			vlan_create $intf $vlan
1813de611b5SPetr Machata			ip link set dev $intf.$vlan master br1_$vlan
1823de611b5SPetr Machata			ip link set dev $intf.$vlan up
1833de611b5SPetr Machata		done
1843de611b5SPetr Machata	done
1853de611b5SPetr Machata
1863de611b5SPetr Machata	for intf in $swp2 $swp3 $swp5; do
1873de611b5SPetr Machata		for vlan in 10 11; do
1883de611b5SPetr Machata			vlan_create $intf $vlan
1893de611b5SPetr Machata			ip link set dev $intf.$vlan master br2_$vlan
1903de611b5SPetr Machata			ip link set dev $intf.$vlan up
1913de611b5SPetr Machata		done
1923de611b5SPetr Machata	done
1933de611b5SPetr Machata
1943de611b5SPetr Machata	ip link set dev $swp4.10 type vlan egress 0:0
1953de611b5SPetr Machata	ip link set dev $swp4.11 type vlan egress 0:1
1963de611b5SPetr Machata	for intf in $swp1 $swp2 $swp5; do
1973de611b5SPetr Machata		for vlan in 10 11; do
1983de611b5SPetr Machata			ip link set dev $intf.$vlan type vlan ingress 0:0 1:1
1993de611b5SPetr Machata		done
2003de611b5SPetr Machata	done
2013de611b5SPetr Machata
202*61a00b19SAmit Cohen	for intf in $swp3 $swp4; do
203*61a00b19SAmit Cohen		tc qdisc replace dev $intf root handle 1: tbf rate 1gbit \
204*61a00b19SAmit Cohen			burst 128K limit 1G
2053de611b5SPetr Machata	done
2063de611b5SPetr Machata
2073de611b5SPetr Machata	ip link set dev br1_10 up
2083de611b5SPetr Machata	ip link set dev br1_11 up
2093de611b5SPetr Machata	ip link set dev br2_10 up
2103de611b5SPetr Machata	ip link set dev br2_11 up
2113de611b5SPetr Machata
2123de611b5SPetr Machata	local size=$(devlink_pool_size_thtype 0 | cut -d' ' -f 1)
2136e0972e0SPetr Machata	devlink_port_pool_th_save $swp3 8
2143de611b5SPetr Machata	devlink_port_pool_th_set $swp3 8 $size
2153de611b5SPetr Machata}
2163de611b5SPetr Machata
2173de611b5SPetr Machataswitch_destroy()
2183de611b5SPetr Machata{
2193de611b5SPetr Machata	local intf
2203de611b5SPetr Machata	local vlan
2213de611b5SPetr Machata
2223de611b5SPetr Machata	devlink_port_pool_th_restore $swp3 8
2233de611b5SPetr Machata
2243de611b5SPetr Machata	ip link set dev br2_11 down
2253de611b5SPetr Machata	ip link set dev br2_10 down
2263de611b5SPetr Machata	ip link set dev br1_11 down
2273de611b5SPetr Machata	ip link set dev br1_10 down
2283de611b5SPetr Machata
229*61a00b19SAmit Cohen	for intf in $swp4 $swp3; do
230*61a00b19SAmit Cohen		tc qdisc del dev $intf root handle 1:
2313de611b5SPetr Machata	done
2323de611b5SPetr Machata
2333de611b5SPetr Machata	for intf in $swp5 $swp3 $swp2 $swp4 $swp1; do
2343de611b5SPetr Machata		for vlan in 11 10; do
2353de611b5SPetr Machata			ip link set dev $intf.$vlan down
2363de611b5SPetr Machata			ip link set dev $intf.$vlan nomaster
2373de611b5SPetr Machata			vlan_destroy $intf $vlan
2383de611b5SPetr Machata		done
2393de611b5SPetr Machata
2403de611b5SPetr Machata		mtu_restore $intf
2413de611b5SPetr Machata		ip link set dev $intf down
2423de611b5SPetr Machata	done
2433de611b5SPetr Machata
2443de611b5SPetr Machata	ip link del dev br2_11
2453de611b5SPetr Machata	ip link del dev br2_10
2463de611b5SPetr Machata	ip link del dev br1_11
2473de611b5SPetr Machata	ip link del dev br1_10
2483de611b5SPetr Machata}
2493de611b5SPetr Machata
2503de611b5SPetr Machatasetup_prepare()
2513de611b5SPetr Machata{
2523de611b5SPetr Machata	h1=${NETIFS[p1]}
2533de611b5SPetr Machata	swp1=${NETIFS[p2]}
2543de611b5SPetr Machata
2553de611b5SPetr Machata	swp2=${NETIFS[p3]}
2563de611b5SPetr Machata	h2=${NETIFS[p4]}
2573de611b5SPetr Machata
2583de611b5SPetr Machata	swp3=${NETIFS[p5]}
2593de611b5SPetr Machata	h3=${NETIFS[p6]}
2603de611b5SPetr Machata
2613de611b5SPetr Machata	swp4=${NETIFS[p7]}
2623de611b5SPetr Machata	swp5=${NETIFS[p8]}
2633de611b5SPetr Machata
2643de611b5SPetr Machata	h3_mac=$(mac_get $h3)
2653de611b5SPetr Machata
2663de611b5SPetr Machata	vrf_prepare
2673de611b5SPetr Machata
2683de611b5SPetr Machata	h1_create
2693de611b5SPetr Machata	h2_create
2703de611b5SPetr Machata	h3_create
2713de611b5SPetr Machata	switch_create
2723de611b5SPetr Machata}
2733de611b5SPetr Machata
2743de611b5SPetr Machatacleanup()
2753de611b5SPetr Machata{
2763de611b5SPetr Machata	pre_cleanup
2773de611b5SPetr Machata
2783de611b5SPetr Machata	switch_destroy
2793de611b5SPetr Machata	h3_destroy
2803de611b5SPetr Machata	h2_destroy
2813de611b5SPetr Machata	h1_destroy
2823de611b5SPetr Machata
2833de611b5SPetr Machata	vrf_cleanup
2843de611b5SPetr Machata}
2853de611b5SPetr Machata
2863de611b5SPetr Machataping_ipv4()
2873de611b5SPetr Machata{
2883de611b5SPetr Machata	ping_test $h1.10 $(ipaddr 3 10) " from host 1, vlan 10"
2893de611b5SPetr Machata	ping_test $h1.11 $(ipaddr 3 11) " from host 1, vlan 11"
2903de611b5SPetr Machata	ping_test $h2.10 $(ipaddr 3 10) " from host 2, vlan 10"
2913de611b5SPetr Machata	ping_test $h2.11 $(ipaddr 3 11) " from host 2, vlan 11"
2923de611b5SPetr Machata}
2933de611b5SPetr Machata
2943de611b5SPetr Machataget_tc()
2953de611b5SPetr Machata{
2963de611b5SPetr Machata	local vlan=$1; shift
2973de611b5SPetr Machata
2983de611b5SPetr Machata	echo $((vlan - 10))
2993de611b5SPetr Machata}
3003de611b5SPetr Machata
3013de611b5SPetr Machataget_qdisc_handle()
3023de611b5SPetr Machata{
3033de611b5SPetr Machata	local vlan=$1; shift
3043de611b5SPetr Machata
3053de611b5SPetr Machata	local tc=$(get_tc $vlan)
3063de611b5SPetr Machata	local band=$((8 - tc))
3073de611b5SPetr Machata
3083de611b5SPetr Machata	# Handle is 107: for TC1, 108: for TC0.
3093de611b5SPetr Machata	echo "10$band:"
3103de611b5SPetr Machata}
3113de611b5SPetr Machata
3123de611b5SPetr Machataget_qdisc_backlog()
3133de611b5SPetr Machata{
3143de611b5SPetr Machata	local vlan=$1; shift
3153de611b5SPetr Machata
3163de611b5SPetr Machata	qdisc_stats_get $swp3 $(get_qdisc_handle $vlan) .backlog
3173de611b5SPetr Machata}
3183de611b5SPetr Machata
3193de611b5SPetr Machataget_mc_transmit_queue()
3203de611b5SPetr Machata{
3213de611b5SPetr Machata	local vlan=$1; shift
3223de611b5SPetr Machata
3233de611b5SPetr Machata	local tc=$(($(get_tc $vlan) + 8))
3243de611b5SPetr Machata	ethtool_stats_get $swp3 tc_transmit_queue_tc_$tc
3253de611b5SPetr Machata}
3263de611b5SPetr Machata
3273de611b5SPetr Machataget_nmarked()
3283de611b5SPetr Machata{
3293de611b5SPetr Machata	local vlan=$1; shift
3303de611b5SPetr Machata
3313de611b5SPetr Machata	ethtool_stats_get $swp3 ecn_marked
3323de611b5SPetr Machata}
3333de611b5SPetr Machata
334bf862732SPetr Machataget_qdisc_nmarked()
335bf862732SPetr Machata{
336bf862732SPetr Machata	local vlan=$1; shift
337bf862732SPetr Machata
338bf862732SPetr Machata	busywait_for_counter 1100 +1 \
339bf862732SPetr Machata		qdisc_stats_get $swp3 $(get_qdisc_handle $vlan) .marked
340bf862732SPetr Machata}
341bf862732SPetr Machata
3423de611b5SPetr Machataget_qdisc_npackets()
3433de611b5SPetr Machata{
3443de611b5SPetr Machata	local vlan=$1; shift
3453de611b5SPetr Machata
3463de611b5SPetr Machata	busywait_for_counter 1100 +1 \
3473de611b5SPetr Machata		qdisc_stats_get $swp3 $(get_qdisc_handle $vlan) .packets
3483de611b5SPetr Machata}
3493de611b5SPetr Machata
3501add9212SPetr Machatasend_packets()
3511add9212SPetr Machata{
3521add9212SPetr Machata	local vlan=$1; shift
3531add9212SPetr Machata	local proto=$1; shift
3541add9212SPetr Machata	local pkts=$1; shift
3551add9212SPetr Machata
3561add9212SPetr Machata	$MZ $h2.$vlan -p 8000 -a own -b $h3_mac \
3571add9212SPetr Machata	    -A $(ipaddr 2 $vlan) -B $(ipaddr 3 $vlan) \
3581add9212SPetr Machata	    -t $proto -q -c $pkts "$@"
3591add9212SPetr Machata}
3601add9212SPetr Machata
3613de611b5SPetr Machata# This sends traffic in an attempt to build a backlog of $size. Returns 0 on
3623de611b5SPetr Machata# success. After 10 failed attempts it bails out and returns 1. It dumps the
3633de611b5SPetr Machata# backlog size to stdout.
3643de611b5SPetr Machatabuild_backlog()
3653de611b5SPetr Machata{
3663de611b5SPetr Machata	local vlan=$1; shift
3673de611b5SPetr Machata	local size=$1; shift
3683de611b5SPetr Machata	local proto=$1; shift
3693de611b5SPetr Machata
3703de611b5SPetr Machata	local tc=$((vlan - 10))
3713de611b5SPetr Machata	local band=$((8 - tc))
3723de611b5SPetr Machata	local cur=-1
3733de611b5SPetr Machata	local i=0
3743de611b5SPetr Machata
3753de611b5SPetr Machata	while :; do
376844f0556SPetr Machata		local cur=$(busywait 1100 until_counter_is "> $cur" \
3773de611b5SPetr Machata					    get_qdisc_backlog $vlan)
3783de611b5SPetr Machata		local diff=$((size - cur))
3793de611b5SPetr Machata		local pkts=$(((diff + 7999) / 8000))
3803de611b5SPetr Machata
3813de611b5SPetr Machata		if ((cur >= size)); then
3823de611b5SPetr Machata			echo $cur
3833de611b5SPetr Machata			return 0
3843de611b5SPetr Machata		elif ((i++ > 10)); then
3853de611b5SPetr Machata			echo $cur
3863de611b5SPetr Machata			return 1
3873de611b5SPetr Machata		fi
3883de611b5SPetr Machata
3891add9212SPetr Machata		send_packets $vlan $proto $pkts "$@"
3903de611b5SPetr Machata	done
3913de611b5SPetr Machata}
3923de611b5SPetr Machata
3933de611b5SPetr Machatacheck_marking()
3943de611b5SPetr Machata{
395bf862732SPetr Machata	local get_nmarked=$1; shift
3963de611b5SPetr Machata	local vlan=$1; shift
3973de611b5SPetr Machata	local cond=$1; shift
3983de611b5SPetr Machata
3993de611b5SPetr Machata	local npackets_0=$(get_qdisc_npackets $vlan)
400bf862732SPetr Machata	local nmarked_0=$($get_nmarked $vlan)
4013de611b5SPetr Machata	sleep 5
4023de611b5SPetr Machata	local npackets_1=$(get_qdisc_npackets $vlan)
403bf862732SPetr Machata	local nmarked_1=$($get_nmarked $vlan)
4043de611b5SPetr Machata
4053de611b5SPetr Machata	local nmarked_d=$((nmarked_1 - nmarked_0))
4063de611b5SPetr Machata	local npackets_d=$((npackets_1 - npackets_0))
4073de611b5SPetr Machata	local pct=$((100 * nmarked_d / npackets_d))
4083de611b5SPetr Machata
4093de611b5SPetr Machata	echo $pct
4103de611b5SPetr Machata	((pct $cond))
4113de611b5SPetr Machata}
4123de611b5SPetr Machata
41363f3c1d0SPetr Machataecn_test_common()
4143de611b5SPetr Machata{
41563f3c1d0SPetr Machata	local name=$1; shift
416bf862732SPetr Machata	local get_nmarked=$1; shift
4173de611b5SPetr Machata	local vlan=$1; shift
4183de611b5SPetr Machata	local limit=$1; shift
4193de611b5SPetr Machata	local backlog
4203de611b5SPetr Machata	local pct
4213de611b5SPetr Machata
4223de611b5SPetr Machata	# Build the below-the-limit backlog using UDP. We could use TCP just
4233de611b5SPetr Machata	# fine, but this way we get a proof that UDP is accepted when queue
4243de611b5SPetr Machata	# length is below the limit. The main stream is using TCP, and if the
4253de611b5SPetr Machata	# limit is misconfigured, we would see this traffic being ECN marked.
4263de611b5SPetr Machata	RET=0
4273de611b5SPetr Machata	backlog=$(build_backlog $vlan $((2 * limit / 3)) udp)
4283de611b5SPetr Machata	check_err $? "Could not build the requested backlog"
429bf862732SPetr Machata	pct=$(check_marking "$get_nmarked" $vlan "== 0")
4303de611b5SPetr Machata	check_err $? "backlog $backlog / $limit Got $pct% marked packets, expected == 0."
43163f3c1d0SPetr Machata	log_test "TC $((vlan - 10)): $name backlog < limit"
4323de611b5SPetr Machata
4333de611b5SPetr Machata	# Now push TCP, because non-TCP traffic would be early-dropped after the
4343de611b5SPetr Machata	# backlog crosses the limit, and we want to make sure that the backlog
4353de611b5SPetr Machata	# is above the limit.
4363de611b5SPetr Machata	RET=0
4373de611b5SPetr Machata	backlog=$(build_backlog $vlan $((3 * limit / 2)) tcp tos=0x01)
4383de611b5SPetr Machata	check_err $? "Could not build the requested backlog"
439bf862732SPetr Machata	pct=$(check_marking "$get_nmarked" $vlan ">= 95")
4403de611b5SPetr Machata	check_err $? "backlog $backlog / $limit Got $pct% marked packets, expected >= 95."
44163f3c1d0SPetr Machata	log_test "TC $((vlan - 10)): $name backlog > limit"
44263f3c1d0SPetr Machata}
44363f3c1d0SPetr Machata
444bf862732SPetr Machata__do_ecn_test()
44563f3c1d0SPetr Machata{
446bf862732SPetr Machata	local get_nmarked=$1; shift
44763f3c1d0SPetr Machata	local vlan=$1; shift
44863f3c1d0SPetr Machata	local limit=$1; shift
449bf862732SPetr Machata	local name=${1-ECN}; shift
45063f3c1d0SPetr Machata
45163f3c1d0SPetr Machata	start_tcp_traffic $h1.$vlan $(ipaddr 1 $vlan) $(ipaddr 3 $vlan) \
45263f3c1d0SPetr Machata			  $h3_mac tos=0x01
45363f3c1d0SPetr Machata	sleep 1
45463f3c1d0SPetr Machata
455bf862732SPetr Machata	ecn_test_common "$name" "$get_nmarked" $vlan $limit
4563de611b5SPetr Machata
4573de611b5SPetr Machata	# Up there we saw that UDP gets accepted when backlog is below the
4583de611b5SPetr Machata	# limit. Now that it is above, it should all get dropped, and backlog
4593de611b5SPetr Machata	# building should fail.
4603de611b5SPetr Machata	RET=0
4613de611b5SPetr Machata	build_backlog $vlan $((2 * limit)) udp >/dev/null
4623de611b5SPetr Machata	check_fail $? "UDP traffic went into backlog instead of being early-dropped"
46363f3c1d0SPetr Machata	log_test "TC $((vlan - 10)): $name backlog > limit: UDP early-dropped"
46463f3c1d0SPetr Machata
46563f3c1d0SPetr Machata	stop_traffic
46663f3c1d0SPetr Machata	sleep 1
46763f3c1d0SPetr Machata}
46863f3c1d0SPetr Machata
469bf862732SPetr Machatado_ecn_test()
470bf862732SPetr Machata{
471bf862732SPetr Machata	local vlan=$1; shift
472bf862732SPetr Machata	local limit=$1; shift
473bf862732SPetr Machata
474bf862732SPetr Machata	__do_ecn_test get_nmarked "$vlan" "$limit"
475bf862732SPetr Machata}
476bf862732SPetr Machata
477bf862732SPetr Machatado_ecn_test_perband()
478bf862732SPetr Machata{
479bf862732SPetr Machata	local vlan=$1; shift
480bf862732SPetr Machata	local limit=$1; shift
481bf862732SPetr Machata
482b8bfafe4SPetr Machata	mlxsw_only_on_spectrum 3+ || return
483bf862732SPetr Machata	__do_ecn_test get_qdisc_nmarked "$vlan" "$limit" "per-band ECN"
484bf862732SPetr Machata}
485bf862732SPetr Machata
48663f3c1d0SPetr Machatado_ecn_nodrop_test()
48763f3c1d0SPetr Machata{
48863f3c1d0SPetr Machata	local vlan=$1; shift
48963f3c1d0SPetr Machata	local limit=$1; shift
49063f3c1d0SPetr Machata	local name="ECN nodrop"
49163f3c1d0SPetr Machata
49263f3c1d0SPetr Machata	start_tcp_traffic $h1.$vlan $(ipaddr 1 $vlan) $(ipaddr 3 $vlan) \
49363f3c1d0SPetr Machata			  $h3_mac tos=0x01
49463f3c1d0SPetr Machata	sleep 1
49563f3c1d0SPetr Machata
496bf862732SPetr Machata	ecn_test_common "$name" get_nmarked $vlan $limit
49763f3c1d0SPetr Machata
49863f3c1d0SPetr Machata	# Up there we saw that UDP gets accepted when backlog is below the
49963f3c1d0SPetr Machata	# limit. Now that it is above, in nodrop mode, make sure it goes to
50063f3c1d0SPetr Machata	# backlog as well.
50163f3c1d0SPetr Machata	RET=0
50263f3c1d0SPetr Machata	build_backlog $vlan $((2 * limit)) udp >/dev/null
50363f3c1d0SPetr Machata	check_err $? "UDP traffic was early-dropped instead of getting into backlog"
50463f3c1d0SPetr Machata	log_test "TC $((vlan - 10)): $name backlog > limit: UDP not dropped"
5053de611b5SPetr Machata
5063de611b5SPetr Machata	stop_traffic
5073de611b5SPetr Machata	sleep 1
5083de611b5SPetr Machata}
5093de611b5SPetr Machata
5103de611b5SPetr Machatado_red_test()
5113de611b5SPetr Machata{
5123de611b5SPetr Machata	local vlan=$1; shift
5133de611b5SPetr Machata	local limit=$1; shift
5143de611b5SPetr Machata	local backlog
5153de611b5SPetr Machata	local pct
5163de611b5SPetr Machata
5173de611b5SPetr Machata	# Use ECN-capable TCP to verify there's no marking even though the queue
5183de611b5SPetr Machata	# is above limit.
5193de611b5SPetr Machata	start_tcp_traffic $h1.$vlan $(ipaddr 1 $vlan) $(ipaddr 3 $vlan) \
5203de611b5SPetr Machata			  $h3_mac tos=0x01
5213de611b5SPetr Machata
5223de611b5SPetr Machata	# Pushing below the queue limit should work.
5233de611b5SPetr Machata	RET=0
5243de611b5SPetr Machata	backlog=$(build_backlog $vlan $((2 * limit / 3)) tcp tos=0x01)
5253de611b5SPetr Machata	check_err $? "Could not build the requested backlog"
526bf862732SPetr Machata	pct=$(check_marking get_nmarked $vlan "== 0")
5273de611b5SPetr Machata	check_err $? "backlog $backlog / $limit Got $pct% marked packets, expected == 0."
5283de611b5SPetr Machata	log_test "TC $((vlan - 10)): RED backlog < limit"
5293de611b5SPetr Machata
5303de611b5SPetr Machata	# Pushing above should not.
5313de611b5SPetr Machata	RET=0
5323de611b5SPetr Machata	backlog=$(build_backlog $vlan $((3 * limit / 2)) tcp tos=0x01)
5333de611b5SPetr Machata	check_fail $? "Traffic went into backlog instead of being early-dropped"
534bf862732SPetr Machata	pct=$(check_marking get_nmarked $vlan "== 0")
5353de611b5SPetr Machata	check_err $? "backlog $backlog / $limit Got $pct% marked packets, expected == 0."
5363de611b5SPetr Machata	local diff=$((limit - backlog))
5373de611b5SPetr Machata	pct=$((100 * diff / limit))
538*61a00b19SAmit Cohen	((-10 <= pct && pct <= 10))
539dda7f4faSPetr Machata	check_err $? "backlog $backlog / $limit expected <= 10% distance"
5403de611b5SPetr Machata	log_test "TC $((vlan - 10)): RED backlog > limit"
5413de611b5SPetr Machata
5423de611b5SPetr Machata	stop_traffic
5433de611b5SPetr Machata	sleep 1
5443de611b5SPetr Machata}
5453de611b5SPetr Machata
5463de611b5SPetr Machatado_mc_backlog_test()
5473de611b5SPetr Machata{
5483de611b5SPetr Machata	local vlan=$1; shift
5493de611b5SPetr Machata	local limit=$1; shift
5503de611b5SPetr Machata	local backlog
5513de611b5SPetr Machata	local pct
5523de611b5SPetr Machata
5533de611b5SPetr Machata	RET=0
5543de611b5SPetr Machata
5553de611b5SPetr Machata	start_tcp_traffic $h1.$vlan $(ipaddr 1 $vlan) $(ipaddr 3 $vlan) bc
5563de611b5SPetr Machata	start_tcp_traffic $h2.$vlan $(ipaddr 2 $vlan) $(ipaddr 3 $vlan) bc
5573de611b5SPetr Machata
558844f0556SPetr Machata	qbl=$(busywait 5000 until_counter_is ">= 500000" \
5593de611b5SPetr Machata		       get_qdisc_backlog $vlan)
5603de611b5SPetr Machata	check_err $? "Could not build MC backlog"
5613de611b5SPetr Machata
5623de611b5SPetr Machata	# Verify that we actually see the backlog on BUM TC. Do a busywait as
5633de611b5SPetr Machata	# well, performance blips might cause false fail.
5643de611b5SPetr Machata	local ebl
565844f0556SPetr Machata	ebl=$(busywait 5000 until_counter_is ">= 500000" \
5663de611b5SPetr Machata		       get_mc_transmit_queue $vlan)
5673de611b5SPetr Machata	check_err $? "MC backlog reported by qdisc not visible in ethtool"
5683de611b5SPetr Machata
5693de611b5SPetr Machata	stop_traffic
5703de611b5SPetr Machata	stop_traffic
5713de611b5SPetr Machata
5723de611b5SPetr Machata	log_test "TC $((vlan - 10)): Qdisc reports MC backlog"
5733de611b5SPetr Machata}
5741add9212SPetr Machata
5750cd6fa99SPetr Machatado_mark_test()
5760cd6fa99SPetr Machata{
5770cd6fa99SPetr Machata	local vlan=$1; shift
5780cd6fa99SPetr Machata	local limit=$1; shift
5790cd6fa99SPetr Machata	local subtest=$1; shift
5800cd6fa99SPetr Machata	local fetch_counter=$1; shift
5810cd6fa99SPetr Machata	local should_fail=$1; shift
5820cd6fa99SPetr Machata	local base
5830cd6fa99SPetr Machata
584b8bfafe4SPetr Machata	mlxsw_only_on_spectrum 2+ || return
585b8bfafe4SPetr Machata
5860cd6fa99SPetr Machata	RET=0
5870cd6fa99SPetr Machata
5880cd6fa99SPetr Machata	start_tcp_traffic $h1.$vlan $(ipaddr 1 $vlan) $(ipaddr 3 $vlan) \
5890cd6fa99SPetr Machata			  $h3_mac tos=0x01
5900cd6fa99SPetr Machata
5910cd6fa99SPetr Machata	# Create a bit of a backlog and observe no mirroring due to marks.
5920cd6fa99SPetr Machata	qevent_rule_install_$subtest
5930cd6fa99SPetr Machata
5940cd6fa99SPetr Machata	build_backlog $vlan $((2 * limit / 3)) tcp tos=0x01 >/dev/null
5950cd6fa99SPetr Machata
5960cd6fa99SPetr Machata	base=$($fetch_counter)
5970cd6fa99SPetr Machata	count=$(busywait 1100 until_counter_is ">= $((base + 1))" \
5980cd6fa99SPetr Machata		$fetch_counter)
5990cd6fa99SPetr Machata	check_fail $? "Spurious packets ($base -> $count) observed without buffer pressure"
6000cd6fa99SPetr Machata
6010cd6fa99SPetr Machata	# Above limit, everything should be mirrored, we should see lots of
6020cd6fa99SPetr Machata	# packets.
6030cd6fa99SPetr Machata	build_backlog $vlan $((3 * limit / 2)) tcp tos=0x01 >/dev/null
6040cd6fa99SPetr Machata	busywait_for_counter 1100 +10000 \
6050cd6fa99SPetr Machata		 $fetch_counter > /dev/null
6060cd6fa99SPetr Machata	check_err_fail "$should_fail" $? "ECN-marked packets $subtest'd"
6070cd6fa99SPetr Machata
6080cd6fa99SPetr Machata	# When the rule is uninstalled, there should be no mirroring.
6090cd6fa99SPetr Machata	qevent_rule_uninstall_$subtest
6100cd6fa99SPetr Machata	busywait_for_counter 1100 +10 \
6110cd6fa99SPetr Machata		 $fetch_counter > /dev/null
6120cd6fa99SPetr Machata	check_fail $? "Spurious packets observed after uninstall"
6130cd6fa99SPetr Machata
6140cd6fa99SPetr Machata	if ((should_fail)); then
6150cd6fa99SPetr Machata		log_test "TC $((vlan - 10)): marked packets not $subtest'd"
6160cd6fa99SPetr Machata	else
6170cd6fa99SPetr Machata		log_test "TC $((vlan - 10)): marked packets $subtest'd"
6180cd6fa99SPetr Machata	fi
6190cd6fa99SPetr Machata
6200cd6fa99SPetr Machata	stop_traffic
6210cd6fa99SPetr Machata	sleep 1
6220cd6fa99SPetr Machata}
6230cd6fa99SPetr Machata
6241add9212SPetr Machatado_drop_test()
6251add9212SPetr Machata{
6261add9212SPetr Machata	local vlan=$1; shift
6271add9212SPetr Machata	local limit=$1; shift
6281add9212SPetr Machata	local trigger=$1; shift
6291add9212SPetr Machata	local subtest=$1; shift
6301add9212SPetr Machata	local fetch_counter=$1; shift
6311add9212SPetr Machata	local base
6321add9212SPetr Machata	local now
6331add9212SPetr Machata
634b8bfafe4SPetr Machata	mlxsw_only_on_spectrum 2+ || return
635b8bfafe4SPetr Machata
6361add9212SPetr Machata	RET=0
6371add9212SPetr Machata
6381add9212SPetr Machata	start_traffic $h1.$vlan $(ipaddr 1 $vlan) $(ipaddr 3 $vlan) $h3_mac
6391add9212SPetr Machata
6401add9212SPetr Machata	# Create a bit of a backlog and observe no mirroring due to drops.
6411add9212SPetr Machata	qevent_rule_install_$subtest
6421add9212SPetr Machata	base=$($fetch_counter)
6431add9212SPetr Machata
6441add9212SPetr Machata	build_backlog $vlan $((2 * limit / 3)) udp >/dev/null
6451add9212SPetr Machata
6461add9212SPetr Machata	busywait 1100 until_counter_is ">= $((base + 1))" $fetch_counter >/dev/null
6471add9212SPetr Machata	check_fail $? "Spurious packets observed without buffer pressure"
6481add9212SPetr Machata
6491add9212SPetr Machata	# Push to the queue until it's at the limit. The configured limit is
6501add9212SPetr Machata	# rounded by the qdisc and then by the driver, so this is the best we
6518fb6ac45SPetr Machata	# can do to get to the real limit of the system.
6521add9212SPetr Machata	build_backlog $vlan $((3 * limit / 2)) udp >/dev/null
6531add9212SPetr Machata
6541add9212SPetr Machata	base=$($fetch_counter)
6551add9212SPetr Machata	send_packets $vlan udp 11
6561add9212SPetr Machata
6571add9212SPetr Machata	now=$(busywait 1100 until_counter_is ">= $((base + 10))" $fetch_counter)
6581add9212SPetr Machata	check_err $? "Dropped packets not observed: 11 expected, $((now - base)) seen"
6591add9212SPetr Machata
6601add9212SPetr Machata	# When no extra traffic is injected, there should be no mirroring.
6611add9212SPetr Machata	busywait 1100 until_counter_is ">= $((base + 20))" $fetch_counter >/dev/null
6621add9212SPetr Machata	check_fail $? "Spurious packets observed"
6631add9212SPetr Machata
6641add9212SPetr Machata	# When the rule is uninstalled, there should be no mirroring.
6651add9212SPetr Machata	qevent_rule_uninstall_$subtest
6661add9212SPetr Machata	send_packets $vlan udp 11
6671add9212SPetr Machata	busywait 1100 until_counter_is ">= $((base + 20))" $fetch_counter >/dev/null
6681add9212SPetr Machata	check_fail $? "Spurious packets observed after uninstall"
6691add9212SPetr Machata
6701add9212SPetr Machata	log_test "TC $((vlan - 10)): ${trigger}ped packets $subtest'd"
6711add9212SPetr Machata
6721add9212SPetr Machata	stop_traffic
6731add9212SPetr Machata	sleep 1
6741add9212SPetr Machata}
6751add9212SPetr Machata
6761add9212SPetr Machataqevent_rule_install_mirror()
6771add9212SPetr Machata{
6781add9212SPetr Machata	tc filter add block 10 pref 1234 handle 102 matchall skip_sw \
6791add9212SPetr Machata	   action mirred egress mirror dev $swp2 hw_stats disabled
6801add9212SPetr Machata}
6811add9212SPetr Machata
6821add9212SPetr Machataqevent_rule_uninstall_mirror()
6831add9212SPetr Machata{
6841add9212SPetr Machata	tc filter del block 10 pref 1234 handle 102 matchall
6851add9212SPetr Machata}
6861add9212SPetr Machata
6871add9212SPetr Machataqevent_counter_fetch_mirror()
6881add9212SPetr Machata{
6891add9212SPetr Machata	tc_rule_handle_stats_get "dev $h2 ingress" 101
6901add9212SPetr Machata}
6911add9212SPetr Machata
6921add9212SPetr Machatado_drop_mirror_test()
6931add9212SPetr Machata{
6941add9212SPetr Machata	local vlan=$1; shift
6951add9212SPetr Machata	local limit=$1; shift
6961add9212SPetr Machata	local qevent_name=$1; shift
6971add9212SPetr Machata
6981add9212SPetr Machata	tc filter add dev $h2 ingress pref 1 handle 101 prot ip \
6991add9212SPetr Machata	   flower skip_sw ip_proto udp \
7001add9212SPetr Machata	   action drop
7011add9212SPetr Machata
7021add9212SPetr Machata	do_drop_test "$vlan" "$limit" "$qevent_name" mirror \
7031add9212SPetr Machata		     qevent_counter_fetch_mirror
7041add9212SPetr Machata
7051add9212SPetr Machata	tc filter del dev $h2 ingress pref 1 handle 101 flower
7061add9212SPetr Machata}
7078fb6ac45SPetr Machata
7080cd6fa99SPetr Machatado_mark_mirror_test()
7090cd6fa99SPetr Machata{
7100cd6fa99SPetr Machata	local vlan=$1; shift
7110cd6fa99SPetr Machata	local limit=$1; shift
7120cd6fa99SPetr Machata
7130cd6fa99SPetr Machata	tc filter add dev $h2 ingress pref 1 handle 101 prot ip \
7140cd6fa99SPetr Machata	   flower skip_sw ip_proto tcp \
7150cd6fa99SPetr Machata	   action drop
7160cd6fa99SPetr Machata
7170cd6fa99SPetr Machata	do_mark_test "$vlan" "$limit" mirror \
7180cd6fa99SPetr Machata		     qevent_counter_fetch_mirror \
7190cd6fa99SPetr Machata		     $(: should_fail=)0
7200cd6fa99SPetr Machata
7210cd6fa99SPetr Machata	tc filter del dev $h2 ingress pref 1 handle 101 flower
7220cd6fa99SPetr Machata}
7230cd6fa99SPetr Machata
7248fb6ac45SPetr Machataqevent_rule_install_trap()
7258fb6ac45SPetr Machata{
7268fb6ac45SPetr Machata	tc filter add block 10 pref 1234 handle 102 matchall skip_sw \
7278fb6ac45SPetr Machata	   action trap hw_stats disabled
7288fb6ac45SPetr Machata}
7298fb6ac45SPetr Machata
7308fb6ac45SPetr Machataqevent_rule_uninstall_trap()
7318fb6ac45SPetr Machata{
7328fb6ac45SPetr Machata	tc filter del block 10 pref 1234 handle 102 matchall
7338fb6ac45SPetr Machata}
7348fb6ac45SPetr Machata
7358fb6ac45SPetr Machataqevent_counter_fetch_trap()
7368fb6ac45SPetr Machata{
7378fb6ac45SPetr Machata	local trap_name=$1; shift
7388fb6ac45SPetr Machata
7398fb6ac45SPetr Machata	devlink_trap_rx_packets_get "$trap_name"
7408fb6ac45SPetr Machata}
7418fb6ac45SPetr Machata
7428fb6ac45SPetr Machatado_drop_trap_test()
7438fb6ac45SPetr Machata{
7448fb6ac45SPetr Machata	local vlan=$1; shift
7458fb6ac45SPetr Machata	local limit=$1; shift
7468fb6ac45SPetr Machata	local trap_name=$1; shift
7478fb6ac45SPetr Machata
7488fb6ac45SPetr Machata	do_drop_test "$vlan" "$limit" "$trap_name" trap \
7498fb6ac45SPetr Machata		     "qevent_counter_fetch_trap $trap_name"
7508fb6ac45SPetr Machata}
7510cd6fa99SPetr Machata
7520cd6fa99SPetr Machataqevent_rule_install_trap_fwd()
7530cd6fa99SPetr Machata{
7540cd6fa99SPetr Machata	tc filter add block 10 pref 1234 handle 102 matchall skip_sw \
7550cd6fa99SPetr Machata	   action trap_fwd hw_stats disabled
7560cd6fa99SPetr Machata}
7570cd6fa99SPetr Machata
7580cd6fa99SPetr Machataqevent_rule_uninstall_trap_fwd()
7590cd6fa99SPetr Machata{
7600cd6fa99SPetr Machata	tc filter del block 10 pref 1234 handle 102 matchall
7610cd6fa99SPetr Machata}
762