xref: /linux/tools/testing/selftests/drivers/net/mlxsw/devlink_trap_l3_drops.sh (revision c771600c6af14749609b49565ffb4cac2959710d)
1d3e985c9SAmit Cohen#!/bin/bash
2d3e985c9SAmit Cohen# SPDX-License-Identifier: GPL-2.0
3d3e985c9SAmit Cohen#
4d3e985c9SAmit Cohen# Test devlink-trap L3 drops functionality over mlxsw. Each registered L3 drop
5d3e985c9SAmit Cohen# packet trap is tested to make sure it is triggered under the right
6d3e985c9SAmit Cohen# conditions.
7d3e985c9SAmit Cohen
8d3e985c9SAmit Cohen# +---------------------------------+
9d3e985c9SAmit Cohen# | H1 (vrf)                        |
10d3e985c9SAmit Cohen# |    + $h1                        |
11d3e985c9SAmit Cohen# |    | 192.0.2.1/24               |
12d3e985c9SAmit Cohen# |    | 2001:db8:1::1/64           |
13d3e985c9SAmit Cohen# |    |                            |
14d3e985c9SAmit Cohen# |    |  default via 192.0.2.2     |
15d3e985c9SAmit Cohen# |    |  default via 2001:db8:1::2 |
16d3e985c9SAmit Cohen# +----|----------------------------+
17d3e985c9SAmit Cohen#      |
18d3e985c9SAmit Cohen# +----|----------------------------------------------------------------------+
19d3e985c9SAmit Cohen# | SW |                                                                      |
20d3e985c9SAmit Cohen# |    + $rp1                                                                 |
21d3e985c9SAmit Cohen# |        192.0.2.2/24                                                       |
22d3e985c9SAmit Cohen# |        2001:db8:1::2/64                                                   |
23d3e985c9SAmit Cohen# |                                                                           |
24d3e985c9SAmit Cohen# |        2001:db8:2::2/64                                                   |
25d3e985c9SAmit Cohen# |        198.51.100.2/24                                                    |
26d3e985c9SAmit Cohen# |    + $rp2                                                                 |
27d3e985c9SAmit Cohen# |    |                                                                      |
28d3e985c9SAmit Cohen# +----|----------------------------------------------------------------------+
29d3e985c9SAmit Cohen#      |
30d3e985c9SAmit Cohen# +----|----------------------------+
31d3e985c9SAmit Cohen# |    |  default via 198.51.100.2  |
32d3e985c9SAmit Cohen# |    |  default via 2001:db8:2::2 |
33d3e985c9SAmit Cohen# |    |                            |
34d3e985c9SAmit Cohen# |    | 2001:db8:2::1/64           |
35d3e985c9SAmit Cohen# |    | 198.51.100.1/24            |
36d3e985c9SAmit Cohen# |    + $h2                        |
37d3e985c9SAmit Cohen# | H2 (vrf)                        |
38d3e985c9SAmit Cohen# +---------------------------------+
39d3e985c9SAmit Cohen
40d3e985c9SAmit Cohenlib_dir=$(dirname $0)/../../../net/forwarding
41d3e985c9SAmit Cohen
42d3e985c9SAmit CohenALL_TESTS="
43d3e985c9SAmit Cohen	non_ip_test
44d3e985c9SAmit Cohen	uc_dip_over_mc_dmac_test
45d3e985c9SAmit Cohen	dip_is_loopback_test
46d3e985c9SAmit Cohen	sip_is_mc_test
47d3e985c9SAmit Cohen	sip_is_loopback_test
48d3e985c9SAmit Cohen	ip_header_corrupted_test
49d3e985c9SAmit Cohen	ipv4_sip_is_limited_bc_test
50d3e985c9SAmit Cohen	ipv6_mc_dip_reserved_scope_test
51d3e985c9SAmit Cohen	ipv6_mc_dip_interface_local_scope_test
52d3e985c9SAmit Cohen	blackhole_route_test
53740e87bcSAmit Cohen	irif_disabled_test
54740e87bcSAmit Cohen	erif_disabled_test
5584e8feeaSIdo Schimmel	blackhole_nexthop_test
56d3e985c9SAmit Cohen"
57d3e985c9SAmit Cohen
58d3e985c9SAmit CohenNUM_NETIFS=4
59d3e985c9SAmit Cohensource $lib_dir/lib.sh
60d3e985c9SAmit Cohensource $lib_dir/tc_common.sh
61d3e985c9SAmit Cohensource $lib_dir/devlink_lib.sh
62d3e985c9SAmit Cohen
63d3e985c9SAmit Cohenh1_create()
64d3e985c9SAmit Cohen{
65d3e985c9SAmit Cohen	simple_if_init $h1 192.0.2.1/24 2001:db8:1::1/64
66d3e985c9SAmit Cohen
67d3e985c9SAmit Cohen	ip -4 route add default vrf v$h1 nexthop via 192.0.2.2
68d3e985c9SAmit Cohen	ip -6 route add default vrf v$h1 nexthop via 2001:db8:1::2
69d3e985c9SAmit Cohen}
70d3e985c9SAmit Cohen
71d3e985c9SAmit Cohenh1_destroy()
72d3e985c9SAmit Cohen{
73d3e985c9SAmit Cohen	ip -6 route del default vrf v$h1 nexthop via 2001:db8:1::2
74d3e985c9SAmit Cohen	ip -4 route del default vrf v$h1 nexthop via 192.0.2.2
75d3e985c9SAmit Cohen
76d3e985c9SAmit Cohen	simple_if_fini $h1 192.0.2.1/24 2001:db8:1::1/64
77d3e985c9SAmit Cohen}
78d3e985c9SAmit Cohen
79d3e985c9SAmit Cohenh2_create()
80d3e985c9SAmit Cohen{
81d3e985c9SAmit Cohen	simple_if_init $h2 $h2_ipv4/24 $h2_ipv6/64
82d3e985c9SAmit Cohen
83d3e985c9SAmit Cohen	ip -4 route add default vrf v$h2 nexthop via 198.51.100.2
84d3e985c9SAmit Cohen	ip -6 route add default vrf v$h2 nexthop via 2001:db8:2::2
85d3e985c9SAmit Cohen}
86d3e985c9SAmit Cohen
87d3e985c9SAmit Cohenh2_destroy()
88d3e985c9SAmit Cohen{
89d3e985c9SAmit Cohen	ip -6 route del default vrf v$h2 nexthop via 2001:db8:2::2
90d3e985c9SAmit Cohen	ip -4 route del default vrf v$h2 nexthop via 198.51.100.2
91d3e985c9SAmit Cohen
92d3e985c9SAmit Cohen	simple_if_fini $h2 $h2_ipv4/24 $h2_ipv6/64
93d3e985c9SAmit Cohen}
94d3e985c9SAmit Cohen
95d3e985c9SAmit Cohenrouter_create()
96d3e985c9SAmit Cohen{
97d3e985c9SAmit Cohen	ip link set dev $rp1 up
98d3e985c9SAmit Cohen	ip link set dev $rp2 up
99d3e985c9SAmit Cohen
100d3e985c9SAmit Cohen	tc qdisc add dev $rp2 clsact
101d3e985c9SAmit Cohen
102d3e985c9SAmit Cohen	__addr_add_del $rp1 add 192.0.2.2/24 2001:db8:1::2/64
103d3e985c9SAmit Cohen	__addr_add_del $rp2 add 198.51.100.2/24 2001:db8:2::2/64
104d3e985c9SAmit Cohen}
105d3e985c9SAmit Cohen
106d3e985c9SAmit Cohenrouter_destroy()
107d3e985c9SAmit Cohen{
108d3e985c9SAmit Cohen	__addr_add_del $rp2 del 198.51.100.2/24 2001:db8:2::2/64
109d3e985c9SAmit Cohen	__addr_add_del $rp1 del 192.0.2.2/24 2001:db8:1::2/64
110d3e985c9SAmit Cohen
111d3e985c9SAmit Cohen	tc qdisc del dev $rp2 clsact
112e67dfb8dSAmit Cohen
113e67dfb8dSAmit Cohen	ip link set dev $rp2 down
114e67dfb8dSAmit Cohen	ip link set dev $rp1 down
115d3e985c9SAmit Cohen}
116d3e985c9SAmit Cohen
117d3e985c9SAmit Cohensetup_prepare()
118d3e985c9SAmit Cohen{
119d3e985c9SAmit Cohen	h1=${NETIFS[p1]}
120d3e985c9SAmit Cohen	rp1=${NETIFS[p2]}
121d3e985c9SAmit Cohen
122d3e985c9SAmit Cohen	rp2=${NETIFS[p3]}
123d3e985c9SAmit Cohen	h2=${NETIFS[p4]}
124d3e985c9SAmit Cohen
125d3e985c9SAmit Cohen	h1mac=$(mac_get $h1)
126d3e985c9SAmit Cohen	rp1mac=$(mac_get $rp1)
127d3e985c9SAmit Cohen
128d3e985c9SAmit Cohen	h1_ipv4=192.0.2.1
129d3e985c9SAmit Cohen	h2_ipv4=198.51.100.1
130d3e985c9SAmit Cohen	h1_ipv6=2001:db8:1::1
131d3e985c9SAmit Cohen	h2_ipv6=2001:db8:2::1
132d3e985c9SAmit Cohen
133d3e985c9SAmit Cohen	vrf_prepare
134d3e985c9SAmit Cohen	forwarding_enable
135d3e985c9SAmit Cohen
136d3e985c9SAmit Cohen	h1_create
137d3e985c9SAmit Cohen	h2_create
138d3e985c9SAmit Cohen
139d3e985c9SAmit Cohen	router_create
140d3e985c9SAmit Cohen}
141d3e985c9SAmit Cohen
142d3e985c9SAmit Cohencleanup()
143d3e985c9SAmit Cohen{
144d3e985c9SAmit Cohen	pre_cleanup
145d3e985c9SAmit Cohen
146d3e985c9SAmit Cohen	router_destroy
147d3e985c9SAmit Cohen
148d3e985c9SAmit Cohen	h2_destroy
149d3e985c9SAmit Cohen	h1_destroy
150d3e985c9SAmit Cohen
151d3e985c9SAmit Cohen	forwarding_restore
152d3e985c9SAmit Cohen	vrf_cleanup
153d3e985c9SAmit Cohen}
154d3e985c9SAmit Cohen
155d3e985c9SAmit Cohenping_check()
156d3e985c9SAmit Cohen{
157d3e985c9SAmit Cohen	trap_name=$1; shift
158d3e985c9SAmit Cohen
159d3e985c9SAmit Cohen	devlink_trap_action_set $trap_name "trap"
160d3e985c9SAmit Cohen	ping_do $h1 $h2_ipv4
161d3e985c9SAmit Cohen	check_err $? "Packets that should not be trapped were trapped"
162d3e985c9SAmit Cohen	devlink_trap_action_set $trap_name "drop"
163d3e985c9SAmit Cohen}
164d3e985c9SAmit Cohen
165d3e985c9SAmit Cohennon_ip_test()
166d3e985c9SAmit Cohen{
167d3e985c9SAmit Cohen	local trap_name="non_ip"
168d3e985c9SAmit Cohen	local mz_pid
169d3e985c9SAmit Cohen
170d3e985c9SAmit Cohen	RET=0
171d3e985c9SAmit Cohen
172d3e985c9SAmit Cohen	ping_check $trap_name
173d3e985c9SAmit Cohen
174d3e985c9SAmit Cohen	tc filter add dev $rp2 egress protocol ip pref 1 handle 101 \
175d3e985c9SAmit Cohen		flower dst_ip $h2_ipv4 action drop
176d3e985c9SAmit Cohen
177d3e985c9SAmit Cohen	# Generate non-IP packets to the router
178d3e985c9SAmit Cohen	$MZ $h1 -c 0 -p 100 -d 1msec -B $h2_ipv4 -q "$rp1mac $h1mac \
179d3e985c9SAmit Cohen		00:00 de:ad:be:ef" &
180d3e985c9SAmit Cohen	mz_pid=$!
181d3e985c9SAmit Cohen
18204cc99d9SIdo Schimmel	devlink_trap_drop_test $trap_name $rp2 101
183d3e985c9SAmit Cohen
184d3e985c9SAmit Cohen	log_test "Non IP"
185d3e985c9SAmit Cohen
186c902a52cSJiri Pirko	devlink_trap_drop_cleanup $mz_pid $rp2 "ip" 1 101
187d3e985c9SAmit Cohen}
188d3e985c9SAmit Cohen
189d3e985c9SAmit Cohen__uc_dip_over_mc_dmac_test()
190d3e985c9SAmit Cohen{
191d3e985c9SAmit Cohen	local desc=$1; shift
192d3e985c9SAmit Cohen	local proto=$1; shift
193d3e985c9SAmit Cohen	local dip=$1; shift
194d3e985c9SAmit Cohen	local flags=${1:-""}; shift
195d3e985c9SAmit Cohen	local trap_name="uc_dip_over_mc_dmac"
196d3e985c9SAmit Cohen	local dmac=01:02:03:04:05:06
197d3e985c9SAmit Cohen	local mz_pid
198d3e985c9SAmit Cohen
199d3e985c9SAmit Cohen	RET=0
200d3e985c9SAmit Cohen
201d3e985c9SAmit Cohen	ping_check $trap_name
202d3e985c9SAmit Cohen
203d3e985c9SAmit Cohen	tc filter add dev $rp2 egress protocol $proto pref 1 handle 101 \
204d3e985c9SAmit Cohen		flower ip_proto udp src_port 54321 dst_port 12345 action drop
205d3e985c9SAmit Cohen
206d3e985c9SAmit Cohen	# Generate IP packets with a unicast IP and a multicast destination MAC
207d3e985c9SAmit Cohen	$MZ $h1 $flags -t udp "sp=54321,dp=12345" -c 0 -p 100 -b $dmac \
208d3e985c9SAmit Cohen		-B $dip -d 1msec -q &
209d3e985c9SAmit Cohen	mz_pid=$!
210d3e985c9SAmit Cohen
21104cc99d9SIdo Schimmel	devlink_trap_drop_test $trap_name $rp2 101
212d3e985c9SAmit Cohen
213d3e985c9SAmit Cohen	log_test "Unicast destination IP over multicast destination MAC: $desc"
214d3e985c9SAmit Cohen
215c902a52cSJiri Pirko	devlink_trap_drop_cleanup $mz_pid $rp2 $proto 1 101
216d3e985c9SAmit Cohen}
217d3e985c9SAmit Cohen
218d3e985c9SAmit Cohenuc_dip_over_mc_dmac_test()
219d3e985c9SAmit Cohen{
220d3e985c9SAmit Cohen	__uc_dip_over_mc_dmac_test "IPv4" "ip" $h2_ipv4
221d3e985c9SAmit Cohen	__uc_dip_over_mc_dmac_test "IPv6" "ipv6" $h2_ipv6 "-6"
222d3e985c9SAmit Cohen}
223d3e985c9SAmit Cohen
224d3e985c9SAmit Cohen__sip_is_loopback_test()
225d3e985c9SAmit Cohen{
226d3e985c9SAmit Cohen	local desc=$1; shift
227d3e985c9SAmit Cohen	local proto=$1; shift
228d3e985c9SAmit Cohen	local sip=$1; shift
229d3e985c9SAmit Cohen	local dip=$1; shift
230d3e985c9SAmit Cohen	local flags=${1:-""}; shift
231d3e985c9SAmit Cohen	local trap_name="sip_is_loopback_address"
232d3e985c9SAmit Cohen	local mz_pid
233d3e985c9SAmit Cohen
234d3e985c9SAmit Cohen	RET=0
235d3e985c9SAmit Cohen
236d3e985c9SAmit Cohen	ping_check $trap_name
237d3e985c9SAmit Cohen
238d3e985c9SAmit Cohen	tc filter add dev $rp2 egress protocol $proto pref 1 handle 101 \
239d3e985c9SAmit Cohen		flower src_ip $sip action drop
240d3e985c9SAmit Cohen
241d3e985c9SAmit Cohen	# Generate packets with loopback source IP
242d3e985c9SAmit Cohen	$MZ $h1 $flags -t udp "sp=54321,dp=12345" -c 0 -p 100 -A $sip \
243d3e985c9SAmit Cohen		-b $rp1mac -B $dip -d 1msec -q &
244d3e985c9SAmit Cohen	mz_pid=$!
245d3e985c9SAmit Cohen
24604cc99d9SIdo Schimmel	devlink_trap_drop_test $trap_name $rp2 101
247d3e985c9SAmit Cohen
248d3e985c9SAmit Cohen	log_test "Source IP is loopback address: $desc"
249d3e985c9SAmit Cohen
250c902a52cSJiri Pirko	devlink_trap_drop_cleanup $mz_pid $rp2 $proto 1 101
251d3e985c9SAmit Cohen}
252d3e985c9SAmit Cohen
253d3e985c9SAmit Cohensip_is_loopback_test()
254d3e985c9SAmit Cohen{
255d3e985c9SAmit Cohen	__sip_is_loopback_test "IPv4" "ip" "127.0.0.0/8" $h2_ipv4
256d3e985c9SAmit Cohen	__sip_is_loopback_test "IPv6" "ipv6" "::1" $h2_ipv6 "-6"
257d3e985c9SAmit Cohen}
258d3e985c9SAmit Cohen
259d3e985c9SAmit Cohen__dip_is_loopback_test()
260d3e985c9SAmit Cohen{
261d3e985c9SAmit Cohen	local desc=$1; shift
262d3e985c9SAmit Cohen	local proto=$1; shift
263d3e985c9SAmit Cohen	local dip=$1; shift
264d3e985c9SAmit Cohen	local flags=${1:-""}; shift
265d3e985c9SAmit Cohen	local trap_name="dip_is_loopback_address"
266d3e985c9SAmit Cohen	local mz_pid
267d3e985c9SAmit Cohen
268d3e985c9SAmit Cohen	RET=0
269d3e985c9SAmit Cohen
270d3e985c9SAmit Cohen	ping_check $trap_name
271d3e985c9SAmit Cohen
272d3e985c9SAmit Cohen	tc filter add dev $rp2 egress protocol $proto pref 1 handle 101 \
273d3e985c9SAmit Cohen		flower dst_ip $dip action drop
274d3e985c9SAmit Cohen
275d3e985c9SAmit Cohen	# Generate packets with loopback destination IP
276d3e985c9SAmit Cohen	$MZ $h1 $flags -t udp "sp=54321,dp=12345" -c 0 -p 100 -b $rp1mac \
277d3e985c9SAmit Cohen		-B $dip -d 1msec -q &
278d3e985c9SAmit Cohen	mz_pid=$!
279d3e985c9SAmit Cohen
28004cc99d9SIdo Schimmel	devlink_trap_drop_test $trap_name $rp2 101
281d3e985c9SAmit Cohen
282d3e985c9SAmit Cohen	log_test "Destination IP is loopback address: $desc"
283d3e985c9SAmit Cohen
284c902a52cSJiri Pirko	devlink_trap_drop_cleanup $mz_pid $rp2 $proto 1 101
285d3e985c9SAmit Cohen}
286d3e985c9SAmit Cohen
287d3e985c9SAmit Cohendip_is_loopback_test()
288d3e985c9SAmit Cohen{
289d3e985c9SAmit Cohen	__dip_is_loopback_test "IPv4" "ip" "127.0.0.0/8"
290d3e985c9SAmit Cohen	__dip_is_loopback_test "IPv6" "ipv6" "::1" "-6"
291d3e985c9SAmit Cohen}
292d3e985c9SAmit Cohen
293d3e985c9SAmit Cohen__sip_is_mc_test()
294d3e985c9SAmit Cohen{
295d3e985c9SAmit Cohen	local desc=$1; shift
296d3e985c9SAmit Cohen	local proto=$1; shift
297d3e985c9SAmit Cohen	local sip=$1; shift
298d3e985c9SAmit Cohen	local dip=$1; shift
299d3e985c9SAmit Cohen	local flags=${1:-""}; shift
300d3e985c9SAmit Cohen	local trap_name="sip_is_mc"
301d3e985c9SAmit Cohen	local mz_pid
302d3e985c9SAmit Cohen
303d3e985c9SAmit Cohen	RET=0
304d3e985c9SAmit Cohen
305d3e985c9SAmit Cohen	ping_check $trap_name
306d3e985c9SAmit Cohen
307d3e985c9SAmit Cohen	tc filter add dev $rp2 egress protocol $proto pref 1 handle 101 \
308d3e985c9SAmit Cohen		flower src_ip $sip action drop
309d3e985c9SAmit Cohen
310d3e985c9SAmit Cohen	# Generate packets with multicast source IP
311d3e985c9SAmit Cohen	$MZ $h1 $flags -t udp "sp=54321,dp=12345" -c 0 -p 100 -A $sip \
312d3e985c9SAmit Cohen		-b $rp1mac -B $dip -d 1msec -q &
313d3e985c9SAmit Cohen	mz_pid=$!
314d3e985c9SAmit Cohen
31504cc99d9SIdo Schimmel	devlink_trap_drop_test $trap_name $rp2 101
316d3e985c9SAmit Cohen
317d3e985c9SAmit Cohen	log_test "Source IP is multicast: $desc"
318d3e985c9SAmit Cohen
319c902a52cSJiri Pirko	devlink_trap_drop_cleanup $mz_pid $rp2 $proto 1 101
320d3e985c9SAmit Cohen}
321d3e985c9SAmit Cohen
322d3e985c9SAmit Cohensip_is_mc_test()
323d3e985c9SAmit Cohen{
324d3e985c9SAmit Cohen	__sip_is_mc_test "IPv4" "ip" "239.1.1.1" $h2_ipv4
325d3e985c9SAmit Cohen	__sip_is_mc_test "IPv6" "ipv6" "FF02::2" $h2_ipv6 "-6"
326d3e985c9SAmit Cohen}
327d3e985c9SAmit Cohen
328d3e985c9SAmit Cohenipv4_sip_is_limited_bc_test()
329d3e985c9SAmit Cohen{
330d3e985c9SAmit Cohen	local trap_name="ipv4_sip_is_limited_bc"
331d3e985c9SAmit Cohen	local sip=255.255.255.255
332d3e985c9SAmit Cohen	local mz_pid
333d3e985c9SAmit Cohen
334d3e985c9SAmit Cohen	RET=0
335d3e985c9SAmit Cohen
336d3e985c9SAmit Cohen	ping_check $trap_name
337d3e985c9SAmit Cohen
338d3e985c9SAmit Cohen	tc filter add dev $rp2 egress protocol ip pref 1 handle 101 \
339d3e985c9SAmit Cohen		flower src_ip $sip action drop
340d3e985c9SAmit Cohen
341d3e985c9SAmit Cohen	# Generate packets with limited broadcast source IP
342d3e985c9SAmit Cohen	$MZ $h1 -t udp "sp=54321,dp=12345" -c 0 -p 100 -A $sip -b $rp1mac \
343d3e985c9SAmit Cohen		-B $h2_ipv4 -d 1msec -q &
344d3e985c9SAmit Cohen	mz_pid=$!
345d3e985c9SAmit Cohen
34604cc99d9SIdo Schimmel	devlink_trap_drop_test $trap_name $rp2 101
347d3e985c9SAmit Cohen
348d3e985c9SAmit Cohen	log_test "IPv4 source IP is limited broadcast"
349d3e985c9SAmit Cohen
350c902a52cSJiri Pirko	devlink_trap_drop_cleanup $mz_pid $rp2 "ip" 1 101
351d3e985c9SAmit Cohen}
352d3e985c9SAmit Cohen
353d3e985c9SAmit Cohenipv4_payload_get()
354d3e985c9SAmit Cohen{
355d3e985c9SAmit Cohen	local ipver=$1; shift
356d3e985c9SAmit Cohen	local ihl=$1; shift
357d3e985c9SAmit Cohen	local checksum=$1; shift
358d3e985c9SAmit Cohen
359d3e985c9SAmit Cohen	p=$(:
360d3e985c9SAmit Cohen		)"08:00:"$(                   : ETH type
361d3e985c9SAmit Cohen		)"$ipver"$(                   : IP version
362d3e985c9SAmit Cohen		)"$ihl:"$(                    : IHL
363d3e985c9SAmit Cohen		)"00:"$(		      : IP TOS
364d3e985c9SAmit Cohen		)"00:F4:"$(                   : IP total length
365d3e985c9SAmit Cohen		)"00:00:"$(                   : IP identification
366d3e985c9SAmit Cohen		)"20:00:"$(                   : IP flags + frag off
367d3e985c9SAmit Cohen		)"30:"$(                      : IP TTL
368d3e985c9SAmit Cohen		)"01:"$(                      : IP proto
369d3e985c9SAmit Cohen		)"$checksum:"$(               : IP header csum
370d3e985c9SAmit Cohen		)"$h1_ipv4:"$(                : IP saddr
371d3e985c9SAmit Cohen	        )"$h2_ipv4:"$(                : IP daddr
372d3e985c9SAmit Cohen		)
373d3e985c9SAmit Cohen	echo $p
374d3e985c9SAmit Cohen}
375d3e985c9SAmit Cohen
376d3e985c9SAmit Cohen__ipv4_header_corrupted_test()
377d3e985c9SAmit Cohen{
378d3e985c9SAmit Cohen	local desc=$1; shift
379d3e985c9SAmit Cohen	local ipver=$1; shift
380d3e985c9SAmit Cohen	local ihl=$1; shift
381d3e985c9SAmit Cohen	local checksum=$1; shift
382d3e985c9SAmit Cohen	local trap_name="ip_header_corrupted"
383d3e985c9SAmit Cohen	local payload
384d3e985c9SAmit Cohen	local mz_pid
385d3e985c9SAmit Cohen
386d3e985c9SAmit Cohen	RET=0
387d3e985c9SAmit Cohen
388d3e985c9SAmit Cohen	ping_check $trap_name
389d3e985c9SAmit Cohen
390d3e985c9SAmit Cohen	tc filter add dev $rp2 egress protocol ip pref 1 handle 101 \
391d3e985c9SAmit Cohen		flower dst_ip $h2_ipv4 action drop
392d3e985c9SAmit Cohen
393d3e985c9SAmit Cohen	payload=$(ipv4_payload_get $ipver $ihl $checksum)
394d3e985c9SAmit Cohen
395d3e985c9SAmit Cohen	# Generate packets with corrupted IP header
396d3e985c9SAmit Cohen	$MZ $h1 -c 0 -d 1msec -a $h1mac -b $rp1mac -q p=$payload &
397d3e985c9SAmit Cohen	mz_pid=$!
398d3e985c9SAmit Cohen
39904cc99d9SIdo Schimmel	devlink_trap_drop_test $trap_name $rp2 101
400d3e985c9SAmit Cohen
401d3e985c9SAmit Cohen	log_test "IP header corrupted: $desc: IPv4"
402d3e985c9SAmit Cohen
403c902a52cSJiri Pirko	devlink_trap_drop_cleanup $mz_pid $rp2 "ip" 1 101
404d3e985c9SAmit Cohen}
405d3e985c9SAmit Cohen
406d3e985c9SAmit Cohenipv6_payload_get()
407d3e985c9SAmit Cohen{
408d3e985c9SAmit Cohen	local ipver=$1; shift
409d3e985c9SAmit Cohen
410d3e985c9SAmit Cohen	p=$(:
411d3e985c9SAmit Cohen		)"86:DD:"$(                  : ETH type
412d3e985c9SAmit Cohen		)"$ipver"$(                  : IP version
413d3e985c9SAmit Cohen		)"0:0:"$(                    : Traffic class
414d3e985c9SAmit Cohen		)"0:00:00:"$(		     : Flow label
415d3e985c9SAmit Cohen		)"00:00:"$(                  : Payload length
416d3e985c9SAmit Cohen		)"01:"$(                     : Next header
417d3e985c9SAmit Cohen		)"04:"$(                     : Hop limit
418d3e985c9SAmit Cohen		)"$h1_ipv6:"$(      	     : IP saddr
419d3e985c9SAmit Cohen		)"$h2_ipv6:"$(               : IP daddr
420d3e985c9SAmit Cohen		)
421d3e985c9SAmit Cohen	echo $p
422d3e985c9SAmit Cohen}
423d3e985c9SAmit Cohen
424d3e985c9SAmit Cohen__ipv6_header_corrupted_test()
425d3e985c9SAmit Cohen{
426d3e985c9SAmit Cohen	local desc=$1; shift
427d3e985c9SAmit Cohen	local ipver=$1; shift
428d3e985c9SAmit Cohen	local trap_name="ip_header_corrupted"
429d3e985c9SAmit Cohen	local payload
430d3e985c9SAmit Cohen	local mz_pid
431d3e985c9SAmit Cohen
432d3e985c9SAmit Cohen	RET=0
433d3e985c9SAmit Cohen
434d3e985c9SAmit Cohen	ping_check $trap_name
435d3e985c9SAmit Cohen
436d3e985c9SAmit Cohen	tc filter add dev $rp2 egress protocol ip pref 1 handle 101 \
437d3e985c9SAmit Cohen		flower dst_ip $h2_ipv4 action drop
438d3e985c9SAmit Cohen
439d3e985c9SAmit Cohen	payload=$(ipv6_payload_get $ipver)
440d3e985c9SAmit Cohen
441d3e985c9SAmit Cohen	# Generate packets with corrupted IP header
442d3e985c9SAmit Cohen	$MZ $h1 -c 0 -d 1msec -a $h1mac -b $rp1mac -q p=$payload &
443d3e985c9SAmit Cohen	mz_pid=$!
444d3e985c9SAmit Cohen
44504cc99d9SIdo Schimmel	devlink_trap_drop_test $trap_name $rp2 101
446d3e985c9SAmit Cohen
447d3e985c9SAmit Cohen	log_test "IP header corrupted: $desc: IPv6"
448d3e985c9SAmit Cohen
449c902a52cSJiri Pirko	devlink_trap_drop_cleanup $mz_pid $rp2 "ip" 1 101
450d3e985c9SAmit Cohen}
451d3e985c9SAmit Cohen
452d3e985c9SAmit Cohenip_header_corrupted_test()
453d3e985c9SAmit Cohen{
454d3e985c9SAmit Cohen	# Each test uses one wrong value. The three values below are correct.
455d3e985c9SAmit Cohen	local ipv="4"
456d3e985c9SAmit Cohen	local ihl="5"
457d3e985c9SAmit Cohen	local checksum="00:F4"
458d3e985c9SAmit Cohen
459d3e985c9SAmit Cohen	__ipv4_header_corrupted_test "wrong IP version" 5 $ihl $checksum
460d3e985c9SAmit Cohen	__ipv4_header_corrupted_test "wrong IHL" $ipv 4 $checksum
461d3e985c9SAmit Cohen	__ipv4_header_corrupted_test "wrong checksum" $ipv $ihl "00:00"
462d3e985c9SAmit Cohen	__ipv6_header_corrupted_test "wrong IP version" 5
463d3e985c9SAmit Cohen}
464d3e985c9SAmit Cohen
465d3e985c9SAmit Cohenipv6_mc_dip_reserved_scope_test()
466d3e985c9SAmit Cohen{
467d3e985c9SAmit Cohen	local trap_name="ipv6_mc_dip_reserved_scope"
468d3e985c9SAmit Cohen	local dip=FF00::
469d3e985c9SAmit Cohen	local mz_pid
470d3e985c9SAmit Cohen
471d3e985c9SAmit Cohen	RET=0
472d3e985c9SAmit Cohen
473d3e985c9SAmit Cohen	ping_check $trap_name
474d3e985c9SAmit Cohen
475d3e985c9SAmit Cohen	tc filter add dev $rp2 egress protocol ipv6 pref 1 handle 101 \
476d3e985c9SAmit Cohen		flower dst_ip $dip action drop
477d3e985c9SAmit Cohen
478d3e985c9SAmit Cohen	# Generate packets with reserved scope destination IP
479d3e985c9SAmit Cohen	$MZ $h1 -6 -t udp "sp=54321,dp=12345" -c 0 -p 100 -b \
480d3e985c9SAmit Cohen		"33:33:00:00:00:00" -B $dip -d 1msec -q &
481d3e985c9SAmit Cohen	mz_pid=$!
482d3e985c9SAmit Cohen
48304cc99d9SIdo Schimmel	devlink_trap_drop_test $trap_name $rp2 101
484d3e985c9SAmit Cohen
485d3e985c9SAmit Cohen	log_test "IPv6 multicast destination IP reserved scope"
486d3e985c9SAmit Cohen
487c902a52cSJiri Pirko	devlink_trap_drop_cleanup $mz_pid $rp2 "ipv6" 1 101
488d3e985c9SAmit Cohen}
489d3e985c9SAmit Cohen
490d3e985c9SAmit Cohenipv6_mc_dip_interface_local_scope_test()
491d3e985c9SAmit Cohen{
492d3e985c9SAmit Cohen	local trap_name="ipv6_mc_dip_interface_local_scope"
493d3e985c9SAmit Cohen	local dip=FF01::
494d3e985c9SAmit Cohen	local mz_pid
495d3e985c9SAmit Cohen
496d3e985c9SAmit Cohen	RET=0
497d3e985c9SAmit Cohen
498d3e985c9SAmit Cohen	ping_check $trap_name
499d3e985c9SAmit Cohen
500d3e985c9SAmit Cohen	tc filter add dev $rp2 egress protocol ipv6 pref 1 handle 101 \
501d3e985c9SAmit Cohen		flower dst_ip $dip action drop
502d3e985c9SAmit Cohen
503d3e985c9SAmit Cohen	# Generate packets with interface local scope destination IP
504d3e985c9SAmit Cohen	$MZ $h1 -6 -t udp "sp=54321,dp=12345" -c 0 -p 100 -b \
505d3e985c9SAmit Cohen		"33:33:00:00:00:00" -B $dip -d 1msec -q &
506d3e985c9SAmit Cohen	mz_pid=$!
507d3e985c9SAmit Cohen
50804cc99d9SIdo Schimmel	devlink_trap_drop_test $trap_name $rp2 101
509d3e985c9SAmit Cohen
510d3e985c9SAmit Cohen	log_test "IPv6 multicast destination IP interface-local scope"
511d3e985c9SAmit Cohen
512c902a52cSJiri Pirko	devlink_trap_drop_cleanup $mz_pid $rp2 "ipv6" 1 101
513d3e985c9SAmit Cohen}
514d3e985c9SAmit Cohen
515d3e985c9SAmit Cohen__blackhole_route_test()
516d3e985c9SAmit Cohen{
517d3e985c9SAmit Cohen	local flags=$1; shift
518d3e985c9SAmit Cohen	local subnet=$1; shift
519d3e985c9SAmit Cohen	local proto=$1; shift
520d3e985c9SAmit Cohen	local dip=$1; shift
521d3e985c9SAmit Cohen	local ip_proto=${1:-"icmp"}; shift
522d3e985c9SAmit Cohen	local trap_name="blackhole_route"
523d3e985c9SAmit Cohen	local mz_pid
524d3e985c9SAmit Cohen
525d3e985c9SAmit Cohen	RET=0
526d3e985c9SAmit Cohen
527d3e985c9SAmit Cohen	ping_check $trap_name
528d3e985c9SAmit Cohen
529d3e985c9SAmit Cohen	ip -$flags route add blackhole $subnet
530d3e985c9SAmit Cohen	tc filter add dev $rp2 egress protocol $proto pref 1 handle 101 \
531d3e985c9SAmit Cohen		flower skip_hw dst_ip $dip ip_proto $ip_proto action drop
532d3e985c9SAmit Cohen
533d3e985c9SAmit Cohen	# Generate packets to the blackhole route
534d3e985c9SAmit Cohen	$MZ $h1 -$flags -t udp "sp=54321,dp=12345" -c 0 -p 100 -b $rp1mac \
535d3e985c9SAmit Cohen		-B $dip -d 1msec -q &
536d3e985c9SAmit Cohen	mz_pid=$!
537d3e985c9SAmit Cohen
53804cc99d9SIdo Schimmel	devlink_trap_drop_test $trap_name $rp2 101
539d3e985c9SAmit Cohen	log_test "Blackhole route: IPv$flags"
540d3e985c9SAmit Cohen
541c902a52cSJiri Pirko	devlink_trap_drop_cleanup $mz_pid $rp2 $proto 1 101
542d3e985c9SAmit Cohen	ip -$flags route del blackhole $subnet
543d3e985c9SAmit Cohen}
544d3e985c9SAmit Cohen
545d3e985c9SAmit Cohenblackhole_route_test()
546d3e985c9SAmit Cohen{
547d3e985c9SAmit Cohen	__blackhole_route_test "4" "198.51.100.0/30" "ip" $h2_ipv4
548d3e985c9SAmit Cohen	__blackhole_route_test "6" "2001:db8:2::/120" "ipv6" $h2_ipv6 "icmpv6"
549d3e985c9SAmit Cohen}
550d3e985c9SAmit Cohen
551740e87bcSAmit Cohenirif_disabled_test()
552740e87bcSAmit Cohen{
553740e87bcSAmit Cohen	local trap_name="irif_disabled"
554740e87bcSAmit Cohen	local t0_packets t0_bytes
555740e87bcSAmit Cohen	local t1_packets t1_bytes
556740e87bcSAmit Cohen	local mz_pid
557740e87bcSAmit Cohen
558740e87bcSAmit Cohen	RET=0
559740e87bcSAmit Cohen
560740e87bcSAmit Cohen	ping_check $trap_name
561740e87bcSAmit Cohen
562740e87bcSAmit Cohen	devlink_trap_action_set $trap_name "trap"
563740e87bcSAmit Cohen
564740e87bcSAmit Cohen	# When RIF of a physical port ("Sub-port RIF") is destroyed, we first
565740e87bcSAmit Cohen	# block the STP of the {Port, VLAN} so packets cannot get into the RIF.
566740e87bcSAmit Cohen	# Using bridge enables us to see this trap because when bridge is
567740e87bcSAmit Cohen	# destroyed, there is a small time window that packets can go into the
568740e87bcSAmit Cohen	# RIF, while it is disabled.
569740e87bcSAmit Cohen	ip link add dev br0 type bridge
570740e87bcSAmit Cohen	ip link set dev $rp1 master br0
571740e87bcSAmit Cohen	ip address flush dev $rp1
572740e87bcSAmit Cohen	__addr_add_del br0 add 192.0.2.2/24
573740e87bcSAmit Cohen	ip li set dev br0 up
574740e87bcSAmit Cohen
575740e87bcSAmit Cohen	t0_packets=$(devlink_trap_rx_packets_get $trap_name)
576740e87bcSAmit Cohen	t0_bytes=$(devlink_trap_rx_bytes_get $trap_name)
577740e87bcSAmit Cohen
578740e87bcSAmit Cohen	# Generate packets to h2 through br0 RIF that will be removed later
579740e87bcSAmit Cohen	$MZ $h1 -t udp "sp=54321,dp=12345" -c 0 -p 100 -a own -b $rp1mac \
580740e87bcSAmit Cohen		-B $h2_ipv4 -q &
581740e87bcSAmit Cohen	mz_pid=$!
582740e87bcSAmit Cohen
583740e87bcSAmit Cohen	# Wait before removing br0 RIF to allow packets to go into the bridge.
584740e87bcSAmit Cohen	sleep 1
585740e87bcSAmit Cohen
586740e87bcSAmit Cohen	# Flushing address will dismantle the RIF
587740e87bcSAmit Cohen	ip address flush dev br0
588740e87bcSAmit Cohen
589740e87bcSAmit Cohen	t1_packets=$(devlink_trap_rx_packets_get $trap_name)
590740e87bcSAmit Cohen	t1_bytes=$(devlink_trap_rx_bytes_get $trap_name)
591740e87bcSAmit Cohen
592740e87bcSAmit Cohen	if [[ $t0_packets -eq $t1_packets && $t0_bytes -eq $t1_bytes ]]; then
593740e87bcSAmit Cohen		check_err 1 "Trap stats idle when packets should be trapped"
594740e87bcSAmit Cohen	fi
595740e87bcSAmit Cohen
596740e87bcSAmit Cohen	log_test "Ingress RIF disabled"
597740e87bcSAmit Cohen
598*46f6569cSPetr Machata	kill_process $mz_pid
599740e87bcSAmit Cohen	ip link set dev $rp1 nomaster
600740e87bcSAmit Cohen	__addr_add_del $rp1 add 192.0.2.2/24 2001:db8:1::2/64
601740e87bcSAmit Cohen	ip link del dev br0 type bridge
602740e87bcSAmit Cohen	devlink_trap_action_set $trap_name "drop"
603740e87bcSAmit Cohen}
604740e87bcSAmit Cohen
605740e87bcSAmit Cohenerif_disabled_test()
606740e87bcSAmit Cohen{
607740e87bcSAmit Cohen	local trap_name="erif_disabled"
608740e87bcSAmit Cohen	local t0_packets t0_bytes
609740e87bcSAmit Cohen	local t1_packets t1_bytes
610740e87bcSAmit Cohen	local mz_pid
611740e87bcSAmit Cohen
612740e87bcSAmit Cohen	RET=0
613740e87bcSAmit Cohen
614740e87bcSAmit Cohen	ping_check $trap_name
615740e87bcSAmit Cohen
616740e87bcSAmit Cohen	devlink_trap_action_set $trap_name "trap"
617740e87bcSAmit Cohen	ip link add dev br0 type bridge
618740e87bcSAmit Cohen	ip add flush dev $rp1
619740e87bcSAmit Cohen	ip link set dev $rp1 master br0
620740e87bcSAmit Cohen	__addr_add_del br0 add 192.0.2.2/24
621740e87bcSAmit Cohen	ip link set dev br0 up
622740e87bcSAmit Cohen
623740e87bcSAmit Cohen	t0_packets=$(devlink_trap_rx_packets_get $trap_name)
624740e87bcSAmit Cohen	t0_bytes=$(devlink_trap_rx_bytes_get $trap_name)
625740e87bcSAmit Cohen
626740e87bcSAmit Cohen	rp2mac=$(mac_get $rp2)
627740e87bcSAmit Cohen
628740e87bcSAmit Cohen	# Generate packets that should go out through br0 RIF that will be
629740e87bcSAmit Cohen	# removed later
630740e87bcSAmit Cohen	$MZ $h2 -t udp "sp=54321,dp=12345" -c 0 -p 100 -a own -b $rp2mac \
631740e87bcSAmit Cohen		-B 192.0.2.1 -q &
632740e87bcSAmit Cohen	mz_pid=$!
633740e87bcSAmit Cohen
634740e87bcSAmit Cohen	sleep 5
6355d66773fSIdo Schimmel	# Unlinking the port from the bridge will disable the RIF associated
6365d66773fSIdo Schimmel	# with br0 as it is no longer an upper of any mlxsw port.
6375d66773fSIdo Schimmel	ip link set dev $rp1 nomaster
638740e87bcSAmit Cohen
639740e87bcSAmit Cohen	t1_packets=$(devlink_trap_rx_packets_get $trap_name)
640740e87bcSAmit Cohen	t1_bytes=$(devlink_trap_rx_bytes_get $trap_name)
641740e87bcSAmit Cohen
642740e87bcSAmit Cohen	if [[ $t0_packets -eq $t1_packets && $t0_bytes -eq $t1_bytes ]]; then
643740e87bcSAmit Cohen		check_err 1 "Trap stats idle when packets should be trapped"
644740e87bcSAmit Cohen	fi
645740e87bcSAmit Cohen
646740e87bcSAmit Cohen	log_test "Egress RIF disabled"
647740e87bcSAmit Cohen
648*46f6569cSPetr Machata	kill_process $mz_pid
649740e87bcSAmit Cohen	__addr_add_del $rp1 add 192.0.2.2/24 2001:db8:1::2/64
650740e87bcSAmit Cohen	ip link del dev br0 type bridge
651740e87bcSAmit Cohen	devlink_trap_action_set $trap_name "drop"
652740e87bcSAmit Cohen}
653740e87bcSAmit Cohen
65484e8feeaSIdo Schimmel__blackhole_nexthop_test()
65584e8feeaSIdo Schimmel{
65684e8feeaSIdo Schimmel	local flags=$1; shift
65784e8feeaSIdo Schimmel	local subnet=$1; shift
65884e8feeaSIdo Schimmel	local proto=$1; shift
65984e8feeaSIdo Schimmel	local dip=$1; shift
66084e8feeaSIdo Schimmel	local trap_name="blackhole_nexthop"
66184e8feeaSIdo Schimmel	local mz_pid
66284e8feeaSIdo Schimmel
66384e8feeaSIdo Schimmel	RET=0
66484e8feeaSIdo Schimmel
66584e8feeaSIdo Schimmel	ip -$flags nexthop add id 1 blackhole
66684e8feeaSIdo Schimmel	ip -$flags route add $subnet nhid 1
66784e8feeaSIdo Schimmel	tc filter add dev $rp2 egress protocol $proto pref 1 handle 101 \
66884e8feeaSIdo Schimmel		flower skip_hw dst_ip $dip ip_proto udp action drop
66984e8feeaSIdo Schimmel
67084e8feeaSIdo Schimmel	# Generate packets to the blackhole nexthop
67184e8feeaSIdo Schimmel	$MZ $h1 -$flags -t udp "sp=54321,dp=12345" -c 0 -p 100 -b $rp1mac \
67284e8feeaSIdo Schimmel		-B $dip -d 1msec -q &
67384e8feeaSIdo Schimmel	mz_pid=$!
67484e8feeaSIdo Schimmel
67584e8feeaSIdo Schimmel	devlink_trap_drop_test $trap_name $rp2 101
67684e8feeaSIdo Schimmel	log_test "Blackhole nexthop: IPv$flags"
67784e8feeaSIdo Schimmel
67884e8feeaSIdo Schimmel	devlink_trap_drop_cleanup $mz_pid $rp2 $proto 1 101
67984e8feeaSIdo Schimmel	ip -$flags route del $subnet
68084e8feeaSIdo Schimmel	ip -$flags nexthop del id 1
68184e8feeaSIdo Schimmel}
68284e8feeaSIdo Schimmel
68384e8feeaSIdo Schimmelblackhole_nexthop_test()
68484e8feeaSIdo Schimmel{
68584e8feeaSIdo Schimmel	__blackhole_nexthop_test "4" "198.51.100.0/30" "ip" $h2_ipv4
68684e8feeaSIdo Schimmel	__blackhole_nexthop_test "6" "2001:db8:2::/120" "ipv6" $h2_ipv6
68784e8feeaSIdo Schimmel}
68884e8feeaSIdo Schimmel
689d3e985c9SAmit Cohentrap cleanup EXIT
690d3e985c9SAmit Cohen
691d3e985c9SAmit Cohensetup_prepare
692d3e985c9SAmit Cohensetup_wait
693d3e985c9SAmit Cohen
694d3e985c9SAmit Cohentests_run
695d3e985c9SAmit Cohen
696d3e985c9SAmit Cohenexit $EXIT_STATUS
697