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
23*1233898aSPetr Machatais_ipv6()
24*1233898aSPetr Machata{
25*1233898aSPetr Machata	local addr=$1; shift
26*1233898aSPetr Machata
27*1233898aSPetr Machata	[[ -z ${addr//[0-9a-fA-F:]/} ]]
28*1233898aSPetr Machata}
29*1233898aSPetr 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
39*1233898aSPetr Machata	if is_ipv6 $dip; then
40*1233898aSPetr Machata		local proto=-6
41*1233898aSPetr Machata		local type="icmp6 type=128" # Echo request.
42*1233898aSPetr Machata	else
43*1233898aSPetr Machata		local proto=
44*1233898aSPetr Machata		local type="icmp echoreq"
45*1233898aSPetr Machata	fi
46*1233898aSPetr Machata
477d4cbae0SPetr Machata	local t0=$(tc_rule_stats_get $dev $pref)
48*1233898aSPetr Machata	$MZ $proto $vrf_name ${sip:+-A $sip} -B $dip -a own -b bc -q \
49*1233898aSPetr 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
118900530f3SPetr Machata	local ip1=$1; shift
119900530f3SPetr Machata	local ip2=$1; shift
120900530f3SPetr Machata
121275225fbSPetr Machata	# Install the capture as skip_hw to avoid double-counting of packets.
122275225fbSPetr Machata	# The traffic is meant for local box anyway, so will be trapped to
123275225fbSPetr Machata	# kernel.
124db560d16SPetr Machata	vlan_capture_install $dev "skip_hw vlan_id $vid vlan_ethtype ip"
125900530f3SPetr Machata	mirror_test v$h1 $ip1 $ip2 $dev 100 $expect
126900530f3SPetr Machata	mirror_test v$h2 $ip2 $ip1 $dev 100 $expect
127900530f3SPetr Machata	vlan_capture_uninstall $dev
128900530f3SPetr Machata}
129900530f3SPetr Machata
130900530f3SPetr Machataquick_test_span_vlan_dir_ips()
131900530f3SPetr Machata{
132900530f3SPetr Machata	do_test_span_vlan_dir_ips 10 "$@"
133900530f3SPetr Machata}
134900530f3SPetr Machata
135900530f3SPetr Machatafail_test_span_vlan_dir_ips()
136900530f3SPetr Machata{
137900530f3SPetr Machata	do_test_span_vlan_dir_ips 0 "$@"
138900530f3SPetr Machata}
139900530f3SPetr Machata
140900530f3SPetr Machataquick_test_span_vlan_dir()
141900530f3SPetr Machata{
142900530f3SPetr Machata	quick_test_span_vlan_dir_ips "$@" 192.0.2.1 192.0.2.2
143900530f3SPetr Machata}
144900530f3SPetr Machata
145900530f3SPetr Machatafail_test_span_vlan_dir()
146900530f3SPetr Machata{
147900530f3SPetr Machata	fail_test_span_vlan_dir_ips "$@" 192.0.2.1 192.0.2.2
148900530f3SPetr Machata}
149