1# SPDX-License-Identifier: GPL-2.0
2
3mirror_install()
4{
5	local from_dev=$1; shift
6	local direction=$1; shift
7	local to_dev=$1; shift
8	local filter=$1; shift
9
10	tc filter add dev $from_dev $direction \
11	   pref 1000 $filter \
12	   action mirred egress mirror dev $to_dev
13}
14
15mirror_uninstall()
16{
17	local from_dev=$1; shift
18	local direction=$1; shift
19
20	tc filter del dev $swp1 $direction pref 1000
21}
22
23mirror_test()
24{
25	local vrf_name=$1; shift
26	local sip=$1; shift
27	local dip=$1; shift
28	local dev=$1; shift
29	local pref=$1; shift
30	local expect=$1; shift
31
32	local t0=$(tc_rule_stats_get $dev $pref)
33	ip vrf exec $vrf_name \
34	   ${PING} ${sip:+-I $sip} $dip -c 10 -i 0.1 -w 2 &> /dev/null
35	local t1=$(tc_rule_stats_get $dev $pref)
36	local delta=$((t1 - t0))
37	# Tolerate a couple stray extra packets.
38	((expect <= delta && delta <= expect + 2))
39	check_err $? "Expected to capture $expect packets, got $delta."
40}
41
42do_test_span_dir_ips()
43{
44	local expect=$1; shift
45	local dev=$1; shift
46	local direction=$1; shift
47	local ip1=$1; shift
48	local ip2=$1; shift
49
50	icmp_capture_install $dev
51	mirror_test v$h1 $ip1 $ip2 $dev 100 $expect
52	mirror_test v$h2 $ip2 $ip1 $dev 100 $expect
53	icmp_capture_uninstall $dev
54}
55
56quick_test_span_dir_ips()
57{
58	do_test_span_dir_ips 10 "$@"
59}
60
61fail_test_span_dir_ips()
62{
63	do_test_span_dir_ips 0 "$@"
64}
65
66test_span_dir_ips()
67{
68	local dev=$1; shift
69	local direction=$1; shift
70	local forward_type=$1; shift
71	local backward_type=$1; shift
72	local ip1=$1; shift
73	local ip2=$1; shift
74
75	quick_test_span_dir_ips "$dev" "$direction" "$ip1" "$ip2"
76
77	icmp_capture_install $dev "type $forward_type"
78	mirror_test v$h1 $ip1 $ip2 $dev 100 10
79	icmp_capture_uninstall $dev
80
81	icmp_capture_install $dev "type $backward_type"
82	mirror_test v$h2 $ip2 $ip1 $dev 100 10
83	icmp_capture_uninstall $dev
84}
85
86fail_test_span_dir()
87{
88	fail_test_span_dir_ips "$@" 192.0.2.1 192.0.2.2
89}
90
91test_span_dir()
92{
93	test_span_dir_ips "$@" 192.0.2.1 192.0.2.2
94}
95
96do_test_span_vlan_dir_ips()
97{
98	local expect=$1; shift
99	local dev=$1; shift
100	local vid=$1; shift
101	local direction=$1; shift
102	local ip1=$1; shift
103	local ip2=$1; shift
104
105	# Install the capture as skip_hw to avoid double-counting of packets.
106	# The traffic is meant for local box anyway, so will be trapped to
107	# kernel.
108	vlan_capture_install $dev "skip_hw vlan_id $vid"
109	mirror_test v$h1 $ip1 $ip2 $dev 100 $expect
110	mirror_test v$h2 $ip2 $ip1 $dev 100 $expect
111	vlan_capture_uninstall $dev
112}
113
114quick_test_span_vlan_dir_ips()
115{
116	do_test_span_vlan_dir_ips 10 "$@"
117}
118
119fail_test_span_vlan_dir_ips()
120{
121	do_test_span_vlan_dir_ips 0 "$@"
122}
123
124quick_test_span_vlan_dir()
125{
126	quick_test_span_vlan_dir_ips "$@" 192.0.2.1 192.0.2.2
127}
128
129fail_test_span_vlan_dir()
130{
131	fail_test_span_vlan_dir_ips "$@" 192.0.2.1 192.0.2.2
132}
133