402 lines · 7.5 KB · Shell
RawDownload
#!/bin/bash# SPDX-License-Identifier: GPL-2.0## This test is for checking the FIB offload API. It makes use of netdevsim# which registers a listener to the FIB notification chain. lib_dir=$(dirname $0)/../../../net/forwarding ALL_TESTS="	ipv4_identical_routes	ipv4_tos	ipv4_metric	ipv4_replace	ipv4_delete	ipv4_plen	ipv4_replay	ipv4_flush	ipv4_error_path	ipv4_delete_fail	ipv6_add	ipv6_metric	ipv6_append_single	ipv6_replace_single	ipv6_metric_multipath	ipv6_append_multipath	ipv6_replace_multipath	ipv6_append_multipath_to_single	ipv6_delete_single	ipv6_delete_multipath	ipv6_replay_single	ipv6_replay_multipath	ipv6_error_path	ipv6_delete_fail"NETDEVSIM_PATH=/sys/bus/netdevsim/DEV_ADDR=1337DEV=netdevsim${DEV_ADDR}SYSFS_NET_DIR=/sys/bus/netdevsim/devices/$DEV/net/DEBUGFS_DIR=/sys/kernel/debug/netdevsim/$DEV/NUM_NETIFS=0source $lib_dir/lib.shsource $lib_dir/fib_offload_lib.sh DEVLINK_DEV=source $lib_dir/devlink_lib.shDEVLINK_DEV=netdevsim/${DEV} ipv4_identical_routes(){	fib_ipv4_identical_routes_test "testns1"} ipv4_tos(){	fib_ipv4_tos_test "testns1"} ipv4_metric(){	fib_ipv4_metric_test "testns1"} ipv4_replace(){	fib_ipv4_replace_test "testns1"} ipv4_delete(){	fib_ipv4_delete_test "testns1"} ipv4_plen(){	fib_ipv4_plen_test "testns1"} ipv4_replay_metric(){	fib_ipv4_replay_metric_test "testns1" "$DEVLINK_DEV"} ipv4_replay_tos(){	fib_ipv4_replay_tos_test "testns1" "$DEVLINK_DEV"} ipv4_replay_plen(){	fib_ipv4_replay_plen_test "testns1" "$DEVLINK_DEV"} ipv4_replay(){	ipv4_replay_metric	ipv4_replay_tos	ipv4_replay_plen} ipv4_flush(){	fib_ipv4_flush_test "testns1"} ipv4_error_path_add(){	local lsb 	RET=0 	ip -n testns1 link add name dummy1 type dummy	ip -n testns1 link set dev dummy1 up 	devlink -N testns1 resource set $DEVLINK_DEV path IPv4/fib size 10	devlink -N testns1 dev reload $DEVLINK_DEV 	for lsb in $(seq 1 20); do		ip -n testns1 route add 192.0.2.${lsb}/32 dev dummy1 \			&> /dev/null	done 	log_test "IPv4 error path - add" 	ip -n testns1 link del dev dummy1} ipv4_error_path_replay(){	local lsb 	RET=0 	ip -n testns1 link add name dummy1 type dummy	ip -n testns1 link set dev dummy1 up 	devlink -N testns1 resource set $DEVLINK_DEV path IPv4/fib size 100	devlink -N testns1 dev reload $DEVLINK_DEV 	for lsb in $(seq 1 20); do		ip -n testns1 route add 192.0.2.${lsb}/32 dev dummy1	done 	devlink -N testns1 resource set $DEVLINK_DEV path IPv4/fib size 10	devlink -N testns1 dev reload $DEVLINK_DEV &> /dev/null 	log_test "IPv4 error path - replay" 	ip -n testns1 link del dev dummy1 	# Successfully reload after deleting all the routes.	devlink -N testns1 resource set $DEVLINK_DEV path IPv4/fib size 100	devlink -N testns1 dev reload $DEVLINK_DEV} ipv4_error_path(){	# Test the different error paths of the notifiers by limiting the size	# of the "IPv4/fib" resource.	ipv4_error_path_add	ipv4_error_path_replay} ipv4_delete_fail(){	RET=0 	echo "y" > $DEBUGFS_DIR/fib/fail_route_delete 	ip -n testns1 link add name dummy1 type dummy	ip -n testns1 link set dev dummy1 up 	ip -n testns1 route add 192.0.2.0/24 dev dummy1	ip -n testns1 route del 192.0.2.0/24 dev dummy1 &> /dev/null 	# We should not be able to delete the netdev if we are leaking a	# reference.	ip -n testns1 link del dev dummy1 	log_test "IPv4 route delete failure" 	echo "n" > $DEBUGFS_DIR/fib/fail_route_delete} ipv6_add(){	fib_ipv6_add_test "testns1"} ipv6_metric(){	fib_ipv6_metric_test "testns1"} ipv6_append_single(){	fib_ipv6_append_single_test "testns1"} ipv6_replace_single(){	fib_ipv6_replace_single_test "testns1"} ipv6_metric_multipath(){	fib_ipv6_metric_multipath_test "testns1"} ipv6_append_multipath(){	fib_ipv6_append_multipath_test "testns1"} ipv6_replace_multipath(){	fib_ipv6_replace_multipath_test "testns1"} ipv6_append_multipath_to_single(){	fib_ipv6_append_multipath_to_single_test "testns1"} ipv6_delete_single(){	fib_ipv6_delete_single_test "testns1"} ipv6_delete_multipath(){	fib_ipv6_delete_multipath_test "testns1"} ipv6_replay_single(){	fib_ipv6_replay_single_test "testns1" "$DEVLINK_DEV"} ipv6_replay_multipath(){	fib_ipv6_replay_multipath_test "testns1" "$DEVLINK_DEV"} ipv6_error_path_add_single(){	local lsb 	RET=0 	ip -n testns1 link add name dummy1 type dummy	ip -n testns1 link set dev dummy1 up 	devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 10	devlink -N testns1 dev reload $DEVLINK_DEV 	for lsb in $(seq 1 20); do		ip -n testns1 route add 2001:db8:1::${lsb}/128 dev dummy1 \			&> /dev/null	done 	log_test "IPv6 error path - add single" 	ip -n testns1 link del dev dummy1} ipv6_error_path_add_multipath(){	local lsb 	RET=0 	for i in $(seq 1 2); do		ip -n testns1 link add name dummy$i type dummy		ip -n testns1 link set dev dummy$i up		ip -n testns1 address add 2001:db8:$i::1/64 dev dummy$i	done 	devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 10	devlink -N testns1 dev reload $DEVLINK_DEV 	for lsb in $(seq 1 20); do		ip -n testns1 route add 2001:db8:10::${lsb}/128 \			nexthop via 2001:db8:1::2 dev dummy1 \			nexthop via 2001:db8:2::2 dev dummy2 &> /dev/null	done 	log_test "IPv6 error path - add multipath" 	for i in $(seq 1 2); do		ip -n testns1 link del dev dummy$i	done} ipv6_error_path_replay(){	local lsb 	RET=0 	ip -n testns1 link add name dummy1 type dummy	ip -n testns1 link set dev dummy1 up 	devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 100	devlink -N testns1 dev reload $DEVLINK_DEV 	for lsb in $(seq 1 20); do		ip -n testns1 route add 2001:db8:1::${lsb}/128 dev dummy1	done 	devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 10	devlink -N testns1 dev reload $DEVLINK_DEV &> /dev/null 	log_test "IPv6 error path - replay" 	ip -n testns1 link del dev dummy1 	# Successfully reload after deleting all the routes.	devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 100	devlink -N testns1 dev reload $DEVLINK_DEV} ipv6_error_path(){	# Test the different error paths of the notifiers by limiting the size	# of the "IPv6/fib" resource.	ipv6_error_path_add_single	ipv6_error_path_add_multipath	ipv6_error_path_replay} ipv6_delete_fail(){	RET=0 	echo "y" > $DEBUGFS_DIR/fib/fail_route_delete 	ip -n testns1 link add name dummy1 type dummy	ip -n testns1 link set dev dummy1 up 	ip -n testns1 route add 2001:db8:1::/64 dev dummy1	ip -n testns1 route del 2001:db8:1::/64 dev dummy1 &> /dev/null 	# We should not be able to delete the netdev if we are leaking a	# reference.	ip -n testns1 link del dev dummy1 	log_test "IPv6 route delete failure" 	echo "n" > $DEBUGFS_DIR/fib/fail_route_delete} fib_notify_on_flag_change_set(){	local notify=$1; shift 	ip netns exec testns1 sysctl -qw net.ipv4.fib_notify_on_flag_change=$notify	ip netns exec testns1 sysctl -qw net.ipv6.fib_notify_on_flag_change=$notify 	log_info "Set fib_notify_on_flag_change to $notify"} setup_prepare(){	local netdev 	modprobe netdevsim &> /dev/null 	echo "$DEV_ADDR 1" > ${NETDEVSIM_PATH}/new_device	while [ ! -d $SYSFS_NET_DIR ] ; do :; done 	ip netns add testns1	if [ $? -ne 0 ]; then		echo "Failed to add netns \"testns1\""		exit 1	fi 	devlink dev reload $DEVLINK_DEV netns testns1	if [ $? -ne 0 ]; then		echo "Failed to reload into netns \"testns1\""		exit 1	fi} cleanup(){	pre_cleanup	ip netns del testns1	echo "$DEV_ADDR" > ${NETDEVSIM_PATH}/del_device	modprobe -r netdevsim &> /dev/null} trap cleanup EXIT setup_prepare fib_notify_on_flag_change_set 1tests_run fib_notify_on_flag_change_set 0tests_run exit $EXIT_STATUS