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