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