314 lines · bash
1#!/bin/bash2# SPDX-License-Identifier: GPL-2.03 4# This test sends traffic from H1 to H2. Either on ingress of $swp1, or on5# egress of $swp2, the traffic is acted upon by a pedit action. An ingress6# filter installed on $h2 verifies that the packet looks like expected.7#8# +----------------------+ +----------------------+9# | H1 | | H2 |10# | + $h1 | | $h2 + |11# | | 192.0.2.1/28 | | 192.0.2.2/28 | |12# +----|-----------------+ +----------------|-----+13# | |14# +----|----------------------------------------------------------------|-----+15# | SW | | |16# | +-|----------------------------------------------------------------|-+ |17# | | + $swp1 BR $swp2 + | |18# | +--------------------------------------------------------------------+ |19# +---------------------------------------------------------------------------+20 21ALL_TESTS="22 ping_ipv423 ping_ipv624 test_ip_dsfield25 test_ip_dscp26 test_ip_ecn27 test_ip_dscp_ecn28 test_ip6_dsfield29 test_ip6_dscp30 test_ip6_ecn31"32 33NUM_NETIFS=434source lib.sh35source tc_common.sh36 37: ${HIT_TIMEOUT:=2000} # ms38 39h1_create()40{41 simple_if_init $h1 192.0.2.1/28 2001:db8:1::1/6442}43 44h1_destroy()45{46 simple_if_fini $h1 192.0.2.1/28 2001:db8:1::1/6447}48 49h2_create()50{51 simple_if_init $h2 192.0.2.2/28 2001:db8:1::2/6452 tc qdisc add dev $h2 clsact53}54 55h2_destroy()56{57 tc qdisc del dev $h2 clsact58 simple_if_fini $h2 192.0.2.2/28 2001:db8:1::2/6459}60 61switch_create()62{63 ip link add name br1 type bridge vlan_filtering 164 ip link set dev br1 addrgenmode none65 ip link set dev br1 up66 ip link set dev $swp1 master br167 ip link set dev $swp1 up68 ip link set dev $swp2 master br169 ip link set dev $swp2 up70 71 tc qdisc add dev $swp1 clsact72 tc qdisc add dev $swp2 clsact73}74 75switch_destroy()76{77 tc qdisc del dev $swp2 clsact78 tc qdisc del dev $swp1 clsact79 80 ip link set dev $swp2 down81 ip link set dev $swp2 nomaster82 ip link set dev $swp1 down83 ip link set dev $swp1 nomaster84 ip link del dev br185}86 87setup_prepare()88{89 h1=${NETIFS[p1]}90 swp1=${NETIFS[p2]}91 92 swp2=${NETIFS[p3]}93 h2=${NETIFS[p4]}94 95 h2mac=$(mac_get $h2)96 97 vrf_prepare98 h1_create99 h2_create100 switch_create101}102 103cleanup()104{105 pre_cleanup106 107 switch_destroy108 h2_destroy109 h1_destroy110 vrf_cleanup111}112 113ping_ipv4()114{115 ping_test $h1 192.0.2.2116}117 118ping_ipv6()119{120 ping6_test $h1 2001:db8:1::2121}122 123do_test_pedit_dsfield_common()124{125 local pedit_locus=$1; shift126 local pedit_action=$1; shift127 local mz_flags=$1; shift128 129 RET=0130 131 # TOS 125: DSCP 31, ECN 1. Used for testing that the relevant part is132 # overwritten when zero is selected.133 $MZ $mz_flags $h1 -c 10 -d 20msec -p 100 \134 -a own -b $h2mac -q -t tcp tos=0x7d,sp=54321,dp=12345135 136 local pkts137 pkts=$(busywait "$TC_HIT_TIMEOUT" until_counter_is ">= 10" \138 tc_rule_handle_stats_get "dev $h2 ingress" 101)139 check_err $? "Expected to get 10 packets on test probe, but got $pkts."140 141 pkts=$(tc_rule_handle_stats_get "$pedit_locus" 101)142 ((pkts >= 10))143 check_err $? "Expected to get 10 packets on pedit rule, but got $pkts."144 145 log_test "$pedit_locus pedit $pedit_action"146}147 148do_test_pedit_dsfield()149{150 local pedit_locus=$1; shift151 local pedit_action=$1; shift152 local match_prot=$1; shift153 local match_flower=$1; shift154 local mz_flags=$1; shift155 local saddr=$1; shift156 local daddr=$1; shift157 158 tc filter add $pedit_locus handle 101 pref 1 \159 flower action pedit ex munge $pedit_action160 tc filter add dev $h2 ingress handle 101 pref 1 prot $match_prot \161 flower skip_hw $match_flower action pass162 163 do_test_pedit_dsfield_common "$pedit_locus" "$pedit_action" "$mz_flags"164 165 tc filter del dev $h2 ingress pref 1166 tc filter del $pedit_locus pref 1167}168 169do_test_ip_dsfield()170{171 local locus=$1; shift172 local dsfield173 174 for dsfield in 0 1 2 3 128 252 253 254 255; do175 do_test_pedit_dsfield "$locus" \176 "ip dsfield set $dsfield" \177 ip "ip_tos $dsfield" \178 "-A 192.0.2.1 -B 192.0.2.2"179 done180}181 182test_ip_dsfield()183{184 do_test_ip_dsfield "dev $swp1 ingress"185 do_test_ip_dsfield "dev $swp2 egress"186}187 188do_test_ip_dscp()189{190 local locus=$1; shift191 local dscp192 193 for dscp in 0 1 2 3 32 61 62 63; do194 do_test_pedit_dsfield "$locus" \195 "ip dsfield set $((dscp << 2)) retain 0xfc" \196 ip "ip_tos $(((dscp << 2) | 1))" \197 "-A 192.0.2.1 -B 192.0.2.2"198 done199}200 201test_ip_dscp()202{203 do_test_ip_dscp "dev $swp1 ingress"204 do_test_ip_dscp "dev $swp2 egress"205}206 207do_test_ip_ecn()208{209 local locus=$1; shift210 local ecn211 212 for ecn in 0 1 2 3; do213 do_test_pedit_dsfield "$locus" \214 "ip dsfield set $ecn retain 0x03" \215 ip "ip_tos $((124 | $ecn))" \216 "-A 192.0.2.1 -B 192.0.2.2"217 done218}219 220test_ip_ecn()221{222 do_test_ip_ecn "dev $swp1 ingress"223 do_test_ip_ecn "dev $swp2 egress"224}225 226do_test_ip_dscp_ecn()227{228 local locus=$1; shift229 230 tc filter add $locus handle 101 pref 1 \231 flower action pedit ex munge ip dsfield set 124 retain 0xfc \232 action pedit ex munge ip dsfield set 1 retain 0x03233 tc filter add dev $h2 ingress handle 101 pref 1 prot ip \234 flower skip_hw ip_tos 125 action pass235 236 do_test_pedit_dsfield_common "$locus" "set DSCP + set ECN" \237 "-A 192.0.2.1 -B 192.0.2.2"238 239 tc filter del dev $h2 ingress pref 1240 tc filter del $locus pref 1241}242 243test_ip_dscp_ecn()244{245 do_test_ip_dscp_ecn "dev $swp1 ingress"246 do_test_ip_dscp_ecn "dev $swp2 egress"247}248 249do_test_ip6_dsfield()250{251 local locus=$1; shift252 local dsfield253 254 for dsfield in 0 1 2 3 128 252 253 254 255; do255 do_test_pedit_dsfield "$locus" \256 "ip6 traffic_class set $dsfield" \257 ipv6 "ip_tos $dsfield" \258 "-6 -A 2001:db8:1::1 -B 2001:db8:1::2"259 done260}261 262test_ip6_dsfield()263{264 do_test_ip6_dsfield "dev $swp1 ingress"265 do_test_ip6_dsfield "dev $swp2 egress"266}267 268do_test_ip6_dscp()269{270 local locus=$1; shift271 local dscp272 273 for dscp in 0 1 2 3 32 61 62 63; do274 do_test_pedit_dsfield "$locus" \275 "ip6 traffic_class set $((dscp << 2)) retain 0xfc" \276 ipv6 "ip_tos $(((dscp << 2) | 1))" \277 "-6 -A 2001:db8:1::1 -B 2001:db8:1::2"278 done279}280 281test_ip6_dscp()282{283 do_test_ip6_dscp "dev $swp1 ingress"284 do_test_ip6_dscp "dev $swp2 egress"285}286 287do_test_ip6_ecn()288{289 local locus=$1; shift290 local ecn291 292 for ecn in 0 1 2 3; do293 do_test_pedit_dsfield "$locus" \294 "ip6 traffic_class set $ecn retain 0x3" \295 ipv6 "ip_tos $((124 | $ecn))" \296 "-6 -A 2001:db8:1::1 -B 2001:db8:1::2"297 done298}299 300test_ip6_ecn()301{302 do_test_ip6_ecn "dev $swp1 ingress"303 do_test_ip6_ecn "dev $swp2 egress"304}305 306trap cleanup EXIT307 308setup_prepare309setup_wait310 311tests_run312 313exit $EXIT_STATUS314