Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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 ping_timeout=$((PING_TIMEOUT * 5))
33 local t0=$(tc_rule_stats_get $dev $pref)
34 ip vrf exec $vrf_name \
35 ${PING} ${sip:+-I $sip} $dip -c 10 -i 0.5 -w $ping_timeout \
36 &> /dev/null
37 sleep 0.5
38 local t1=$(tc_rule_stats_get $dev $pref)
39 local delta=$((t1 - t0))
40 # Tolerate a couple stray extra packets.
41 ((expect <= delta && delta <= expect + 2))
42 check_err $? "Expected to capture $expect packets, got $delta."
43}
44
45do_test_span_dir_ips()
46{
47 local expect=$1; shift
48 local dev=$1; shift
49 local direction=$1; shift
50 local ip1=$1; shift
51 local ip2=$1; shift
52
53 icmp_capture_install $dev
54 mirror_test v$h1 $ip1 $ip2 $dev 100 $expect
55 mirror_test v$h2 $ip2 $ip1 $dev 100 $expect
56 icmp_capture_uninstall $dev
57}
58
59quick_test_span_dir_ips()
60{
61 do_test_span_dir_ips 10 "$@"
62}
63
64fail_test_span_dir_ips()
65{
66 do_test_span_dir_ips 0 "$@"
67}
68
69test_span_dir_ips()
70{
71 local dev=$1; shift
72 local direction=$1; shift
73 local forward_type=$1; shift
74 local backward_type=$1; shift
75 local ip1=$1; shift
76 local ip2=$1; shift
77
78 quick_test_span_dir_ips "$dev" "$direction" "$ip1" "$ip2"
79
80 icmp_capture_install $dev "type $forward_type"
81 mirror_test v$h1 $ip1 $ip2 $dev 100 10
82 icmp_capture_uninstall $dev
83
84 icmp_capture_install $dev "type $backward_type"
85 mirror_test v$h2 $ip2 $ip1 $dev 100 10
86 icmp_capture_uninstall $dev
87}
88
89fail_test_span_dir()
90{
91 fail_test_span_dir_ips "$@" 192.0.2.1 192.0.2.2
92}
93
94test_span_dir()
95{
96 test_span_dir_ips "$@" 192.0.2.1 192.0.2.2
97}
98
99do_test_span_vlan_dir_ips()
100{
101 local expect=$1; shift
102 local dev=$1; shift
103 local vid=$1; shift
104 local direction=$1; shift
105 local ip1=$1; shift
106 local ip2=$1; shift
107
108 # Install the capture as skip_hw to avoid double-counting of packets.
109 # The traffic is meant for local box anyway, so will be trapped to
110 # kernel.
111 vlan_capture_install $dev "skip_hw vlan_id $vid vlan_ethtype ip"
112 mirror_test v$h1 $ip1 $ip2 $dev 100 $expect
113 mirror_test v$h2 $ip2 $ip1 $dev 100 $expect
114 vlan_capture_uninstall $dev
115}
116
117quick_test_span_vlan_dir_ips()
118{
119 do_test_span_vlan_dir_ips 10 "$@"
120}
121
122fail_test_span_vlan_dir_ips()
123{
124 do_test_span_vlan_dir_ips 0 "$@"
125}
126
127quick_test_span_vlan_dir()
128{
129 quick_test_span_vlan_dir_ips "$@" 192.0.2.1 192.0.2.2
130}
131
132fail_test_span_vlan_dir()
133{
134 fail_test_span_vlan_dir_ips "$@" 192.0.2.1 192.0.2.2
135}