135388a6aSPetr Machata#!/bin/bash
235388a6aSPetr Machata# SPDX-License-Identifier: GPL-2.0
335388a6aSPetr Machata
435388a6aSPetr Machata# This test uses standard topology for testing mirroring. See mirror_topo_lib.sh
535388a6aSPetr Machata# for more details.
635388a6aSPetr Machata#
735388a6aSPetr Machata# Test for "tc action mirred egress mirror" that mirrors to a vlan device.
835388a6aSPetr Machata
935388a6aSPetr MachataALL_TESTS="
1035388a6aSPetr Machata	test_vlan
1135388a6aSPetr Machata	test_tagged_vlan
1235388a6aSPetr Machata"
1335388a6aSPetr Machata
1435388a6aSPetr MachataNUM_NETIFS=6
1535388a6aSPetr Machatasource lib.sh
1635388a6aSPetr Machatasource mirror_lib.sh
1735388a6aSPetr Machatasource mirror_topo_lib.sh
1835388a6aSPetr Machata
1935388a6aSPetr Machatasetup_prepare()
2035388a6aSPetr Machata{
2135388a6aSPetr Machata	h1=${NETIFS[p1]}
2235388a6aSPetr Machata	swp1=${NETIFS[p2]}
2335388a6aSPetr Machata
2435388a6aSPetr Machata	swp2=${NETIFS[p3]}
2535388a6aSPetr Machata	h2=${NETIFS[p4]}
2635388a6aSPetr Machata
2735388a6aSPetr Machata	swp3=${NETIFS[p5]}
2835388a6aSPetr Machata	h3=${NETIFS[p6]}
2935388a6aSPetr Machata
3035388a6aSPetr Machata	vrf_prepare
3135388a6aSPetr Machata	mirror_topo_create
3235388a6aSPetr Machata
3335388a6aSPetr Machata	vlan_create $swp3 555
3435388a6aSPetr Machata
3535388a6aSPetr Machata	vlan_create $h3 555 v$h3
3635388a6aSPetr Machata	matchall_sink_create $h3.555
3735388a6aSPetr Machata
3835388a6aSPetr Machata	vlan_create $h1 111 v$h1 192.0.2.17/28
3935388a6aSPetr Machata	bridge vlan add dev $swp1 vid 111
4035388a6aSPetr Machata
4135388a6aSPetr Machata	vlan_create $h2 111 v$h2 192.0.2.18/28
4235388a6aSPetr Machata	bridge vlan add dev $swp2 vid 111
4335388a6aSPetr Machata}
4435388a6aSPetr Machata
4535388a6aSPetr Machatacleanup()
4635388a6aSPetr Machata{
4735388a6aSPetr Machata	pre_cleanup
4835388a6aSPetr Machata
4935388a6aSPetr Machata	vlan_destroy $h2 111
5035388a6aSPetr Machata	vlan_destroy $h1 111
5135388a6aSPetr Machata	vlan_destroy $h3 555
5235388a6aSPetr Machata	vlan_destroy $swp3 555
5335388a6aSPetr Machata
5435388a6aSPetr Machata	mirror_topo_destroy
5535388a6aSPetr Machata	vrf_cleanup
5635388a6aSPetr Machata}
5735388a6aSPetr Machata
5835388a6aSPetr Machatatest_vlan_dir()
5935388a6aSPetr Machata{
6035388a6aSPetr Machata	local direction=$1; shift
6135388a6aSPetr Machata	local forward_type=$1; shift
6235388a6aSPetr Machata	local backward_type=$1; shift
6335388a6aSPetr Machata
6435388a6aSPetr Machata	RET=0
6535388a6aSPetr Machata
6635388a6aSPetr Machata	mirror_install $swp1 $direction $swp3.555 "matchall $tcflags"
6735388a6aSPetr Machata	test_span_dir "$h3.555" "$direction" "$forward_type" "$backward_type"
6835388a6aSPetr Machata	mirror_uninstall $swp1 $direction
6935388a6aSPetr Machata
7035388a6aSPetr Machata	log_test "$direction mirror to vlan ($tcflags)"
7135388a6aSPetr Machata}
7235388a6aSPetr Machata
7335388a6aSPetr Machatatest_vlan()
7435388a6aSPetr Machata{
7535388a6aSPetr Machata	test_vlan_dir ingress 8 0
7635388a6aSPetr Machata	test_vlan_dir egress 0 8
7735388a6aSPetr Machata}
7835388a6aSPetr Machata
7935388a6aSPetr Machatatest_tagged_vlan_dir()
8035388a6aSPetr Machata{
8135388a6aSPetr Machata	local direction=$1; shift
8235388a6aSPetr Machata	local forward_type=$1; shift
8335388a6aSPetr Machata	local backward_type=$1; shift
8435388a6aSPetr Machata
8535388a6aSPetr Machata	RET=0
8635388a6aSPetr Machata
8735388a6aSPetr Machata	mirror_install $swp1 $direction $swp3.555 "matchall $tcflags"
88*af0a5111SPetr Machata	do_test_span_vlan_dir_ips 10 "$h3.555" 111 "$direction" ip \
8935388a6aSPetr Machata				  192.0.2.17 192.0.2.18
90*af0a5111SPetr Machata	do_test_span_vlan_dir_ips  0 "$h3.555" 555 "$direction" ip \
9135388a6aSPetr Machata				  192.0.2.17 192.0.2.18
9235388a6aSPetr Machata	mirror_uninstall $swp1 $direction
9335388a6aSPetr Machata
946ebe5a7aSPetr Machata	log_test "$direction mirror tagged to vlan ($tcflags)"
9535388a6aSPetr Machata}
9635388a6aSPetr Machata
9735388a6aSPetr Machatatest_tagged_vlan()
9835388a6aSPetr Machata{
9935388a6aSPetr Machata	test_tagged_vlan_dir ingress 8 0
10035388a6aSPetr Machata	test_tagged_vlan_dir egress 0 8
10135388a6aSPetr Machata}
10235388a6aSPetr Machata
10335388a6aSPetr Machatatest_all()
10435388a6aSPetr Machata{
10535388a6aSPetr Machata	slow_path_trap_install $swp1 ingress
10635388a6aSPetr Machata	slow_path_trap_install $swp1 egress
10735388a6aSPetr Machata	trap_install $h3 ingress
10835388a6aSPetr Machata
10935388a6aSPetr Machata	tests_run
11035388a6aSPetr Machata
11100d56229SPetr Machata	trap_uninstall $h3 ingress
11235388a6aSPetr Machata	slow_path_trap_uninstall $swp1 egress
11335388a6aSPetr Machata	slow_path_trap_uninstall $swp1 ingress
11435388a6aSPetr Machata}
11535388a6aSPetr Machata
11635388a6aSPetr Machatatrap cleanup EXIT
11735388a6aSPetr Machata
11835388a6aSPetr Machatasetup_prepare
11935388a6aSPetr Machatasetup_wait
12035388a6aSPetr Machata
12135388a6aSPetr Machatatcflags="skip_hw"
12235388a6aSPetr Machatatest_all
12335388a6aSPetr Machata
12435388a6aSPetr Machataif ! tc_offload_check; then
12535388a6aSPetr Machata	echo "WARN: Could not test offloaded functionality"
12635388a6aSPetr Machataelse
12735388a6aSPetr Machata	tcflags="skip_sw"
12835388a6aSPetr Machata	test_all
12935388a6aSPetr Machatafi
13035388a6aSPetr Machata
13135388a6aSPetr Machataexit $EXIT_STATUS
132