Path: blob/master/tools/testing/selftests/drivers/net/netdevsim/fib.sh
26299 views
#!/bin/bash1# SPDX-License-Identifier: GPL-2.02#3# This test is for checking the FIB offload API. It makes use of netdevsim4# which registers a listener to the FIB notification chain.56lib_dir=$(dirname $0)/../../../net/forwarding78ALL_TESTS="9ipv4_identical_routes10ipv4_tos11ipv4_metric12ipv4_replace13ipv4_delete14ipv4_plen15ipv4_replay16ipv4_flush17ipv4_error_path18ipv4_delete_fail19ipv6_add20ipv6_metric21ipv6_append_single22ipv6_replace_single23ipv6_metric_multipath24ipv6_append_multipath25ipv6_replace_multipath26ipv6_append_multipath_to_single27ipv6_delete_single28ipv6_delete_multipath29ipv6_replay_single30ipv6_replay_multipath31ipv6_error_path32ipv6_delete_fail33"34NETDEVSIM_PATH=/sys/bus/netdevsim/35DEV_ADDR=133736DEV=netdevsim${DEV_ADDR}37SYSFS_NET_DIR=/sys/bus/netdevsim/devices/$DEV/net/38DEBUGFS_DIR=/sys/kernel/debug/netdevsim/$DEV/39NUM_NETIFS=040source $lib_dir/lib.sh41source $lib_dir/fib_offload_lib.sh4243DEVLINK_DEV=44source $lib_dir/devlink_lib.sh45DEVLINK_DEV=netdevsim/${DEV}4647ipv4_identical_routes()48{49fib_ipv4_identical_routes_test "testns1"50}5152ipv4_tos()53{54fib_ipv4_tos_test "testns1"55}5657ipv4_metric()58{59fib_ipv4_metric_test "testns1"60}6162ipv4_replace()63{64fib_ipv4_replace_test "testns1"65}6667ipv4_delete()68{69fib_ipv4_delete_test "testns1"70}7172ipv4_plen()73{74fib_ipv4_plen_test "testns1"75}7677ipv4_replay_metric()78{79fib_ipv4_replay_metric_test "testns1" "$DEVLINK_DEV"80}8182ipv4_replay_tos()83{84fib_ipv4_replay_tos_test "testns1" "$DEVLINK_DEV"85}8687ipv4_replay_plen()88{89fib_ipv4_replay_plen_test "testns1" "$DEVLINK_DEV"90}9192ipv4_replay()93{94ipv4_replay_metric95ipv4_replay_tos96ipv4_replay_plen97}9899ipv4_flush()100{101fib_ipv4_flush_test "testns1"102}103104ipv4_error_path_add()105{106local lsb107108RET=0109110ip -n testns1 link add name dummy1 type dummy111ip -n testns1 link set dev dummy1 up112113devlink -N testns1 resource set $DEVLINK_DEV path IPv4/fib size 10114devlink -N testns1 dev reload $DEVLINK_DEV115116for lsb in $(seq 1 20); do117ip -n testns1 route add 192.0.2.${lsb}/32 dev dummy1 \118&> /dev/null119done120121log_test "IPv4 error path - add"122123ip -n testns1 link del dev dummy1124}125126ipv4_error_path_replay()127{128local lsb129130RET=0131132ip -n testns1 link add name dummy1 type dummy133ip -n testns1 link set dev dummy1 up134135devlink -N testns1 resource set $DEVLINK_DEV path IPv4/fib size 100136devlink -N testns1 dev reload $DEVLINK_DEV137138for lsb in $(seq 1 20); do139ip -n testns1 route add 192.0.2.${lsb}/32 dev dummy1140done141142devlink -N testns1 resource set $DEVLINK_DEV path IPv4/fib size 10143devlink -N testns1 dev reload $DEVLINK_DEV &> /dev/null144145log_test "IPv4 error path - replay"146147ip -n testns1 link del dev dummy1148149# Successfully reload after deleting all the routes.150devlink -N testns1 resource set $DEVLINK_DEV path IPv4/fib size 100151devlink -N testns1 dev reload $DEVLINK_DEV152}153154ipv4_error_path()155{156# Test the different error paths of the notifiers by limiting the size157# of the "IPv4/fib" resource.158ipv4_error_path_add159ipv4_error_path_replay160}161162ipv4_delete_fail()163{164RET=0165166echo "y" > $DEBUGFS_DIR/fib/fail_route_delete167168ip -n testns1 link add name dummy1 type dummy169ip -n testns1 link set dev dummy1 up170171ip -n testns1 route add 192.0.2.0/24 dev dummy1172ip -n testns1 route del 192.0.2.0/24 dev dummy1 &> /dev/null173174# We should not be able to delete the netdev if we are leaking a175# reference.176ip -n testns1 link del dev dummy1177178log_test "IPv4 route delete failure"179180echo "n" > $DEBUGFS_DIR/fib/fail_route_delete181}182183ipv6_add()184{185fib_ipv6_add_test "testns1"186}187188ipv6_metric()189{190fib_ipv6_metric_test "testns1"191}192193ipv6_append_single()194{195fib_ipv6_append_single_test "testns1"196}197198ipv6_replace_single()199{200fib_ipv6_replace_single_test "testns1"201}202203ipv6_metric_multipath()204{205fib_ipv6_metric_multipath_test "testns1"206}207208ipv6_append_multipath()209{210fib_ipv6_append_multipath_test "testns1"211}212213ipv6_replace_multipath()214{215fib_ipv6_replace_multipath_test "testns1"216}217218ipv6_append_multipath_to_single()219{220fib_ipv6_append_multipath_to_single_test "testns1"221}222223ipv6_delete_single()224{225fib_ipv6_delete_single_test "testns1"226}227228ipv6_delete_multipath()229{230fib_ipv6_delete_multipath_test "testns1"231}232233ipv6_replay_single()234{235fib_ipv6_replay_single_test "testns1" "$DEVLINK_DEV"236}237238ipv6_replay_multipath()239{240fib_ipv6_replay_multipath_test "testns1" "$DEVLINK_DEV"241}242243ipv6_error_path_add_single()244{245local lsb246247RET=0248249ip -n testns1 link add name dummy1 type dummy250ip -n testns1 link set dev dummy1 up251252devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 10253devlink -N testns1 dev reload $DEVLINK_DEV254255for lsb in $(seq 1 20); do256ip -n testns1 route add 2001:db8:1::${lsb}/128 dev dummy1 \257&> /dev/null258done259260log_test "IPv6 error path - add single"261262ip -n testns1 link del dev dummy1263}264265ipv6_error_path_add_multipath()266{267local lsb268269RET=0270271for i in $(seq 1 2); do272ip -n testns1 link add name dummy$i type dummy273ip -n testns1 link set dev dummy$i up274ip -n testns1 address add 2001:db8:$i::1/64 dev dummy$i275done276277devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 10278devlink -N testns1 dev reload $DEVLINK_DEV279280for lsb in $(seq 1 20); do281ip -n testns1 route add 2001:db8:10::${lsb}/128 \282nexthop via 2001:db8:1::2 dev dummy1 \283nexthop via 2001:db8:2::2 dev dummy2 &> /dev/null284done285286log_test "IPv6 error path - add multipath"287288for i in $(seq 1 2); do289ip -n testns1 link del dev dummy$i290done291}292293ipv6_error_path_replay()294{295local lsb296297RET=0298299ip -n testns1 link add name dummy1 type dummy300ip -n testns1 link set dev dummy1 up301302devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 100303devlink -N testns1 dev reload $DEVLINK_DEV304305for lsb in $(seq 1 20); do306ip -n testns1 route add 2001:db8:1::${lsb}/128 dev dummy1307done308309devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 10310devlink -N testns1 dev reload $DEVLINK_DEV &> /dev/null311312log_test "IPv6 error path - replay"313314ip -n testns1 link del dev dummy1315316# Successfully reload after deleting all the routes.317devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 100318devlink -N testns1 dev reload $DEVLINK_DEV319}320321ipv6_error_path()322{323# Test the different error paths of the notifiers by limiting the size324# of the "IPv6/fib" resource.325ipv6_error_path_add_single326ipv6_error_path_add_multipath327ipv6_error_path_replay328}329330ipv6_delete_fail()331{332RET=0333334echo "y" > $DEBUGFS_DIR/fib/fail_route_delete335336ip -n testns1 link add name dummy1 type dummy337ip -n testns1 link set dev dummy1 up338339ip -n testns1 route add 2001:db8:1::/64 dev dummy1340ip -n testns1 route del 2001:db8:1::/64 dev dummy1 &> /dev/null341342# We should not be able to delete the netdev if we are leaking a343# reference.344ip -n testns1 link del dev dummy1345346log_test "IPv6 route delete failure"347348echo "n" > $DEBUGFS_DIR/fib/fail_route_delete349}350351fib_notify_on_flag_change_set()352{353local notify=$1; shift354355ip netns exec testns1 sysctl -qw net.ipv4.fib_notify_on_flag_change=$notify356ip netns exec testns1 sysctl -qw net.ipv6.fib_notify_on_flag_change=$notify357358log_info "Set fib_notify_on_flag_change to $notify"359}360361setup_prepare()362{363local netdev364365modprobe netdevsim &> /dev/null366367echo "$DEV_ADDR 1" > ${NETDEVSIM_PATH}/new_device368while [ ! -d $SYSFS_NET_DIR ] ; do :; done369370ip netns add testns1371if [ $? -ne 0 ]; then372echo "Failed to add netns \"testns1\""373exit 1374fi375376devlink dev reload $DEVLINK_DEV netns testns1377if [ $? -ne 0 ]; then378echo "Failed to reload into netns \"testns1\""379exit 1380fi381}382383cleanup()384{385pre_cleanup386ip netns del testns1387echo "$DEV_ADDR" > ${NETDEVSIM_PATH}/del_device388modprobe -r netdevsim &> /dev/null389}390391trap cleanup EXIT392393setup_prepare394395fib_notify_on_flag_change_set 1396tests_run397398fib_notify_on_flag_change_set 0399tests_run400401exit $EXIT_STATUS402403404