Back to home page

OSCL-LXR

 
 

    


0001 #!/bin/bash
0002 # SPDX-License-Identifier: GPL-2.0
0003 #
0004 # Test devlink-trap policer functionality over mlxsw.
0005 
0006 # +---------------------------------+
0007 # | H1 (vrf)                        |
0008 # |    + $h1                        |
0009 # |    | 192.0.2.1/24               |
0010 # |    |                            |
0011 # |    |  default via 192.0.2.2     |
0012 # +----|----------------------------+
0013 #      |
0014 # +----|----------------------------------------------------------------------+
0015 # | SW |                                                                      |
0016 # |    + $rp1                                                                 |
0017 # |        192.0.2.2/24                                                       |
0018 # |                                                                           |
0019 # |        198.51.100.2/24                                                    |
0020 # |    + $rp2                                                                 |
0021 # |    |                                                                      |
0022 # +----|----------------------------------------------------------------------+
0023 #      |
0024 # +----|----------------------------+
0025 # |    |  default via 198.51.100.2  |
0026 # |    |                            |
0027 # |    | 198.51.100.1/24            |
0028 # |    + $h2                        |
0029 # | H2 (vrf)                        |
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         # Reload to ensure devlink-trap settings are back to default.
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         # Send packets at highest possible rate and make sure they are dropped
0214         # by the policer. Make sure measured received rate is about 1000 pps
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 # Take measurements when rate is stable
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         # Send packets at a rate of 1000 pps and make sure they are not dropped
0235         # by the policer
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 # Take measurements when rate is stable
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         # Unbind the policer and send packets at highest possible rate. Make
0250         # sure they are not dropped by the policer and that the measured
0251         # received rate is higher than 1000 pps
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         # Send a burst of 16 packets and make sure that 16 are received
0299         # and that none are dropped by the policer
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         # Unbind the policer and send a burst of 64 packets. Make sure that
0321         # 64 packets are received and that none are dropped by the policer
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