1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3# 4# Test devlink-trap policer functionality over mlxsw. 5 6# +---------------------------------+ 7# | H1 (vrf) | 8# | + $h1 | 9# | | 192.0.2.1/24 | 10# | | | 11# | | default via 192.0.2.2 | 12# +----|----------------------------+ 13# | 14# +----|----------------------------------------------------------------------+ 15# | SW | | 16# | + $rp1 | 17# | 192.0.2.2/24 | 18# | | 19# | 198.51.100.2/24 | 20# | + $rp2 | 21# | | | 22# +----|----------------------------------------------------------------------+ 23# | 24# +----|----------------------------+ 25# | | default via 198.51.100.2 | 26# | | | 27# | | 198.51.100.1/24 | 28# | + $h2 | 29# | H2 (vrf) | 30# +---------------------------------+ 31 32lib_dir=$(dirname $0)/../../../net/forwarding 33 34ALL_TESTS=" 35 rate_limits_test 36 burst_limits_test 37 rate_test 38 burst_test 39" 40NUM_NETIFS=4 41source $lib_dir/tc_common.sh 42source $lib_dir/lib.sh 43source $lib_dir/devlink_lib.sh 44 45h1_create() 46{ 47 adf_simple_if_init $h1 192.0.2.1/24 48 49 mtu_set $h1 10000 50 defer mtu_restore $h1 51 52 ip -4 route add default vrf v$h1 nexthop via 192.0.2.2 53 defer ip -4 route del default vrf v$h1 nexthop via 192.0.2.2 54} 55 56h2_create() 57{ 58 adf_simple_if_init $h2 198.51.100.1/24 59 60 mtu_set $h2 10000 61 defer mtu_restore $h2 62 63 ip -4 route add default vrf v$h2 nexthop via 198.51.100.2 64 defer ip -4 route del default vrf v$h2 nexthop via 198.51.100.2 65} 66 67router_create() 68{ 69 ip link set dev $rp1 up 70 defer ip link set dev $rp1 down 71 72 ip link set dev $rp2 up 73 defer ip link set dev $rp2 down 74 75 __addr_add_del $rp1 add 192.0.2.2/24 76 defer __addr_add_del $rp1 del 192.0.2.2/24 77 78 __addr_add_del $rp2 add 198.51.100.2/24 79 defer __addr_add_del $rp2 del 198.51.100.2/24 80 81 mtu_set $rp1 10000 82 defer mtu_restore $rp1 83 84 mtu_set $rp2 10000 85 defer mtu_restore $rp2 86 87 ip -4 route add blackhole 198.51.100.100 88 defer ip -4 route del blackhole 198.51.100.100 89 90 devlink trap set $DEVLINK_DEV trap blackhole_route action trap 91 defer devlink trap set $DEVLINK_DEV trap blackhole_route action drop 92} 93 94setup_prepare() 95{ 96 h1=${NETIFS[p1]} 97 rp1=${NETIFS[p2]} 98 99 rp2=${NETIFS[p3]} 100 h2=${NETIFS[p4]} 101 102 rp1_mac=$(mac_get $rp1) 103 104 # Reload to ensure devlink-trap settings are back to default. 105 defer devlink_reload 106 107 adf_vrf_prepare 108 109 h1_create 110 h2_create 111 112 router_create 113} 114 115rate_limits_test() 116{ 117 RET=0 118 119 devlink trap policer set $DEVLINK_DEV policer 1 rate 0 &> /dev/null 120 check_fail $? "Policer rate was changed to rate lower than limit" 121 devlink trap policer set $DEVLINK_DEV policer 1 \ 122 rate 2000000001 &> /dev/null 123 check_fail $? "Policer rate was changed to rate higher than limit" 124 125 devlink trap policer set $DEVLINK_DEV policer 1 rate 1 126 check_err $? "Failed to set policer rate to minimum" 127 devlink trap policer set $DEVLINK_DEV policer 1 rate 2000000000 128 check_err $? "Failed to set policer rate to maximum" 129 130 log_test "Trap policer rate limits" 131} 132 133burst_limits_test() 134{ 135 RET=0 136 137 devlink trap policer set $DEVLINK_DEV policer 1 burst 0 &> /dev/null 138 check_fail $? "Policer burst size was changed to 0" 139 devlink trap policer set $DEVLINK_DEV policer 1 burst 17 &> /dev/null 140 check_fail $? "Policer burst size was changed to burst size that is not power of 2" 141 devlink trap policer set $DEVLINK_DEV policer 1 burst 8 &> /dev/null 142 check_fail $? "Policer burst size was changed to burst size lower than limit" 143 devlink trap policer set $DEVLINK_DEV policer 1 \ 144 burst $((2**25)) &> /dev/null 145 check_fail $? "Policer burst size was changed to burst size higher than limit" 146 147 devlink trap policer set $DEVLINK_DEV policer 1 burst 16 148 check_err $? "Failed to set policer burst size to minimum" 149 devlink trap policer set $DEVLINK_DEV policer 1 burst $((2**24)) 150 check_err $? "Failed to set policer burst size to maximum" 151 152 log_test "Trap policer burst size limits" 153} 154 155trap_rate_get() 156{ 157 local t0 t1 158 159 t0=$(devlink_trap_rx_packets_get blackhole_route) 160 sleep 10 161 t1=$(devlink_trap_rx_packets_get blackhole_route) 162 163 echo $(((t1 - t0) / 10)) 164} 165 166policer_drop_rate_get() 167{ 168 local id=$1; shift 169 local t0 t1 170 171 t0=$(devlink_trap_policer_rx_dropped_get $id) 172 sleep 10 173 t1=$(devlink_trap_policer_rx_dropped_get $id) 174 175 echo $(((t1 - t0) / 10)) 176} 177 178__rate_test() 179{ 180 local rate pct drop_rate 181 local id=$1; shift 182 183 RET=0 184 185 devlink trap policer set $DEVLINK_DEV policer $id rate 1000 burst 512 186 devlink trap group set $DEVLINK_DEV group l3_drops policer $id 187 188 # Send packets at highest possible rate and make sure they are dropped 189 # by the policer. Make sure measured received rate is about 1000 pps 190 log_info "=== Tx rate: Highest, Policer rate: 1000 pps ===" 191 192 defer_scope_push 193 194 start_traffic $h1 192.0.2.1 198.51.100.100 $rp1_mac 195 defer stop_traffic $! 196 197 sleep 5 # Take measurements when rate is stable 198 199 rate=$(trap_rate_get) 200 pct=$((100 * (rate - 1000) / 1000)) 201 ((-10 <= pct && pct <= 10)) 202 check_err $? "Expected rate 1000 pps, got $rate pps, which is $pct% off. Required accuracy is +-10%" 203 log_info "Expected rate 1000 pps, measured rate $rate pps" 204 205 drop_rate=$(policer_drop_rate_get $id) 206 (( drop_rate > 0 )) 207 check_err $? "Expected non-zero policer drop rate, got 0" 208 log_info "Measured policer drop rate of $drop_rate pps" 209 210 defer_scope_pop 211 212 # Send packets at a rate of 1000 pps and make sure they are not dropped 213 # by the policer 214 log_info "=== Tx rate: 1000 pps, Policer rate: 1000 pps ===" 215 216 defer_scope_push 217 218 start_traffic $h1 192.0.2.1 198.51.100.100 $rp1_mac -d 1msec 219 defer stop_traffic $! 220 221 sleep 5 # Take measurements when rate is stable 222 223 drop_rate=$(policer_drop_rate_get $id) 224 (( drop_rate == 0 )) 225 check_err $? "Expected zero policer drop rate, got a drop rate of $drop_rate pps" 226 log_info "Measured policer drop rate of $drop_rate pps" 227 228 defer_scope_pop 229 230 # Unbind the policer and send packets at highest possible rate. Make 231 # sure they are not dropped by the policer and that the measured 232 # received rate is higher than 1000 pps 233 log_info "=== Tx rate: Highest, Policer rate: No policer ===" 234 235 devlink trap group set $DEVLINK_DEV group l3_drops nopolicer 236 237 defer_scope_push 238 239 start_traffic $h1 192.0.2.1 198.51.100.100 $rp1_mac 240 defer stop_traffic $! 241 242 rate=$(trap_rate_get) 243 (( rate > 1000 )) 244 check_err $? "Expected rate higher than 1000 pps, got $rate pps" 245 log_info "Measured rate $rate pps" 246 247 drop_rate=$(policer_drop_rate_get $id) 248 (( drop_rate == 0 )) 249 check_err $? "Expected zero policer drop rate, got a drop rate of $drop_rate pps" 250 log_info "Measured policer drop rate of $drop_rate pps" 251 252 defer_scope_pop 253 254 log_test "Trap policer rate" 255} 256 257rate_test() 258{ 259 local last_policer=$(devlink -j -p trap policer show | 260 jq '[.[]["'$DEVLINK_DEV'"][].policer] | max') 261 262 log_info "Running rate test for policer 1" 263 __rate_test 1 264 265 log_info "Running rate test for policer $((last_policer / 2))" 266 __rate_test $((last_policer / 2)) 267 268 log_info "Running rate test for policer $last_policer" 269 __rate_test $last_policer 270} 271 272__burst_test() 273{ 274 local t0_rx t0_drop t1_rx t1_drop rx drop 275 local id=$1; shift 276 277 RET=0 278 279 devlink trap policer set $DEVLINK_DEV policer $id rate 1000 burst 512 280 devlink trap group set $DEVLINK_DEV group l3_drops policer $id 281 282 # Send a burst of 16 packets and make sure that 16 are received 283 # and that none are dropped by the policer 284 log_info "=== Tx burst size: 16, Policer burst size: 512 ===" 285 286 t0_rx=$(devlink_trap_rx_packets_get blackhole_route) 287 t0_drop=$(devlink_trap_policer_rx_dropped_get $id) 288 289 start_traffic $h1 192.0.2.1 198.51.100.100 $rp1_mac -c 16 290 291 t1_rx=$(devlink_trap_rx_packets_get blackhole_route) 292 t1_drop=$(devlink_trap_policer_rx_dropped_get $id) 293 294 rx=$((t1_rx - t0_rx)) 295 (( rx == 16 )) 296 check_err $? "Expected burst size of 16 packets, got $rx packets" 297 log_info "Expected burst size of 16 packets, measured burst size of $rx packets" 298 299 drop=$((t1_drop - t0_drop)) 300 (( drop == 0 )) 301 check_err $? "Expected zero policer drops, got $drop" 302 log_info "Measured policer drops of $drop packets" 303 304 # Unbind the policer and send a burst of 64 packets. Make sure that 305 # 64 packets are received and that none are dropped by the policer 306 log_info "=== Tx burst size: 64, Policer burst size: No policer ===" 307 308 devlink trap group set $DEVLINK_DEV group l3_drops nopolicer 309 310 t0_rx=$(devlink_trap_rx_packets_get blackhole_route) 311 t0_drop=$(devlink_trap_policer_rx_dropped_get $id) 312 313 start_traffic $h1 192.0.2.1 198.51.100.100 $rp1_mac -c 64 314 315 t1_rx=$(devlink_trap_rx_packets_get blackhole_route) 316 t1_drop=$(devlink_trap_policer_rx_dropped_get $id) 317 318 rx=$((t1_rx - t0_rx)) 319 (( rx == 64 )) 320 check_err $? "Expected burst size of 64 packets, got $rx packets" 321 log_info "Expected burst size of 64 packets, measured burst size of $rx packets" 322 323 drop=$((t1_drop - t0_drop)) 324 (( drop == 0 )) 325 check_err $? "Expected zero policer drops, got $drop" 326 log_info "Measured policer drops of $drop packets" 327 328 log_test "Trap policer burst size" 329} 330 331burst_test() 332{ 333 local last_policer=$(devlink -j -p trap policer show | 334 jq '[.[]["'$DEVLINK_DEV'"][].policer] | max') 335 336 log_info "Running burst test for policer 1" 337 __burst_test 1 338 339 log_info "Running burst test for policer $((last_policer / 2))" 340 __burst_test $((last_policer / 2)) 341 342 log_info "Running burst test for policer $last_policer" 343 __burst_test $last_policer 344} 345 346trap cleanup EXIT 347 348setup_prepare 349setup_wait 350 351tests_run 352 353exit $EXIT_STATUS 354