File Index
Files and directories
Sign in
FILE

sch_tbf_core.sh

File preview with syntax highlighting.

linux-6.19.14/tools/testing/selftests/net/forwarding/sch_tbf_core.sh BASH
  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.