17d4cbae0SPetr Machata# SPDX-License-Identifier: GPL-2.0
27d4cbae0SPetr Machata
37d4cbae0SPetr Machatamirror_install()
47d4cbae0SPetr Machata{
57d4cbae0SPetr Machata	local from_dev=$1; shift
67d4cbae0SPetr Machata	local direction=$1; shift
77d4cbae0SPetr Machata	local to_dev=$1; shift
87d4cbae0SPetr Machata	local filter=$1; shift
97d4cbae0SPetr Machata
107d4cbae0SPetr Machata	tc filter add dev $from_dev $direction \
117d4cbae0SPetr Machata	   pref 1000 $filter \
127d4cbae0SPetr Machata	   action mirred egress mirror dev $to_dev
137d4cbae0SPetr Machata}
147d4cbae0SPetr Machata
157d4cbae0SPetr Machatamirror_uninstall()
167d4cbae0SPetr Machata{
177d4cbae0SPetr Machata	local from_dev=$1; shift
187d4cbae0SPetr Machata	local direction=$1; shift
197d4cbae0SPetr Machata
207d4cbae0SPetr Machata	tc filter del dev $swp1 $direction pref 1000
217d4cbae0SPetr Machata}
227d4cbae0SPetr Machata
231233898aSPetr Machatais_ipv6()
241233898aSPetr Machata{
251233898aSPetr Machata	local addr=$1; shift
261233898aSPetr Machata
271233898aSPetr Machata	[[ -z ${addr//[0-9a-fA-F:]/} ]]
281233898aSPetr Machata}
291233898aSPetr Machata
307d4cbae0SPetr Machatamirror_test()
317d4cbae0SPetr Machata{
327d4cbae0SPetr Machata	local vrf_name=$1; shift
337d4cbae0SPetr Machata	local sip=$1; shift
347d4cbae0SPetr Machata	local dip=$1; shift
357d4cbae0SPetr Machata	local dev=$1; shift
367d4cbae0SPetr Machata	local pref=$1; shift
377d4cbae0SPetr Machata	local expect=$1; shift
387d4cbae0SPetr Machata
391233898aSPetr Machata	if is_ipv6 $dip; then
401233898aSPetr Machata		local proto=-6
411233898aSPetr Machata		local type="icmp6 type=128" # Echo request.
421233898aSPetr Machata	else
431233898aSPetr Machata		local proto=
441233898aSPetr Machata		local type="icmp echoreq"
451233898aSPetr Machata	fi
461233898aSPetr Machata
477d4cbae0SPetr Machata	local t0=$(tc_rule_stats_get $dev $pref)
481233898aSPetr Machata	$MZ $proto $vrf_name ${sip:+-A $sip} -B $dip -a own -b bc -q \
491233898aSPetr Machata	    -c 10 -d 100msec -t $type
50db2c5bfcSPetr Machata	sleep 0.5
517d4cbae0SPetr Machata	local t1=$(tc_rule_stats_get $dev $pref)
527d4cbae0SPetr Machata	local delta=$((t1 - t0))
537d4cbae0SPetr Machata	# Tolerate a couple stray extra packets.
547d4cbae0SPetr Machata	((expect <= delta && delta <= expect + 2))
557d4cbae0SPetr Machata	check_err $? "Expected to capture $expect packets, got $delta."
567d4cbae0SPetr Machata}
57d5ea2bfcSPetr Machata
58d5ea2bfcSPetr Machatado_test_span_dir_ips()
59d5ea2bfcSPetr Machata{
60d5ea2bfcSPetr Machata	local expect=$1; shift
61d5ea2bfcSPetr Machata	local dev=$1; shift
62d5ea2bfcSPetr Machata	local direction=$1; shift
63d5ea2bfcSPetr Machata	local ip1=$1; shift
64d5ea2bfcSPetr Machata	local ip2=$1; shift
65d5ea2bfcSPetr Machata
66d5ea2bfcSPetr Machata	icmp_capture_install $dev
67d5ea2bfcSPetr Machata	mirror_test v$h1 $ip1 $ip2 $dev 100 $expect
68d5ea2bfcSPetr Machata	mirror_test v$h2 $ip2 $ip1 $dev 100 $expect
69d5ea2bfcSPetr Machata	icmp_capture_uninstall $dev
70d5ea2bfcSPetr Machata}
71d5ea2bfcSPetr Machata
72d5ea2bfcSPetr Machataquick_test_span_dir_ips()
73d5ea2bfcSPetr Machata{
74d5ea2bfcSPetr Machata	do_test_span_dir_ips 10 "$@"
75d5ea2bfcSPetr Machata}
76d5ea2bfcSPetr Machata
77d5ea2bfcSPetr Machatafail_test_span_dir_ips()
78d5ea2bfcSPetr Machata{
79d5ea2bfcSPetr Machata	do_test_span_dir_ips 0 "$@"
80d5ea2bfcSPetr Machata}
81d5ea2bfcSPetr Machata
82d5ea2bfcSPetr Machatatest_span_dir_ips()
83d5ea2bfcSPetr Machata{
84d5ea2bfcSPetr Machata	local dev=$1; shift
85d5ea2bfcSPetr Machata	local direction=$1; shift
86d5ea2bfcSPetr Machata	local forward_type=$1; shift
87d5ea2bfcSPetr Machata	local backward_type=$1; shift
88d5ea2bfcSPetr Machata	local ip1=$1; shift
89d5ea2bfcSPetr Machata	local ip2=$1; shift
90d5ea2bfcSPetr Machata
91d5ea2bfcSPetr Machata	quick_test_span_dir_ips "$dev" "$direction" "$ip1" "$ip2"
92d5ea2bfcSPetr Machata
93d5ea2bfcSPetr Machata	icmp_capture_install $dev "type $forward_type"
94d5ea2bfcSPetr Machata	mirror_test v$h1 $ip1 $ip2 $dev 100 10
95d5ea2bfcSPetr Machata	icmp_capture_uninstall $dev
96d5ea2bfcSPetr Machata
97d5ea2bfcSPetr Machata	icmp_capture_install $dev "type $backward_type"
98d5ea2bfcSPetr Machata	mirror_test v$h2 $ip2 $ip1 $dev 100 10
99d5ea2bfcSPetr Machata	icmp_capture_uninstall $dev
100d5ea2bfcSPetr Machata}
101d5ea2bfcSPetr Machata
102d5ea2bfcSPetr Machatafail_test_span_dir()
103d5ea2bfcSPetr Machata{
104d5ea2bfcSPetr Machata	fail_test_span_dir_ips "$@" 192.0.2.1 192.0.2.2
105d5ea2bfcSPetr Machata}
106d5ea2bfcSPetr Machata
107d5ea2bfcSPetr Machatatest_span_dir()
108d5ea2bfcSPetr Machata{
109d5ea2bfcSPetr Machata	test_span_dir_ips "$@" 192.0.2.1 192.0.2.2
110d5ea2bfcSPetr Machata}
111900530f3SPetr Machata
112900530f3SPetr Machatado_test_span_vlan_dir_ips()
113900530f3SPetr Machata{
114900530f3SPetr Machata	local expect=$1; shift
115900530f3SPetr Machata	local dev=$1; shift
116900530f3SPetr Machata	local vid=$1; shift
117900530f3SPetr Machata	local direction=$1; shift
118*af0a5111SPetr Machata	local ul_proto=$1; shift
119900530f3SPetr Machata	local ip1=$1; shift
120900530f3SPetr Machata	local ip2=$1; shift
121900530f3SPetr Machata
122275225fbSPetr Machata	# Install the capture as skip_hw to avoid double-counting of packets.
123275225fbSPetr Machata	# The traffic is meant for local box anyway, so will be trapped to
124275225fbSPetr Machata	# kernel.
125*af0a5111SPetr Machata	vlan_capture_install $dev "skip_hw vlan_id $vid vlan_ethtype $ul_proto"
126900530f3SPetr Machata	mirror_test v$h1 $ip1 $ip2 $dev 100 $expect
127900530f3SPetr Machata	mirror_test v$h2 $ip2 $ip1 $dev 100 $expect
128900530f3SPetr Machata	vlan_capture_uninstall $dev
129900530f3SPetr Machata}
130900530f3SPetr Machata
131900530f3SPetr Machataquick_test_span_vlan_dir_ips()
132900530f3SPetr Machata{
133900530f3SPetr Machata	do_test_span_vlan_dir_ips 10 "$@"
134900530f3SPetr Machata}
135900530f3SPetr Machata
136900530f3SPetr Machatafail_test_span_vlan_dir_ips()
137900530f3SPetr Machata{
138900530f3SPetr Machata	do_test_span_vlan_dir_ips 0 "$@"
139900530f3SPetr Machata}
140900530f3SPetr Machata
141900530f3SPetr Machataquick_test_span_vlan_dir()
142900530f3SPetr Machata{
143900530f3SPetr Machata	quick_test_span_vlan_dir_ips "$@" 192.0.2.1 192.0.2.2
144900530f3SPetr Machata}
145900530f3SPetr Machata
146900530f3SPetr Machatafail_test_span_vlan_dir()
147900530f3SPetr Machata{
148900530f3SPetr Machata	fail_test_span_vlan_dir_ips "$@" 192.0.2.1 192.0.2.2
149900530f3SPetr Machata}
150