145315673SPetr Machata#!/bin/bash
245315673SPetr Machata# SPDX-License-Identifier: GPL-2.0
345315673SPetr Machata
445315673SPetr Machata# This test uses standard topology for testing gretap. See
545315673SPetr Machata# mirror_gre_topo_lib.sh for more details.
645315673SPetr Machata#
745315673SPetr Machata# Test how mirrors to gretap and ip6gretap react to changes to relevant
845315673SPetr Machata# configuration.
945315673SPetr Machata
100eb8053cSIdo SchimmelALL_TESTS="
110eb8053cSIdo Schimmel	test_ttl
120eb8053cSIdo Schimmel	test_tun_up
130eb8053cSIdo Schimmel	test_egress_up
140eb8053cSIdo Schimmel	test_remote_ip
156b45432dSPetr Machata	test_tun_del
1677a8df38SPetr Machata	test_route_del
170eb8053cSIdo Schimmel"
180eb8053cSIdo Schimmel
1945315673SPetr MachataNUM_NETIFS=6
2045315673SPetr Machatasource lib.sh
2145315673SPetr Machatasource mirror_lib.sh
2245315673SPetr Machatasource mirror_gre_lib.sh
2345315673SPetr Machatasource mirror_gre_topo_lib.sh
2445315673SPetr Machata
2545315673SPetr Machatasetup_prepare()
2645315673SPetr Machata{
2745315673SPetr Machata	h1=${NETIFS[p1]}
2845315673SPetr Machata	swp1=${NETIFS[p2]}
2945315673SPetr Machata
3045315673SPetr Machata	swp2=${NETIFS[p3]}
3145315673SPetr Machata	h2=${NETIFS[p4]}
3245315673SPetr Machata
3345315673SPetr Machata	swp3=${NETIFS[p5]}
3445315673SPetr Machata	h3=${NETIFS[p6]}
3545315673SPetr Machata
3645315673SPetr Machata	vrf_prepare
3745315673SPetr Machata	mirror_gre_topo_create
3845315673SPetr Machata
3945315673SPetr Machata	# This test downs $swp3, which deletes the configured IPv6 address
4045315673SPetr Machata	# unless this sysctl is set.
41d51d10aaSPetr Machata	sysctl_set net.ipv6.conf.$swp3.keep_addr_on_down 1
4245315673SPetr Machata
4345315673SPetr Machata	ip address add dev $swp3 192.0.2.129/28
4445315673SPetr Machata	ip address add dev $h3 192.0.2.130/28
4545315673SPetr Machata
4645315673SPetr Machata	ip address add dev $swp3 2001:db8:2::1/64
4745315673SPetr Machata	ip address add dev $h3 2001:db8:2::2/64
4845315673SPetr Machata}
4945315673SPetr Machata
5045315673SPetr Machatacleanup()
5145315673SPetr Machata{
5245315673SPetr Machata	pre_cleanup
5345315673SPetr Machata
5445315673SPetr Machata	ip address del dev $h3 2001:db8:2::2/64
5545315673SPetr Machata	ip address del dev $swp3 2001:db8:2::1/64
5645315673SPetr Machata
5745315673SPetr Machata	ip address del dev $h3 192.0.2.130/28
5845315673SPetr Machata	ip address del dev $swp3 192.0.2.129/28
5945315673SPetr Machata
60d51d10aaSPetr Machata	sysctl_restore net.ipv6.conf.$swp3.keep_addr_on_down
6145315673SPetr Machata
6245315673SPetr Machata	mirror_gre_topo_destroy
6345315673SPetr Machata	vrf_cleanup
6445315673SPetr Machata}
6545315673SPetr Machata
6645315673SPetr Machatatest_span_gre_ttl()
6745315673SPetr Machata{
6845315673SPetr Machata	local tundev=$1; shift
6945315673SPetr Machata	local type=$1; shift
7045315673SPetr Machata	local prot=$1; shift
7145315673SPetr Machata	local what=$1; shift
7245315673SPetr Machata
7345315673SPetr Machata	RET=0
7445315673SPetr Machata
75*855067deSPetr Machata	mirror_install $swp1 ingress $tundev \
76*855067deSPetr Machata		"prot ip flower $tcflags ip_prot icmp"
7745315673SPetr Machata	tc filter add dev $h3 ingress pref 77 prot $prot \
78af0a5111SPetr Machata		flower skip_hw ip_ttl 50 action pass
7945315673SPetr Machata
8045315673SPetr Machata	mirror_test v$h1 192.0.2.1 192.0.2.2 $h3 77 0
8145315673SPetr Machata
8245315673SPetr Machata	ip link set dev $tundev type $type ttl 50
833dc178a9SPetr Machata	sleep 2
8445315673SPetr Machata	mirror_test v$h1 192.0.2.1 192.0.2.2 $h3 77 10
8545315673SPetr Machata
8645315673SPetr Machata	ip link set dev $tundev type $type ttl 100
8745315673SPetr Machata	tc filter del dev $h3 ingress pref 77
8845315673SPetr Machata	mirror_uninstall $swp1 ingress
8945315673SPetr Machata
9045315673SPetr Machata	log_test "$what: TTL change ($tcflags)"
9145315673SPetr Machata}
9245315673SPetr Machata
9345315673SPetr Machatatest_span_gre_tun_up()
9445315673SPetr Machata{
9545315673SPetr Machata	local tundev=$1; shift
9645315673SPetr Machata	local what=$1; shift
9745315673SPetr Machata
9845315673SPetr Machata	RET=0
9945315673SPetr Machata
10045315673SPetr Machata	ip link set dev $tundev down
10145315673SPetr Machata	mirror_install $swp1 ingress $tundev "matchall $tcflags"
10245315673SPetr Machata	fail_test_span_gre_dir $tundev ingress
10345315673SPetr Machata
10445315673SPetr Machata	ip link set dev $tundev up
10545315673SPetr Machata
10645315673SPetr Machata	quick_test_span_gre_dir $tundev ingress
10745315673SPetr Machata	mirror_uninstall $swp1 ingress
10845315673SPetr Machata
10945315673SPetr Machata	log_test "$what: tunnel down/up ($tcflags)"
11045315673SPetr Machata}
11145315673SPetr Machata
11245315673SPetr Machatatest_span_gre_egress_up()
11345315673SPetr Machata{
11445315673SPetr Machata	local tundev=$1; shift
11545315673SPetr Machata	local remote_ip=$1; shift
11645315673SPetr Machata	local what=$1; shift
11745315673SPetr Machata
11845315673SPetr Machata	RET=0
11945315673SPetr Machata
12045315673SPetr Machata	ip link set dev $swp3 down
12145315673SPetr Machata	mirror_install $swp1 ingress $tundev "matchall $tcflags"
12245315673SPetr Machata	fail_test_span_gre_dir $tundev ingress
12345315673SPetr Machata
12445315673SPetr Machata	# After setting the device up, wait for neighbor to get resolved so that
12545315673SPetr Machata	# we can expect mirroring to work.
12645315673SPetr Machata	ip link set dev $swp3 up
1274e74cc7cSPetr Machata	setup_wait_dev $swp3
1284e74cc7cSPetr Machata	ping -c 1 -I $swp3 $remote_ip &>/dev/null
12945315673SPetr Machata
13045315673SPetr Machata	quick_test_span_gre_dir $tundev ingress
13145315673SPetr Machata	mirror_uninstall $swp1 ingress
13245315673SPetr Machata
13345315673SPetr Machata	log_test "$what: egress down/up ($tcflags)"
13445315673SPetr Machata}
13545315673SPetr Machata
13645315673SPetr Machatatest_span_gre_remote_ip()
13745315673SPetr Machata{
13845315673SPetr Machata	local tundev=$1; shift
13945315673SPetr Machata	local type=$1; shift
14045315673SPetr Machata	local correct_ip=$1; shift
14145315673SPetr Machata	local wrong_ip=$1; shift
14245315673SPetr Machata	local what=$1; shift
14345315673SPetr Machata
14445315673SPetr Machata	RET=0
14545315673SPetr Machata
14645315673SPetr Machata	ip link set dev $tundev type $type remote $wrong_ip
14745315673SPetr Machata	mirror_install $swp1 ingress $tundev "matchall $tcflags"
14845315673SPetr Machata	fail_test_span_gre_dir $tundev ingress
14945315673SPetr Machata
15045315673SPetr Machata	ip link set dev $tundev type $type remote $correct_ip
15145315673SPetr Machata	quick_test_span_gre_dir $tundev ingress
15245315673SPetr Machata	mirror_uninstall $swp1 ingress
15345315673SPetr Machata
15445315673SPetr Machata	log_test "$what: remote address change ($tcflags)"
15545315673SPetr Machata}
15645315673SPetr Machata
1576b45432dSPetr Machatatest_span_gre_tun_del()
1586b45432dSPetr Machata{
1596b45432dSPetr Machata	local tundev=$1; shift
1606b45432dSPetr Machata	local type=$1; shift
1616b45432dSPetr Machata	local flags=$1; shift
1626b45432dSPetr Machata	local local_ip=$1; shift
1636b45432dSPetr Machata	local remote_ip=$1; shift
1646b45432dSPetr Machata	local what=$1; shift
1656b45432dSPetr Machata
1666b45432dSPetr Machata	RET=0
1676b45432dSPetr Machata
1686b45432dSPetr Machata	mirror_install $swp1 ingress $tundev "matchall $tcflags"
1696b45432dSPetr Machata	quick_test_span_gre_dir $tundev ingress
1706b45432dSPetr Machata	ip link del dev $tundev
1716b45432dSPetr Machata	fail_test_span_gre_dir $tundev ingress
1726b45432dSPetr Machata
1736b45432dSPetr Machata	tunnel_create $tundev $type $local_ip $remote_ip \
1746b45432dSPetr Machata		      ttl 100 tos inherit $flags
1756b45432dSPetr Machata
1766b45432dSPetr Machata	# Recreating the tunnel doesn't reestablish mirroring, so reinstall it
1776b45432dSPetr Machata	# and verify it works for the follow-up tests.
1786b45432dSPetr Machata	mirror_uninstall $swp1 ingress
1796b45432dSPetr Machata	mirror_install $swp1 ingress $tundev "matchall $tcflags"
1806b45432dSPetr Machata	quick_test_span_gre_dir $tundev ingress
1816b45432dSPetr Machata	mirror_uninstall $swp1 ingress
1826b45432dSPetr Machata
1836b45432dSPetr Machata	log_test "$what: tunnel deleted ($tcflags)"
1846b45432dSPetr Machata}
1856b45432dSPetr Machata
18677a8df38SPetr Machatatest_span_gre_route_del()
18777a8df38SPetr Machata{
18877a8df38SPetr Machata	local tundev=$1; shift
18977a8df38SPetr Machata	local edev=$1; shift
19077a8df38SPetr Machata	local route=$1; shift
19177a8df38SPetr Machata	local what=$1; shift
19277a8df38SPetr Machata
19377a8df38SPetr Machata	RET=0
19477a8df38SPetr Machata
19577a8df38SPetr Machata	mirror_install $swp1 ingress $tundev "matchall $tcflags"
19677a8df38SPetr Machata	quick_test_span_gre_dir $tundev ingress
19777a8df38SPetr Machata
19877a8df38SPetr Machata	ip route del $route dev $edev
19977a8df38SPetr Machata	fail_test_span_gre_dir $tundev ingress
20077a8df38SPetr Machata
20177a8df38SPetr Machata	ip route add $route dev $edev
20277a8df38SPetr Machata	quick_test_span_gre_dir $tundev ingress
20377a8df38SPetr Machata
20477a8df38SPetr Machata	mirror_uninstall $swp1 ingress
20577a8df38SPetr Machata
20677a8df38SPetr Machata	log_test "$what: underlay route removal ($tcflags)"
20777a8df38SPetr Machata}
20877a8df38SPetr Machata
2090eb8053cSIdo Schimmeltest_ttl()
2100eb8053cSIdo Schimmel{
2110eb8053cSIdo Schimmel	test_span_gre_ttl gt4 gretap ip "mirror to gretap"
2120eb8053cSIdo Schimmel	test_span_gre_ttl gt6 ip6gretap ipv6 "mirror to ip6gretap"
2130eb8053cSIdo Schimmel}
2140eb8053cSIdo Schimmel
2150eb8053cSIdo Schimmeltest_tun_up()
2160eb8053cSIdo Schimmel{
2170eb8053cSIdo Schimmel	test_span_gre_tun_up gt4 "mirror to gretap"
2180eb8053cSIdo Schimmel	test_span_gre_tun_up gt6 "mirror to ip6gretap"
2190eb8053cSIdo Schimmel}
2200eb8053cSIdo Schimmel
2210eb8053cSIdo Schimmeltest_egress_up()
2220eb8053cSIdo Schimmel{
2230eb8053cSIdo Schimmel	test_span_gre_egress_up gt4 192.0.2.130 "mirror to gretap"
2240eb8053cSIdo Schimmel	test_span_gre_egress_up gt6 2001:db8:2::2 "mirror to ip6gretap"
2250eb8053cSIdo Schimmel}
2260eb8053cSIdo Schimmel
2270eb8053cSIdo Schimmeltest_remote_ip()
2280eb8053cSIdo Schimmel{
2290eb8053cSIdo Schimmel	test_span_gre_remote_ip gt4 gretap 192.0.2.130 192.0.2.132 "mirror to gretap"
2300eb8053cSIdo Schimmel	test_span_gre_remote_ip gt6 ip6gretap 2001:db8:2::2 2001:db8:2::4 "mirror to ip6gretap"
2310eb8053cSIdo Schimmel}
2320eb8053cSIdo Schimmel
2336b45432dSPetr Machatatest_tun_del()
2346b45432dSPetr Machata{
2356b45432dSPetr Machata	test_span_gre_tun_del gt4 gretap "" \
2366b45432dSPetr Machata			      192.0.2.129 192.0.2.130 "mirror to gretap"
2376b45432dSPetr Machata	test_span_gre_tun_del gt6 ip6gretap allow-localremote \
2386b45432dSPetr Machata			      2001:db8:2::1 2001:db8:2::2 "mirror to ip6gretap"
2396b45432dSPetr Machata}
2406b45432dSPetr Machata
24177a8df38SPetr Machatatest_route_del()
24277a8df38SPetr Machata{
24377a8df38SPetr Machata	test_span_gre_route_del gt4 $swp3 192.0.2.128/28 "mirror to gretap"
24477a8df38SPetr Machata	test_span_gre_route_del gt6 $swp3 2001:db8:2::/64 "mirror to ip6gretap"
24577a8df38SPetr Machata}
24677a8df38SPetr Machata
24745315673SPetr Machatatest_all()
24845315673SPetr Machata{
24945315673SPetr Machata	slow_path_trap_install $swp1 ingress
25045315673SPetr Machata	slow_path_trap_install $swp1 egress
25145315673SPetr Machata
2520eb8053cSIdo Schimmel	tests_run
25345315673SPetr Machata
25445315673SPetr Machata	slow_path_trap_uninstall $swp1 egress
25545315673SPetr Machata	slow_path_trap_uninstall $swp1 ingress
25645315673SPetr Machata}
25745315673SPetr Machata
25845315673SPetr Machatatrap cleanup EXIT
25945315673SPetr Machata
26045315673SPetr Machatasetup_prepare
26145315673SPetr Machatasetup_wait
26245315673SPetr Machata
26345315673SPetr Machatatcflags="skip_hw"
26445315673SPetr Machatatest_all
26545315673SPetr Machata
26645315673SPetr Machataif ! tc_offload_check; then
26745315673SPetr Machata	echo "WARN: Could not test offloaded functionality"
26845315673SPetr Machataelse
26945315673SPetr Machata	tcflags="skip_sw"
27045315673SPetr Machata	test_all
27145315673SPetr Machatafi
27245315673SPetr Machata
27345315673SPetr Machataexit $EXIT_STATUS
274