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 simple_if_init $dev 63 defer simple_if_fini $dev 64 65 mtu_set $dev 10000 66 defer mtu_restore $dev 67 68 vlan_create $dev 10 v$dev $(ipaddr $host 10)/28 69 defer vlan_destroy $dev 10 70 ip link set dev $dev.10 type vlan egress 0:0 71 72 vlan_create $dev 11 v$dev $(ipaddr $host 11)/28 73 defer vlan_destroy $dev 11 74 ip link set dev $dev.11 type vlan egress 0:1 75} 76 77h1_create() 78{ 79 host_create $h1 1 80} 81 82h2_create() 83{ 84 host_create $h2 2 85 86 tc qdisc add dev $h2 clsact 87 defer tc qdisc del dev $h2 clsact 88 89 tc filter add dev $h2 ingress pref 1010 prot 802.1q \ 90 flower $TCFLAGS vlan_id 10 action pass 91 tc filter add dev $h2 ingress pref 1011 prot 802.1q \ 92 flower $TCFLAGS vlan_id 11 action pass 93} 94 95switch_create() 96{ 97 local intf 98 local vlan 99 100 ip link add dev br10 type bridge 101 defer ip link del dev br10 102 103 ip link add dev br11 type bridge 104 defer ip link del dev br11 105 106 for intf in $swp1 $swp2; do 107 ip link set dev $intf up 108 defer ip link set dev $intf down 109 110 mtu_set $intf 10000 111 defer mtu_restore $intf 112 113 for vlan in 10 11; do 114 vlan_create $intf $vlan 115 defer vlan_destroy $intf $vlan 116 117 ip link set dev $intf.$vlan master br$vlan 118 defer ip link set dev $intf.$vlan nomaster 119 120 ip link set dev $intf.$vlan up 121 defer ip link set dev $intf.$vlan down 122 done 123 done 124 125 for vlan in 10 11; do 126 ip link set dev $swp1.$vlan type vlan ingress 0:0 1:1 127 done 128 129 ip link set dev br10 up 130 defer ip link set dev br10 down 131 132 ip link set dev br11 up 133 defer ip link set dev br11 down 134} 135 136setup_prepare() 137{ 138 h1=${NETIFS[p1]} 139 swp1=${NETIFS[p2]} 140 141 swp2=${NETIFS[p3]} 142 h2=${NETIFS[p4]} 143 144 swp3=${NETIFS[p5]} 145 h3=${NETIFS[p6]} 146 147 swp4=${NETIFS[p7]} 148 swp5=${NETIFS[p8]} 149 150 h2_mac=$(mac_get $h2) 151 152 vrf_prepare 153 defer vrf_cleanup 154 155 h1_create 156 h2_create 157 switch_create 158} 159 160ping_ipv4() 161{ 162 ping_test $h1.10 $(ipaddr 2 10) " vlan 10" 163 ping_test $h1.11 $(ipaddr 2 11) " vlan 11" 164} 165 166tbf_get_counter() 167{ 168 local vlan=$1; shift 169 170 tc_rule_stats_get $h2 10$vlan ingress .bytes 171} 172 173__tbf_test() 174{ 175 local vlan=$1; shift 176 local mbit=$1; shift 177 178 start_traffic $h1.$vlan $(ipaddr 1 $vlan) $(ipaddr 2 $vlan) $h2_mac 179 defer stop_traffic $! 180 sleep 5 # Wait for the burst to dwindle 181 182 local t2=$(busywait_for_counter 1000 +1 tbf_get_counter $vlan) 183 sleep 10 184 local t3=$(tbf_get_counter $vlan) 185 186 RET=0 187 188 # Note: TBF uses 10^6 Mbits, not 2^20 ones. 189 local er=$((mbit * 1000 * 1000)) 190 local nr=$(rate $t2 $t3 10) 191 local nr_pct=$((100 * (nr - er) / er)) 192 ((-5 <= nr_pct && nr_pct <= 5)) 193 xfail_on_slow check_err $? "Expected rate $(humanize $er), got $(humanize $nr), which is $nr_pct% off. Required accuracy is +-5%." 194 195 log_test "TC $((vlan - 10)): TBF rate ${mbit}Mbit" 196} 197 198do_tbf_test() 199{ 200 in_defer_scope \ 201 __tbf_test "$@" 202} 203