1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3 4# This test sends traffic from H1 to H2. Either on ingress of $swp1, or on 5# egress of $swp2, the traffic is acted upon by an action skbedit priority. The 6# new priority should be taken into account when classifying traffic on the PRIO 7# qdisc at $swp2. The test verifies that for different priority values, the 8# traffic ends up in expected PRIO band. 9# 10# +----------------------+ +----------------------+ 11# | H1 | | H2 | 12# | + $h1 | | $h2 + | 13# | | 192.0.2.1/28 | | 192.0.2.2/28 | | 14# +----|-----------------+ +----------------|-----+ 15# | | 16# +----|----------------------------------------------------------------|-----+ 17# | SW | | | 18# | +-|----------------------------------------------------------------|-+ | 19# | | + $swp1 BR $swp2 + | | 20# | | PRIO | | 21# | +--------------------------------------------------------------------+ | 22# +---------------------------------------------------------------------------+ 23 24ALL_TESTS=" 25 ping_ipv4 26 test_ingress 27 test_egress 28" 29 30NUM_NETIFS=4 31source lib.sh 32 33: ${HIT_TIMEOUT:=2000} # ms 34 35h1_create() 36{ 37 simple_if_init $h1 192.0.2.1/28 38} 39 40h1_destroy() 41{ 42 simple_if_fini $h1 192.0.2.1/28 43} 44 45h2_create() 46{ 47 simple_if_init $h2 192.0.2.2/28 48} 49 50h2_destroy() 51{ 52 simple_if_fini $h2 192.0.2.2/28 53} 54 55switch_create() 56{ 57 ip link add name br1 up type bridge vlan_filtering 1 58 ip link set dev $swp1 master br1 59 ip link set dev $swp1 up 60 ip link set dev $swp2 master br1 61 ip link set dev $swp2 up 62 63 tc qdisc add dev $swp1 clsact 64 tc qdisc add dev $swp2 clsact 65 tc qdisc add dev $swp2 root handle 10: \ 66 prio bands 8 priomap 7 6 5 4 3 2 1 0 67} 68 69switch_destroy() 70{ 71 tc qdisc del dev $swp2 root 72 tc qdisc del dev $swp2 clsact 73 tc qdisc del dev $swp1 clsact 74 75 ip link set dev $swp2 down 76 ip link set dev $swp2 nomaster 77 ip link set dev $swp1 down 78 ip link set dev $swp1 nomaster 79 ip link del dev br1 80} 81 82setup_prepare() 83{ 84 h1=${NETIFS[p1]} 85 swp1=${NETIFS[p2]} 86 87 swp2=${NETIFS[p3]} 88 h2=${NETIFS[p4]} 89 90 h2mac=$(mac_get $h2) 91 92 vrf_prepare 93 h1_create 94 h2_create 95 switch_create 96} 97 98cleanup() 99{ 100 pre_cleanup 101 102 switch_destroy 103 h2_destroy 104 h1_destroy 105 vrf_cleanup 106} 107 108ping_ipv4() 109{ 110 ping_test $h1 192.0.2.2 111} 112 113test_skbedit_priority_one() 114{ 115 local locus=$1; shift 116 local prio=$1; shift 117 local classid=$1; shift 118 119 RET=0 120 121 tc filter add $locus handle 101 pref 1 \ 122 flower action skbedit priority $prio 123 124 local pkt0=$(qdisc_parent_stats_get $swp2 $classid .packets) 125 local pkt2=$(tc_rule_handle_stats_get "$locus" 101) 126 $MZ $h1 -t udp "sp=54321,dp=12345" -c 10 -d 20msec -p 100 \ 127 -a own -b $h2mac -A 192.0.2.1 -B 192.0.2.2 -q 128 129 local pkt1 130 pkt1=$(busywait "$HIT_TIMEOUT" until_counter_is ">= $((pkt0 + 10))" \ 131 qdisc_parent_stats_get $swp2 $classid .packets) 132 check_err $? "Expected to get 10 packets on class $classid, but got $((pkt1 - pkt0))." 133 134 local pkt3=$(tc_rule_handle_stats_get "$locus" 101) 135 ((pkt3 >= pkt2 + 10)) 136 check_err $? "Expected to get 10 packets on skbedit rule but got $((pkt3 - pkt2))." 137 138 log_test "$locus skbedit priority $prio -> classid $classid" 139 140 tc filter del $locus pref 1 141} 142 143test_ingress() 144{ 145 local prio 146 147 for prio in {0..7}; do 148 test_skbedit_priority_one "dev $swp1 ingress" \ 149 $prio 10:$((8 - prio)) 150 done 151} 152 153test_egress() 154{ 155 local prio 156 157 for prio in {0..7}; do 158 test_skbedit_priority_one "dev $swp2 egress" \ 159 $prio 10:$((8 - prio)) 160 done 161} 162 163trap cleanup EXIT 164 165setup_prepare 166setup_wait 167 168tests_run 169 170exit $EXIT_STATUS 171