#!/bin/bash
# SPDX-License-Identifier: GPL-2.0

ROUTER_NUM_NETIFS=4

router_h1_create()
{
	simple_if_init $h1 192.0.1.1/24
	ip route add 193.0.0.0/8 via 192.0.1.2 dev $h1
}

router_h1_destroy()
{
	ip route del 193.0.0.0/8 via 192.0.1.2 dev $h1
	simple_if_fini $h1 192.0.1.1/24
}

router_h2_create()
{
	simple_if_init $h2 192.0.2.1/24
	tc qdisc add dev $h2 handle ffff: ingress
}

router_h2_destroy()
{
	tc qdisc del dev $h2 handle ffff: ingress
	simple_if_fini $h2 192.0.2.1/24
}

router_create()
{
	ip link set dev $rp1 up
	ip link set dev $rp2 up

	ip address add 192.0.1.2/24 dev $rp1
	ip address add 192.0.2.2/24 dev $rp2
}

router_destroy()
{
	ip address del 192.0.2.2/24 dev $rp2
	ip address del 192.0.1.2/24 dev $rp1

	ip link set dev $rp2 down
	ip link set dev $rp1 down
}

router_setup_prepare()
{
	h1=${NETIFS[p1]}
	rp1=${NETIFS[p2]}

	rp2=${NETIFS[p3]}
	h2=${NETIFS[p4]}

	h1mac=$(mac_get $h1)
	rp1mac=$(mac_get $rp1)

	vrf_prepare

	router_h1_create
	router_h2_create

	router_create
}

router_offload_validate()
{
	local route_count=$1
	local offloaded_count

	offloaded_count=$(ip route | grep -o 'offload' | wc -l)
	[[ $offloaded_count -ge $route_count ]]
}

router_routes_create()
{
	local route_count=$1
	local count=0

	ROUTE_FILE="$(mktemp)"

	for i in {0..255}
	do
		for j in {0..255}
		do
			for k in {0..255}
			do
				if [[ $count -eq $route_count ]]; then
					break 3
				fi

				echo route add 193.${i}.${j}.${k}/32 via \
				       192.0.2.1 dev $rp2  >> $ROUTE_FILE
				((count++))
			done
		done
	done

	ip -b $ROUTE_FILE &> /dev/null
}

router_routes_destroy()
{
	if [[ -v ROUTE_FILE ]]; then
		rm -f $ROUTE_FILE
	fi
}

router_test()
{
	local route_count=$1
	local should_fail=$2
	local count=0

	RET=0

	router_routes_create $route_count

	router_offload_validate $route_count
	check_err_fail $should_fail $? "Offload of $route_count routes"
	if [[ $RET -ne 0 ]] || [[ $should_fail -eq 1 ]]; then
		return
	fi

	tc filter add dev $h2 ingress protocol ip pref 1 flower \
		skip_sw dst_ip 193.0.0.0/8 action drop

	for i in {0..255}
	do
		for j in {0..255}
		do
			for k in {0..255}
			do
				if [[ $count -eq $route_count ]]; then
					break 3
				fi

				$MZ $h1 -c 1 -p 64 -a $h1mac -b $rp1mac \
					-A 192.0.1.1 -B 193.${i}.${j}.${k} \
					-t ip -q
				((count++))
			done
		done
	done

	tc_check_packets "dev $h2 ingress" 1 $route_count
	check_err $? "Offload mismatch"

	tc filter del dev $h2 ingress protocol ip pref 1 flower \
		skip_sw dst_ip 193.0.0.0/8 action drop

	router_routes_destroy
}

router_cleanup()
{
	pre_cleanup

	router_routes_destroy
	router_destroy

	router_h2_destroy
	router_h1_destroy

	vrf_cleanup
}
