# SPDX-License-Identifier: GPL-2.0

TC_POLICE_NUM_NETIFS=2

tc_police_h1_create()
{
	simple_if_init $h1
}

tc_police_h1_destroy()
{
	simple_if_fini $h1
}

tc_police_switch_create()
{
	simple_if_init $swp1
	tc qdisc add dev $swp1 clsact
}

tc_police_switch_destroy()
{
	tc qdisc del dev $swp1 clsact
	simple_if_fini $swp1
}

tc_police_addr()
{
       local num=$1; shift

       printf "2001:db8:1::%x" $num
}

tc_police_rules_create()
{
	local count=$1; shift
	local should_fail=$1; shift

	TC_POLICE_BATCH_FILE="$(mktemp)"

	for ((i = 0; i < count; ++i)); do
		cat >> $TC_POLICE_BATCH_FILE <<-EOF
			filter add dev $swp1 ingress \
				prot ipv6 \
				pref 1000 \
				flower skip_sw dst_ip $(tc_police_addr $i) \
				action police rate 10mbit burst 100k \
				conform-exceed drop/ok
		EOF
	done

	tc -b $TC_POLICE_BATCH_FILE
	check_err_fail $should_fail $? "Rule insertion"
}

__tc_police_test()
{
	local count=$1; shift
	local should_fail=$1; shift

	tc_police_rules_create $count $should_fail

	offload_count=$(tc filter show dev $swp1 ingress | grep in_hw | wc -l)
	((offload_count == count))
	check_err_fail $should_fail $? "tc police offload count"
}

tc_police_test()
{
	local count=$1; shift
	local should_fail=$1; shift

	if ! tc_offload_check $TC_POLICE_NUM_NETIFS; then
		check_err 1 "Could not test offloaded functionality"
		return
	fi

	__tc_police_test $count $should_fail
}

tc_police_setup_prepare()
{
	h1=${NETIFS[p1]}
	swp1=${NETIFS[p2]}

	vrf_prepare

	tc_police_h1_create
	tc_police_switch_create
}

tc_police_cleanup()
{
	pre_cleanup

	tc_police_switch_destroy
	tc_police_h1_destroy

	vrf_cleanup
}
