xref: /openbmc/linux/tools/testing/selftests/net/forwarding/sch_red.sh (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
1*83e4b196SHangbin Liu#!/bin/bash
26cf0291fSPetr Machata# SPDX-License-Identifier: GPL-2.0
36cf0291fSPetr Machata
46cf0291fSPetr Machata# This test sends one stream of traffic from H1 through a TBF shaper, to a RED
56cf0291fSPetr Machata# within TBF shaper on $swp3. The two shapers have the same configuration, and
66cf0291fSPetr Machata# thus the resulting stream should fill all available bandwidth on the latter
76cf0291fSPetr Machata# shaper. A second stream is sent from H2 also via $swp3, and used to inject
86cf0291fSPetr Machata# additional traffic. Since all available bandwidth is taken, this traffic has
96cf0291fSPetr Machata# to go to backlog.
106cf0291fSPetr Machata#
116cf0291fSPetr Machata# +--------------------------+                     +--------------------------+
126cf0291fSPetr Machata# | H1                       |                     | H2                       |
136cf0291fSPetr Machata# |     + $h1                |                     |     + $h2                |
146cf0291fSPetr Machata# |     | 192.0.2.1/28       |                     |     | 192.0.2.2/28       |
156cf0291fSPetr Machata# |     | TBF 10Mbps         |                     |     |                    |
166cf0291fSPetr Machata# +-----|--------------------+                     +-----|--------------------+
176cf0291fSPetr Machata#       |                                                |
186cf0291fSPetr Machata# +-----|------------------------------------------------|--------------------+
196cf0291fSPetr Machata# | SW  |                                                |                    |
206cf0291fSPetr Machata# |  +--|------------------------------------------------|----------------+   |
216cf0291fSPetr Machata# |  |  + $swp1                                          + $swp2          |   |
226cf0291fSPetr Machata# |  |                               BR                                   |   |
236cf0291fSPetr Machata# |  |                                                                    |   |
246cf0291fSPetr Machata# |  |                                + $swp3                             |   |
256cf0291fSPetr Machata# |  |                                | TBF 10Mbps / RED                  |   |
266cf0291fSPetr Machata# |  +--------------------------------|-----------------------------------+   |
276cf0291fSPetr Machata# |                                   |                                       |
286cf0291fSPetr Machata# +-----------------------------------|---------------------------------------+
296cf0291fSPetr Machata#                                     |
306cf0291fSPetr Machata#                               +-----|--------------------+
316cf0291fSPetr Machata#			        | H3  |                    |
326cf0291fSPetr Machata#			        |     + $h1                |
336cf0291fSPetr Machata#			        |       192.0.2.3/28       |
346cf0291fSPetr Machata#			        |                          |
356cf0291fSPetr Machata#			        +--------------------------+
366cf0291fSPetr Machata
376cf0291fSPetr MachataALL_TESTS="
386cf0291fSPetr Machata	ping_ipv4
396cf0291fSPetr Machata	ecn_test
406cf0291fSPetr Machata	ecn_nodrop_test
416cf0291fSPetr Machata	red_test
426cf0291fSPetr Machata	red_qevent_test
436cf0291fSPetr Machata	ecn_qevent_test
446cf0291fSPetr Machata"
456cf0291fSPetr Machata
466cf0291fSPetr MachataNUM_NETIFS=6
476cf0291fSPetr MachataCHECK_TC="yes"
486cf0291fSPetr Machatasource lib.sh
496cf0291fSPetr Machata
506cf0291fSPetr MachataBACKLOG=30000
516cf0291fSPetr MachataPKTSZ=1400
526cf0291fSPetr Machata
536cf0291fSPetr Machatah1_create()
546cf0291fSPetr Machata{
556cf0291fSPetr Machata	simple_if_init $h1 192.0.2.1/28
566cf0291fSPetr Machata	mtu_set $h1 10000
576cf0291fSPetr Machata	tc qdisc replace dev $h1 root handle 1: tbf \
586cf0291fSPetr Machata	   rate 10Mbit burst 10K limit 1M
596cf0291fSPetr Machata}
606cf0291fSPetr Machata
616cf0291fSPetr Machatah1_destroy()
626cf0291fSPetr Machata{
636cf0291fSPetr Machata	tc qdisc del dev $h1 root
646cf0291fSPetr Machata	mtu_restore $h1
656cf0291fSPetr Machata	simple_if_fini $h1 192.0.2.1/28
666cf0291fSPetr Machata}
676cf0291fSPetr Machata
686cf0291fSPetr Machatah2_create()
696cf0291fSPetr Machata{
706cf0291fSPetr Machata	simple_if_init $h2 192.0.2.2/28
716cf0291fSPetr Machata	mtu_set $h2 10000
726cf0291fSPetr Machata}
736cf0291fSPetr Machata
746cf0291fSPetr Machatah2_destroy()
756cf0291fSPetr Machata{
766cf0291fSPetr Machata	mtu_restore $h2
776cf0291fSPetr Machata	simple_if_fini $h2 192.0.2.2/28
786cf0291fSPetr Machata}
796cf0291fSPetr Machata
806cf0291fSPetr Machatah3_create()
816cf0291fSPetr Machata{
826cf0291fSPetr Machata	simple_if_init $h3 192.0.2.3/28
836cf0291fSPetr Machata	mtu_set $h3 10000
846cf0291fSPetr Machata}
856cf0291fSPetr Machata
866cf0291fSPetr Machatah3_destroy()
876cf0291fSPetr Machata{
886cf0291fSPetr Machata	mtu_restore $h3
896cf0291fSPetr Machata	simple_if_fini $h3 192.0.2.3/28
906cf0291fSPetr Machata}
916cf0291fSPetr Machata
926cf0291fSPetr Machataswitch_create()
936cf0291fSPetr Machata{
946cf0291fSPetr Machata	ip link add dev br up type bridge
956cf0291fSPetr Machata	ip link set dev $swp1 up master br
966cf0291fSPetr Machata	ip link set dev $swp2 up master br
976cf0291fSPetr Machata	ip link set dev $swp3 up master br
986cf0291fSPetr Machata
996cf0291fSPetr Machata	mtu_set $swp1 10000
1006cf0291fSPetr Machata	mtu_set $swp2 10000
1016cf0291fSPetr Machata	mtu_set $swp3 10000
1026cf0291fSPetr Machata
1036cf0291fSPetr Machata	tc qdisc replace dev $swp3 root handle 1: tbf \
1046cf0291fSPetr Machata	   rate 10Mbit burst 10K limit 1M
1056cf0291fSPetr Machata	ip link add name _drop_test up type dummy
1066cf0291fSPetr Machata}
1076cf0291fSPetr Machata
1086cf0291fSPetr Machataswitch_destroy()
1096cf0291fSPetr Machata{
1106cf0291fSPetr Machata	ip link del dev _drop_test
1116cf0291fSPetr Machata	tc qdisc del dev $swp3 root
1126cf0291fSPetr Machata
1136cf0291fSPetr Machata	mtu_restore $h3
1146cf0291fSPetr Machata	mtu_restore $h2
1156cf0291fSPetr Machata	mtu_restore $h1
1166cf0291fSPetr Machata
1176cf0291fSPetr Machata	ip link set dev $swp3 down nomaster
1186cf0291fSPetr Machata	ip link set dev $swp2 down nomaster
1196cf0291fSPetr Machata	ip link set dev $swp1 down nomaster
1206cf0291fSPetr Machata	ip link del dev br
1216cf0291fSPetr Machata}
1226cf0291fSPetr Machata
1236cf0291fSPetr Machatasetup_prepare()
1246cf0291fSPetr Machata{
1256cf0291fSPetr Machata	h1=${NETIFS[p1]}
1266cf0291fSPetr Machata	swp1=${NETIFS[p2]}
1276cf0291fSPetr Machata
1286cf0291fSPetr Machata	h2=${NETIFS[p3]}
1296cf0291fSPetr Machata	swp2=${NETIFS[p4]}
1306cf0291fSPetr Machata
1316cf0291fSPetr Machata	swp3=${NETIFS[p5]}
1326cf0291fSPetr Machata	h3=${NETIFS[p6]}
1336cf0291fSPetr Machata
1346cf0291fSPetr Machata	h3_mac=$(mac_get $h3)
1356cf0291fSPetr Machata
1366cf0291fSPetr Machata	vrf_prepare
1376cf0291fSPetr Machata
1386cf0291fSPetr Machata	h1_create
1396cf0291fSPetr Machata	h2_create
1406cf0291fSPetr Machata	h3_create
1416cf0291fSPetr Machata	switch_create
1426cf0291fSPetr Machata}
1436cf0291fSPetr Machata
1446cf0291fSPetr Machatacleanup()
1456cf0291fSPetr Machata{
1466cf0291fSPetr Machata	pre_cleanup
1476cf0291fSPetr Machata
1486cf0291fSPetr Machata	switch_destroy
1496cf0291fSPetr Machata	h3_destroy
1506cf0291fSPetr Machata	h2_destroy
1516cf0291fSPetr Machata	h1_destroy
1526cf0291fSPetr Machata
1536cf0291fSPetr Machata	vrf_cleanup
1546cf0291fSPetr Machata}
1556cf0291fSPetr Machata
1566cf0291fSPetr Machataping_ipv4()
1576cf0291fSPetr Machata{
1586cf0291fSPetr Machata	ping_test $h1 192.0.2.3 " from host 1"
1596cf0291fSPetr Machata	ping_test $h2 192.0.2.3 " from host 2"
1606cf0291fSPetr Machata}
1616cf0291fSPetr Machata
1626cf0291fSPetr Machataget_qdisc_backlog()
1636cf0291fSPetr Machata{
1646cf0291fSPetr Machata	qdisc_stats_get $swp3 11: .backlog
1656cf0291fSPetr Machata}
1666cf0291fSPetr Machata
1676cf0291fSPetr Machataget_nmarked()
1686cf0291fSPetr Machata{
1696cf0291fSPetr Machata	qdisc_stats_get $swp3 11: .marked
1706cf0291fSPetr Machata}
1716cf0291fSPetr Machata
1726cf0291fSPetr Machataget_qdisc_npackets()
1736cf0291fSPetr Machata{
1746cf0291fSPetr Machata	qdisc_stats_get $swp3 11: .packets
1756cf0291fSPetr Machata}
1766cf0291fSPetr Machata
1776cf0291fSPetr Machataget_nmirrored()
1786cf0291fSPetr Machata{
1796cf0291fSPetr Machata	link_stats_get _drop_test tx packets
1806cf0291fSPetr Machata}
1816cf0291fSPetr Machata
1826cf0291fSPetr Machatasend_packets()
1836cf0291fSPetr Machata{
1846cf0291fSPetr Machata	local proto=$1; shift
1856cf0291fSPetr Machata	local pkts=$1; shift
1866cf0291fSPetr Machata
1876cf0291fSPetr Machata	$MZ $h2 -p $PKTSZ -a own -b $h3_mac -A 192.0.2.2 -B 192.0.2.3 -t $proto -q -c $pkts "$@"
1886cf0291fSPetr Machata}
1896cf0291fSPetr Machata
1906cf0291fSPetr Machata# This sends traffic in an attempt to build a backlog of $size. Returns 0 on
1916cf0291fSPetr Machata# success. After 10 failed attempts it bails out and returns 1. It dumps the
1926cf0291fSPetr Machata# backlog size to stdout.
1936cf0291fSPetr Machatabuild_backlog()
1946cf0291fSPetr Machata{
1956cf0291fSPetr Machata	local size=$1; shift
1966cf0291fSPetr Machata	local proto=$1; shift
1976cf0291fSPetr Machata
1986cf0291fSPetr Machata	local i=0
1996cf0291fSPetr Machata
2006cf0291fSPetr Machata	while :; do
2016cf0291fSPetr Machata		local cur=$(get_qdisc_backlog)
2026cf0291fSPetr Machata		local diff=$((size - cur))
2036cf0291fSPetr Machata		local pkts=$(((diff + PKTSZ - 1) / PKTSZ))
2046cf0291fSPetr Machata
2056cf0291fSPetr Machata		if ((cur >= size)); then
2066cf0291fSPetr Machata			echo $cur
2076cf0291fSPetr Machata			return 0
2086cf0291fSPetr Machata		elif ((i++ > 10)); then
2096cf0291fSPetr Machata			echo $cur
2106cf0291fSPetr Machata			return 1
2116cf0291fSPetr Machata		fi
2126cf0291fSPetr Machata
2136cf0291fSPetr Machata		send_packets $proto $pkts "$@"
2146cf0291fSPetr Machata		sleep 1
2156cf0291fSPetr Machata	done
2166cf0291fSPetr Machata}
2176cf0291fSPetr Machata
2186cf0291fSPetr Machatacheck_marking()
2196cf0291fSPetr Machata{
2206cf0291fSPetr Machata	local cond=$1; shift
2216cf0291fSPetr Machata
2226cf0291fSPetr Machata	local npackets_0=$(get_qdisc_npackets)
2236cf0291fSPetr Machata	local nmarked_0=$(get_nmarked)
2246cf0291fSPetr Machata	sleep 5
2256cf0291fSPetr Machata	local npackets_1=$(get_qdisc_npackets)
2266cf0291fSPetr Machata	local nmarked_1=$(get_nmarked)
2276cf0291fSPetr Machata
2286cf0291fSPetr Machata	local nmarked_d=$((nmarked_1 - nmarked_0))
2296cf0291fSPetr Machata	local npackets_d=$((npackets_1 - npackets_0))
2306cf0291fSPetr Machata	local pct=$((100 * nmarked_d / npackets_d))
2316cf0291fSPetr Machata
2326cf0291fSPetr Machata	echo $pct
2336cf0291fSPetr Machata	((pct $cond))
2346cf0291fSPetr Machata}
2356cf0291fSPetr Machata
2366cf0291fSPetr Machatacheck_mirroring()
2376cf0291fSPetr Machata{
2386cf0291fSPetr Machata	local cond=$1; shift
2396cf0291fSPetr Machata
2406cf0291fSPetr Machata	local npackets_0=$(get_qdisc_npackets)
2416cf0291fSPetr Machata	local nmirrored_0=$(get_nmirrored)
2426cf0291fSPetr Machata	sleep 5
2436cf0291fSPetr Machata	local npackets_1=$(get_qdisc_npackets)
2446cf0291fSPetr Machata	local nmirrored_1=$(get_nmirrored)
2456cf0291fSPetr Machata
2466cf0291fSPetr Machata	local nmirrored_d=$((nmirrored_1 - nmirrored_0))
2476cf0291fSPetr Machata	local npackets_d=$((npackets_1 - npackets_0))
2486cf0291fSPetr Machata	local pct=$((100 * nmirrored_d / npackets_d))
2496cf0291fSPetr Machata
2506cf0291fSPetr Machata	echo $pct
2516cf0291fSPetr Machata	((pct $cond))
2526cf0291fSPetr Machata}
2536cf0291fSPetr Machata
2546cf0291fSPetr Machataecn_test_common()
2556cf0291fSPetr Machata{
2566cf0291fSPetr Machata	local name=$1; shift
2576cf0291fSPetr Machata	local limit=$1; shift
2586cf0291fSPetr Machata	local backlog
2596cf0291fSPetr Machata	local pct
2606cf0291fSPetr Machata
2616cf0291fSPetr Machata	# Build the below-the-limit backlog using UDP. We could use TCP just
2626cf0291fSPetr Machata	# fine, but this way we get a proof that UDP is accepted when queue
2636cf0291fSPetr Machata	# length is below the limit. The main stream is using TCP, and if the
2646cf0291fSPetr Machata	# limit is misconfigured, we would see this traffic being ECN marked.
2656cf0291fSPetr Machata	RET=0
2666cf0291fSPetr Machata	backlog=$(build_backlog $((2 * limit / 3)) udp)
2676cf0291fSPetr Machata	check_err $? "Could not build the requested backlog"
2686cf0291fSPetr Machata	pct=$(check_marking "== 0")
2696cf0291fSPetr Machata	check_err $? "backlog $backlog / $limit Got $pct% marked packets, expected == 0."
2706cf0291fSPetr Machata	log_test "$name backlog < limit"
2716cf0291fSPetr Machata
2726cf0291fSPetr Machata	# Now push TCP, because non-TCP traffic would be early-dropped after the
2736cf0291fSPetr Machata	# backlog crosses the limit, and we want to make sure that the backlog
2746cf0291fSPetr Machata	# is above the limit.
2756cf0291fSPetr Machata	RET=0
2766cf0291fSPetr Machata	backlog=$(build_backlog $((3 * limit / 2)) tcp tos=0x01)
2776cf0291fSPetr Machata	check_err $? "Could not build the requested backlog"
2786cf0291fSPetr Machata	pct=$(check_marking ">= 95")
2796cf0291fSPetr Machata	check_err $? "backlog $backlog / $limit Got $pct% marked packets, expected >= 95."
2806cf0291fSPetr Machata	log_test "$name backlog > limit"
2816cf0291fSPetr Machata}
2826cf0291fSPetr Machata
2836cf0291fSPetr Machatado_ecn_test()
2846cf0291fSPetr Machata{
2856cf0291fSPetr Machata	local limit=$1; shift
2866cf0291fSPetr Machata	local name=ECN
2876cf0291fSPetr Machata
2886cf0291fSPetr Machata	$MZ $h1 -p $PKTSZ -A 192.0.2.1 -B 192.0.2.3 -c 0 \
2896cf0291fSPetr Machata		-a own -b $h3_mac -t tcp -q tos=0x01 &
2906cf0291fSPetr Machata	sleep 1
2916cf0291fSPetr Machata
2926cf0291fSPetr Machata	ecn_test_common "$name" $limit
2936cf0291fSPetr Machata
2946cf0291fSPetr Machata	# Up there we saw that UDP gets accepted when backlog is below the
2956cf0291fSPetr Machata	# limit. Now that it is above, it should all get dropped, and backlog
2966cf0291fSPetr Machata	# building should fail.
2976cf0291fSPetr Machata	RET=0
2986cf0291fSPetr Machata	build_backlog $((2 * limit)) udp >/dev/null
2996cf0291fSPetr Machata	check_fail $? "UDP traffic went into backlog instead of being early-dropped"
3006cf0291fSPetr Machata	log_test "$name backlog > limit: UDP early-dropped"
3016cf0291fSPetr Machata
3026cf0291fSPetr Machata	stop_traffic
3036cf0291fSPetr Machata	sleep 1
3046cf0291fSPetr Machata}
3056cf0291fSPetr Machata
3066cf0291fSPetr Machatado_ecn_nodrop_test()
3076cf0291fSPetr Machata{
3086cf0291fSPetr Machata	local limit=$1; shift
3096cf0291fSPetr Machata	local name="ECN nodrop"
3106cf0291fSPetr Machata
3116cf0291fSPetr Machata	$MZ $h1 -p $PKTSZ -A 192.0.2.1 -B 192.0.2.3 -c 0 \
3126cf0291fSPetr Machata		-a own -b $h3_mac -t tcp -q tos=0x01 &
3136cf0291fSPetr Machata	sleep 1
3146cf0291fSPetr Machata
3156cf0291fSPetr Machata	ecn_test_common "$name" $limit
3166cf0291fSPetr Machata
3176cf0291fSPetr Machata	# Up there we saw that UDP gets accepted when backlog is below the
3186cf0291fSPetr Machata	# limit. Now that it is above, in nodrop mode, make sure it goes to
3196cf0291fSPetr Machata	# backlog as well.
3206cf0291fSPetr Machata	RET=0
3216cf0291fSPetr Machata	build_backlog $((2 * limit)) udp >/dev/null
3226cf0291fSPetr Machata	check_err $? "UDP traffic was early-dropped instead of getting into backlog"
3236cf0291fSPetr Machata	log_test "$name backlog > limit: UDP not dropped"
3246cf0291fSPetr Machata
3256cf0291fSPetr Machata	stop_traffic
3266cf0291fSPetr Machata	sleep 1
3276cf0291fSPetr Machata}
3286cf0291fSPetr Machata
3296cf0291fSPetr Machatado_red_test()
3306cf0291fSPetr Machata{
3316cf0291fSPetr Machata	local limit=$1; shift
3326cf0291fSPetr Machata	local backlog
3336cf0291fSPetr Machata	local pct
3346cf0291fSPetr Machata
3356cf0291fSPetr Machata	# Use ECN-capable TCP to verify there's no marking even though the queue
3366cf0291fSPetr Machata	# is above limit.
3376cf0291fSPetr Machata	$MZ $h1 -p $PKTSZ -A 192.0.2.1 -B 192.0.2.3 -c 0 \
3386cf0291fSPetr Machata		-a own -b $h3_mac -t tcp -q tos=0x01 &
3396cf0291fSPetr Machata
3406cf0291fSPetr Machata	# Pushing below the queue limit should work.
3416cf0291fSPetr Machata	RET=0
3426cf0291fSPetr Machata	backlog=$(build_backlog $((2 * limit / 3)) tcp tos=0x01)
3436cf0291fSPetr Machata	check_err $? "Could not build the requested backlog"
3446cf0291fSPetr Machata	pct=$(check_marking "== 0")
3456cf0291fSPetr Machata	check_err $? "backlog $backlog / $limit Got $pct% marked packets, expected == 0."
3466cf0291fSPetr Machata	log_test "RED backlog < limit"
3476cf0291fSPetr Machata
3486cf0291fSPetr Machata	# Pushing above should not.
3496cf0291fSPetr Machata	RET=0
3506cf0291fSPetr Machata	backlog=$(build_backlog $((3 * limit / 2)) tcp tos=0x01)
3516cf0291fSPetr Machata	check_fail $? "Traffic went into backlog instead of being early-dropped"
3526cf0291fSPetr Machata	pct=$(check_marking "== 0")
3536cf0291fSPetr Machata	check_err $? "backlog $backlog / $limit Got $pct% marked packets, expected == 0."
3546cf0291fSPetr Machata	log_test "RED backlog > limit"
3556cf0291fSPetr Machata
3566cf0291fSPetr Machata	stop_traffic
3576cf0291fSPetr Machata	sleep 1
3586cf0291fSPetr Machata}
3596cf0291fSPetr Machata
3606cf0291fSPetr Machatado_red_qevent_test()
3616cf0291fSPetr Machata{
3626cf0291fSPetr Machata	local limit=$1; shift
3636cf0291fSPetr Machata	local backlog
3646cf0291fSPetr Machata	local base
3656cf0291fSPetr Machata	local now
3666cf0291fSPetr Machata	local pct
3676cf0291fSPetr Machata
3686cf0291fSPetr Machata	RET=0
3696cf0291fSPetr Machata
3706cf0291fSPetr Machata	$MZ $h1 -p $PKTSZ -A 192.0.2.1 -B 192.0.2.3 -c 0 \
3716cf0291fSPetr Machata		-a own -b $h3_mac -t udp -q &
3726cf0291fSPetr Machata	sleep 1
3736cf0291fSPetr Machata
3746cf0291fSPetr Machata	tc filter add block 10 pref 1234 handle 102 matchall skip_hw \
3756cf0291fSPetr Machata	   action mirred egress mirror dev _drop_test
3766cf0291fSPetr Machata
3776cf0291fSPetr Machata	# Push to the queue until it's at the limit. The configured limit is
3786cf0291fSPetr Machata	# rounded by the qdisc, so this is the best we can do to get to the real
3796cf0291fSPetr Machata	# limit.
3806cf0291fSPetr Machata	build_backlog $((3 * limit / 2)) udp >/dev/null
3816cf0291fSPetr Machata
3826cf0291fSPetr Machata	base=$(get_nmirrored)
3836cf0291fSPetr Machata	send_packets udp 100
3846cf0291fSPetr Machata	sleep 1
3856cf0291fSPetr Machata	now=$(get_nmirrored)
3866cf0291fSPetr Machata	((now >= base + 100))
3876cf0291fSPetr Machata	check_err $? "Dropped packets not observed: 100 expected, $((now - base)) seen"
3886cf0291fSPetr Machata
3896cf0291fSPetr Machata	tc filter del block 10 pref 1234 handle 102 matchall
3906cf0291fSPetr Machata
3916cf0291fSPetr Machata	base=$(get_nmirrored)
3926cf0291fSPetr Machata	send_packets udp 100
3936cf0291fSPetr Machata	sleep 1
3946cf0291fSPetr Machata	now=$(get_nmirrored)
3956cf0291fSPetr Machata	((now == base))
3966cf0291fSPetr Machata	check_err $? "Dropped packets still observed: 0 expected, $((now - base)) seen"
3976cf0291fSPetr Machata
3986cf0291fSPetr Machata	log_test "RED early_dropped packets mirrored"
3996cf0291fSPetr Machata
4006cf0291fSPetr Machata	stop_traffic
4016cf0291fSPetr Machata	sleep 1
4026cf0291fSPetr Machata}
4036cf0291fSPetr Machata
4046cf0291fSPetr Machatado_ecn_qevent_test()
4056cf0291fSPetr Machata{
4066cf0291fSPetr Machata	local limit=$1; shift
4076cf0291fSPetr Machata	local name=ECN
4086cf0291fSPetr Machata
4096cf0291fSPetr Machata	RET=0
4106cf0291fSPetr Machata
4116cf0291fSPetr Machata	$MZ $h1 -p $PKTSZ -A 192.0.2.1 -B 192.0.2.3 -c 0 \
4126cf0291fSPetr Machata		-a own -b $h3_mac -t tcp -q tos=0x01 &
4136cf0291fSPetr Machata	sleep 1
4146cf0291fSPetr Machata
4156cf0291fSPetr Machata	tc filter add block 10 pref 1234 handle 102 matchall skip_hw \
4166cf0291fSPetr Machata	   action mirred egress mirror dev _drop_test
4176cf0291fSPetr Machata
4186cf0291fSPetr Machata	backlog=$(build_backlog $((2 * limit / 3)) tcp tos=0x01)
4196cf0291fSPetr Machata	check_err $? "Could not build the requested backlog"
4206cf0291fSPetr Machata	pct=$(check_mirroring "== 0")
4216cf0291fSPetr Machata	check_err $? "backlog $backlog / $limit Got $pct% mirrored packets, expected == 0."
4226cf0291fSPetr Machata
4236cf0291fSPetr Machata	backlog=$(build_backlog $((3 * limit / 2)) tcp tos=0x01)
4246cf0291fSPetr Machata	check_err $? "Could not build the requested backlog"
4256cf0291fSPetr Machata	pct=$(check_mirroring ">= 95")
4266cf0291fSPetr Machata	check_err $? "backlog $backlog / $limit Got $pct% mirrored packets, expected >= 95."
4276cf0291fSPetr Machata
4286cf0291fSPetr Machata	tc filter del block 10 pref 1234 handle 102 matchall
4296cf0291fSPetr Machata
4306cf0291fSPetr Machata	log_test "ECN marked packets mirrored"
4316cf0291fSPetr Machata
4326cf0291fSPetr Machata	stop_traffic
4336cf0291fSPetr Machata	sleep 1
4346cf0291fSPetr Machata}
4356cf0291fSPetr Machata
4366cf0291fSPetr Machatainstall_qdisc()
4376cf0291fSPetr Machata{
4386cf0291fSPetr Machata	local -a args=("$@")
4396cf0291fSPetr Machata
4406cf0291fSPetr Machata	tc qdisc replace dev $swp3 parent 1:1 handle 11: red \
4416cf0291fSPetr Machata	   limit 1M avpkt $PKTSZ probability 1 \
4426cf0291fSPetr Machata	   min $BACKLOG max $((BACKLOG + 1)) burst 38 "${args[@]}"
4436cf0291fSPetr Machata	sleep 1
4446cf0291fSPetr Machata}
4456cf0291fSPetr Machata
4466cf0291fSPetr Machatauninstall_qdisc()
4476cf0291fSPetr Machata{
4486cf0291fSPetr Machata	tc qdisc del dev $swp3 parent 1:1
4496cf0291fSPetr Machata}
4506cf0291fSPetr Machata
4516cf0291fSPetr Machataecn_test()
4526cf0291fSPetr Machata{
4536cf0291fSPetr Machata	install_qdisc ecn
4546cf0291fSPetr Machata	do_ecn_test $BACKLOG
4556cf0291fSPetr Machata	uninstall_qdisc
4566cf0291fSPetr Machata}
4576cf0291fSPetr Machata
4586cf0291fSPetr Machataecn_nodrop_test()
4596cf0291fSPetr Machata{
4606cf0291fSPetr Machata	install_qdisc ecn nodrop
4616cf0291fSPetr Machata	do_ecn_nodrop_test $BACKLOG
4626cf0291fSPetr Machata	uninstall_qdisc
4636cf0291fSPetr Machata}
4646cf0291fSPetr Machata
4656cf0291fSPetr Machatared_test()
4666cf0291fSPetr Machata{
4676cf0291fSPetr Machata	install_qdisc
4686cf0291fSPetr Machata	do_red_test $BACKLOG
4696cf0291fSPetr Machata	uninstall_qdisc
4706cf0291fSPetr Machata}
4716cf0291fSPetr Machata
4726cf0291fSPetr Machatared_qevent_test()
4736cf0291fSPetr Machata{
4746cf0291fSPetr Machata	install_qdisc qevent early_drop block 10
4756cf0291fSPetr Machata	do_red_qevent_test $BACKLOG
4766cf0291fSPetr Machata	uninstall_qdisc
4776cf0291fSPetr Machata}
4786cf0291fSPetr Machata
4796cf0291fSPetr Machataecn_qevent_test()
4806cf0291fSPetr Machata{
4816cf0291fSPetr Machata	install_qdisc ecn qevent mark block 10
4826cf0291fSPetr Machata	do_ecn_qevent_test $BACKLOG
4836cf0291fSPetr Machata	uninstall_qdisc
4846cf0291fSPetr Machata}
4856cf0291fSPetr Machata
4866cf0291fSPetr Machatatrap cleanup EXIT
4876cf0291fSPetr Machata
4886cf0291fSPetr Machatasetup_prepare
4896cf0291fSPetr Machatasetup_wait
4906cf0291fSPetr Machata
4916cf0291fSPetr Machatatests_run
4926cf0291fSPetr Machata
4936cf0291fSPetr Machataexit $EXIT_STATUS
494