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

# This test sends traffic from H1 to H2. Either on ingress of $swp1, or on
# egress of $swp2, the traffic is acted upon by an action skbedit priority. The
# new priority should be taken into account when classifying traffic on the PRIO
# qdisc at $swp2. The test verifies that for different priority values, the
# traffic ends up in expected PRIO band.
#
# +----------------------+                             +----------------------+
# | H1                   |                             |                   H2 |
# |    + $h1             |                             |            $h2 +     |
# |    | 192.0.2.1/28    |                             |   192.0.2.2/28 |     |
# +----|-----------------+                             +----------------|-----+
#      |                                                                |
# +----|----------------------------------------------------------------|-----+
# | SW |                                                                |     |
# |  +-|----------------------------------------------------------------|-+   |
# |  | + $swp1                       BR                           $swp2 + |   |
# |  |                                                             PRIO   |   |
# |  +--------------------------------------------------------------------+   |
# +---------------------------------------------------------------------------+

ALL_TESTS="
	ping_ipv4
	test_ingress
	test_egress
"

NUM_NETIFS=4
source lib.sh

: ${HIT_TIMEOUT:=2000} # ms

h1_create()
{
	simple_if_init $h1 192.0.2.1/28
}

h1_destroy()
{
	simple_if_fini $h1 192.0.2.1/28
}

h2_create()
{
	simple_if_init $h2 192.0.2.2/28
}

h2_destroy()
{
	simple_if_fini $h2 192.0.2.2/28
}

switch_create()
{
	ip link add name br1 type bridge vlan_filtering 1
	ip link set dev br1 addrgenmode none
	ip link set dev br1 up
	ip link set dev $swp1 master br1
	ip link set dev $swp1 up
	ip link set dev $swp2 master br1
	ip link set dev $swp2 up

	tc qdisc add dev $swp1 clsact
	tc qdisc add dev $swp2 clsact
	tc qdisc add dev $swp2 root handle 10: \
	   prio bands 8 priomap 7 6 5 4 3 2 1 0
}

switch_destroy()
{
	tc qdisc del dev $swp2 root
	tc qdisc del dev $swp2 clsact
	tc qdisc del dev $swp1 clsact

	ip link set dev $swp2 down
	ip link set dev $swp2 nomaster
	ip link set dev $swp1 down
	ip link set dev $swp1 nomaster
	ip link del dev br1
}

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

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

	h2mac=$(mac_get $h2)

	vrf_prepare
	h1_create
	h2_create
	switch_create
}

cleanup()
{
	pre_cleanup

	switch_destroy
	h2_destroy
	h1_destroy
	vrf_cleanup
}

ping_ipv4()
{
	ping_test $h1 192.0.2.2
}

test_skbedit_priority_one()
{
	local locus=$1; shift
	local prio=$1; shift
	local classid=$1; shift

	RET=0

	tc filter add $locus handle 101 pref 1 \
	   flower action skbedit priority $prio

	local pkt0=$(qdisc_parent_stats_get $swp2 $classid .packets)
	local pkt2=$(tc_rule_handle_stats_get "$locus" 101)
	$MZ $h1 -t udp "sp=54321,dp=12345" -c 10 -d 20msec -p 100 \
	    -a own -b $h2mac -A 192.0.2.1 -B 192.0.2.2 -q

	local pkt1
	pkt1=$(busywait "$HIT_TIMEOUT" until_counter_is ">= $((pkt0 + 10))" \
			qdisc_parent_stats_get $swp2 $classid .packets)
	check_err $? "Expected to get 10 packets on class $classid, but got $((pkt1 - pkt0))."

	local pkt3=$(tc_rule_handle_stats_get "$locus" 101)
	((pkt3 >= pkt2 + 10))
	check_err $? "Expected to get 10 packets on skbedit rule but got $((pkt3 - pkt2))."

	log_test "$locus skbedit priority $prio -> classid $classid"

	tc filter del $locus pref 1
}

test_ingress()
{
	local prio

	for prio in {0..7}; do
		test_skbedit_priority_one "dev $swp1 ingress" \
					  $prio 10:$((8 - prio))
	done
}

test_egress()
{
	local prio

	for prio in {0..7}; do
		test_skbedit_priority_one "dev $swp2 egress" \
					  $prio 10:$((8 - prio))
	done
}

trap cleanup EXIT

setup_prepare
setup_wait

tests_run

exit $EXIT_STATUS
