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) 2113de611b5SPetr Machata devlink_port_pool_th_set $swp3 8 $size 2123de611b5SPetr Machata} 2133de611b5SPetr Machata 2143de611b5SPetr Machataswitch_destroy() 2153de611b5SPetr Machata{ 2163de611b5SPetr Machata local intf 2173de611b5SPetr Machata local vlan 2183de611b5SPetr Machata 2193de611b5SPetr Machata devlink_port_pool_th_restore $swp3 8 2203de611b5SPetr Machata 2213de611b5SPetr Machata tc qdisc del dev $swp3 root 2>/dev/null 2223de611b5SPetr Machata 2233de611b5SPetr Machata ip link set dev br2_11 down 2243de611b5SPetr Machata ip link set dev br2_10 down 2253de611b5SPetr Machata ip link set dev br1_11 down 2263de611b5SPetr Machata ip link set dev br1_10 down 2273de611b5SPetr Machata 2283de611b5SPetr Machata for intf in $swp5 $swp4 $swp3 $swp2; do 2293de611b5SPetr Machata ethtool -s $intf autoneg on 2303de611b5SPetr Machata done 2313de611b5SPetr Machata 2323de611b5SPetr Machata for intf in $swp5 $swp3 $swp2 $swp4 $swp1; do 2333de611b5SPetr Machata for vlan in 11 10; do 2343de611b5SPetr Machata ip link set dev $intf.$vlan down 2353de611b5SPetr Machata ip link set dev $intf.$vlan nomaster 2363de611b5SPetr Machata vlan_destroy $intf $vlan 2373de611b5SPetr Machata done 2383de611b5SPetr Machata 2393de611b5SPetr Machata mtu_restore $intf 2403de611b5SPetr Machata ip link set dev $intf down 2413de611b5SPetr Machata done 2423de611b5SPetr Machata 2433de611b5SPetr Machata ip link del dev br2_11 2443de611b5SPetr Machata ip link del dev br2_10 2453de611b5SPetr Machata ip link del dev br1_11 2463de611b5SPetr Machata ip link del dev br1_10 2473de611b5SPetr Machata} 2483de611b5SPetr Machata 2493de611b5SPetr Machatasetup_prepare() 2503de611b5SPetr Machata{ 2513de611b5SPetr Machata h1=${NETIFS[p1]} 2523de611b5SPetr Machata swp1=${NETIFS[p2]} 2533de611b5SPetr Machata 2543de611b5SPetr Machata swp2=${NETIFS[p3]} 2553de611b5SPetr Machata h2=${NETIFS[p4]} 2563de611b5SPetr Machata 2573de611b5SPetr Machata swp3=${NETIFS[p5]} 2583de611b5SPetr Machata h3=${NETIFS[p6]} 2593de611b5SPetr Machata 2603de611b5SPetr Machata swp4=${NETIFS[p7]} 2613de611b5SPetr Machata swp5=${NETIFS[p8]} 2623de611b5SPetr Machata 2633de611b5SPetr Machata h3_mac=$(mac_get $h3) 2643de611b5SPetr Machata 2653de611b5SPetr Machata vrf_prepare 2663de611b5SPetr Machata 2673de611b5SPetr Machata h1_create 2683de611b5SPetr Machata h2_create 2693de611b5SPetr Machata h3_create 2703de611b5SPetr Machata switch_create 2713de611b5SPetr Machata} 2723de611b5SPetr Machata 2733de611b5SPetr Machatacleanup() 2743de611b5SPetr Machata{ 2753de611b5SPetr Machata pre_cleanup 2763de611b5SPetr Machata 2773de611b5SPetr Machata switch_destroy 2783de611b5SPetr Machata h3_destroy 2793de611b5SPetr Machata h2_destroy 2803de611b5SPetr Machata h1_destroy 2813de611b5SPetr Machata 2823de611b5SPetr Machata vrf_cleanup 2833de611b5SPetr Machata} 2843de611b5SPetr Machata 2853de611b5SPetr Machataping_ipv4() 2863de611b5SPetr Machata{ 2873de611b5SPetr Machata ping_test $h1.10 $(ipaddr 3 10) " from host 1, vlan 10" 2883de611b5SPetr Machata ping_test $h1.11 $(ipaddr 3 11) " from host 1, vlan 11" 2893de611b5SPetr Machata ping_test $h2.10 $(ipaddr 3 10) " from host 2, vlan 10" 2903de611b5SPetr Machata ping_test $h2.11 $(ipaddr 3 11) " from host 2, vlan 11" 2913de611b5SPetr Machata} 2923de611b5SPetr Machata 2933de611b5SPetr Machataget_tc() 2943de611b5SPetr Machata{ 2953de611b5SPetr Machata local vlan=$1; shift 2963de611b5SPetr Machata 2973de611b5SPetr Machata echo $((vlan - 10)) 2983de611b5SPetr Machata} 2993de611b5SPetr Machata 3003de611b5SPetr Machataget_qdisc_handle() 3013de611b5SPetr Machata{ 3023de611b5SPetr Machata local vlan=$1; shift 3033de611b5SPetr Machata 3043de611b5SPetr Machata local tc=$(get_tc $vlan) 3053de611b5SPetr Machata local band=$((8 - tc)) 3063de611b5SPetr Machata 3073de611b5SPetr Machata # Handle is 107: for TC1, 108: for TC0. 3083de611b5SPetr Machata echo "10$band:" 3093de611b5SPetr Machata} 3103de611b5SPetr Machata 3113de611b5SPetr Machataget_qdisc_backlog() 3123de611b5SPetr Machata{ 3133de611b5SPetr Machata local vlan=$1; shift 3143de611b5SPetr Machata 3153de611b5SPetr Machata qdisc_stats_get $swp3 $(get_qdisc_handle $vlan) .backlog 3163de611b5SPetr Machata} 3173de611b5SPetr Machata 3183de611b5SPetr Machataget_mc_transmit_queue() 3193de611b5SPetr Machata{ 3203de611b5SPetr Machata local vlan=$1; shift 3213de611b5SPetr Machata 3223de611b5SPetr Machata local tc=$(($(get_tc $vlan) + 8)) 3233de611b5SPetr Machata ethtool_stats_get $swp3 tc_transmit_queue_tc_$tc 3243de611b5SPetr Machata} 3253de611b5SPetr Machata 3263de611b5SPetr Machataget_nmarked() 3273de611b5SPetr Machata{ 3283de611b5SPetr Machata local vlan=$1; shift 3293de611b5SPetr Machata 3303de611b5SPetr Machata ethtool_stats_get $swp3 ecn_marked 3313de611b5SPetr Machata} 3323de611b5SPetr Machata 3333de611b5SPetr Machataget_qdisc_npackets() 3343de611b5SPetr Machata{ 3353de611b5SPetr Machata local vlan=$1; shift 3363de611b5SPetr Machata 3373de611b5SPetr Machata busywait_for_counter 1100 +1 \ 3383de611b5SPetr Machata qdisc_stats_get $swp3 $(get_qdisc_handle $vlan) .packets 3393de611b5SPetr Machata} 3403de611b5SPetr Machata 3411add9212SPetr Machatasend_packets() 3421add9212SPetr Machata{ 3431add9212SPetr Machata local vlan=$1; shift 3441add9212SPetr Machata local proto=$1; shift 3451add9212SPetr Machata local pkts=$1; shift 3461add9212SPetr Machata 3471add9212SPetr Machata $MZ $h2.$vlan -p 8000 -a own -b $h3_mac \ 3481add9212SPetr Machata -A $(ipaddr 2 $vlan) -B $(ipaddr 3 $vlan) \ 3491add9212SPetr Machata -t $proto -q -c $pkts "$@" 3501add9212SPetr Machata} 3511add9212SPetr Machata 3523de611b5SPetr Machata# This sends traffic in an attempt to build a backlog of $size. Returns 0 on 3533de611b5SPetr Machata# success. After 10 failed attempts it bails out and returns 1. It dumps the 3543de611b5SPetr Machata# backlog size to stdout. 3553de611b5SPetr Machatabuild_backlog() 3563de611b5SPetr Machata{ 3573de611b5SPetr Machata local vlan=$1; shift 3583de611b5SPetr Machata local size=$1; shift 3593de611b5SPetr Machata local proto=$1; shift 3603de611b5SPetr Machata 3613de611b5SPetr Machata local tc=$((vlan - 10)) 3623de611b5SPetr Machata local band=$((8 - tc)) 3633de611b5SPetr Machata local cur=-1 3643de611b5SPetr Machata local i=0 3653de611b5SPetr Machata 3663de611b5SPetr Machata while :; do 367844f0556SPetr Machata local cur=$(busywait 1100 until_counter_is "> $cur" \ 3683de611b5SPetr Machata get_qdisc_backlog $vlan) 3693de611b5SPetr Machata local diff=$((size - cur)) 3703de611b5SPetr Machata local pkts=$(((diff + 7999) / 8000)) 3713de611b5SPetr Machata 3723de611b5SPetr Machata if ((cur >= size)); then 3733de611b5SPetr Machata echo $cur 3743de611b5SPetr Machata return 0 3753de611b5SPetr Machata elif ((i++ > 10)); then 3763de611b5SPetr Machata echo $cur 3773de611b5SPetr Machata return 1 3783de611b5SPetr Machata fi 3793de611b5SPetr Machata 3801add9212SPetr Machata send_packets $vlan $proto $pkts "$@" 3813de611b5SPetr Machata done 3823de611b5SPetr Machata} 3833de611b5SPetr Machata 3843de611b5SPetr Machatacheck_marking() 3853de611b5SPetr Machata{ 3863de611b5SPetr Machata local vlan=$1; shift 3873de611b5SPetr Machata local cond=$1; shift 3883de611b5SPetr Machata 3893de611b5SPetr Machata local npackets_0=$(get_qdisc_npackets $vlan) 3903de611b5SPetr Machata local nmarked_0=$(get_nmarked $vlan) 3913de611b5SPetr Machata sleep 5 3923de611b5SPetr Machata local npackets_1=$(get_qdisc_npackets $vlan) 3933de611b5SPetr Machata local nmarked_1=$(get_nmarked $vlan) 3943de611b5SPetr Machata 3953de611b5SPetr Machata local nmarked_d=$((nmarked_1 - nmarked_0)) 3963de611b5SPetr Machata local npackets_d=$((npackets_1 - npackets_0)) 3973de611b5SPetr Machata local pct=$((100 * nmarked_d / npackets_d)) 3983de611b5SPetr Machata 3993de611b5SPetr Machata echo $pct 4003de611b5SPetr Machata ((pct $cond)) 4013de611b5SPetr Machata} 4023de611b5SPetr Machata 40363f3c1d0SPetr Machataecn_test_common() 4043de611b5SPetr Machata{ 40563f3c1d0SPetr Machata local name=$1; shift 4063de611b5SPetr Machata local vlan=$1; shift 4073de611b5SPetr Machata local limit=$1; shift 4083de611b5SPetr Machata local backlog 4093de611b5SPetr Machata local pct 4103de611b5SPetr Machata 4113de611b5SPetr Machata # Build the below-the-limit backlog using UDP. We could use TCP just 4123de611b5SPetr Machata # fine, but this way we get a proof that UDP is accepted when queue 4133de611b5SPetr Machata # length is below the limit. The main stream is using TCP, and if the 4143de611b5SPetr Machata # limit is misconfigured, we would see this traffic being ECN marked. 4153de611b5SPetr Machata RET=0 4163de611b5SPetr Machata backlog=$(build_backlog $vlan $((2 * limit / 3)) udp) 4173de611b5SPetr Machata check_err $? "Could not build the requested backlog" 4183de611b5SPetr Machata pct=$(check_marking $vlan "== 0") 4193de611b5SPetr Machata check_err $? "backlog $backlog / $limit Got $pct% marked packets, expected == 0." 42063f3c1d0SPetr Machata log_test "TC $((vlan - 10)): $name backlog < limit" 4213de611b5SPetr Machata 4223de611b5SPetr Machata # Now push TCP, because non-TCP traffic would be early-dropped after the 4233de611b5SPetr Machata # backlog crosses the limit, and we want to make sure that the backlog 4243de611b5SPetr Machata # is above the limit. 4253de611b5SPetr Machata RET=0 4263de611b5SPetr Machata backlog=$(build_backlog $vlan $((3 * limit / 2)) tcp tos=0x01) 4273de611b5SPetr Machata check_err $? "Could not build the requested backlog" 4283de611b5SPetr Machata pct=$(check_marking $vlan ">= 95") 4293de611b5SPetr Machata check_err $? "backlog $backlog / $limit Got $pct% marked packets, expected >= 95." 43063f3c1d0SPetr Machata log_test "TC $((vlan - 10)): $name backlog > limit" 43163f3c1d0SPetr Machata} 43263f3c1d0SPetr Machata 43363f3c1d0SPetr Machatado_ecn_test() 43463f3c1d0SPetr Machata{ 43563f3c1d0SPetr Machata local vlan=$1; shift 43663f3c1d0SPetr Machata local limit=$1; shift 43763f3c1d0SPetr Machata local name=ECN 43863f3c1d0SPetr Machata 43963f3c1d0SPetr Machata start_tcp_traffic $h1.$vlan $(ipaddr 1 $vlan) $(ipaddr 3 $vlan) \ 44063f3c1d0SPetr Machata $h3_mac tos=0x01 44163f3c1d0SPetr Machata sleep 1 44263f3c1d0SPetr Machata 44363f3c1d0SPetr Machata ecn_test_common "$name" $vlan $limit 4443de611b5SPetr Machata 4453de611b5SPetr Machata # Up there we saw that UDP gets accepted when backlog is below the 4463de611b5SPetr Machata # limit. Now that it is above, it should all get dropped, and backlog 4473de611b5SPetr Machata # building should fail. 4483de611b5SPetr Machata RET=0 4493de611b5SPetr Machata build_backlog $vlan $((2 * limit)) udp >/dev/null 4503de611b5SPetr Machata check_fail $? "UDP traffic went into backlog instead of being early-dropped" 45163f3c1d0SPetr Machata log_test "TC $((vlan - 10)): $name backlog > limit: UDP early-dropped" 45263f3c1d0SPetr Machata 45363f3c1d0SPetr Machata stop_traffic 45463f3c1d0SPetr Machata sleep 1 45563f3c1d0SPetr Machata} 45663f3c1d0SPetr Machata 45763f3c1d0SPetr Machatado_ecn_nodrop_test() 45863f3c1d0SPetr Machata{ 45963f3c1d0SPetr Machata local vlan=$1; shift 46063f3c1d0SPetr Machata local limit=$1; shift 46163f3c1d0SPetr Machata local name="ECN nodrop" 46263f3c1d0SPetr Machata 46363f3c1d0SPetr Machata start_tcp_traffic $h1.$vlan $(ipaddr 1 $vlan) $(ipaddr 3 $vlan) \ 46463f3c1d0SPetr Machata $h3_mac tos=0x01 46563f3c1d0SPetr Machata sleep 1 46663f3c1d0SPetr Machata 46763f3c1d0SPetr Machata ecn_test_common "$name" $vlan $limit 46863f3c1d0SPetr Machata 46963f3c1d0SPetr Machata # Up there we saw that UDP gets accepted when backlog is below the 47063f3c1d0SPetr Machata # limit. Now that it is above, in nodrop mode, make sure it goes to 47163f3c1d0SPetr Machata # backlog as well. 47263f3c1d0SPetr Machata RET=0 47363f3c1d0SPetr Machata build_backlog $vlan $((2 * limit)) udp >/dev/null 47463f3c1d0SPetr Machata check_err $? "UDP traffic was early-dropped instead of getting into backlog" 47563f3c1d0SPetr Machata log_test "TC $((vlan - 10)): $name backlog > limit: UDP not dropped" 4763de611b5SPetr Machata 4773de611b5SPetr Machata stop_traffic 4783de611b5SPetr Machata sleep 1 4793de611b5SPetr Machata} 4803de611b5SPetr Machata 4813de611b5SPetr Machatado_red_test() 4823de611b5SPetr Machata{ 4833de611b5SPetr Machata local vlan=$1; shift 4843de611b5SPetr Machata local limit=$1; shift 4853de611b5SPetr Machata local backlog 4863de611b5SPetr Machata local pct 4873de611b5SPetr Machata 4883de611b5SPetr Machata # Use ECN-capable TCP to verify there's no marking even though the queue 4893de611b5SPetr Machata # is above limit. 4903de611b5SPetr Machata start_tcp_traffic $h1.$vlan $(ipaddr 1 $vlan) $(ipaddr 3 $vlan) \ 4913de611b5SPetr Machata $h3_mac tos=0x01 4923de611b5SPetr Machata 4933de611b5SPetr Machata # Pushing below the queue limit should work. 4943de611b5SPetr Machata RET=0 4953de611b5SPetr Machata backlog=$(build_backlog $vlan $((2 * limit / 3)) tcp tos=0x01) 4963de611b5SPetr Machata check_err $? "Could not build the requested backlog" 4973de611b5SPetr Machata pct=$(check_marking $vlan "== 0") 4983de611b5SPetr Machata check_err $? "backlog $backlog / $limit Got $pct% marked packets, expected == 0." 4993de611b5SPetr Machata log_test "TC $((vlan - 10)): RED backlog < limit" 5003de611b5SPetr Machata 5013de611b5SPetr Machata # Pushing above should not. 5023de611b5SPetr Machata RET=0 5033de611b5SPetr Machata backlog=$(build_backlog $vlan $((3 * limit / 2)) tcp tos=0x01) 5043de611b5SPetr Machata check_fail $? "Traffic went into backlog instead of being early-dropped" 5053de611b5SPetr Machata pct=$(check_marking $vlan "== 0") 5063de611b5SPetr Machata check_err $? "backlog $backlog / $limit Got $pct% marked packets, expected == 0." 5073de611b5SPetr Machata local diff=$((limit - backlog)) 5083de611b5SPetr Machata pct=$((100 * diff / limit)) 5093de611b5SPetr Machata ((0 <= pct && pct <= 5)) 5103de611b5SPetr Machata check_err $? "backlog $backlog / $limit expected <= 5% distance" 5113de611b5SPetr Machata log_test "TC $((vlan - 10)): RED backlog > limit" 5123de611b5SPetr Machata 5133de611b5SPetr Machata stop_traffic 5143de611b5SPetr Machata sleep 1 5153de611b5SPetr Machata} 5163de611b5SPetr Machata 5173de611b5SPetr Machatado_mc_backlog_test() 5183de611b5SPetr Machata{ 5193de611b5SPetr Machata local vlan=$1; shift 5203de611b5SPetr Machata local limit=$1; shift 5213de611b5SPetr Machata local backlog 5223de611b5SPetr Machata local pct 5233de611b5SPetr Machata 5243de611b5SPetr Machata RET=0 5253de611b5SPetr Machata 5263de611b5SPetr Machata start_tcp_traffic $h1.$vlan $(ipaddr 1 $vlan) $(ipaddr 3 $vlan) bc 5273de611b5SPetr Machata start_tcp_traffic $h2.$vlan $(ipaddr 2 $vlan) $(ipaddr 3 $vlan) bc 5283de611b5SPetr Machata 529844f0556SPetr Machata qbl=$(busywait 5000 until_counter_is ">= 500000" \ 5303de611b5SPetr Machata get_qdisc_backlog $vlan) 5313de611b5SPetr Machata check_err $? "Could not build MC backlog" 5323de611b5SPetr Machata 5333de611b5SPetr Machata # Verify that we actually see the backlog on BUM TC. Do a busywait as 5343de611b5SPetr Machata # well, performance blips might cause false fail. 5353de611b5SPetr Machata local ebl 536844f0556SPetr Machata ebl=$(busywait 5000 until_counter_is ">= 500000" \ 5373de611b5SPetr Machata get_mc_transmit_queue $vlan) 5383de611b5SPetr Machata check_err $? "MC backlog reported by qdisc not visible in ethtool" 5393de611b5SPetr Machata 5403de611b5SPetr Machata stop_traffic 5413de611b5SPetr Machata stop_traffic 5423de611b5SPetr Machata 5433de611b5SPetr Machata log_test "TC $((vlan - 10)): Qdisc reports MC backlog" 5443de611b5SPetr Machata} 5451add9212SPetr Machata 5461add9212SPetr Machatado_drop_test() 5471add9212SPetr Machata{ 5481add9212SPetr Machata local vlan=$1; shift 5491add9212SPetr Machata local limit=$1; shift 5501add9212SPetr Machata local trigger=$1; shift 5511add9212SPetr Machata local subtest=$1; shift 5521add9212SPetr Machata local fetch_counter=$1; shift 5531add9212SPetr Machata local backlog 5541add9212SPetr Machata local base 5551add9212SPetr Machata local now 5561add9212SPetr Machata local pct 5571add9212SPetr Machata 5581add9212SPetr Machata RET=0 5591add9212SPetr Machata 5601add9212SPetr Machata start_traffic $h1.$vlan $(ipaddr 1 $vlan) $(ipaddr 3 $vlan) $h3_mac 5611add9212SPetr Machata 5621add9212SPetr Machata # Create a bit of a backlog and observe no mirroring due to drops. 5631add9212SPetr Machata qevent_rule_install_$subtest 5641add9212SPetr Machata base=$($fetch_counter) 5651add9212SPetr Machata 5661add9212SPetr Machata build_backlog $vlan $((2 * limit / 3)) udp >/dev/null 5671add9212SPetr Machata 5681add9212SPetr Machata busywait 1100 until_counter_is ">= $((base + 1))" $fetch_counter >/dev/null 5691add9212SPetr Machata check_fail $? "Spurious packets observed without buffer pressure" 5701add9212SPetr Machata 5711add9212SPetr Machata # Push to the queue until it's at the limit. The configured limit is 5721add9212SPetr Machata # rounded by the qdisc and then by the driver, so this is the best we 5738fb6ac45SPetr Machata # can do to get to the real limit of the system. 5741add9212SPetr Machata build_backlog $vlan $((3 * limit / 2)) udp >/dev/null 5751add9212SPetr Machata 5761add9212SPetr Machata base=$($fetch_counter) 5771add9212SPetr Machata send_packets $vlan udp 11 5781add9212SPetr Machata 5791add9212SPetr Machata now=$(busywait 1100 until_counter_is ">= $((base + 10))" $fetch_counter) 5801add9212SPetr Machata check_err $? "Dropped packets not observed: 11 expected, $((now - base)) seen" 5811add9212SPetr Machata 5821add9212SPetr Machata # When no extra traffic is injected, there should be no mirroring. 5831add9212SPetr Machata busywait 1100 until_counter_is ">= $((base + 20))" $fetch_counter >/dev/null 5841add9212SPetr Machata check_fail $? "Spurious packets observed" 5851add9212SPetr Machata 5861add9212SPetr Machata # When the rule is uninstalled, there should be no mirroring. 5871add9212SPetr Machata qevent_rule_uninstall_$subtest 5881add9212SPetr Machata send_packets $vlan udp 11 5891add9212SPetr Machata busywait 1100 until_counter_is ">= $((base + 20))" $fetch_counter >/dev/null 5901add9212SPetr Machata check_fail $? "Spurious packets observed after uninstall" 5911add9212SPetr Machata 5921add9212SPetr Machata log_test "TC $((vlan - 10)): ${trigger}ped packets $subtest'd" 5931add9212SPetr Machata 5941add9212SPetr Machata stop_traffic 5951add9212SPetr Machata sleep 1 5961add9212SPetr Machata} 5971add9212SPetr Machata 5981add9212SPetr Machataqevent_rule_install_mirror() 5991add9212SPetr Machata{ 6001add9212SPetr Machata tc filter add block 10 pref 1234 handle 102 matchall skip_sw \ 6011add9212SPetr Machata action mirred egress mirror dev $swp2 hw_stats disabled 6021add9212SPetr Machata} 6031add9212SPetr Machata 6041add9212SPetr Machataqevent_rule_uninstall_mirror() 6051add9212SPetr Machata{ 6061add9212SPetr Machata tc filter del block 10 pref 1234 handle 102 matchall 6071add9212SPetr Machata} 6081add9212SPetr Machata 6091add9212SPetr Machataqevent_counter_fetch_mirror() 6101add9212SPetr Machata{ 6111add9212SPetr Machata tc_rule_handle_stats_get "dev $h2 ingress" 101 6121add9212SPetr Machata} 6131add9212SPetr Machata 6141add9212SPetr Machatado_drop_mirror_test() 6151add9212SPetr Machata{ 6161add9212SPetr Machata local vlan=$1; shift 6171add9212SPetr Machata local limit=$1; shift 6181add9212SPetr Machata local qevent_name=$1; shift 6191add9212SPetr Machata 6201add9212SPetr Machata tc filter add dev $h2 ingress pref 1 handle 101 prot ip \ 6211add9212SPetr Machata flower skip_sw ip_proto udp \ 6221add9212SPetr Machata action drop 6231add9212SPetr Machata 6241add9212SPetr Machata do_drop_test "$vlan" "$limit" "$qevent_name" mirror \ 6251add9212SPetr Machata qevent_counter_fetch_mirror 6261add9212SPetr Machata 6271add9212SPetr Machata tc filter del dev $h2 ingress pref 1 handle 101 flower 6281add9212SPetr Machata} 6298fb6ac45SPetr Machata 6308fb6ac45SPetr Machataqevent_rule_install_trap() 6318fb6ac45SPetr Machata{ 6328fb6ac45SPetr Machata tc filter add block 10 pref 1234 handle 102 matchall skip_sw \ 6338fb6ac45SPetr Machata action trap hw_stats disabled 6348fb6ac45SPetr Machata} 6358fb6ac45SPetr Machata 6368fb6ac45SPetr Machataqevent_rule_uninstall_trap() 6378fb6ac45SPetr Machata{ 6388fb6ac45SPetr Machata tc filter del block 10 pref 1234 handle 102 matchall 6398fb6ac45SPetr Machata} 6408fb6ac45SPetr Machata 6418fb6ac45SPetr Machataqevent_counter_fetch_trap() 6428fb6ac45SPetr Machata{ 6438fb6ac45SPetr Machata local trap_name=$1; shift 6448fb6ac45SPetr Machata 6458fb6ac45SPetr Machata devlink_trap_rx_packets_get "$trap_name" 6468fb6ac45SPetr Machata} 6478fb6ac45SPetr Machata 6488fb6ac45SPetr Machatado_drop_trap_test() 6498fb6ac45SPetr Machata{ 6508fb6ac45SPetr Machata local vlan=$1; shift 6518fb6ac45SPetr Machata local limit=$1; shift 6528fb6ac45SPetr Machata local trap_name=$1; shift 6538fb6ac45SPetr Machata 6548fb6ac45SPetr Machata do_drop_test "$vlan" "$limit" "$trap_name" trap \ 6558fb6ac45SPetr Machata "qevent_counter_fetch_trap $trap_name" 6568fb6ac45SPetr Machata} 657