0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032 lib_dir=$(dirname $0)/../../../net/forwarding
0033
0034 ALL_TESTS="
0035 rate_limits_test
0036 burst_limits_test
0037 rate_test
0038 burst_test
0039 "
0040 NUM_NETIFS=4
0041 source $lib_dir/tc_common.sh
0042 source $lib_dir/lib.sh
0043 source $lib_dir/devlink_lib.sh
0044
0045 h1_create()
0046 {
0047 simple_if_init $h1 192.0.2.1/24
0048 mtu_set $h1 10000
0049
0050 ip -4 route add default vrf v$h1 nexthop via 192.0.2.2
0051 }
0052
0053 h1_destroy()
0054 {
0055 ip -4 route del default vrf v$h1 nexthop via 192.0.2.2
0056
0057 mtu_restore $h1
0058 simple_if_fini $h1 192.0.2.1/24
0059 }
0060
0061 h2_create()
0062 {
0063 simple_if_init $h2 198.51.100.1/24
0064 mtu_set $h2 10000
0065
0066 ip -4 route add default vrf v$h2 nexthop via 198.51.100.2
0067 }
0068
0069 h2_destroy()
0070 {
0071 ip -4 route del default vrf v$h2 nexthop via 198.51.100.2
0072
0073 mtu_restore $h2
0074 simple_if_fini $h2 198.51.100.1/24
0075 }
0076
0077 router_create()
0078 {
0079 ip link set dev $rp1 up
0080 ip link set dev $rp2 up
0081
0082 __addr_add_del $rp1 add 192.0.2.2/24
0083 __addr_add_del $rp2 add 198.51.100.2/24
0084 mtu_set $rp1 10000
0085 mtu_set $rp2 10000
0086
0087 ip -4 route add blackhole 198.51.100.100
0088
0089 devlink trap set $DEVLINK_DEV trap blackhole_route action trap
0090 }
0091
0092 router_destroy()
0093 {
0094 devlink trap set $DEVLINK_DEV trap blackhole_route action drop
0095
0096 ip -4 route del blackhole 198.51.100.100
0097
0098 mtu_restore $rp2
0099 mtu_restore $rp1
0100 __addr_add_del $rp2 del 198.51.100.2/24
0101 __addr_add_del $rp1 del 192.0.2.2/24
0102
0103 ip link set dev $rp2 down
0104 ip link set dev $rp1 down
0105 }
0106
0107 setup_prepare()
0108 {
0109 h1=${NETIFS[p1]}
0110 rp1=${NETIFS[p2]}
0111
0112 rp2=${NETIFS[p3]}
0113 h2=${NETIFS[p4]}
0114
0115 rp1_mac=$(mac_get $rp1)
0116
0117 vrf_prepare
0118
0119 h1_create
0120 h2_create
0121
0122 router_create
0123 }
0124
0125 cleanup()
0126 {
0127 pre_cleanup
0128
0129 router_destroy
0130
0131 h2_destroy
0132 h1_destroy
0133
0134 vrf_cleanup
0135
0136
0137 devlink_reload
0138 }
0139
0140 rate_limits_test()
0141 {
0142 RET=0
0143
0144 devlink trap policer set $DEVLINK_DEV policer 1 rate 0 &> /dev/null
0145 check_fail $? "Policer rate was changed to rate lower than limit"
0146 devlink trap policer set $DEVLINK_DEV policer 1 \
0147 rate 2000000001 &> /dev/null
0148 check_fail $? "Policer rate was changed to rate higher than limit"
0149
0150 devlink trap policer set $DEVLINK_DEV policer 1 rate 1
0151 check_err $? "Failed to set policer rate to minimum"
0152 devlink trap policer set $DEVLINK_DEV policer 1 rate 2000000000
0153 check_err $? "Failed to set policer rate to maximum"
0154
0155 log_test "Trap policer rate limits"
0156 }
0157
0158 burst_limits_test()
0159 {
0160 RET=0
0161
0162 devlink trap policer set $DEVLINK_DEV policer 1 burst 0 &> /dev/null
0163 check_fail $? "Policer burst size was changed to 0"
0164 devlink trap policer set $DEVLINK_DEV policer 1 burst 17 &> /dev/null
0165 check_fail $? "Policer burst size was changed to burst size that is not power of 2"
0166 devlink trap policer set $DEVLINK_DEV policer 1 burst 8 &> /dev/null
0167 check_fail $? "Policer burst size was changed to burst size lower than limit"
0168 devlink trap policer set $DEVLINK_DEV policer 1 \
0169 burst $((2**25)) &> /dev/null
0170 check_fail $? "Policer burst size was changed to burst size higher than limit"
0171
0172 devlink trap policer set $DEVLINK_DEV policer 1 burst 16
0173 check_err $? "Failed to set policer burst size to minimum"
0174 devlink trap policer set $DEVLINK_DEV policer 1 burst $((2**24))
0175 check_err $? "Failed to set policer burst size to maximum"
0176
0177 log_test "Trap policer burst size limits"
0178 }
0179
0180 trap_rate_get()
0181 {
0182 local t0 t1
0183
0184 t0=$(devlink_trap_rx_packets_get blackhole_route)
0185 sleep 10
0186 t1=$(devlink_trap_rx_packets_get blackhole_route)
0187
0188 echo $(((t1 - t0) / 10))
0189 }
0190
0191 policer_drop_rate_get()
0192 {
0193 local id=$1; shift
0194 local t0 t1
0195
0196 t0=$(devlink_trap_policer_rx_dropped_get $id)
0197 sleep 10
0198 t1=$(devlink_trap_policer_rx_dropped_get $id)
0199
0200 echo $(((t1 - t0) / 10))
0201 }
0202
0203 __rate_test()
0204 {
0205 local rate pct drop_rate
0206 local id=$1; shift
0207
0208 RET=0
0209
0210 devlink trap policer set $DEVLINK_DEV policer $id rate 1000 burst 512
0211 devlink trap group set $DEVLINK_DEV group l3_drops policer $id
0212
0213
0214
0215 log_info "=== Tx rate: Highest, Policer rate: 1000 pps ==="
0216
0217 start_traffic $h1 192.0.2.1 198.51.100.100 $rp1_mac
0218
0219 sleep 5
0220
0221 rate=$(trap_rate_get)
0222 pct=$((100 * (rate - 1000) / 1000))
0223 ((-10 <= pct && pct <= 10))
0224 check_err $? "Expected rate 1000 pps, got $rate pps, which is $pct% off. Required accuracy is +-10%"
0225 log_info "Expected rate 1000 pps, measured rate $rate pps"
0226
0227 drop_rate=$(policer_drop_rate_get $id)
0228 (( drop_rate > 0 ))
0229 check_err $? "Expected non-zero policer drop rate, got 0"
0230 log_info "Measured policer drop rate of $drop_rate pps"
0231
0232 stop_traffic
0233
0234
0235
0236 log_info "=== Tx rate: 1000 pps, Policer rate: 1000 pps ==="
0237
0238 start_traffic $h1 192.0.2.1 198.51.100.100 $rp1_mac -d 1msec
0239
0240 sleep 5
0241
0242 drop_rate=$(policer_drop_rate_get $id)
0243 (( drop_rate == 0 ))
0244 check_err $? "Expected zero policer drop rate, got a drop rate of $drop_rate pps"
0245 log_info "Measured policer drop rate of $drop_rate pps"
0246
0247 stop_traffic
0248
0249
0250
0251
0252 log_info "=== Tx rate: Highest, Policer rate: No policer ==="
0253
0254 devlink trap group set $DEVLINK_DEV group l3_drops nopolicer
0255
0256 start_traffic $h1 192.0.2.1 198.51.100.100 $rp1_mac
0257
0258 rate=$(trap_rate_get)
0259 (( rate > 1000 ))
0260 check_err $? "Expected rate higher than 1000 pps, got $rate pps"
0261 log_info "Measured rate $rate pps"
0262
0263 drop_rate=$(policer_drop_rate_get $id)
0264 (( drop_rate == 0 ))
0265 check_err $? "Expected zero policer drop rate, got a drop rate of $drop_rate pps"
0266 log_info "Measured policer drop rate of $drop_rate pps"
0267
0268 stop_traffic
0269
0270 log_test "Trap policer rate"
0271 }
0272
0273 rate_test()
0274 {
0275 local last_policer=$(devlink -j -p trap policer show |
0276 jq '[.[]["'$DEVLINK_DEV'"][].policer] | max')
0277
0278 log_info "Running rate test for policer 1"
0279 __rate_test 1
0280
0281 log_info "Running rate test for policer $((last_policer / 2))"
0282 __rate_test $((last_policer / 2))
0283
0284 log_info "Running rate test for policer $last_policer"
0285 __rate_test $last_policer
0286 }
0287
0288 __burst_test()
0289 {
0290 local t0_rx t0_drop t1_rx t1_drop rx drop
0291 local id=$1; shift
0292
0293 RET=0
0294
0295 devlink trap policer set $DEVLINK_DEV policer $id rate 1000 burst 512
0296 devlink trap group set $DEVLINK_DEV group l3_drops policer $id
0297
0298
0299
0300 log_info "=== Tx burst size: 16, Policer burst size: 512 ==="
0301
0302 t0_rx=$(devlink_trap_rx_packets_get blackhole_route)
0303 t0_drop=$(devlink_trap_policer_rx_dropped_get $id)
0304
0305 start_traffic $h1 192.0.2.1 198.51.100.100 $rp1_mac -c 16
0306
0307 t1_rx=$(devlink_trap_rx_packets_get blackhole_route)
0308 t1_drop=$(devlink_trap_policer_rx_dropped_get $id)
0309
0310 rx=$((t1_rx - t0_rx))
0311 (( rx == 16 ))
0312 check_err $? "Expected burst size of 16 packets, got $rx packets"
0313 log_info "Expected burst size of 16 packets, measured burst size of $rx packets"
0314
0315 drop=$((t1_drop - t0_drop))
0316 (( drop == 0 ))
0317 check_err $? "Expected zero policer drops, got $drop"
0318 log_info "Measured policer drops of $drop packets"
0319
0320
0321
0322 log_info "=== Tx burst size: 64, Policer burst size: No policer ==="
0323
0324 devlink trap group set $DEVLINK_DEV group l3_drops nopolicer
0325
0326 t0_rx=$(devlink_trap_rx_packets_get blackhole_route)
0327 t0_drop=$(devlink_trap_policer_rx_dropped_get $id)
0328
0329 start_traffic $h1 192.0.2.1 198.51.100.100 $rp1_mac -c 64
0330
0331 t1_rx=$(devlink_trap_rx_packets_get blackhole_route)
0332 t1_drop=$(devlink_trap_policer_rx_dropped_get $id)
0333
0334 rx=$((t1_rx - t0_rx))
0335 (( rx == 64 ))
0336 check_err $? "Expected burst size of 64 packets, got $rx packets"
0337 log_info "Expected burst size of 64 packets, measured burst size of $rx packets"
0338
0339 drop=$((t1_drop - t0_drop))
0340 (( drop == 0 ))
0341 check_err $? "Expected zero policer drops, got $drop"
0342 log_info "Measured policer drops of $drop packets"
0343
0344 log_test "Trap policer burst size"
0345 }
0346
0347 burst_test()
0348 {
0349 local last_policer=$(devlink -j -p trap policer show |
0350 jq '[.[]["'$DEVLINK_DEV'"][].policer] | max')
0351
0352 log_info "Running burst test for policer 1"
0353 __burst_test 1
0354
0355 log_info "Running burst test for policer $((last_policer / 2))"
0356 __burst_test $((last_policer / 2))
0357
0358 log_info "Running burst test for policer $last_policer"
0359 __burst_test $last_policer
0360 }
0361
0362 trap cleanup EXIT
0363
0364 setup_prepare
0365 setup_wait
0366
0367 tests_run
0368
0369 exit $EXIT_STATUS