370 lines · bash
1#!/bin/bash2# SPDX-License-Identifier: GPL-2.03#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/forwarding33 34ALL_TESTS="35 rate_limits_test36 burst_limits_test37 rate_test38 burst_test39"40NUM_NETIFS=441source $lib_dir/tc_common.sh42source $lib_dir/lib.sh43source $lib_dir/devlink_lib.sh44 45h1_create()46{47 simple_if_init $h1 192.0.2.1/2448 mtu_set $h1 1000049 50 ip -4 route add default vrf v$h1 nexthop via 192.0.2.251}52 53h1_destroy()54{55 ip -4 route del default vrf v$h1 nexthop via 192.0.2.256 57 mtu_restore $h158 simple_if_fini $h1 192.0.2.1/2459}60 61h2_create()62{63 simple_if_init $h2 198.51.100.1/2464 mtu_set $h2 1000065 66 ip -4 route add default vrf v$h2 nexthop via 198.51.100.267}68 69h2_destroy()70{71 ip -4 route del default vrf v$h2 nexthop via 198.51.100.272 73 mtu_restore $h274 simple_if_fini $h2 198.51.100.1/2475}76 77router_create()78{79 ip link set dev $rp1 up80 ip link set dev $rp2 up81 82 __addr_add_del $rp1 add 192.0.2.2/2483 __addr_add_del $rp2 add 198.51.100.2/2484 mtu_set $rp1 1000085 mtu_set $rp2 1000086 87 ip -4 route add blackhole 198.51.100.10088 89 devlink trap set $DEVLINK_DEV trap blackhole_route action trap90}91 92router_destroy()93{94 devlink trap set $DEVLINK_DEV trap blackhole_route action drop95 96 ip -4 route del blackhole 198.51.100.10097 98 mtu_restore $rp299 mtu_restore $rp1100 __addr_add_del $rp2 del 198.51.100.2/24101 __addr_add_del $rp1 del 192.0.2.2/24102 103 ip link set dev $rp2 down104 ip link set dev $rp1 down105}106 107setup_prepare()108{109 h1=${NETIFS[p1]}110 rp1=${NETIFS[p2]}111 112 rp2=${NETIFS[p3]}113 h2=${NETIFS[p4]}114 115 rp1_mac=$(mac_get $rp1)116 117 vrf_prepare118 119 h1_create120 h2_create121 122 router_create123}124 125cleanup()126{127 pre_cleanup128 129 router_destroy130 131 h2_destroy132 h1_destroy133 134 vrf_cleanup135 136 # Reload to ensure devlink-trap settings are back to default.137 devlink_reload138}139 140rate_limits_test()141{142 RET=0143 144 devlink trap policer set $DEVLINK_DEV policer 1 rate 0 &> /dev/null145 check_fail $? "Policer rate was changed to rate lower than limit"146 devlink trap policer set $DEVLINK_DEV policer 1 \147 rate 2000000001 &> /dev/null148 check_fail $? "Policer rate was changed to rate higher than limit"149 150 devlink trap policer set $DEVLINK_DEV policer 1 rate 1151 check_err $? "Failed to set policer rate to minimum"152 devlink trap policer set $DEVLINK_DEV policer 1 rate 2000000000153 check_err $? "Failed to set policer rate to maximum"154 155 log_test "Trap policer rate limits"156}157 158burst_limits_test()159{160 RET=0161 162 devlink trap policer set $DEVLINK_DEV policer 1 burst 0 &> /dev/null163 check_fail $? "Policer burst size was changed to 0"164 devlink trap policer set $DEVLINK_DEV policer 1 burst 17 &> /dev/null165 check_fail $? "Policer burst size was changed to burst size that is not power of 2"166 devlink trap policer set $DEVLINK_DEV policer 1 burst 8 &> /dev/null167 check_fail $? "Policer burst size was changed to burst size lower than limit"168 devlink trap policer set $DEVLINK_DEV policer 1 \169 burst $((2**25)) &> /dev/null170 check_fail $? "Policer burst size was changed to burst size higher than limit"171 172 devlink trap policer set $DEVLINK_DEV policer 1 burst 16173 check_err $? "Failed to set policer burst size to minimum"174 devlink trap policer set $DEVLINK_DEV policer 1 burst $((2**24))175 check_err $? "Failed to set policer burst size to maximum"176 177 log_test "Trap policer burst size limits"178}179 180trap_rate_get()181{182 local t0 t1183 184 t0=$(devlink_trap_rx_packets_get blackhole_route)185 sleep 10186 t1=$(devlink_trap_rx_packets_get blackhole_route)187 188 echo $(((t1 - t0) / 10))189}190 191policer_drop_rate_get()192{193 local id=$1; shift194 local t0 t1195 196 t0=$(devlink_trap_policer_rx_dropped_get $id)197 sleep 10198 t1=$(devlink_trap_policer_rx_dropped_get $id)199 200 echo $(((t1 - t0) / 10))201}202 203__rate_test()204{205 local rate pct drop_rate206 local id=$1; shift207 208 RET=0209 210 devlink trap policer set $DEVLINK_DEV policer $id rate 1000 burst 512211 devlink trap group set $DEVLINK_DEV group l3_drops policer $id212 213 # Send packets at highest possible rate and make sure they are dropped214 # by the policer. Make sure measured received rate is about 1000 pps215 log_info "=== Tx rate: Highest, Policer rate: 1000 pps ==="216 217 start_traffic $h1 192.0.2.1 198.51.100.100 $rp1_mac218 219 sleep 5 # Take measurements when rate is stable220 221 rate=$(trap_rate_get)222 pct=$((100 * (rate - 1000) / 1000))223 ((-10 <= pct && pct <= 10))224 check_err $? "Expected rate 1000 pps, got $rate pps, which is $pct% off. Required accuracy is +-10%"225 log_info "Expected rate 1000 pps, measured rate $rate pps"226 227 drop_rate=$(policer_drop_rate_get $id)228 (( drop_rate > 0 ))229 check_err $? "Expected non-zero policer drop rate, got 0"230 log_info "Measured policer drop rate of $drop_rate pps"231 232 stop_traffic233 234 # Send packets at a rate of 1000 pps and make sure they are not dropped235 # by the policer236 log_info "=== Tx rate: 1000 pps, Policer rate: 1000 pps ==="237 238 start_traffic $h1 192.0.2.1 198.51.100.100 $rp1_mac -d 1msec239 240 sleep 5 # Take measurements when rate is stable241 242 drop_rate=$(policer_drop_rate_get $id)243 (( drop_rate == 0 ))244 check_err $? "Expected zero policer drop rate, got a drop rate of $drop_rate pps"245 log_info "Measured policer drop rate of $drop_rate pps"246 247 stop_traffic248 249 # Unbind the policer and send packets at highest possible rate. Make250 # sure they are not dropped by the policer and that the measured251 # received rate is higher than 1000 pps252 log_info "=== Tx rate: Highest, Policer rate: No policer ==="253 254 devlink trap group set $DEVLINK_DEV group l3_drops nopolicer255 256 start_traffic $h1 192.0.2.1 198.51.100.100 $rp1_mac257 258 rate=$(trap_rate_get)259 (( rate > 1000 ))260 check_err $? "Expected rate higher than 1000 pps, got $rate pps"261 log_info "Measured rate $rate pps"262 263 drop_rate=$(policer_drop_rate_get $id)264 (( drop_rate == 0 ))265 check_err $? "Expected zero policer drop rate, got a drop rate of $drop_rate pps"266 log_info "Measured policer drop rate of $drop_rate pps"267 268 stop_traffic269 270 log_test "Trap policer rate"271}272 273rate_test()274{275 local last_policer=$(devlink -j -p trap policer show |276 jq '[.[]["'$DEVLINK_DEV'"][].policer] | max')277 278 log_info "Running rate test for policer 1"279 __rate_test 1280 281 log_info "Running rate test for policer $((last_policer / 2))"282 __rate_test $((last_policer / 2))283 284 log_info "Running rate test for policer $last_policer"285 __rate_test $last_policer286}287 288__burst_test()289{290 local t0_rx t0_drop t1_rx t1_drop rx drop291 local id=$1; shift292 293 RET=0294 295 devlink trap policer set $DEVLINK_DEV policer $id rate 1000 burst 512296 devlink trap group set $DEVLINK_DEV group l3_drops policer $id297 298 # Send a burst of 16 packets and make sure that 16 are received299 # and that none are dropped by the policer300 log_info "=== Tx burst size: 16, Policer burst size: 512 ==="301 302 t0_rx=$(devlink_trap_rx_packets_get blackhole_route)303 t0_drop=$(devlink_trap_policer_rx_dropped_get $id)304 305 start_traffic $h1 192.0.2.1 198.51.100.100 $rp1_mac -c 16306 307 t1_rx=$(devlink_trap_rx_packets_get blackhole_route)308 t1_drop=$(devlink_trap_policer_rx_dropped_get $id)309 310 rx=$((t1_rx - t0_rx))311 (( rx == 16 ))312 check_err $? "Expected burst size of 16 packets, got $rx packets"313 log_info "Expected burst size of 16 packets, measured burst size of $rx packets"314 315 drop=$((t1_drop - t0_drop))316 (( drop == 0 ))317 check_err $? "Expected zero policer drops, got $drop"318 log_info "Measured policer drops of $drop packets"319 320 # Unbind the policer and send a burst of 64 packets. Make sure that321 # 64 packets are received and that none are dropped by the policer322 log_info "=== Tx burst size: 64, Policer burst size: No policer ==="323 324 devlink trap group set $DEVLINK_DEV group l3_drops nopolicer325 326 t0_rx=$(devlink_trap_rx_packets_get blackhole_route)327 t0_drop=$(devlink_trap_policer_rx_dropped_get $id)328 329 start_traffic $h1 192.0.2.1 198.51.100.100 $rp1_mac -c 64330 331 t1_rx=$(devlink_trap_rx_packets_get blackhole_route)332 t1_drop=$(devlink_trap_policer_rx_dropped_get $id)333 334 rx=$((t1_rx - t0_rx))335 (( rx == 64 ))336 check_err $? "Expected burst size of 64 packets, got $rx packets"337 log_info "Expected burst size of 64 packets, measured burst size of $rx packets"338 339 drop=$((t1_drop - t0_drop))340 (( drop == 0 ))341 check_err $? "Expected zero policer drops, got $drop"342 log_info "Measured policer drops of $drop packets"343 344 log_test "Trap policer burst size"345}346 347burst_test()348{349 local last_policer=$(devlink -j -p trap policer show |350 jq '[.[]["'$DEVLINK_DEV'"][].policer] | max')351 352 log_info "Running burst test for policer 1"353 __burst_test 1354 355 log_info "Running burst test for policer $((last_policer / 2))"356 __burst_test $((last_policer / 2))357 358 log_info "Running burst test for policer $last_policer"359 __burst_test $last_policer360}361 362trap cleanup EXIT363 364setup_prepare365setup_wait366 367tests_run368 369exit $EXIT_STATUS370