GNU Linux-libre 4.19.245-gnu1
[releases.git] / tools / testing / selftests / net / forwarding / mirror_lib.sh
1 # SPDX-License-Identifier: GPL-2.0
2
3 mirror_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
15 mirror_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
23 mirror_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
42 do_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
56 quick_test_span_dir_ips()
57 {
58         do_test_span_dir_ips 10 "$@"
59 }
60
61 fail_test_span_dir_ips()
62 {
63         do_test_span_dir_ips 0 "$@"
64 }
65
66 test_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
86 fail_test_span_dir()
87 {
88         fail_test_span_dir_ips "$@" 192.0.2.1 192.0.2.2
89 }
90
91 test_span_dir()
92 {
93         test_span_dir_ips "$@" 192.0.2.1 192.0.2.2
94 }
95
96 do_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 vlan_ethtype ip"
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
114 quick_test_span_vlan_dir_ips()
115 {
116         do_test_span_vlan_dir_ips 10 "$@"
117 }
118
119 fail_test_span_vlan_dir_ips()
120 {
121         do_test_span_vlan_dir_ips 0 "$@"
122 }
123
124 quick_test_span_vlan_dir()
125 {
126         quick_test_span_vlan_dir_ips "$@" 192.0.2.1 192.0.2.2
127 }
128
129 fail_test_span_vlan_dir()
130 {
131         fail_test_span_vlan_dir_ips "$@" 192.0.2.1 192.0.2.2
132 }