FILE
sch_tbf_core.sh
File preview with syntax highlighting.
linux-6.19.14/tools/testing/selftests/net/forwarding/sch_tbf_core.sh
1# SPDX-License-Identifier: GPL-2.0 2 3# This test sends a stream of traffic from H1 through a switch, to H2. On the 4# egress port from the switch ($swp2), a shaper is installed. The test verifies 5# that the rates on the port match the configured shaper. 6# 7# In order to test per-class shaping, $swp2 actually contains TBF under PRIO or 8# ETS, with two different configurations. Traffic is prioritized using 802.1p. 9# 10# +-------------------------------------------+ 11# | H1 | 12# | + $h1.10 $h1.11 + | 13# | | 192.0.2.1/28 192.0.2.17/28 | | 14# | | | | 15# | \______________ _____________/ | 16# | \ / | 17# | + $h1 | 18# +---------------------|---------------------+ 19# | 20# +---------------------|---------------------+ 21# | SW + $swp1 | 22# | _______________/ \_______________ | 23# | / \ | 24# | +-|--------------+ +--------------|-+ | 25# | | + $swp1.10 | | $swp1.11 + | | 26# | | | | | | 27# | | BR10 | | BR11 | | 28# | | | | | | 29# | | + $swp2.10 | | $swp2.11 + | | 30# | +-|--------------+ +--------------|-+ | 31# | \_______________ ______________/ | 32# | \ / | 33# | + $swp2 | 34# +---------------------|---------------------+ 35# | 36# +---------------------|---------------------+ 37# | H2 + $h2 | 38# | ______________/ \______________ | 39# | / \ | 40# | | | | 41# | + $h2.10 $h2.11 + | 42# | 192.0.2.2/28 192.0.2.18/28 | 43# +-------------------------------------------+ 44 45NUM_NETIFS=4 46CHECK_TC="yes" 47source $lib_dir/lib.sh 48 49ipaddr() 50{ 51 local host=$1; shift 52 local vlan=$1; shift 53 54 echo 192.0.2.$((16 * (vlan - 10) + host)) 55} 56 57host_create() 58{ 59 local dev=$1; shift 60 local host=$1; shift 61 62 adf_simple_if_init $dev 63 64 mtu_set $dev 10000 65 defer mtu_restore $dev 66 67 vlan_create $dev 10 v$dev $(ipaddr $host 10)/28 68 defer vlan_destroy $dev 10 69 ip link set dev $dev.10 type vlan egress 0:0 70 71 vlan_create $dev 11 v$dev $(ipaddr $host 11)/28 72 defer vlan_destroy $dev 11 73 ip link set dev $dev.11 type vlan egress 0:1 74} 75 76h1_create() 77{ 78 host_create $h1 1 79} 80 81h2_create() 82{ 83 host_create $h2 2 84 85 tc qdisc add dev $h2 clsact 86 defer tc qdisc del dev $h2 clsact 87 88 tc filter add dev $h2 ingress pref 1010 prot 802.1q \ 89 flower $TCFLAGS vlan_id 10 action pass 90 tc filter add dev $h2 ingress pref 1011 prot 802.1q \ 91 flower $TCFLAGS vlan_id 11 action pass 92} 93 94switch_create() 95{ 96 local intf 97 local vlan 98 99 ip link add dev br10 type bridge 100 defer ip link del dev br10 101 102 ip link add dev br11 type bridge 103 defer ip link del dev br11 104 105 for intf in $swp1 $swp2; do 106 ip link set dev $intf up 107 defer ip link set dev $intf down 108 109 mtu_set $intf 10000 110 defer mtu_restore $intf 111 112 for vlan in 10 11; do 113 vlan_create $intf $vlan 114 defer vlan_destroy $intf $vlan 115 116 ip link set dev $intf.$vlan master br$vlan 117 defer ip link set dev $intf.$vlan nomaster 118 119 ip link set dev $intf.$vlan up 120 defer ip link set dev $intf.$vlan down 121 done 122 done 123 124 for vlan in 10 11; do 125 ip link set dev $swp1.$vlan type vlan ingress 0:0 1:1 126 done 127 128 ip link set dev br10 up 129 defer ip link set dev br10 down 130 131 ip link set dev br11 up 132 defer ip link set dev br11 down 133} 134 135setup_prepare() 136{ 137 h1=${NETIFS[p1]} 138 swp1=${NETIFS[p2]} 139 140 swp2=${NETIFS[p3]} 141 h2=${NETIFS[p4]} 142 143 swp3=${NETIFS[p5]} 144 h3=${NETIFS[p6]} 145 146 swp4=${NETIFS[p7]} 147 swp5=${NETIFS[p8]} 148 149 h2_mac=$(mac_get $h2) 150 151 adf_vrf_prepare 152 153 h1_create 154 h2_create 155 switch_create 156} 157 158ping_ipv4() 159{ 160 ping_test $h1.10 $(ipaddr 2 10) " vlan 10" 161 ping_test $h1.11 $(ipaddr 2 11) " vlan 11" 162} 163 164tbf_get_counter() 165{ 166 local vlan=$1; shift 167 168 tc_rule_stats_get $h2 10$vlan ingress .bytes 169} 170 171__tbf_test() 172{ 173 local vlan=$1; shift 174 local mbit=$1; shift 175 176 start_traffic $h1.$vlan $(ipaddr 1 $vlan) $(ipaddr 2 $vlan) $h2_mac 177 defer stop_traffic $! 178 sleep 5 # Wait for the burst to dwindle 179 180 local t2=$(busywait_for_counter 1000 +1 tbf_get_counter $vlan) 181 sleep 10 182 local t3=$(tbf_get_counter $vlan) 183 184 RET=0 185 186 # Note: TBF uses 10^6 Mbits, not 2^20 ones. 187 local er=$((mbit * 1000 * 1000)) 188 local nr=$(rate $t2 $t3 10) 189 local nr_pct=$((100 * (nr - er) / er)) 190 ((-5 <= nr_pct && nr_pct <= 5)) 191 xfail_on_slow check_err $? "Expected rate $(humanize $er), got $(humanize $nr), which is $nr_pct% off. Required accuracy is +-5%." 192 193 log_test "TC $((vlan - 10)): TBF rate ${mbit}Mbit" 194} 195 196do_tbf_test() 197{ 198 in_defer_scope \ 199 __tbf_test "$@" 200}
~/
Read-only file preview.