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 763de611b5SPetr Machatasource qos_lib.sh 773de611b5SPetr Machata 783de611b5SPetr Machataipaddr() 793de611b5SPetr Machata{ 803de611b5SPetr Machata local host=$1; shift 813de611b5SPetr Machata local vlan=$1; shift 823de611b5SPetr Machata 833de611b5SPetr Machata echo 192.0.2.$((16 * (vlan - 10) + host)) 843de611b5SPetr Machata} 853de611b5SPetr Machata 863de611b5SPetr Machatahost_create() 873de611b5SPetr Machata{ 883de611b5SPetr Machata local dev=$1; shift 893de611b5SPetr Machata local host=$1; shift 903de611b5SPetr Machata 913de611b5SPetr Machata simple_if_init $dev 923de611b5SPetr Machata mtu_set $dev 10000 933de611b5SPetr Machata 943de611b5SPetr Machata vlan_create $dev 10 v$dev $(ipaddr $host 10)/28 953de611b5SPetr Machata ip link set dev $dev.10 type vlan egress 0:0 963de611b5SPetr Machata 973de611b5SPetr Machata vlan_create $dev 11 v$dev $(ipaddr $host 11)/28 983de611b5SPetr Machata ip link set dev $dev.11 type vlan egress 0:1 993de611b5SPetr Machata} 1003de611b5SPetr Machata 1013de611b5SPetr Machatahost_destroy() 1023de611b5SPetr Machata{ 1033de611b5SPetr Machata local dev=$1; shift 1043de611b5SPetr Machata 1053de611b5SPetr Machata vlan_destroy $dev 11 1063de611b5SPetr Machata vlan_destroy $dev 10 1073de611b5SPetr Machata mtu_restore $dev 1083de611b5SPetr Machata simple_if_fini $dev 1093de611b5SPetr Machata} 1103de611b5SPetr Machata 1113de611b5SPetr Machatah1_create() 1123de611b5SPetr Machata{ 1133de611b5SPetr Machata host_create $h1 1 1143de611b5SPetr Machata} 1153de611b5SPetr Machata 1163de611b5SPetr Machatah1_destroy() 1173de611b5SPetr Machata{ 1183de611b5SPetr Machata host_destroy $h1 1193de611b5SPetr Machata} 1203de611b5SPetr Machata 1213de611b5SPetr Machatah2_create() 1223de611b5SPetr Machata{ 1233de611b5SPetr Machata host_create $h2 2 1241add9212SPetr Machata tc qdisc add dev $h2 clsact 1253de611b5SPetr Machata 1263de611b5SPetr Machata # Some of the tests in this suite use multicast traffic. As this traffic 1273de611b5SPetr Machata # enters BR2_10 resp. BR2_11, it is flooded to all other ports. Thus 1283de611b5SPetr Machata # e.g. traffic ingressing through $swp2 is flooded to $swp3 (the 1293de611b5SPetr Machata # intended destination) and $swp5 (which is intended as ingress for 1303de611b5SPetr Machata # another stream of traffic). 1313de611b5SPetr Machata # 1323de611b5SPetr Machata # This is generally not a problem, but if the $swp5 throughput is lower 1333de611b5SPetr Machata # than $swp2 throughput, there will be a build-up at $swp5. That may 1343de611b5SPetr Machata # cause packets to fail to queue up at $swp3 due to shared buffer 1353de611b5SPetr Machata # quotas, and the test to spuriously fail. 1363de611b5SPetr Machata # 1373de611b5SPetr Machata # Prevent this by setting the speed of $h2 to 1Gbps. 1383de611b5SPetr Machata 1393de611b5SPetr Machata ethtool -s $h2 speed 1000 autoneg off 1403de611b5SPetr Machata} 1413de611b5SPetr Machata 1423de611b5SPetr Machatah2_destroy() 1433de611b5SPetr Machata{ 1443de611b5SPetr Machata ethtool -s $h2 autoneg on 1451add9212SPetr Machata tc qdisc del dev $h2 clsact 1463de611b5SPetr Machata host_destroy $h2 1473de611b5SPetr Machata} 1483de611b5SPetr Machata 1493de611b5SPetr Machatah3_create() 1503de611b5SPetr Machata{ 1513de611b5SPetr Machata host_create $h3 3 1523de611b5SPetr Machata ethtool -s $h3 speed 1000 autoneg off 1533de611b5SPetr Machata} 1543de611b5SPetr Machata 1553de611b5SPetr Machatah3_destroy() 1563de611b5SPetr Machata{ 1573de611b5SPetr Machata ethtool -s $h3 autoneg on 1583de611b5SPetr Machata host_destroy $h3 1593de611b5SPetr Machata} 1603de611b5SPetr Machata 1613de611b5SPetr Machataswitch_create() 1623de611b5SPetr Machata{ 1633de611b5SPetr Machata local intf 1643de611b5SPetr Machata local vlan 1653de611b5SPetr Machata 1663de611b5SPetr Machata ip link add dev br1_10 type bridge 1673de611b5SPetr Machata ip link add dev br1_11 type bridge 1683de611b5SPetr Machata 1693de611b5SPetr Machata ip link add dev br2_10 type bridge 1703de611b5SPetr Machata ip link add dev br2_11 type bridge 1713de611b5SPetr Machata 1723de611b5SPetr Machata for intf in $swp1 $swp2 $swp3 $swp4 $swp5; do 1733de611b5SPetr Machata ip link set dev $intf up 1743de611b5SPetr Machata mtu_set $intf 10000 1753de611b5SPetr Machata done 1763de611b5SPetr Machata 1773de611b5SPetr Machata for intf in $swp1 $swp4; do 1783de611b5SPetr Machata for vlan in 10 11; do 1793de611b5SPetr Machata vlan_create $intf $vlan 1803de611b5SPetr Machata ip link set dev $intf.$vlan master br1_$vlan 1813de611b5SPetr Machata ip link set dev $intf.$vlan up 1823de611b5SPetr Machata done 1833de611b5SPetr Machata done 1843de611b5SPetr Machata 1853de611b5SPetr Machata for intf in $swp2 $swp3 $swp5; do 1863de611b5SPetr Machata for vlan in 10 11; do 1873de611b5SPetr Machata vlan_create $intf $vlan 1883de611b5SPetr Machata ip link set dev $intf.$vlan master br2_$vlan 1893de611b5SPetr Machata ip link set dev $intf.$vlan up 1903de611b5SPetr Machata done 1913de611b5SPetr Machata done 1923de611b5SPetr Machata 1933de611b5SPetr Machata ip link set dev $swp4.10 type vlan egress 0:0 1943de611b5SPetr Machata ip link set dev $swp4.11 type vlan egress 0:1 1953de611b5SPetr Machata for intf in $swp1 $swp2 $swp5; do 1963de611b5SPetr Machata for vlan in 10 11; do 1973de611b5SPetr Machata ip link set dev $intf.$vlan type vlan ingress 0:0 1:1 1983de611b5SPetr Machata done 1993de611b5SPetr Machata done 2003de611b5SPetr Machata 2013de611b5SPetr Machata for intf in $swp2 $swp3 $swp4 $swp5; do 2023de611b5SPetr Machata ethtool -s $intf speed 1000 autoneg off 2033de611b5SPetr Machata done 2043de611b5SPetr Machata 2053de611b5SPetr Machata ip link set dev br1_10 up 2063de611b5SPetr Machata ip link set dev br1_11 up 2073de611b5SPetr Machata ip link set dev br2_10 up 2083de611b5SPetr Machata ip link set dev br2_11 up 2093de611b5SPetr Machata 2103de611b5SPetr Machata local size=$(devlink_pool_size_thtype 0 | cut -d' ' -f 1) 2116e0972e0SPetr Machata devlink_port_pool_th_save $swp3 8 2123de611b5SPetr Machata devlink_port_pool_th_set $swp3 8 $size 2133de611b5SPetr Machata} 2143de611b5SPetr Machata 2153de611b5SPetr Machataswitch_destroy() 2163de611b5SPetr Machata{ 2173de611b5SPetr Machata local intf 2183de611b5SPetr Machata local vlan 2193de611b5SPetr Machata 2203de611b5SPetr Machata devlink_port_pool_th_restore $swp3 8 2213de611b5SPetr Machata 2223de611b5SPetr Machata tc qdisc del dev $swp3 root 2>/dev/null 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 2293de611b5SPetr Machata for intf in $swp5 $swp4 $swp3 $swp2; do 2303de611b5SPetr Machata ethtool -s $intf autoneg on 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 334*bf862732SPetr Machataget_qdisc_nmarked() 335*bf862732SPetr Machata{ 336*bf862732SPetr Machata local vlan=$1; shift 337*bf862732SPetr Machata 338*bf862732SPetr Machata busywait_for_counter 1100 +1 \ 339*bf862732SPetr Machata qdisc_stats_get $swp3 $(get_qdisc_handle $vlan) .marked 340*bf862732SPetr Machata} 341*bf862732SPetr 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{ 395*bf862732SPetr 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) 400*bf862732SPetr Machata local nmarked_0=$($get_nmarked $vlan) 4013de611b5SPetr Machata sleep 5 4023de611b5SPetr Machata local npackets_1=$(get_qdisc_npackets $vlan) 403*bf862732SPetr 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 416*bf862732SPetr 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" 429*bf862732SPetr 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" 439*bf862732SPetr 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 444*bf862732SPetr Machata__do_ecn_test() 44563f3c1d0SPetr Machata{ 446*bf862732SPetr Machata local get_nmarked=$1; shift 44763f3c1d0SPetr Machata local vlan=$1; shift 44863f3c1d0SPetr Machata local limit=$1; shift 449*bf862732SPetr 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 455*bf862732SPetr 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 469*bf862732SPetr Machatado_ecn_test() 470*bf862732SPetr Machata{ 471*bf862732SPetr Machata local vlan=$1; shift 472*bf862732SPetr Machata local limit=$1; shift 473*bf862732SPetr Machata 474*bf862732SPetr Machata __do_ecn_test get_nmarked "$vlan" "$limit" 475*bf862732SPetr Machata} 476*bf862732SPetr Machata 477*bf862732SPetr Machatado_ecn_test_perband() 478*bf862732SPetr Machata{ 479*bf862732SPetr Machata local vlan=$1; shift 480*bf862732SPetr Machata local limit=$1; shift 481*bf862732SPetr Machata 482*bf862732SPetr Machata # Per-band ECN counters are not supported on Spectrum-1 and Spectrum-2. 483*bf862732SPetr Machata [[ "$DEVLINK_VIDDID" == "15b3:cb84" || 484*bf862732SPetr Machata "$DEVLINK_VIDDID" == "15b3:cf6c" ]] && return 485*bf862732SPetr Machata 486*bf862732SPetr Machata __do_ecn_test get_qdisc_nmarked "$vlan" "$limit" "per-band ECN" 487*bf862732SPetr Machata} 488*bf862732SPetr Machata 48963f3c1d0SPetr Machatado_ecn_nodrop_test() 49063f3c1d0SPetr Machata{ 49163f3c1d0SPetr Machata local vlan=$1; shift 49263f3c1d0SPetr Machata local limit=$1; shift 49363f3c1d0SPetr Machata local name="ECN nodrop" 49463f3c1d0SPetr Machata 49563f3c1d0SPetr Machata start_tcp_traffic $h1.$vlan $(ipaddr 1 $vlan) $(ipaddr 3 $vlan) \ 49663f3c1d0SPetr Machata $h3_mac tos=0x01 49763f3c1d0SPetr Machata sleep 1 49863f3c1d0SPetr Machata 499*bf862732SPetr Machata ecn_test_common "$name" get_nmarked $vlan $limit 50063f3c1d0SPetr Machata 50163f3c1d0SPetr Machata # Up there we saw that UDP gets accepted when backlog is below the 50263f3c1d0SPetr Machata # limit. Now that it is above, in nodrop mode, make sure it goes to 50363f3c1d0SPetr Machata # backlog as well. 50463f3c1d0SPetr Machata RET=0 50563f3c1d0SPetr Machata build_backlog $vlan $((2 * limit)) udp >/dev/null 50663f3c1d0SPetr Machata check_err $? "UDP traffic was early-dropped instead of getting into backlog" 50763f3c1d0SPetr Machata log_test "TC $((vlan - 10)): $name backlog > limit: UDP not dropped" 5083de611b5SPetr Machata 5093de611b5SPetr Machata stop_traffic 5103de611b5SPetr Machata sleep 1 5113de611b5SPetr Machata} 5123de611b5SPetr Machata 5133de611b5SPetr Machatado_red_test() 5143de611b5SPetr Machata{ 5153de611b5SPetr Machata local vlan=$1; shift 5163de611b5SPetr Machata local limit=$1; shift 5173de611b5SPetr Machata local backlog 5183de611b5SPetr Machata local pct 5193de611b5SPetr Machata 5203de611b5SPetr Machata # Use ECN-capable TCP to verify there's no marking even though the queue 5213de611b5SPetr Machata # is above limit. 5223de611b5SPetr Machata start_tcp_traffic $h1.$vlan $(ipaddr 1 $vlan) $(ipaddr 3 $vlan) \ 5233de611b5SPetr Machata $h3_mac tos=0x01 5243de611b5SPetr Machata 5253de611b5SPetr Machata # Pushing below the queue limit should work. 5263de611b5SPetr Machata RET=0 5273de611b5SPetr Machata backlog=$(build_backlog $vlan $((2 * limit / 3)) tcp tos=0x01) 5283de611b5SPetr Machata check_err $? "Could not build the requested backlog" 529*bf862732SPetr Machata pct=$(check_marking get_nmarked $vlan "== 0") 5303de611b5SPetr Machata check_err $? "backlog $backlog / $limit Got $pct% marked packets, expected == 0." 5313de611b5SPetr Machata log_test "TC $((vlan - 10)): RED backlog < limit" 5323de611b5SPetr Machata 5333de611b5SPetr Machata # Pushing above should not. 5343de611b5SPetr Machata RET=0 5353de611b5SPetr Machata backlog=$(build_backlog $vlan $((3 * limit / 2)) tcp tos=0x01) 5363de611b5SPetr Machata check_fail $? "Traffic went into backlog instead of being early-dropped" 537*bf862732SPetr Machata pct=$(check_marking get_nmarked $vlan "== 0") 5383de611b5SPetr Machata check_err $? "backlog $backlog / $limit Got $pct% marked packets, expected == 0." 5393de611b5SPetr Machata local diff=$((limit - backlog)) 5403de611b5SPetr Machata pct=$((100 * diff / limit)) 541dda7f4faSPetr Machata ((0 <= pct && pct <= 10)) 542dda7f4faSPetr Machata check_err $? "backlog $backlog / $limit expected <= 10% distance" 5433de611b5SPetr Machata log_test "TC $((vlan - 10)): RED backlog > limit" 5443de611b5SPetr Machata 5453de611b5SPetr Machata stop_traffic 5463de611b5SPetr Machata sleep 1 5473de611b5SPetr Machata} 5483de611b5SPetr Machata 5493de611b5SPetr Machatado_mc_backlog_test() 5503de611b5SPetr Machata{ 5513de611b5SPetr Machata local vlan=$1; shift 5523de611b5SPetr Machata local limit=$1; shift 5533de611b5SPetr Machata local backlog 5543de611b5SPetr Machata local pct 5553de611b5SPetr Machata 5563de611b5SPetr Machata RET=0 5573de611b5SPetr Machata 5583de611b5SPetr Machata start_tcp_traffic $h1.$vlan $(ipaddr 1 $vlan) $(ipaddr 3 $vlan) bc 5593de611b5SPetr Machata start_tcp_traffic $h2.$vlan $(ipaddr 2 $vlan) $(ipaddr 3 $vlan) bc 5603de611b5SPetr Machata 561844f0556SPetr Machata qbl=$(busywait 5000 until_counter_is ">= 500000" \ 5623de611b5SPetr Machata get_qdisc_backlog $vlan) 5633de611b5SPetr Machata check_err $? "Could not build MC backlog" 5643de611b5SPetr Machata 5653de611b5SPetr Machata # Verify that we actually see the backlog on BUM TC. Do a busywait as 5663de611b5SPetr Machata # well, performance blips might cause false fail. 5673de611b5SPetr Machata local ebl 568844f0556SPetr Machata ebl=$(busywait 5000 until_counter_is ">= 500000" \ 5693de611b5SPetr Machata get_mc_transmit_queue $vlan) 5703de611b5SPetr Machata check_err $? "MC backlog reported by qdisc not visible in ethtool" 5713de611b5SPetr Machata 5723de611b5SPetr Machata stop_traffic 5733de611b5SPetr Machata stop_traffic 5743de611b5SPetr Machata 5753de611b5SPetr Machata log_test "TC $((vlan - 10)): Qdisc reports MC backlog" 5763de611b5SPetr Machata} 5771add9212SPetr Machata 5780cd6fa99SPetr Machatado_mark_test() 5790cd6fa99SPetr Machata{ 5800cd6fa99SPetr Machata local vlan=$1; shift 5810cd6fa99SPetr Machata local limit=$1; shift 5820cd6fa99SPetr Machata local subtest=$1; shift 5830cd6fa99SPetr Machata local fetch_counter=$1; shift 5840cd6fa99SPetr Machata local should_fail=$1; shift 5850cd6fa99SPetr Machata local base 5860cd6fa99SPetr Machata 5870cd6fa99SPetr Machata RET=0 5880cd6fa99SPetr Machata 5890cd6fa99SPetr Machata start_tcp_traffic $h1.$vlan $(ipaddr 1 $vlan) $(ipaddr 3 $vlan) \ 5900cd6fa99SPetr Machata $h3_mac tos=0x01 5910cd6fa99SPetr Machata 5920cd6fa99SPetr Machata # Create a bit of a backlog and observe no mirroring due to marks. 5930cd6fa99SPetr Machata qevent_rule_install_$subtest 5940cd6fa99SPetr Machata 5950cd6fa99SPetr Machata build_backlog $vlan $((2 * limit / 3)) tcp tos=0x01 >/dev/null 5960cd6fa99SPetr Machata 5970cd6fa99SPetr Machata base=$($fetch_counter) 5980cd6fa99SPetr Machata count=$(busywait 1100 until_counter_is ">= $((base + 1))" \ 5990cd6fa99SPetr Machata $fetch_counter) 6000cd6fa99SPetr Machata check_fail $? "Spurious packets ($base -> $count) observed without buffer pressure" 6010cd6fa99SPetr Machata 6020cd6fa99SPetr Machata # Above limit, everything should be mirrored, we should see lots of 6030cd6fa99SPetr Machata # packets. 6040cd6fa99SPetr Machata build_backlog $vlan $((3 * limit / 2)) tcp tos=0x01 >/dev/null 6050cd6fa99SPetr Machata busywait_for_counter 1100 +10000 \ 6060cd6fa99SPetr Machata $fetch_counter > /dev/null 6070cd6fa99SPetr Machata check_err_fail "$should_fail" $? "ECN-marked packets $subtest'd" 6080cd6fa99SPetr Machata 6090cd6fa99SPetr Machata # When the rule is uninstalled, there should be no mirroring. 6100cd6fa99SPetr Machata qevent_rule_uninstall_$subtest 6110cd6fa99SPetr Machata busywait_for_counter 1100 +10 \ 6120cd6fa99SPetr Machata $fetch_counter > /dev/null 6130cd6fa99SPetr Machata check_fail $? "Spurious packets observed after uninstall" 6140cd6fa99SPetr Machata 6150cd6fa99SPetr Machata if ((should_fail)); then 6160cd6fa99SPetr Machata log_test "TC $((vlan - 10)): marked packets not $subtest'd" 6170cd6fa99SPetr Machata else 6180cd6fa99SPetr Machata log_test "TC $((vlan - 10)): marked packets $subtest'd" 6190cd6fa99SPetr Machata fi 6200cd6fa99SPetr Machata 6210cd6fa99SPetr Machata stop_traffic 6220cd6fa99SPetr Machata sleep 1 6230cd6fa99SPetr Machata} 6240cd6fa99SPetr Machata 6251add9212SPetr Machatado_drop_test() 6261add9212SPetr Machata{ 6271add9212SPetr Machata local vlan=$1; shift 6281add9212SPetr Machata local limit=$1; shift 6291add9212SPetr Machata local trigger=$1; shift 6301add9212SPetr Machata local subtest=$1; shift 6311add9212SPetr Machata local fetch_counter=$1; shift 6321add9212SPetr Machata local base 6331add9212SPetr Machata local now 6341add9212SPetr Machata 6351add9212SPetr Machata RET=0 6361add9212SPetr Machata 6371add9212SPetr Machata start_traffic $h1.$vlan $(ipaddr 1 $vlan) $(ipaddr 3 $vlan) $h3_mac 6381add9212SPetr Machata 6391add9212SPetr Machata # Create a bit of a backlog and observe no mirroring due to drops. 6401add9212SPetr Machata qevent_rule_install_$subtest 6411add9212SPetr Machata base=$($fetch_counter) 6421add9212SPetr Machata 6431add9212SPetr Machata build_backlog $vlan $((2 * limit / 3)) udp >/dev/null 6441add9212SPetr Machata 6451add9212SPetr Machata busywait 1100 until_counter_is ">= $((base + 1))" $fetch_counter >/dev/null 6461add9212SPetr Machata check_fail $? "Spurious packets observed without buffer pressure" 6471add9212SPetr Machata 6481add9212SPetr Machata # Push to the queue until it's at the limit. The configured limit is 6491add9212SPetr Machata # rounded by the qdisc and then by the driver, so this is the best we 6508fb6ac45SPetr Machata # can do to get to the real limit of the system. 6511add9212SPetr Machata build_backlog $vlan $((3 * limit / 2)) udp >/dev/null 6521add9212SPetr Machata 6531add9212SPetr Machata base=$($fetch_counter) 6541add9212SPetr Machata send_packets $vlan udp 11 6551add9212SPetr Machata 6561add9212SPetr Machata now=$(busywait 1100 until_counter_is ">= $((base + 10))" $fetch_counter) 6571add9212SPetr Machata check_err $? "Dropped packets not observed: 11 expected, $((now - base)) seen" 6581add9212SPetr Machata 6591add9212SPetr Machata # When no extra traffic is injected, there should be no mirroring. 6601add9212SPetr Machata busywait 1100 until_counter_is ">= $((base + 20))" $fetch_counter >/dev/null 6611add9212SPetr Machata check_fail $? "Spurious packets observed" 6621add9212SPetr Machata 6631add9212SPetr Machata # When the rule is uninstalled, there should be no mirroring. 6641add9212SPetr Machata qevent_rule_uninstall_$subtest 6651add9212SPetr Machata send_packets $vlan udp 11 6661add9212SPetr Machata busywait 1100 until_counter_is ">= $((base + 20))" $fetch_counter >/dev/null 6671add9212SPetr Machata check_fail $? "Spurious packets observed after uninstall" 6681add9212SPetr Machata 6691add9212SPetr Machata log_test "TC $((vlan - 10)): ${trigger}ped packets $subtest'd" 6701add9212SPetr Machata 6711add9212SPetr Machata stop_traffic 6721add9212SPetr Machata sleep 1 6731add9212SPetr Machata} 6741add9212SPetr Machata 6751add9212SPetr Machataqevent_rule_install_mirror() 6761add9212SPetr Machata{ 6771add9212SPetr Machata tc filter add block 10 pref 1234 handle 102 matchall skip_sw \ 6781add9212SPetr Machata action mirred egress mirror dev $swp2 hw_stats disabled 6791add9212SPetr Machata} 6801add9212SPetr Machata 6811add9212SPetr Machataqevent_rule_uninstall_mirror() 6821add9212SPetr Machata{ 6831add9212SPetr Machata tc filter del block 10 pref 1234 handle 102 matchall 6841add9212SPetr Machata} 6851add9212SPetr Machata 6861add9212SPetr Machataqevent_counter_fetch_mirror() 6871add9212SPetr Machata{ 6881add9212SPetr Machata tc_rule_handle_stats_get "dev $h2 ingress" 101 6891add9212SPetr Machata} 6901add9212SPetr Machata 6911add9212SPetr Machatado_drop_mirror_test() 6921add9212SPetr Machata{ 6931add9212SPetr Machata local vlan=$1; shift 6941add9212SPetr Machata local limit=$1; shift 6951add9212SPetr Machata local qevent_name=$1; shift 6961add9212SPetr Machata 6971add9212SPetr Machata tc filter add dev $h2 ingress pref 1 handle 101 prot ip \ 6981add9212SPetr Machata flower skip_sw ip_proto udp \ 6991add9212SPetr Machata action drop 7001add9212SPetr Machata 7011add9212SPetr Machata do_drop_test "$vlan" "$limit" "$qevent_name" mirror \ 7021add9212SPetr Machata qevent_counter_fetch_mirror 7031add9212SPetr Machata 7041add9212SPetr Machata tc filter del dev $h2 ingress pref 1 handle 101 flower 7051add9212SPetr Machata} 7068fb6ac45SPetr Machata 7070cd6fa99SPetr Machatado_mark_mirror_test() 7080cd6fa99SPetr Machata{ 7090cd6fa99SPetr Machata local vlan=$1; shift 7100cd6fa99SPetr Machata local limit=$1; shift 7110cd6fa99SPetr Machata 7120cd6fa99SPetr Machata tc filter add dev $h2 ingress pref 1 handle 101 prot ip \ 7130cd6fa99SPetr Machata flower skip_sw ip_proto tcp \ 7140cd6fa99SPetr Machata action drop 7150cd6fa99SPetr Machata 7160cd6fa99SPetr Machata do_mark_test "$vlan" "$limit" mirror \ 7170cd6fa99SPetr Machata qevent_counter_fetch_mirror \ 7180cd6fa99SPetr Machata $(: should_fail=)0 7190cd6fa99SPetr Machata 7200cd6fa99SPetr Machata tc filter del dev $h2 ingress pref 1 handle 101 flower 7210cd6fa99SPetr Machata} 7220cd6fa99SPetr Machata 7238fb6ac45SPetr Machataqevent_rule_install_trap() 7248fb6ac45SPetr Machata{ 7258fb6ac45SPetr Machata tc filter add block 10 pref 1234 handle 102 matchall skip_sw \ 7268fb6ac45SPetr Machata action trap hw_stats disabled 7278fb6ac45SPetr Machata} 7288fb6ac45SPetr Machata 7298fb6ac45SPetr Machataqevent_rule_uninstall_trap() 7308fb6ac45SPetr Machata{ 7318fb6ac45SPetr Machata tc filter del block 10 pref 1234 handle 102 matchall 7328fb6ac45SPetr Machata} 7338fb6ac45SPetr Machata 7348fb6ac45SPetr Machataqevent_counter_fetch_trap() 7358fb6ac45SPetr Machata{ 7368fb6ac45SPetr Machata local trap_name=$1; shift 7378fb6ac45SPetr Machata 7388fb6ac45SPetr Machata devlink_trap_rx_packets_get "$trap_name" 7398fb6ac45SPetr Machata} 7408fb6ac45SPetr Machata 7418fb6ac45SPetr Machatado_drop_trap_test() 7428fb6ac45SPetr Machata{ 7438fb6ac45SPetr Machata local vlan=$1; shift 7448fb6ac45SPetr Machata local limit=$1; shift 7458fb6ac45SPetr Machata local trap_name=$1; shift 7468fb6ac45SPetr Machata 7478fb6ac45SPetr Machata do_drop_test "$vlan" "$limit" "$trap_name" trap \ 7488fb6ac45SPetr Machata "qevent_counter_fetch_trap $trap_name" 7498fb6ac45SPetr Machata} 7500cd6fa99SPetr Machata 7510cd6fa99SPetr Machataqevent_rule_install_trap_fwd() 7520cd6fa99SPetr Machata{ 7530cd6fa99SPetr Machata tc filter add block 10 pref 1234 handle 102 matchall skip_sw \ 7540cd6fa99SPetr Machata action trap_fwd hw_stats disabled 7550cd6fa99SPetr Machata} 7560cd6fa99SPetr Machata 7570cd6fa99SPetr Machataqevent_rule_uninstall_trap_fwd() 7580cd6fa99SPetr Machata{ 7590cd6fa99SPetr Machata tc filter del block 10 pref 1234 handle 102 matchall 7600cd6fa99SPetr Machata} 761