xref: /openbmc/linux/tools/testing/selftests/drivers/net/mlxsw/blackhole_routes.sh (revision ead5d1f4d877e92c051e1a1ade623d0d30e71619)
1a98232a1SIdo Schimmel#!/bin/bash
2a98232a1SIdo Schimmel# SPDX-License-Identifier: GPL-2.0
3a98232a1SIdo Schimmel#
4a98232a1SIdo Schimmel# Test that blackhole routes are marked as offloaded and that packets hitting
5a98232a1SIdo Schimmel# them are dropped by the ASIC and not by the kernel.
6a98232a1SIdo Schimmel#
7a98232a1SIdo Schimmel# +---------------------------------+
8a98232a1SIdo Schimmel# | H1 (vrf)                        |
9a98232a1SIdo Schimmel# |    + $h1                        |
10a98232a1SIdo Schimmel# |    | 192.0.2.1/24               |
11a98232a1SIdo Schimmel# |    | 2001:db8:1::1/64           |
12a98232a1SIdo Schimmel# |    |                            |
13a98232a1SIdo Schimmel# |    |  default via 192.0.2.2     |
14a98232a1SIdo Schimmel# |    |  default via 2001:db8:1::2 |
15a98232a1SIdo Schimmel# +----|----------------------------+
16a98232a1SIdo Schimmel#      |
17a98232a1SIdo Schimmel# +----|----------------------------------------------------------------------+
18a98232a1SIdo Schimmel# | SW |                                                                      |
19a98232a1SIdo Schimmel# |    + $rp1                                                                 |
20a98232a1SIdo Schimmel# |        192.0.2.2/24                                                       |
21a98232a1SIdo Schimmel# |        2001:db8:1::2/64                                                   |
22a98232a1SIdo Schimmel# |                                                                           |
23a98232a1SIdo Schimmel# |        2001:db8:2::2/64                                                   |
24a98232a1SIdo Schimmel# |        198.51.100.2/24                                                    |
25a98232a1SIdo Schimmel# |    + $rp2                                                                 |
26a98232a1SIdo Schimmel# |    |                                                                      |
27a98232a1SIdo Schimmel# +----|----------------------------------------------------------------------+
28a98232a1SIdo Schimmel#      |
29a98232a1SIdo Schimmel# +----|----------------------------+
30a98232a1SIdo Schimmel# |    |  default via 198.51.100.2  |
31a98232a1SIdo Schimmel# |    |  default via 2001:db8:2::2 |
32a98232a1SIdo Schimmel# |    |                            |
33a98232a1SIdo Schimmel# |    | 2001:db8:2::1/64           |
34a98232a1SIdo Schimmel# |    | 198.51.100.1/24            |
35a98232a1SIdo Schimmel# |    + $h2                        |
36a98232a1SIdo Schimmel# | H2 (vrf)                        |
37a98232a1SIdo Schimmel# +---------------------------------+
38a98232a1SIdo Schimmel
39a98232a1SIdo Schimmellib_dir=$(dirname $0)/../../../net/forwarding
40a98232a1SIdo Schimmel
41a98232a1SIdo SchimmelALL_TESTS="
42a98232a1SIdo Schimmel	ping_ipv4
43a98232a1SIdo Schimmel	ping_ipv6
44a98232a1SIdo Schimmel	blackhole_ipv4
45a98232a1SIdo Schimmel	blackhole_ipv6
46a98232a1SIdo Schimmel"
47a98232a1SIdo SchimmelNUM_NETIFS=4
48*0c22f993SDanielle Ratson: ${TIMEOUT:=20000} # ms
49a98232a1SIdo Schimmelsource $lib_dir/tc_common.sh
50a98232a1SIdo Schimmelsource $lib_dir/lib.sh
51a98232a1SIdo Schimmel
52a98232a1SIdo Schimmelh1_create()
53a98232a1SIdo Schimmel{
54a98232a1SIdo Schimmel	simple_if_init $h1 192.0.2.1/24 2001:db8:1::1/64
55a98232a1SIdo Schimmel
56a98232a1SIdo Schimmel	ip -4 route add default vrf v$h1 nexthop via 192.0.2.2
57a98232a1SIdo Schimmel	ip -6 route add default vrf v$h1 nexthop via 2001:db8:1::2
58a98232a1SIdo Schimmel}
59a98232a1SIdo Schimmel
60a98232a1SIdo Schimmelh1_destroy()
61a98232a1SIdo Schimmel{
62a98232a1SIdo Schimmel	ip -6 route del default vrf v$h1 nexthop via 2001:db8:1::2
63a98232a1SIdo Schimmel	ip -4 route del default vrf v$h1 nexthop via 192.0.2.2
64a98232a1SIdo Schimmel
65a98232a1SIdo Schimmel	simple_if_fini $h1 192.0.2.1/24 2001:db8:1::1/64
66a98232a1SIdo Schimmel}
67a98232a1SIdo Schimmel
68a98232a1SIdo Schimmelh2_create()
69a98232a1SIdo Schimmel{
70a98232a1SIdo Schimmel	simple_if_init $h2 198.51.100.1/24 2001:db8:2::1/64
71a98232a1SIdo Schimmel
72a98232a1SIdo Schimmel	ip -4 route add default vrf v$h2 nexthop via 198.51.100.2
73a98232a1SIdo Schimmel	ip -6 route add default vrf v$h2 nexthop via 2001:db8:2::2
74a98232a1SIdo Schimmel}
75a98232a1SIdo Schimmel
76a98232a1SIdo Schimmelh2_destroy()
77a98232a1SIdo Schimmel{
78a98232a1SIdo Schimmel	ip -6 route del default vrf v$h2 nexthop via 2001:db8:2::2
79a98232a1SIdo Schimmel	ip -4 route del default vrf v$h2 nexthop via 198.51.100.2
80a98232a1SIdo Schimmel
81a98232a1SIdo Schimmel	simple_if_fini $h2 198.51.100.1/24 2001:db8:2::1/64
82a98232a1SIdo Schimmel}
83a98232a1SIdo Schimmel
84a98232a1SIdo Schimmelrouter_create()
85a98232a1SIdo Schimmel{
86a98232a1SIdo Schimmel	ip link set dev $rp1 up
87a98232a1SIdo Schimmel	ip link set dev $rp2 up
88a98232a1SIdo Schimmel
89a98232a1SIdo Schimmel	tc qdisc add dev $rp1 clsact
90a98232a1SIdo Schimmel
91a98232a1SIdo Schimmel	__addr_add_del $rp1 add 192.0.2.2/24 2001:db8:1::2/64
92a98232a1SIdo Schimmel	__addr_add_del $rp2 add 198.51.100.2/24 2001:db8:2::2/64
93a98232a1SIdo Schimmel}
94a98232a1SIdo Schimmel
95a98232a1SIdo Schimmelrouter_destroy()
96a98232a1SIdo Schimmel{
97a98232a1SIdo Schimmel	__addr_add_del $rp2 del 198.51.100.2/24 2001:db8:2::2/64
98a98232a1SIdo Schimmel	__addr_add_del $rp1 del 192.0.2.2/24 2001:db8:1::2/64
99a98232a1SIdo Schimmel
100a98232a1SIdo Schimmel	tc qdisc del dev $rp1 clsact
101a98232a1SIdo Schimmel
102a98232a1SIdo Schimmel	ip link set dev $rp2 down
103a98232a1SIdo Schimmel	ip link set dev $rp1 down
104a98232a1SIdo Schimmel}
105a98232a1SIdo Schimmel
106a98232a1SIdo Schimmelping_ipv4()
107a98232a1SIdo Schimmel{
108a98232a1SIdo Schimmel	ping_test $h1 198.51.100.1 ": h1->h2"
109a98232a1SIdo Schimmel}
110a98232a1SIdo Schimmel
111a98232a1SIdo Schimmelping_ipv6()
112a98232a1SIdo Schimmel{
113a98232a1SIdo Schimmel	ping6_test $h1 2001:db8:2::1 ": h1->h2"
114a98232a1SIdo Schimmel}
115a98232a1SIdo Schimmel
116a98232a1SIdo Schimmelblackhole_ipv4()
117a98232a1SIdo Schimmel{
118a98232a1SIdo Schimmel	# Transmit packets from H1 to H2 and make sure they are dropped by the
119a98232a1SIdo Schimmel	# ASIC and not by the kernel
120a98232a1SIdo Schimmel	RET=0
121a98232a1SIdo Schimmel
122a98232a1SIdo Schimmel	ip -4 route add blackhole 198.51.100.0/30
123a98232a1SIdo Schimmel	tc filter add dev $rp1 ingress protocol ip pref 1 handle 101 flower \
124a98232a1SIdo Schimmel		skip_hw dst_ip 198.51.100.1 src_ip 192.0.2.1 ip_proto icmp \
125a98232a1SIdo Schimmel		action pass
126a98232a1SIdo Schimmel
127*0c22f993SDanielle Ratson	busywait "$TIMEOUT" wait_for_offload ip -4 route show 198.51.100.0/30
128a98232a1SIdo Schimmel	check_err $? "route not marked as offloaded when should"
129a98232a1SIdo Schimmel
130a98232a1SIdo Schimmel	ping_do $h1 198.51.100.1
131a98232a1SIdo Schimmel	check_fail $? "ping passed when should not"
132a98232a1SIdo Schimmel
133a98232a1SIdo Schimmel	tc_check_packets "dev $rp1 ingress" 101 0
134a98232a1SIdo Schimmel	check_err $? "packets trapped and not dropped by ASIC"
135a98232a1SIdo Schimmel
136a98232a1SIdo Schimmel	log_test "IPv4 blackhole route"
137a98232a1SIdo Schimmel
138a98232a1SIdo Schimmel	tc filter del dev $rp1 ingress protocol ip pref 1 handle 101 flower
139a98232a1SIdo Schimmel	ip -4 route del blackhole 198.51.100.0/30
140a98232a1SIdo Schimmel}
141a98232a1SIdo Schimmel
142a98232a1SIdo Schimmelblackhole_ipv6()
143a98232a1SIdo Schimmel{
144a98232a1SIdo Schimmel	RET=0
145a98232a1SIdo Schimmel
146a98232a1SIdo Schimmel	ip -6 route add blackhole 2001:db8:2::/120
147a98232a1SIdo Schimmel	tc filter add dev $rp1 ingress protocol ipv6 pref 1 handle 101 flower \
148a98232a1SIdo Schimmel		skip_hw dst_ip 2001:db8:2::1 src_ip 2001:db8:1::1 \
149a98232a1SIdo Schimmel		ip_proto icmpv6 action pass
150a98232a1SIdo Schimmel
151*0c22f993SDanielle Ratson	busywait "$TIMEOUT" wait_for_offload ip -6 route show 2001:db8:2::/120
152a98232a1SIdo Schimmel	check_err $? "route not marked as offloaded when should"
153a98232a1SIdo Schimmel
154a98232a1SIdo Schimmel	ping6_do $h1 2001:db8:2::1
155a98232a1SIdo Schimmel	check_fail $? "ping passed when should not"
156a98232a1SIdo Schimmel
157a98232a1SIdo Schimmel	tc_check_packets "dev $rp1 ingress" 101 0
158a98232a1SIdo Schimmel	check_err $? "packets trapped and not dropped by ASIC"
159a98232a1SIdo Schimmel
160a98232a1SIdo Schimmel	log_test "IPv6 blackhole route"
161a98232a1SIdo Schimmel
162a98232a1SIdo Schimmel	tc filter del dev $rp1 ingress protocol ipv6 pref 1 handle 101 flower
163a98232a1SIdo Schimmel	ip -6 route del blackhole 2001:db8:2::/120
164a98232a1SIdo Schimmel}
165a98232a1SIdo Schimmel
166a98232a1SIdo Schimmelsetup_prepare()
167a98232a1SIdo Schimmel{
168a98232a1SIdo Schimmel	h1=${NETIFS[p1]}
169a98232a1SIdo Schimmel	rp1=${NETIFS[p2]}
170a98232a1SIdo Schimmel
171a98232a1SIdo Schimmel	rp2=${NETIFS[p3]}
172a98232a1SIdo Schimmel	h2=${NETIFS[p4]}
173a98232a1SIdo Schimmel
174a98232a1SIdo Schimmel	vrf_prepare
175a98232a1SIdo Schimmel	forwarding_enable
176a98232a1SIdo Schimmel
177a98232a1SIdo Schimmel	h1_create
178a98232a1SIdo Schimmel	h2_create
179a98232a1SIdo Schimmel	router_create
180a98232a1SIdo Schimmel}
181a98232a1SIdo Schimmel
182a98232a1SIdo Schimmelcleanup()
183a98232a1SIdo Schimmel{
184a98232a1SIdo Schimmel	pre_cleanup
185a98232a1SIdo Schimmel
186a98232a1SIdo Schimmel	router_destroy
187a98232a1SIdo Schimmel	h2_destroy
188a98232a1SIdo Schimmel	h1_destroy
189a98232a1SIdo Schimmel
190a98232a1SIdo Schimmel	forwarding_restore
191a98232a1SIdo Schimmel	vrf_cleanup
192a98232a1SIdo Schimmel}
193a98232a1SIdo Schimmel
194a98232a1SIdo Schimmeltrap cleanup EXIT
195a98232a1SIdo Schimmel
196a98232a1SIdo Schimmelsetup_prepare
197a98232a1SIdo Schimmelsetup_wait
198a98232a1SIdo Schimmel
199a98232a1SIdo Schimmeltests_run
200a98232a1SIdo Schimmel
201a98232a1SIdo Schimmelexit $EXIT_STATUS
202