0001
0002
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
0317
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
0370
0371
0372
0373
0374
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