#!/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
	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
"
NETDEVSIM_PATH=/sys/bus/netdevsim/
DEV_ADDR=1337
DEV=netdevsim${DEV_ADDR}
DEVLINK_DEV=netdevsim/${DEV}
SYSFS_NET_DIR=/sys/bus/netdevsim/devices/$DEV/net/
NUM_NETIFS=0
source $lib_dir/lib.sh
source $lib_dir/devlink_lib.sh
source $lib_dir/fib_offload_lib.sh

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
}

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
}

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

tests_run

exit $EXIT_STATUS
