Back to home page

OSCL-LXR

 
 

    


0001 #!/bin/bash
0002 # SPDX-License-Identifier: GPL-2.0
0003 
0004 lib_dir=$(dirname $0)/../../../net/forwarding
0005 
0006 ALL_TESTS="
0007         l3_reporting_test
0008         l3_fail_next_test
0009         l3_counter_test
0010         l3_rollback_test
0011         l3_monitor_test
0012 "
0013 
0014 NETDEVSIM_PATH=/sys/bus/netdevsim/
0015 DEV_ADDR_1=1337
0016 DEV_ADDR_2=1057
0017 DEV_ADDR_3=5417
0018 NUM_NETIFS=0
0019 source $lib_dir/lib.sh
0020 
0021 DUMMY_IFINDEX=
0022 
0023 DEV_ADDR()
0024 {
0025         local n=$1; shift
0026         local var=DEV_ADDR_$n
0027 
0028         echo ${!var}
0029 }
0030 
0031 DEV()
0032 {
0033         echo netdevsim$(DEV_ADDR $1)
0034 }
0035 
0036 DEVLINK_DEV()
0037 {
0038         echo netdevsim/$(DEV $1)
0039 }
0040 
0041 SYSFS_NET_DIR()
0042 {
0043         echo /sys/bus/netdevsim/devices/$(DEV $1)/net/
0044 }
0045 
0046 DEBUGFS_DIR()
0047 {
0048         echo /sys/kernel/debug/netdevsim/$(DEV $1)/
0049 }
0050 
0051 nsim_add()
0052 {
0053         local n=$1; shift
0054 
0055         echo "$(DEV_ADDR $n) 1" > ${NETDEVSIM_PATH}/new_device
0056         while [ ! -d $(SYSFS_NET_DIR $n) ] ; do :; done
0057 }
0058 
0059 nsim_reload()
0060 {
0061         local n=$1; shift
0062         local ns=$1; shift
0063 
0064         devlink dev reload $(DEVLINK_DEV $n) netns $ns
0065 
0066         if [ $? -ne 0 ]; then
0067                 echo "Failed to reload $(DEV $n) into netns \"testns1\""
0068                 exit 1
0069         fi
0070 
0071 }
0072 
0073 nsim_del()
0074 {
0075         local n=$1; shift
0076 
0077         echo "$(DEV_ADDR $n)" > ${NETDEVSIM_PATH}/del_device
0078 }
0079 
0080 nsim_hwstats_toggle()
0081 {
0082         local action=$1; shift
0083         local instance=$1; shift
0084         local netdev=$1; shift
0085         local type=$1; shift
0086 
0087         local ifindex=$($IP -j link show dev $netdev | jq '.[].ifindex')
0088 
0089         echo $ifindex > $(DEBUGFS_DIR $instance)/hwstats/$type/$action
0090 }
0091 
0092 nsim_hwstats_enable()
0093 {
0094         nsim_hwstats_toggle enable_ifindex "$@"
0095 }
0096 
0097 nsim_hwstats_disable()
0098 {
0099         nsim_hwstats_toggle disable_ifindex "$@"
0100 }
0101 
0102 nsim_hwstats_fail_next_enable()
0103 {
0104         nsim_hwstats_toggle fail_next_enable "$@"
0105 }
0106 
0107 setup_prepare()
0108 {
0109         modprobe netdevsim &> /dev/null
0110         nsim_add 1
0111         nsim_add 2
0112         nsim_add 3
0113 
0114         ip netns add testns1
0115 
0116         if [ $? -ne 0 ]; then
0117                 echo "Failed to add netns \"testns1\""
0118                 exit 1
0119         fi
0120 
0121         nsim_reload 1 testns1
0122         nsim_reload 2 testns1
0123         nsim_reload 3 testns1
0124 
0125         IP="ip -n testns1"
0126 
0127         $IP link add name dummy1 type dummy
0128         $IP link set dev dummy1 up
0129         DUMMY_IFINDEX=$($IP -j link show dev dummy1 | jq '.[].ifindex')
0130 }
0131 
0132 cleanup()
0133 {
0134         pre_cleanup
0135 
0136         $IP link del name dummy1
0137         ip netns del testns1
0138         nsim_del 3
0139         nsim_del 2
0140         nsim_del 1
0141         modprobe -r netdevsim &> /dev/null
0142 }
0143 
0144 netdev_hwstats_used()
0145 {
0146         local netdev=$1; shift
0147         local type=$1; shift
0148 
0149         $IP -j stats show dev "$netdev" group offload subgroup hw_stats_info |
0150             jq '.[].info.l3_stats.used'
0151 }
0152 
0153 netdev_check_used()
0154 {
0155         local netdev=$1; shift
0156         local type=$1; shift
0157 
0158         [[ $(netdev_hwstats_used $netdev $type) == "true" ]]
0159 }
0160 
0161 netdev_check_unused()
0162 {
0163         local netdev=$1; shift
0164         local type=$1; shift
0165 
0166         [[ $(netdev_hwstats_used $netdev $type) == "false" ]]
0167 }
0168 
0169 netdev_hwstats_request()
0170 {
0171         local netdev=$1; shift
0172         local type=$1; shift
0173 
0174         $IP -j stats show dev "$netdev" group offload subgroup hw_stats_info |
0175             jq ".[].info.${type}_stats.request"
0176 }
0177 
0178 netdev_check_requested()
0179 {
0180         local netdev=$1; shift
0181         local type=$1; shift
0182 
0183         [[ $(netdev_hwstats_request $netdev $type) == "true" ]]
0184 }
0185 
0186 netdev_check_unrequested()
0187 {
0188         local netdev=$1; shift
0189         local type=$1; shift
0190 
0191         [[ $(netdev_hwstats_request $netdev $type) == "false" ]]
0192 }
0193 
0194 reporting_test()
0195 {
0196         local type=$1; shift
0197         local instance=1
0198 
0199         RET=0
0200 
0201         [[ -n $(netdev_hwstats_used dummy1 $type) ]]
0202         check_err $? "$type stats not reported"
0203 
0204         netdev_check_unused dummy1 $type
0205         check_err $? "$type stats reported as used before either device or netdevsim request"
0206 
0207         nsim_hwstats_enable $instance dummy1 $type
0208         netdev_check_unused dummy1 $type
0209         check_err $? "$type stats reported as used before device request"
0210         netdev_check_unrequested dummy1 $type
0211         check_err $? "$type stats reported as requested before device request"
0212 
0213         $IP stats set dev dummy1 ${type}_stats on
0214         netdev_check_used dummy1 $type
0215         check_err $? "$type stats reported as not used after both device and netdevsim request"
0216         netdev_check_requested dummy1 $type
0217         check_err $? "$type stats reported as not requested after device request"
0218 
0219         nsim_hwstats_disable $instance dummy1 $type
0220         netdev_check_unused dummy1 $type
0221         check_err $? "$type stats reported as used after netdevsim request withdrawn"
0222 
0223         nsim_hwstats_enable $instance dummy1 $type
0224         netdev_check_used dummy1 $type
0225         check_err $? "$type stats reported as not used after netdevsim request reenabled"
0226 
0227         $IP stats set dev dummy1 ${type}_stats off
0228         netdev_check_unused dummy1 $type
0229         check_err $? "$type stats reported as used after device request withdrawn"
0230         netdev_check_unrequested dummy1 $type
0231         check_err $? "$type stats reported as requested after device request withdrawn"
0232 
0233         nsim_hwstats_disable $instance dummy1 $type
0234         netdev_check_unused dummy1 $type
0235         check_err $? "$type stats reported as used after both requests withdrawn"
0236 
0237         log_test "Reporting of $type stats usage"
0238 }
0239 
0240 l3_reporting_test()
0241 {
0242         reporting_test l3
0243 }
0244 
0245 __fail_next_test()
0246 {
0247         local instance=$1; shift
0248         local type=$1; shift
0249 
0250         RET=0
0251 
0252         netdev_check_unused dummy1 $type
0253         check_err $? "$type stats reported as used before either device or netdevsim request"
0254 
0255         nsim_hwstats_enable $instance dummy1 $type
0256         nsim_hwstats_fail_next_enable $instance dummy1 $type
0257         netdev_check_unused dummy1 $type
0258         check_err $? "$type stats reported as used before device request"
0259         netdev_check_unrequested dummy1 $type
0260         check_err $? "$type stats reported as requested before device request"
0261 
0262         $IP stats set dev dummy1 ${type}_stats on 2>/dev/null
0263         check_fail $? "$type stats request not bounced as it should have been"
0264         netdev_check_unused dummy1 $type
0265         check_err $? "$type stats reported as used after bounce"
0266         netdev_check_unrequested dummy1 $type
0267         check_err $? "$type stats reported as requested after bounce"
0268 
0269         $IP stats set dev dummy1 ${type}_stats on
0270         check_err $? "$type stats request failed when it shouldn't have"
0271         netdev_check_used dummy1 $type
0272         check_err $? "$type stats reported as not used after both device and netdevsim request"
0273         netdev_check_requested dummy1 $type
0274         check_err $? "$type stats reported as not requested after device request"
0275 
0276         $IP stats set dev dummy1 ${type}_stats off
0277         nsim_hwstats_disable $instance dummy1 $type
0278 
0279         log_test "Injected failure of $type stats enablement (netdevsim #$instance)"
0280 }
0281 
0282 fail_next_test()
0283 {
0284         __fail_next_test 1 "$@"
0285         __fail_next_test 2 "$@"
0286         __fail_next_test 3 "$@"
0287 }
0288 
0289 l3_fail_next_test()
0290 {
0291         fail_next_test l3
0292 }
0293 
0294 get_hwstat()
0295 {
0296         local netdev=$1; shift
0297         local type=$1; shift
0298         local selector=$1; shift
0299 
0300         $IP -j stats show dev $netdev group offload subgroup ${type}_stats |
0301                   jq ".[0].stats64.${selector}"
0302 }
0303 
0304 counter_test()
0305 {
0306         local type=$1; shift
0307         local instance=1
0308 
0309         RET=0
0310 
0311         nsim_hwstats_enable $instance dummy1 $type
0312         $IP stats set dev dummy1 ${type}_stats on
0313         netdev_check_used dummy1 $type
0314         check_err $? "$type stats reported as not used after both device and netdevsim request"
0315 
0316         # Netdevsim counts 10pps on ingress. We should see maybe a couple
0317         # packets, unless things take a reeealy long time.
0318         local pkts=$(get_hwstat dummy1 l3 rx.packets)
0319         ((pkts < 10))
0320         check_err $? "$type stats show >= 10 packets after first enablement"
0321 
0322         sleep 2.5
0323 
0324         local pkts=$(get_hwstat dummy1 l3 rx.packets)
0325         ((pkts >= 20))
0326         check_err $? "$type stats show < 20 packets after 2.5s passed"
0327 
0328         $IP stats set dev dummy1 ${type}_stats off
0329 
0330         sleep 2
0331 
0332         $IP stats set dev dummy1 ${type}_stats on
0333         local pkts=$(get_hwstat dummy1 l3 rx.packets)
0334         ((pkts < 10))
0335         check_err $? "$type stats show >= 10 packets after second enablement"
0336 
0337         $IP stats set dev dummy1 ${type}_stats off
0338         nsim_hwstats_fail_next_enable $instance dummy1 $type
0339         $IP stats set dev dummy1 ${type}_stats on 2>/dev/null
0340         check_fail $? "$type stats request not bounced as it should have been"
0341 
0342         sleep 2
0343 
0344         $IP stats set dev dummy1 ${type}_stats on
0345         local pkts=$(get_hwstat dummy1 l3 rx.packets)
0346         ((pkts < 10))
0347         check_err $? "$type stats show >= 10 packets after post-fail enablement"
0348 
0349         $IP stats set dev dummy1 ${type}_stats off
0350 
0351         log_test "Counter values in $type stats"
0352 }
0353 
0354 l3_counter_test()
0355 {
0356         counter_test l3
0357 }
0358 
0359 rollback_test()
0360 {
0361         local type=$1; shift
0362 
0363         RET=0
0364 
0365         nsim_hwstats_enable 1 dummy1 l3
0366         nsim_hwstats_enable 2 dummy1 l3
0367         nsim_hwstats_enable 3 dummy1 l3
0368 
0369         # The three netdevsim instances are registered in order of their number
0370         # one after another. It is reasonable to expect that whatever
0371         # notifications take place hit no. 2 in between hitting nos. 1 and 3,
0372         # whatever the actual order. This allows us to test that a fail caused
0373         # by no. 2 does not leave the system in a partial state, and rolls
0374         # everything back.
0375 
0376         nsim_hwstats_fail_next_enable 2 dummy1 l3
0377         $IP stats set dev dummy1 ${type}_stats on 2>/dev/null
0378         check_fail $? "$type stats request not bounced as it should have been"
0379 
0380         netdev_check_unused dummy1 $type
0381         check_err $? "$type stats reported as used after bounce"
0382         netdev_check_unrequested dummy1 $type
0383         check_err $? "$type stats reported as requested after bounce"
0384 
0385         sleep 2
0386 
0387         $IP stats set dev dummy1 ${type}_stats on
0388         check_err $? "$type stats request not upheld as it should have been"
0389 
0390         local pkts=$(get_hwstat dummy1 l3 rx.packets)
0391         ((pkts < 10))
0392         check_err $? "$type stats show $pkts packets after post-fail enablement"
0393 
0394         $IP stats set dev dummy1 ${type}_stats off
0395 
0396         nsim_hwstats_disable 3 dummy1 l3
0397         nsim_hwstats_disable 2 dummy1 l3
0398         nsim_hwstats_disable 1 dummy1 l3
0399 
0400         log_test "Failure in $type stats enablement rolled back"
0401 }
0402 
0403 l3_rollback_test()
0404 {
0405         rollback_test l3
0406 }
0407 
0408 l3_monitor_test()
0409 {
0410         hw_stats_monitor_test dummy1 l3            \
0411                 "nsim_hwstats_enable 1 dummy1 l3"  \
0412                 "nsim_hwstats_disable 1 dummy1 l3" \
0413                 "$IP"
0414 }
0415 
0416 trap cleanup EXIT
0417 
0418 setup_prepare
0419 tests_run
0420 
0421 exit $EXIT_STATUS