]> Git Repo - J-linux.git/blob - tools/testing/selftests/net/forwarding/router.sh
Merge tag 'vfs-6.13-rc7.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
[J-linux.git] / tools / testing / selftests / net / forwarding / router.sh
1 #!/bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3
4 # +--------------------+                     +----------------------+
5 # | H1                 |                     |                   H2 |
6 # |                    |                     |                      |
7 # |              $h1 + |                     | + $h2                |
8 # |     192.0.2.2/24 | |                     | | 198.51.100.2/24    |
9 # | 2001:db8:1::2/64 | |                     | | 2001:db8:2::2/64   |
10 # |                  | |                     | |                    |
11 # +------------------|-+                     +-|--------------------+
12 #                    |                         |
13 # +------------------|-------------------------|--------------------+
14 # | SW               |                         |                    |
15 # |                  |                         |                    |
16 # |             $rp1 +                         + $rp2               |
17 # |     192.0.2.1/24                             198.51.100.1/24    |
18 # | 2001:db8:1::1/64                             2001:db8:2::1/64   |
19 # |                                                                 |
20 # +-----------------------------------------------------------------+
21
22 ALL_TESTS="
23         ping_ipv4
24         ping_ipv6
25         sip_in_class_e
26         mc_mac_mismatch
27         ipv4_sip_equal_dip
28         ipv6_sip_equal_dip
29         ipv4_dip_link_local
30 "
31
32 NUM_NETIFS=4
33 source lib.sh
34 source tc_common.sh
35
36 require_command $MCD
37 require_command $MC_CLI
38 table_name=selftests
39
40 h1_create()
41 {
42         vrf_create "vrf-h1"
43         ip link set dev $h1 master vrf-h1
44
45         ip link set dev vrf-h1 up
46         ip link set dev $h1 up
47
48         ip address add 192.0.2.2/24 dev $h1
49         ip address add 2001:db8:1::2/64 dev $h1
50
51         ip route add 198.51.100.0/24 vrf vrf-h1 nexthop via 192.0.2.1
52         ip route add 2001:db8:2::/64 vrf vrf-h1 nexthop via 2001:db8:1::1
53 }
54
55 h1_destroy()
56 {
57         ip route del 2001:db8:2::/64 vrf vrf-h1
58         ip route del 198.51.100.0/24 vrf vrf-h1
59
60         ip address del 2001:db8:1::2/64 dev $h1
61         ip address del 192.0.2.2/24 dev $h1
62
63         ip link set dev $h1 down
64         vrf_destroy "vrf-h1"
65 }
66
67 h2_create()
68 {
69         vrf_create "vrf-h2"
70         ip link set dev $h2 master vrf-h2
71
72         ip link set dev vrf-h2 up
73         ip link set dev $h2 up
74
75         ip address add 198.51.100.2/24 dev $h2
76         ip address add 2001:db8:2::2/64 dev $h2
77
78         ip route add 192.0.2.0/24 vrf vrf-h2 nexthop via 198.51.100.1
79         ip route add 2001:db8:1::/64 vrf vrf-h2 nexthop via 2001:db8:2::1
80 }
81
82 h2_destroy()
83 {
84         ip route del 2001:db8:1::/64 vrf vrf-h2
85         ip route del 192.0.2.0/24 vrf vrf-h2
86
87         ip address del 2001:db8:2::2/64 dev $h2
88         ip address del 198.51.100.2/24 dev $h2
89
90         ip link set dev $h2 down
91         vrf_destroy "vrf-h2"
92 }
93
94 router_create()
95 {
96         ip link set dev $rp1 up
97         ip link set dev $rp2 up
98
99         tc qdisc add dev $rp2 clsact
100
101         ip address add 192.0.2.1/24 dev $rp1
102         ip address add 2001:db8:1::1/64 dev $rp1
103
104         ip address add 198.51.100.1/24 dev $rp2
105         ip address add 2001:db8:2::1/64 dev $rp2
106 }
107
108 router_destroy()
109 {
110         ip address del 2001:db8:2::1/64 dev $rp2
111         ip address del 198.51.100.1/24 dev $rp2
112
113         ip address del 2001:db8:1::1/64 dev $rp1
114         ip address del 192.0.2.1/24 dev $rp1
115
116         tc qdisc del dev $rp2 clsact
117
118         ip link set dev $rp2 down
119         ip link set dev $rp1 down
120 }
121
122 start_mcd()
123 {
124         SMCROUTEDIR="$(mktemp -d)"
125
126         for ((i = 1; i <= $NUM_NETIFS; ++i)); do
127                 echo "phyint ${NETIFS[p$i]} enable" >> \
128                         $SMCROUTEDIR/$table_name.conf
129         done
130
131         $MCD -N -I $table_name -f $SMCROUTEDIR/$table_name.conf \
132                 -P $SMCROUTEDIR/$table_name.pid
133 }
134
135 kill_mcd()
136 {
137         pkill $MCD
138         rm -rf $SMCROUTEDIR
139 }
140
141 setup_prepare()
142 {
143         h1=${NETIFS[p1]}
144         rp1=${NETIFS[p2]}
145
146         rp2=${NETIFS[p3]}
147         h2=${NETIFS[p4]}
148
149         rp1mac=$(mac_get $rp1)
150
151         start_mcd
152
153         vrf_prepare
154
155         h1_create
156         h2_create
157
158         router_create
159
160         forwarding_enable
161 }
162
163 cleanup()
164 {
165         pre_cleanup
166
167         forwarding_restore
168
169         router_destroy
170
171         h2_destroy
172         h1_destroy
173
174         vrf_cleanup
175
176         kill_mcd
177 }
178
179 ping_ipv4()
180 {
181         ping_test $h1 198.51.100.2
182 }
183
184 ping_ipv6()
185 {
186         ping6_test $h1 2001:db8:2::2
187 }
188
189 sip_in_class_e()
190 {
191         RET=0
192
193         # Disable rpfilter to prevent packets to be dropped because of it.
194         sysctl_set net.ipv4.conf.all.rp_filter 0
195         sysctl_set net.ipv4.conf.$rp1.rp_filter 0
196
197         tc filter add dev $rp2 egress protocol ip pref 1 handle 101 \
198                 flower src_ip 240.0.0.1 ip_proto udp action pass
199
200         $MZ $h1 -t udp "sp=54321,dp=12345" -c 5 -d 1msec \
201                 -A 240.0.0.1 -b $rp1mac -B 198.51.100.2 -q
202
203         tc_check_packets "dev $rp2 egress" 101 5
204         check_err $? "Packets were dropped"
205
206         log_test "Source IP in class E"
207
208         tc filter del dev $rp2 egress protocol ip pref 1 handle 101 flower
209         sysctl_restore net.ipv4.conf.$rp1.rp_filter
210         sysctl_restore net.ipv4.conf.all.rp_filter
211 }
212
213 create_mcast_sg()
214 {
215         local if_name=$1; shift
216         local s_addr=$1; shift
217         local mcast=$1; shift
218         local dest_ifs=${@}
219
220         $MC_CLI -I $table_name add $if_name $s_addr $mcast $dest_ifs
221 }
222
223 delete_mcast_sg()
224 {
225         local if_name=$1; shift
226         local s_addr=$1; shift
227         local mcast=$1; shift
228         local dest_ifs=${@}
229
230         $MC_CLI -I $table_name remove $if_name $s_addr $mcast $dest_ifs
231 }
232
233 __mc_mac_mismatch()
234 {
235         local desc=$1; shift
236         local proto=$1; shift
237         local sip=$1; shift
238         local dip=$1; shift
239         local flags=${1:-""}; shift
240         local dmac=01:02:03:04:05:06
241
242         RET=0
243
244         tc filter add dev $rp2 egress protocol $proto pref 1 handle 101 \
245                 flower dst_ip $dip action pass
246
247         create_mcast_sg $rp1 $sip $dip $rp2
248
249         $MZ $flags $h1 -t udp "sp=54321,dp=12345" -c 5 -d 1msec -b $dmac \
250                 -B $dip -q
251
252         tc_check_packets "dev $rp2 egress" 101 5
253         check_err $? "Packets were dropped"
254
255         log_test "Multicast MAC mismatch: $desc"
256
257         delete_mcast_sg $rp1 $sip $dip $rp2
258         tc filter del dev $rp2 egress protocol $proto pref 1 handle 101 flower
259 }
260
261 mc_mac_mismatch()
262 {
263         __mc_mac_mismatch "IPv4" "ip" 192.0.2.2 225.1.2.3
264         __mc_mac_mismatch "IPv6" "ipv6" 2001:db8:1::2 ff0e::3 "-6"
265 }
266
267 ipv4_sip_equal_dip()
268 {
269         RET=0
270
271         # Disable rpfilter to prevent packets to be dropped because of it.
272         sysctl_set net.ipv4.conf.all.rp_filter 0
273         sysctl_set net.ipv4.conf.$rp1.rp_filter 0
274
275         tc filter add dev $rp2 egress protocol ip pref 1 handle 101 \
276                 flower src_ip 198.51.100.2  action pass
277
278         $MZ $h1 -t udp "sp=54321,dp=12345" -c 5 -d 1msec \
279                 -A 198.51.100.2 -b $rp1mac -B 198.51.100.2 -q
280
281         tc_check_packets "dev $rp2 egress" 101 5
282         check_err $? "Packets were dropped"
283
284         log_test "Source IP is equal to destination IP: IPv4"
285
286         tc filter del dev $rp2 egress protocol ip pref 1 handle 101 flower
287         sysctl_restore net.ipv4.conf.$rp1.rp_filter
288         sysctl_restore net.ipv4.conf.all.rp_filter
289 }
290
291 ipv6_sip_equal_dip()
292 {
293         RET=0
294
295         tc filter add dev $rp2 egress protocol ipv6 pref 1 handle 101 \
296                 flower src_ip 2001:db8:2::2 action pass
297
298         $MZ -6 $h1 -t udp "sp=54321,dp=12345" -c 5 -d 1msec \
299                 -A 2001:db8:2::2 -b $rp1mac -B 2001:db8:2::2 -q
300
301         tc_check_packets "dev $rp2 egress" 101 5
302         check_err $? "Packets were dropped"
303
304         log_test "Source IP is equal to destination IP: IPv6"
305
306         tc filter del dev $rp2 egress protocol ipv6 pref 1 handle 101 flower
307 }
308
309 ipv4_dip_link_local()
310 {
311         local dip=169.254.1.1
312
313         RET=0
314
315         tc filter add dev $rp2 egress protocol ip pref 1 handle 101 \
316                 flower dst_ip $dip action pass
317
318         ip neigh add 169.254.1.1 lladdr 00:11:22:33:44:55 dev $rp2
319         ip route add 169.254.1.0/24 dev $rp2
320
321         $MZ $h1 -t udp "sp=54321,dp=12345" -c 5 -d 1msec -b $rp1mac -B $dip -q
322
323         tc_check_packets "dev $rp2 egress" 101 5
324         check_err $? "Packets were dropped"
325
326         log_test "IPv4 destination IP is link-local"
327
328         ip route del 169.254.1.0/24 dev $rp2
329         ip neigh del 169.254.1.1 lladdr 00:11:22:33:44:55 dev $rp2
330         tc filter del dev $rp2 egress protocol ip pref 1 handle 101 flower
331 }
332
333 trap cleanup EXIT
334
335 setup_prepare
336 setup_wait
337
338 tests_run
339
340 exit $EXIT_STATUS
This page took 0.049945 seconds and 4 git commands to generate.