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

#   +---------------------+                             +---------------------+
#   | H1                  |                             |                  H2 |
#   |     + $h1           |                             |           $h2 +     |
#   |     | 192.0.2.1/28  |                             |  192.0.2.2/28 |     |
#   +-----|---------------+                             +---------------|-----+
#         |                                                             |
#   +-----|-------------------------------------------------------------|-----+
#   | SW  o--> mirror                                                   |     |
#   | +---|-------------------------------------------------------------|---+ |
#   | |   + $swp1                    BR                           $swp2 +   | |
#   | +---------------------------------------------------------------------+ |
#   |                                                                         |
#   | +---------------------------------------------------------------------+ |
#   | | OL                      + gt6 (ip6gretap)      + gt4 (gretap)       | |
#   | |                         : loc=2001:db8:2::1    : loc=192.0.2.129    | |
#   | |                         : rem=2001:db8:2::2    : rem=192.0.2.130    | |
#   | |                         : ttl=100              : ttl=100            | |
#   | |                         : tos=inherit          : tos=inherit        | |
#   | +-------------------------:--|-------------------:--|-----------------+ |
#   |                           :  |                   :  |                   |
#   | +-------------------------:--|-------------------:--|-----------------+ |
#   | | UL                      :  |,---------------------'                 | |
#   | |   + $swp3               :  ||                  :                    | |
#   | |   | 192.0.2.129/28      :  vv                  :                    | |
#   | |   | 2001:db8:2::1/64    :  + ul (dummy)        :                    | |
#   | +---|---------------------:----------------------:--------------------+ |
#   +-----|---------------------:----------------------:----------------------+
#         |                     :                      :
#   +-----|---------------------:----------------------:----------------------+
#   | H3  + $h3                 + h3-gt6 (ip6gretap)   + h3-gt4 (gretap)      |
#   |       192.0.2.130/28        loc=2001:db8:2::2      loc=192.0.2.130      |
#   |       2001:db8:2::2/64      rem=2001:db8:2::1      rem=192.0.2.129      |
#   |                             ttl=100                ttl=100              |
#   |                             tos=inherit            tos=inherit          |
#   |                                                                         |
#   +-------------------------------------------------------------------------+
#
# This tests mirroring to gretap and ip6gretap configured in an overlay /
# underlay manner, i.e. with a bound dummy device that marks underlay VRF where
# the encapsulated packed should be routed.

ALL_TESTS="
	test_gretap
	test_ip6gretap
"

NUM_NETIFS=6
source lib.sh
source mirror_lib.sh
source mirror_gre_lib.sh

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
}

h3_create()
{
	simple_if_init $h3 192.0.2.130/28 2001:db8:2::2/64

	tunnel_create h3-gt4 gretap 192.0.2.130 192.0.2.129
	ip link set h3-gt4 vrf v$h3
	matchall_sink_create h3-gt4

	tunnel_create h3-gt6 ip6gretap 2001:db8:2::2 2001:db8:2::1
	ip link set h3-gt6 vrf v$h3
	matchall_sink_create h3-gt6
}

h3_destroy()
{
	tunnel_destroy h3-gt6
	tunnel_destroy h3-gt4

	simple_if_fini $h3 192.0.2.130/28 2001:db8:2::2/64
}

switch_create()
{
	# Bridge between H1 and H2.

	ip link add name br1 type bridge vlan_filtering 1
	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

	# Underlay.

	simple_if_init $swp3 192.0.2.129/28 2001:db8:2::1/64

	ip link add name ul type dummy
	ip link set dev ul master v$swp3
	ip link set dev ul up

	# Overlay.

	vrf_create vrf-ol
	ip link set dev vrf-ol up

	tunnel_create gt4 gretap 192.0.2.129 192.0.2.130 \
		      ttl 100 tos inherit dev ul
	ip link set dev gt4 master vrf-ol
	ip link set dev gt4 up

	tunnel_create gt6 ip6gretap 2001:db8:2::1 2001:db8:2::2 \
		      ttl 100 tos inherit dev ul allow-localremote
	ip link set dev gt6 master vrf-ol
	ip link set dev gt6 up
}

switch_destroy()
{
	vrf_destroy vrf-ol

	tunnel_destroy gt6
	tunnel_destroy gt4

	simple_if_fini $swp3 192.0.2.129/28 2001:db8:2::1/64

	ip link del dev ul

	tc qdisc del dev $swp1 clsact

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

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

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

	swp3=${NETIFS[p5]}
	h3=${NETIFS[p6]}

	vrf_prepare

	h1_create
	h2_create
	h3_create

	switch_create
}

cleanup()
{
	pre_cleanup

	switch_destroy

	h3_destroy
	h2_destroy
	h1_destroy

	vrf_cleanup
}

test_gretap()
{
	full_test_span_gre_dir gt4 ingress 8 0 "mirror to gretap w/ UL"
	full_test_span_gre_dir gt4 egress  0 8 "mirror to gretap w/ UL"
}

test_ip6gretap()
{
	full_test_span_gre_dir gt6 ingress 8 0 "mirror to ip6gretap w/ UL"
	full_test_span_gre_dir gt6 egress  0 8 "mirror to ip6gretap w/ UL"
}

test_all()
{
	RET=0

	slow_path_trap_install $swp1 ingress
	slow_path_trap_install $swp1 egress

	tests_run

	slow_path_trap_uninstall $swp1 egress
	slow_path_trap_uninstall $swp1 ingress
}

trap cleanup EXIT

setup_prepare
setup_wait

tcflags="skip_hw"
test_all

if ! tc_offload_check; then
	echo "WARN: Could not test offloaded functionality"
else
	tcflags="skip_sw"
	test_all
fi

exit $EXIT_STATUS
