18c2ecf20Sopenharmony_ci#!/bin/bash
28c2ecf20Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
38c2ecf20Sopenharmony_ci#
48c2ecf20Sopenharmony_ci# This test is for checking the FIB offload API. It makes use of netdevsim
58c2ecf20Sopenharmony_ci# which registers a listener to the FIB notification chain.
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_cilib_dir=$(dirname $0)/../../../net/forwarding
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ciALL_TESTS="
108c2ecf20Sopenharmony_ci	ipv4_identical_routes
118c2ecf20Sopenharmony_ci	ipv4_tos
128c2ecf20Sopenharmony_ci	ipv4_metric
138c2ecf20Sopenharmony_ci	ipv4_replace
148c2ecf20Sopenharmony_ci	ipv4_delete
158c2ecf20Sopenharmony_ci	ipv4_plen
168c2ecf20Sopenharmony_ci	ipv4_replay
178c2ecf20Sopenharmony_ci	ipv4_flush
188c2ecf20Sopenharmony_ci	ipv4_error_path
198c2ecf20Sopenharmony_ci	ipv6_add
208c2ecf20Sopenharmony_ci	ipv6_metric
218c2ecf20Sopenharmony_ci	ipv6_append_single
228c2ecf20Sopenharmony_ci	ipv6_replace_single
238c2ecf20Sopenharmony_ci	ipv6_metric_multipath
248c2ecf20Sopenharmony_ci	ipv6_append_multipath
258c2ecf20Sopenharmony_ci	ipv6_replace_multipath
268c2ecf20Sopenharmony_ci	ipv6_append_multipath_to_single
278c2ecf20Sopenharmony_ci	ipv6_delete_single
288c2ecf20Sopenharmony_ci	ipv6_delete_multipath
298c2ecf20Sopenharmony_ci	ipv6_replay_single
308c2ecf20Sopenharmony_ci	ipv6_replay_multipath
318c2ecf20Sopenharmony_ci	ipv6_error_path
328c2ecf20Sopenharmony_ci"
338c2ecf20Sopenharmony_ciNETDEVSIM_PATH=/sys/bus/netdevsim/
348c2ecf20Sopenharmony_ciDEV_ADDR=1337
358c2ecf20Sopenharmony_ciDEV=netdevsim${DEV_ADDR}
368c2ecf20Sopenharmony_ciDEVLINK_DEV=netdevsim/${DEV}
378c2ecf20Sopenharmony_ciSYSFS_NET_DIR=/sys/bus/netdevsim/devices/$DEV/net/
388c2ecf20Sopenharmony_ciNUM_NETIFS=0
398c2ecf20Sopenharmony_cisource $lib_dir/lib.sh
408c2ecf20Sopenharmony_cisource $lib_dir/devlink_lib.sh
418c2ecf20Sopenharmony_cisource $lib_dir/fib_offload_lib.sh
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_ciipv4_identical_routes()
448c2ecf20Sopenharmony_ci{
458c2ecf20Sopenharmony_ci	fib_ipv4_identical_routes_test "testns1"
468c2ecf20Sopenharmony_ci}
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_ciipv4_tos()
498c2ecf20Sopenharmony_ci{
508c2ecf20Sopenharmony_ci	fib_ipv4_tos_test "testns1"
518c2ecf20Sopenharmony_ci}
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ciipv4_metric()
548c2ecf20Sopenharmony_ci{
558c2ecf20Sopenharmony_ci	fib_ipv4_metric_test "testns1"
568c2ecf20Sopenharmony_ci}
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_ciipv4_replace()
598c2ecf20Sopenharmony_ci{
608c2ecf20Sopenharmony_ci	fib_ipv4_replace_test "testns1"
618c2ecf20Sopenharmony_ci}
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ciipv4_delete()
648c2ecf20Sopenharmony_ci{
658c2ecf20Sopenharmony_ci	fib_ipv4_delete_test "testns1"
668c2ecf20Sopenharmony_ci}
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_ciipv4_plen()
698c2ecf20Sopenharmony_ci{
708c2ecf20Sopenharmony_ci	fib_ipv4_plen_test "testns1"
718c2ecf20Sopenharmony_ci}
728c2ecf20Sopenharmony_ci
738c2ecf20Sopenharmony_ciipv4_replay_metric()
748c2ecf20Sopenharmony_ci{
758c2ecf20Sopenharmony_ci	fib_ipv4_replay_metric_test "testns1" "$DEVLINK_DEV"
768c2ecf20Sopenharmony_ci}
778c2ecf20Sopenharmony_ci
788c2ecf20Sopenharmony_ciipv4_replay_tos()
798c2ecf20Sopenharmony_ci{
808c2ecf20Sopenharmony_ci	fib_ipv4_replay_tos_test "testns1" "$DEVLINK_DEV"
818c2ecf20Sopenharmony_ci}
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_ciipv4_replay_plen()
848c2ecf20Sopenharmony_ci{
858c2ecf20Sopenharmony_ci	fib_ipv4_replay_plen_test "testns1" "$DEVLINK_DEV"
868c2ecf20Sopenharmony_ci}
878c2ecf20Sopenharmony_ci
888c2ecf20Sopenharmony_ciipv4_replay()
898c2ecf20Sopenharmony_ci{
908c2ecf20Sopenharmony_ci	ipv4_replay_metric
918c2ecf20Sopenharmony_ci	ipv4_replay_tos
928c2ecf20Sopenharmony_ci	ipv4_replay_plen
938c2ecf20Sopenharmony_ci}
948c2ecf20Sopenharmony_ci
958c2ecf20Sopenharmony_ciipv4_flush()
968c2ecf20Sopenharmony_ci{
978c2ecf20Sopenharmony_ci	fib_ipv4_flush_test "testns1"
988c2ecf20Sopenharmony_ci}
998c2ecf20Sopenharmony_ci
1008c2ecf20Sopenharmony_ciipv4_error_path_add()
1018c2ecf20Sopenharmony_ci{
1028c2ecf20Sopenharmony_ci	local lsb
1038c2ecf20Sopenharmony_ci
1048c2ecf20Sopenharmony_ci	RET=0
1058c2ecf20Sopenharmony_ci
1068c2ecf20Sopenharmony_ci	ip -n testns1 link add name dummy1 type dummy
1078c2ecf20Sopenharmony_ci	ip -n testns1 link set dev dummy1 up
1088c2ecf20Sopenharmony_ci
1098c2ecf20Sopenharmony_ci	devlink -N testns1 resource set $DEVLINK_DEV path IPv4/fib size 10
1108c2ecf20Sopenharmony_ci	devlink -N testns1 dev reload $DEVLINK_DEV
1118c2ecf20Sopenharmony_ci
1128c2ecf20Sopenharmony_ci	for lsb in $(seq 1 20); do
1138c2ecf20Sopenharmony_ci		ip -n testns1 route add 192.0.2.${lsb}/32 dev dummy1 \
1148c2ecf20Sopenharmony_ci			&> /dev/null
1158c2ecf20Sopenharmony_ci	done
1168c2ecf20Sopenharmony_ci
1178c2ecf20Sopenharmony_ci	log_test "IPv4 error path - add"
1188c2ecf20Sopenharmony_ci
1198c2ecf20Sopenharmony_ci	ip -n testns1 link del dev dummy1
1208c2ecf20Sopenharmony_ci}
1218c2ecf20Sopenharmony_ci
1228c2ecf20Sopenharmony_ciipv4_error_path_replay()
1238c2ecf20Sopenharmony_ci{
1248c2ecf20Sopenharmony_ci	local lsb
1258c2ecf20Sopenharmony_ci
1268c2ecf20Sopenharmony_ci	RET=0
1278c2ecf20Sopenharmony_ci
1288c2ecf20Sopenharmony_ci	ip -n testns1 link add name dummy1 type dummy
1298c2ecf20Sopenharmony_ci	ip -n testns1 link set dev dummy1 up
1308c2ecf20Sopenharmony_ci
1318c2ecf20Sopenharmony_ci	devlink -N testns1 resource set $DEVLINK_DEV path IPv4/fib size 100
1328c2ecf20Sopenharmony_ci	devlink -N testns1 dev reload $DEVLINK_DEV
1338c2ecf20Sopenharmony_ci
1348c2ecf20Sopenharmony_ci	for lsb in $(seq 1 20); do
1358c2ecf20Sopenharmony_ci		ip -n testns1 route add 192.0.2.${lsb}/32 dev dummy1
1368c2ecf20Sopenharmony_ci	done
1378c2ecf20Sopenharmony_ci
1388c2ecf20Sopenharmony_ci	devlink -N testns1 resource set $DEVLINK_DEV path IPv4/fib size 10
1398c2ecf20Sopenharmony_ci	devlink -N testns1 dev reload $DEVLINK_DEV &> /dev/null
1408c2ecf20Sopenharmony_ci
1418c2ecf20Sopenharmony_ci	log_test "IPv4 error path - replay"
1428c2ecf20Sopenharmony_ci
1438c2ecf20Sopenharmony_ci	ip -n testns1 link del dev dummy1
1448c2ecf20Sopenharmony_ci
1458c2ecf20Sopenharmony_ci	# Successfully reload after deleting all the routes.
1468c2ecf20Sopenharmony_ci	devlink -N testns1 resource set $DEVLINK_DEV path IPv4/fib size 100
1478c2ecf20Sopenharmony_ci	devlink -N testns1 dev reload $DEVLINK_DEV
1488c2ecf20Sopenharmony_ci}
1498c2ecf20Sopenharmony_ci
1508c2ecf20Sopenharmony_ciipv4_error_path()
1518c2ecf20Sopenharmony_ci{
1528c2ecf20Sopenharmony_ci	# Test the different error paths of the notifiers by limiting the size
1538c2ecf20Sopenharmony_ci	# of the "IPv4/fib" resource.
1548c2ecf20Sopenharmony_ci	ipv4_error_path_add
1558c2ecf20Sopenharmony_ci	ipv4_error_path_replay
1568c2ecf20Sopenharmony_ci}
1578c2ecf20Sopenharmony_ci
1588c2ecf20Sopenharmony_ciipv6_add()
1598c2ecf20Sopenharmony_ci{
1608c2ecf20Sopenharmony_ci	fib_ipv6_add_test "testns1"
1618c2ecf20Sopenharmony_ci}
1628c2ecf20Sopenharmony_ci
1638c2ecf20Sopenharmony_ciipv6_metric()
1648c2ecf20Sopenharmony_ci{
1658c2ecf20Sopenharmony_ci	fib_ipv6_metric_test "testns1"
1668c2ecf20Sopenharmony_ci}
1678c2ecf20Sopenharmony_ci
1688c2ecf20Sopenharmony_ciipv6_append_single()
1698c2ecf20Sopenharmony_ci{
1708c2ecf20Sopenharmony_ci	fib_ipv6_append_single_test "testns1"
1718c2ecf20Sopenharmony_ci}
1728c2ecf20Sopenharmony_ci
1738c2ecf20Sopenharmony_ciipv6_replace_single()
1748c2ecf20Sopenharmony_ci{
1758c2ecf20Sopenharmony_ci	fib_ipv6_replace_single_test "testns1"
1768c2ecf20Sopenharmony_ci}
1778c2ecf20Sopenharmony_ci
1788c2ecf20Sopenharmony_ciipv6_metric_multipath()
1798c2ecf20Sopenharmony_ci{
1808c2ecf20Sopenharmony_ci	fib_ipv6_metric_multipath_test "testns1"
1818c2ecf20Sopenharmony_ci}
1828c2ecf20Sopenharmony_ci
1838c2ecf20Sopenharmony_ciipv6_append_multipath()
1848c2ecf20Sopenharmony_ci{
1858c2ecf20Sopenharmony_ci	fib_ipv6_append_multipath_test "testns1"
1868c2ecf20Sopenharmony_ci}
1878c2ecf20Sopenharmony_ci
1888c2ecf20Sopenharmony_ciipv6_replace_multipath()
1898c2ecf20Sopenharmony_ci{
1908c2ecf20Sopenharmony_ci	fib_ipv6_replace_multipath_test "testns1"
1918c2ecf20Sopenharmony_ci}
1928c2ecf20Sopenharmony_ci
1938c2ecf20Sopenharmony_ciipv6_append_multipath_to_single()
1948c2ecf20Sopenharmony_ci{
1958c2ecf20Sopenharmony_ci	fib_ipv6_append_multipath_to_single_test "testns1"
1968c2ecf20Sopenharmony_ci}
1978c2ecf20Sopenharmony_ci
1988c2ecf20Sopenharmony_ciipv6_delete_single()
1998c2ecf20Sopenharmony_ci{
2008c2ecf20Sopenharmony_ci	fib_ipv6_delete_single_test "testns1"
2018c2ecf20Sopenharmony_ci}
2028c2ecf20Sopenharmony_ci
2038c2ecf20Sopenharmony_ciipv6_delete_multipath()
2048c2ecf20Sopenharmony_ci{
2058c2ecf20Sopenharmony_ci	fib_ipv6_delete_multipath_test "testns1"
2068c2ecf20Sopenharmony_ci}
2078c2ecf20Sopenharmony_ci
2088c2ecf20Sopenharmony_ciipv6_replay_single()
2098c2ecf20Sopenharmony_ci{
2108c2ecf20Sopenharmony_ci	fib_ipv6_replay_single_test "testns1" "$DEVLINK_DEV"
2118c2ecf20Sopenharmony_ci}
2128c2ecf20Sopenharmony_ci
2138c2ecf20Sopenharmony_ciipv6_replay_multipath()
2148c2ecf20Sopenharmony_ci{
2158c2ecf20Sopenharmony_ci	fib_ipv6_replay_multipath_test "testns1" "$DEVLINK_DEV"
2168c2ecf20Sopenharmony_ci}
2178c2ecf20Sopenharmony_ci
2188c2ecf20Sopenharmony_ciipv6_error_path_add_single()
2198c2ecf20Sopenharmony_ci{
2208c2ecf20Sopenharmony_ci	local lsb
2218c2ecf20Sopenharmony_ci
2228c2ecf20Sopenharmony_ci	RET=0
2238c2ecf20Sopenharmony_ci
2248c2ecf20Sopenharmony_ci	ip -n testns1 link add name dummy1 type dummy
2258c2ecf20Sopenharmony_ci	ip -n testns1 link set dev dummy1 up
2268c2ecf20Sopenharmony_ci
2278c2ecf20Sopenharmony_ci	devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 10
2288c2ecf20Sopenharmony_ci	devlink -N testns1 dev reload $DEVLINK_DEV
2298c2ecf20Sopenharmony_ci
2308c2ecf20Sopenharmony_ci	for lsb in $(seq 1 20); do
2318c2ecf20Sopenharmony_ci		ip -n testns1 route add 2001:db8:1::${lsb}/128 dev dummy1 \
2328c2ecf20Sopenharmony_ci			&> /dev/null
2338c2ecf20Sopenharmony_ci	done
2348c2ecf20Sopenharmony_ci
2358c2ecf20Sopenharmony_ci	log_test "IPv6 error path - add single"
2368c2ecf20Sopenharmony_ci
2378c2ecf20Sopenharmony_ci	ip -n testns1 link del dev dummy1
2388c2ecf20Sopenharmony_ci}
2398c2ecf20Sopenharmony_ci
2408c2ecf20Sopenharmony_ciipv6_error_path_add_multipath()
2418c2ecf20Sopenharmony_ci{
2428c2ecf20Sopenharmony_ci	local lsb
2438c2ecf20Sopenharmony_ci
2448c2ecf20Sopenharmony_ci	RET=0
2458c2ecf20Sopenharmony_ci
2468c2ecf20Sopenharmony_ci	for i in $(seq 1 2); do
2478c2ecf20Sopenharmony_ci		ip -n testns1 link add name dummy$i type dummy
2488c2ecf20Sopenharmony_ci		ip -n testns1 link set dev dummy$i up
2498c2ecf20Sopenharmony_ci		ip -n testns1 address add 2001:db8:$i::1/64 dev dummy$i
2508c2ecf20Sopenharmony_ci	done
2518c2ecf20Sopenharmony_ci
2528c2ecf20Sopenharmony_ci	devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 10
2538c2ecf20Sopenharmony_ci	devlink -N testns1 dev reload $DEVLINK_DEV
2548c2ecf20Sopenharmony_ci
2558c2ecf20Sopenharmony_ci	for lsb in $(seq 1 20); do
2568c2ecf20Sopenharmony_ci		ip -n testns1 route add 2001:db8:10::${lsb}/128 \
2578c2ecf20Sopenharmony_ci			nexthop via 2001:db8:1::2 dev dummy1 \
2588c2ecf20Sopenharmony_ci			nexthop via 2001:db8:2::2 dev dummy2 &> /dev/null
2598c2ecf20Sopenharmony_ci	done
2608c2ecf20Sopenharmony_ci
2618c2ecf20Sopenharmony_ci	log_test "IPv6 error path - add multipath"
2628c2ecf20Sopenharmony_ci
2638c2ecf20Sopenharmony_ci	for i in $(seq 1 2); do
2648c2ecf20Sopenharmony_ci		ip -n testns1 link del dev dummy$i
2658c2ecf20Sopenharmony_ci	done
2668c2ecf20Sopenharmony_ci}
2678c2ecf20Sopenharmony_ci
2688c2ecf20Sopenharmony_ciipv6_error_path_replay()
2698c2ecf20Sopenharmony_ci{
2708c2ecf20Sopenharmony_ci	local lsb
2718c2ecf20Sopenharmony_ci
2728c2ecf20Sopenharmony_ci	RET=0
2738c2ecf20Sopenharmony_ci
2748c2ecf20Sopenharmony_ci	ip -n testns1 link add name dummy1 type dummy
2758c2ecf20Sopenharmony_ci	ip -n testns1 link set dev dummy1 up
2768c2ecf20Sopenharmony_ci
2778c2ecf20Sopenharmony_ci	devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 100
2788c2ecf20Sopenharmony_ci	devlink -N testns1 dev reload $DEVLINK_DEV
2798c2ecf20Sopenharmony_ci
2808c2ecf20Sopenharmony_ci	for lsb in $(seq 1 20); do
2818c2ecf20Sopenharmony_ci		ip -n testns1 route add 2001:db8:1::${lsb}/128 dev dummy1
2828c2ecf20Sopenharmony_ci	done
2838c2ecf20Sopenharmony_ci
2848c2ecf20Sopenharmony_ci	devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 10
2858c2ecf20Sopenharmony_ci	devlink -N testns1 dev reload $DEVLINK_DEV &> /dev/null
2868c2ecf20Sopenharmony_ci
2878c2ecf20Sopenharmony_ci	log_test "IPv6 error path - replay"
2888c2ecf20Sopenharmony_ci
2898c2ecf20Sopenharmony_ci	ip -n testns1 link del dev dummy1
2908c2ecf20Sopenharmony_ci
2918c2ecf20Sopenharmony_ci	# Successfully reload after deleting all the routes.
2928c2ecf20Sopenharmony_ci	devlink -N testns1 resource set $DEVLINK_DEV path IPv6/fib size 100
2938c2ecf20Sopenharmony_ci	devlink -N testns1 dev reload $DEVLINK_DEV
2948c2ecf20Sopenharmony_ci}
2958c2ecf20Sopenharmony_ci
2968c2ecf20Sopenharmony_ciipv6_error_path()
2978c2ecf20Sopenharmony_ci{
2988c2ecf20Sopenharmony_ci	# Test the different error paths of the notifiers by limiting the size
2998c2ecf20Sopenharmony_ci	# of the "IPv6/fib" resource.
3008c2ecf20Sopenharmony_ci	ipv6_error_path_add_single
3018c2ecf20Sopenharmony_ci	ipv6_error_path_add_multipath
3028c2ecf20Sopenharmony_ci	ipv6_error_path_replay
3038c2ecf20Sopenharmony_ci}
3048c2ecf20Sopenharmony_ci
3058c2ecf20Sopenharmony_cisetup_prepare()
3068c2ecf20Sopenharmony_ci{
3078c2ecf20Sopenharmony_ci	local netdev
3088c2ecf20Sopenharmony_ci
3098c2ecf20Sopenharmony_ci	modprobe netdevsim &> /dev/null
3108c2ecf20Sopenharmony_ci
3118c2ecf20Sopenharmony_ci	echo "$DEV_ADDR 1" > ${NETDEVSIM_PATH}/new_device
3128c2ecf20Sopenharmony_ci	while [ ! -d $SYSFS_NET_DIR ] ; do :; done
3138c2ecf20Sopenharmony_ci
3148c2ecf20Sopenharmony_ci	ip netns add testns1
3158c2ecf20Sopenharmony_ci	if [ $? -ne 0 ]; then
3168c2ecf20Sopenharmony_ci		echo "Failed to add netns \"testns1\""
3178c2ecf20Sopenharmony_ci		exit 1
3188c2ecf20Sopenharmony_ci	fi
3198c2ecf20Sopenharmony_ci
3208c2ecf20Sopenharmony_ci	devlink dev reload $DEVLINK_DEV netns testns1
3218c2ecf20Sopenharmony_ci	if [ $? -ne 0 ]; then
3228c2ecf20Sopenharmony_ci		echo "Failed to reload into netns \"testns1\""
3238c2ecf20Sopenharmony_ci		exit 1
3248c2ecf20Sopenharmony_ci	fi
3258c2ecf20Sopenharmony_ci}
3268c2ecf20Sopenharmony_ci
3278c2ecf20Sopenharmony_cicleanup()
3288c2ecf20Sopenharmony_ci{
3298c2ecf20Sopenharmony_ci	pre_cleanup
3308c2ecf20Sopenharmony_ci	ip netns del testns1
3318c2ecf20Sopenharmony_ci	echo "$DEV_ADDR" > ${NETDEVSIM_PATH}/del_device
3328c2ecf20Sopenharmony_ci	modprobe -r netdevsim &> /dev/null
3338c2ecf20Sopenharmony_ci}
3348c2ecf20Sopenharmony_ci
3358c2ecf20Sopenharmony_citrap cleanup EXIT
3368c2ecf20Sopenharmony_ci
3378c2ecf20Sopenharmony_cisetup_prepare
3388c2ecf20Sopenharmony_ci
3398c2ecf20Sopenharmony_citests_run
3408c2ecf20Sopenharmony_ci
3418c2ecf20Sopenharmony_ciexit $EXIT_STATUS
342