Back to home page

OSCL-LXR

 
 

    


0001 #!/bin/bash
0002 # SPDX-License-Identifier: GPL-2.0
0003 #
0004 # This test is for checking the FIB offload API. It makes use of netdevsim
0005 # which registers a listener to the FIB notification chain.
0006 
0007 lib_dir=$(dirname $0)/../../../net/forwarding
0008 
0009 ALL_TESTS="
0010         ipv4_identical_routes
0011         ipv4_tos
0012         ipv4_metric
0013         ipv4_replace
0014         ipv4_delete
0015         ipv4_plen
0016         ipv4_replay
0017         ipv4_flush
0018         ipv4_error_path
0019         ipv4_delete_fail
0020         ipv6_add
0021         ipv6_metric
0022         ipv6_append_single
0023         ipv6_replace_single
0024         ipv6_metric_multipath
0025         ipv6_append_multipath
0026         ipv6_replace_multipath
0027         ipv6_append_multipath_to_single
0028         ipv6_delete_single
0029         ipv6_delete_multipath
0030         ipv6_replay_single
0031         ipv6_replay_multipath
0032         ipv6_error_path
0033         ipv6_delete_fail
0034 "
0035 NETDEVSIM_PATH=/sys/bus/netdevsim/
0036 DEV_ADDR=1337
0037 DEV=netdevsim${DEV_ADDR}
0038 SYSFS_NET_DIR=/sys/bus/netdevsim/devices/$DEV/net/
0039 DEBUGFS_DIR=/sys/kernel/debug/netdevsim/$DEV/
0040 NUM_NETIFS=0
0041 source $lib_dir/lib.sh
0042 source $lib_dir/fib_offload_lib.sh
0043 
0044 DEVLINK_DEV=
0045 source $lib_dir/devlink_lib.sh
0046 DEVLINK_DEV=netdevsim/${DEV}
0047 
0048 ipv4_identical_routes()
0049 {
0050         fib_ipv4_identical_routes_test "testns1"
0051 }
0052 
0053 ipv4_tos()
0054 {
0055         fib_ipv4_tos_test "testns1"
0056 }
0057 
0058 ipv4_metric()
0059 {
0060         fib_ipv4_metric_test "testns1"
0061 }
0062 
0063 ipv4_replace()
0064 {
0065         fib_ipv4_replace_test "testns1"
0066 }
0067 
0068 ipv4_delete()
0069 {
0070         fib_ipv4_delete_test "testns1"
0071 }
0072 
0073 ipv4_plen()
0074 {
0075         fib_ipv4_plen_test "testns1"
0076 }
0077 
0078 ipv4_replay_metric()
0079 {
0080         fib_ipv4_replay_metric_test "testns1" "$DEVLINK_DEV"
0081 }
0082 
0083 ipv4_replay_tos()
0084 {
0085         fib_ipv4_replay_tos_test "testns1" "$DEVLINK_DEV"
0086 }
0087 
0088 ipv4_replay_plen()
0089 {
0090         fib_ipv4_replay_plen_test "testns1" "$DEVLINK_DEV"
0091 }
0092 
0093 ipv4_replay()
0094 {
0095         ipv4_replay_metric
0096         ipv4_replay_tos
0097         ipv4_replay_plen
0098 }
0099 
0100 ipv4_flush()
0101 {
0102         fib_ipv4_flush_test "testns1"
0103 }
0104 
0105 ipv4_error_path_add()
0106 {
0107         local lsb
0108 
0109         RET=0
0110 
0111         ip -n testns1 link add name dummy1 type dummy
0112         ip -n testns1 link set dev dummy1 up
0113 
0114         devlink -N testns1 resource set $DEVLINK_DEV path IPv4/fib size 10
0115         devlink -N testns1 dev reload $DEVLINK_DEV
0116 
0117         for lsb in $(seq 1 20); do
0118                 ip -n testns1 route add 192.0.2.${lsb}/32 dev dummy1 \
0119                         &> /dev/null
0120         done
0121 
0122         log_test "IPv4 error path - add"
0123 
0124         ip -n testns1 link del dev dummy1
0125 }
0126 
0127 ipv4_error_path_replay()
0128 {
0129         local lsb
0130 
0131         RET=0
0132 
0133         ip -n testns1 link add name dummy1 type dummy
0134         ip -n testns1 link set dev dummy1 up
0135 
0136         devlink -N testns1 resource set $DEVLINK_DEV path IPv4/fib size 100
0137         devlink -N testns1 dev reload $DEVLINK_DEV
0138 
0139         for lsb in $(seq 1 20); do
0140                 ip -n testns1 route add 192.0.2.${lsb}/32 dev dummy1
0141         done
0142 
0143         devlink -N testns1 resource set $DEVLINK_DEV path IPv4/fib size 10
0144         devlink -N testns1 dev reload $DEVLINK_DEV &> /dev/null
0145 
0146         log_test "IPv4 error path - replay"
0147 
0148         ip -n testns1 link del dev dummy1
0149 
0150         # Successfully reload after deleting all the routes.
0151         devlink -N testns1 resource set $DEVLINK_DEV path IPv4/fib size 100
0152         devlink -N testns1 dev reload $DEVLINK_DEV
0153 }
0154 
0155 ipv4_error_path()
0156 {
0157         # Test the different error paths of the notifiers by limiting the size
0158         # of the "IPv4/fib" resource.
0159         ipv4_error_path_add
0160         ipv4_error_path_replay
0161 }
0162 
0163 ipv4_delete_fail()
0164 {
0165         RET=0
0166 
0167         echo "y" > $DEBUGFS_DIR/fib/fail_route_delete
0168 
0169         ip -n testns1 link add name dummy1 type dummy
0170         ip -n testns1 link set dev dummy1 up
0171 
0172         ip -n testns1 route add 192.0.2.0/24 dev dummy1
0173         ip -n testns1 route del 192.0.2.0/24 dev dummy1 &> /dev/null
0174 
0175         # We should not be able to delete the netdev if we are leaking a
0176         # reference.
0177         ip -n testns1 link del dev dummy1
0178 
0179         log_test "IPv4 route delete failure"
0180 
0181         echo "n" > $DEBUGFS_DIR/fib/fail_route_delete
0182 }
0183 
0184 ipv6_add()
0185 {
0186         fib_ipv6_add_test "testns1"
0187 }
0188 
0189 ipv6_metric()
0190 {
0191         fib_ipv6_metric_test "testns1"
0192 }
0193 
0194 ipv6_append_single()
0195 {
0196         fib_ipv6_append_single_test "testns1"
0197 }
0198 
0199 ipv6_replace_single()
0200 {
0201         fib_ipv6_replace_single_test "testns1"
0202 }
0203 
0204 ipv6_metric_multipath()
0205 {
0206         fib_ipv6_metric_multipath_test "testns1"
0207 }
0208 
0209 ipv6_append_multipath()
0210 {
0211         fib_ipv6_append_multipath_test "testns1"
0212 }
0213 
0214 ipv6_replace_multipath()
0215 {
0216         fib_ipv6_replace_multipath_test "testns1"
0217 }
0218 
0219 ipv6_append_multipath_to_single()
0220 {
0221         fib_ipv6_append_multipath_to_single_test "testns1"
0222 }
0223 
0224 ipv6_delete_single()
0225 {
0226         fib_ipv6_delete_single_test "testns1"
0227 }
0228 
0229 ipv6_delete_multipath()
0230 {
0231         fib_ipv6_delete_multipath_test "testns1"
0232 }
0233 
0234 ipv6_replay_single()
0235 {
0236         fib_ipv6_replay_single_test "testns1" "$DEVLINK_DEV"
0237 }
0238 
0239 ipv6_replay_multipath()
0240 {
0241         fib_ipv6_replay_multipath_test "testns1" "$DEVLINK_DEV"
0242 }
0243 
0244 ipv6_error_path_add_single()
0245 {
0246         local lsb
0247 
0248         RET=0
0249 
0250         ip -n testns1 link add name dummy1 type dummy
0251         ip -n testns1 link set dev dummy1 up
0252 
0253         devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 10
0254         devlink -N testns1 dev reload $DEVLINK_DEV
0255 
0256         for lsb in $(seq 1 20); do
0257                 ip -n testns1 route add 2001:db8:1::${lsb}/128 dev dummy1 \
0258                         &> /dev/null
0259         done
0260 
0261         log_test "IPv6 error path - add single"
0262 
0263         ip -n testns1 link del dev dummy1
0264 }
0265 
0266 ipv6_error_path_add_multipath()
0267 {
0268         local lsb
0269 
0270         RET=0
0271 
0272         for i in $(seq 1 2); do
0273                 ip -n testns1 link add name dummy$i type dummy
0274                 ip -n testns1 link set dev dummy$i up
0275                 ip -n testns1 address add 2001:db8:$i::1/64 dev dummy$i
0276         done
0277 
0278         devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 10
0279         devlink -N testns1 dev reload $DEVLINK_DEV
0280 
0281         for lsb in $(seq 1 20); do
0282                 ip -n testns1 route add 2001:db8:10::${lsb}/128 \
0283                         nexthop via 2001:db8:1::2 dev dummy1 \
0284                         nexthop via 2001:db8:2::2 dev dummy2 &> /dev/null
0285         done
0286 
0287         log_test "IPv6 error path - add multipath"
0288 
0289         for i in $(seq 1 2); do
0290                 ip -n testns1 link del dev dummy$i
0291         done
0292 }
0293 
0294 ipv6_error_path_replay()
0295 {
0296         local lsb
0297 
0298         RET=0
0299 
0300         ip -n testns1 link add name dummy1 type dummy
0301         ip -n testns1 link set dev dummy1 up
0302 
0303         devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 100
0304         devlink -N testns1 dev reload $DEVLINK_DEV
0305 
0306         for lsb in $(seq 1 20); do
0307                 ip -n testns1 route add 2001:db8:1::${lsb}/128 dev dummy1
0308         done
0309 
0310         devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 10
0311         devlink -N testns1 dev reload $DEVLINK_DEV &> /dev/null
0312 
0313         log_test "IPv6 error path - replay"
0314 
0315         ip -n testns1 link del dev dummy1
0316 
0317         # Successfully reload after deleting all the routes.
0318         devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 100
0319         devlink -N testns1 dev reload $DEVLINK_DEV
0320 }
0321 
0322 ipv6_error_path()
0323 {
0324         # Test the different error paths of the notifiers by limiting the size
0325         # of the "IPv6/fib" resource.
0326         ipv6_error_path_add_single
0327         ipv6_error_path_add_multipath
0328         ipv6_error_path_replay
0329 }
0330 
0331 ipv6_delete_fail()
0332 {
0333         RET=0
0334 
0335         echo "y" > $DEBUGFS_DIR/fib/fail_route_delete
0336 
0337         ip -n testns1 link add name dummy1 type dummy
0338         ip -n testns1 link set dev dummy1 up
0339 
0340         ip -n testns1 route add 2001:db8:1::/64 dev dummy1
0341         ip -n testns1 route del 2001:db8:1::/64 dev dummy1 &> /dev/null
0342 
0343         # We should not be able to delete the netdev if we are leaking a
0344         # reference.
0345         ip -n testns1 link del dev dummy1
0346 
0347         log_test "IPv6 route delete failure"
0348 
0349         echo "n" > $DEBUGFS_DIR/fib/fail_route_delete
0350 }
0351 
0352 fib_notify_on_flag_change_set()
0353 {
0354         local notify=$1; shift
0355 
0356         ip netns exec testns1 sysctl -qw net.ipv4.fib_notify_on_flag_change=$notify
0357         ip netns exec testns1 sysctl -qw net.ipv6.fib_notify_on_flag_change=$notify
0358 
0359         log_info "Set fib_notify_on_flag_change to $notify"
0360 }
0361 
0362 setup_prepare()
0363 {
0364         local netdev
0365 
0366         modprobe netdevsim &> /dev/null
0367 
0368         echo "$DEV_ADDR 1" > ${NETDEVSIM_PATH}/new_device
0369         while [ ! -d $SYSFS_NET_DIR ] ; do :; done
0370 
0371         ip netns add testns1
0372         if [ $? -ne 0 ]; then
0373                 echo "Failed to add netns \"testns1\""
0374                 exit 1
0375         fi
0376 
0377         devlink dev reload $DEVLINK_DEV netns testns1
0378         if [ $? -ne 0 ]; then
0379                 echo "Failed to reload into netns \"testns1\""
0380                 exit 1
0381         fi
0382 }
0383 
0384 cleanup()
0385 {
0386         pre_cleanup
0387         ip netns del testns1
0388         echo "$DEV_ADDR" > ${NETDEVSIM_PATH}/del_device
0389         modprobe -r netdevsim &> /dev/null
0390 }
0391 
0392 trap cleanup EXIT
0393 
0394 setup_prepare
0395 
0396 fib_notify_on_flag_change_set 1
0397 tests_run
0398 
0399 fib_notify_on_flag_change_set 0
0400 tests_run
0401 
0402 exit $EXIT_STATUS