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