xref: /linux/tools/testing/selftests/drivers/net/mlxsw/rtnetlink.sh (revision a4989fa91110508b64eea7ccde63d062113988ff)
1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3#
4# Test various interface configuration scenarios. Observe that configurations
5# deemed valid by mlxsw succeed, invalid configurations fail and that no traces
6# are produced. To prevent the test from passing in case traces are produced,
7# the user can set the 'kernel.panic_on_warn' and 'kernel.panic_on_oops'
8# sysctls in its environment.
9
10lib_dir=$(dirname $0)/../../../net/forwarding
11
12ALL_TESTS="
13	rif_set_addr_test
14	rif_vrf_set_addr_test
15	rif_inherit_bridge_addr_test
16	rif_non_inherit_bridge_addr_test
17	vlan_interface_deletion_test
18	bridge_deletion_test
19	bridge_vlan_flags_test
20	vlan_1_test
21	lag_bridge_upper_test
22	duplicate_vlans_test
23	vlan_rif_refcount_test
24	subport_rif_refcount_test
25	vlan_dev_deletion_test
26	lag_unlink_slaves_test
27	lag_dev_deletion_test
28	vlan_interface_uppers_test
29	bridge_extern_learn_test
30	neigh_offload_test
31	nexthop_offload_test
32	nexthop_obj_invalid_test
33	nexthop_obj_offload_test
34	nexthop_obj_group_offload_test
35	nexthop_obj_blackhole_offload_test
36	nexthop_obj_route_offload_test
37	devlink_reload_test
38"
39NUM_NETIFS=2
40: ${TIMEOUT:=20000} # ms
41source $lib_dir/lib.sh
42source $lib_dir/devlink_lib.sh
43
44setup_prepare()
45{
46	swp1=${NETIFS[p1]}
47	swp2=${NETIFS[p2]}
48
49	ip link set dev $swp1 up
50	ip link set dev $swp2 up
51}
52
53cleanup()
54{
55	pre_cleanup
56
57	ip link set dev $swp2 down
58	ip link set dev $swp1 down
59}
60
61rif_set_addr_test()
62{
63	local swp1_mac=$(mac_get $swp1)
64	local swp2_mac=$(mac_get $swp2)
65
66	RET=0
67
68	# $swp1 and $swp2 likely got their IPv6 local addresses already, but
69	# here we need to test the transition to RIF.
70	ip addr flush dev $swp1
71	ip addr flush dev $swp2
72	sleep .1
73
74	ip addr add dev $swp1 192.0.2.1/28
75	check_err $?
76
77	ip link set dev $swp1 addr 00:11:22:33:44:55
78	check_err $?
79
80	# IP address enablement should be rejected if the MAC address prefix
81	# doesn't match other RIFs.
82	ip addr add dev $swp2 192.0.2.2/28 &>/dev/null
83	check_fail $? "IP address addition passed for a device with a wrong MAC"
84	ip addr add dev $swp2 192.0.2.2/28 2>&1 >/dev/null \
85	    | grep -q mlxsw_spectrum
86	check_err $? "no extack for IP address addition"
87
88	ip link set dev $swp2 addr 00:11:22:33:44:66
89	check_err $?
90	ip addr add dev $swp2 192.0.2.2/28 &>/dev/null
91	check_err $?
92
93	# Change of MAC address of a RIF should be forbidden if the new MAC
94	# doesn't share the prefix with other MAC addresses.
95	ip link set dev $swp2 addr 00:11:22:33:00:66 &>/dev/null
96	check_fail $? "change of MAC address passed for a wrong MAC"
97	ip link set dev $swp2 addr 00:11:22:33:00:66 2>&1 >/dev/null \
98	    | grep -q mlxsw_spectrum
99	check_err $? "no extack for MAC address change"
100
101	log_test "RIF - bad MAC change"
102
103	ip addr del dev $swp2 192.0.2.2/28
104	ip addr del dev $swp1 192.0.2.1/28
105
106	ip link set dev $swp2 addr $swp2_mac
107	ip link set dev $swp1 addr $swp1_mac
108}
109
110rif_vrf_set_addr_test()
111{
112	# Test that it is possible to set an IP address on a VRF upper despite
113	# its random MAC address.
114	RET=0
115
116	ip link add name vrf-test type vrf table 10
117	ip link set dev $swp1 master vrf-test
118
119	ip -4 address add 192.0.2.1/24 dev vrf-test
120	check_err $? "failed to set IPv4 address on VRF"
121	ip -6 address add 2001:db8:1::1/64 dev vrf-test
122	check_err $? "failed to set IPv6 address on VRF"
123
124	log_test "RIF - setting IP address on VRF"
125
126	ip link del dev vrf-test
127}
128
129rif_inherit_bridge_addr_test()
130{
131	RET=0
132
133	# Create first RIF
134	ip addr add dev $swp1 192.0.2.1/28
135	check_err $?
136
137	# Create a FID RIF
138	ip link add name br1 up type bridge vlan_filtering 0
139	ip link set dev $swp2 master br1
140	ip addr add dev br1 192.0.2.17/28
141	check_err $?
142
143	# Prepare a device with a low MAC address
144	ip link add name d up type dummy
145	ip link set dev d addr 00:11:22:33:44:55
146
147	# Attach the device to br1. That prompts bridge address change, which
148	# should be vetoed, thus preventing the attachment.
149	ip link set dev d master br1 &>/dev/null
150	check_fail $? "Device with low MAC was permitted to attach a bridge with RIF"
151	ip link set dev d master br1 2>&1 >/dev/null \
152	    | grep -q mlxsw_spectrum
153	check_err $? "no extack for bridge attach rejection"
154
155	ip link set dev $swp2 addr 00:11:22:33:44:55 &>/dev/null
156	check_fail $? "Changing swp2's MAC address permitted"
157	ip link set dev $swp2 addr 00:11:22:33:44:55 2>&1 >/dev/null \
158	    | grep -q mlxsw_spectrum
159	check_err $? "no extack for bridge port MAC address change rejection"
160
161	log_test "RIF - attach port with bad MAC to bridge"
162
163	ip link del dev d
164	ip link del dev br1
165	ip addr del dev $swp1 192.0.2.1/28
166}
167
168rif_non_inherit_bridge_addr_test()
169{
170	local swp2_mac=$(mac_get $swp2)
171
172	RET=0
173
174	# Create first RIF
175	ip addr add dev $swp1 192.0.2.1/28
176	check_err $?
177
178	# Create a FID RIF
179	ip link add name br1 up type bridge vlan_filtering 0
180	ip link set dev br1 addr $swp2_mac
181	ip link set dev $swp2 master br1
182	ip addr add dev br1 192.0.2.17/28
183	check_err $?
184
185	# Prepare a device with a low MAC address
186	ip link add name d up type dummy
187	ip link set dev d addr 00:11:22:33:44:55
188
189	# Attach the device to br1. Since the bridge address was set, it should
190	# work.
191	ip link set dev d master br1 &>/dev/null
192	check_err $? "Could not attach a device with low MAC to a bridge with RIF"
193
194	# Port MAC address change should be allowed for a bridge with set MAC.
195	ip link set dev $swp2 addr 00:11:22:33:44:55
196	check_err $? "Changing swp2's MAC address not permitted"
197
198	log_test "RIF - attach port with bad MAC to bridge with set MAC"
199
200	ip link set dev $swp2 addr $swp2_mac
201	ip link del dev d
202	ip link del dev br1
203	ip addr del dev $swp1 192.0.2.1/28
204}
205
206vlan_interface_deletion_test()
207{
208	# Test that when a VLAN interface is deleted, its associated router
209	# interface (RIF) is correctly deleted and not leaked. See commit
210	# c360867ec46a ("mlxsw: spectrum: Delete RIF when VLAN device is
211	# removed") for more details
212	RET=0
213
214	ip link add name br0 type bridge vlan_filtering 1
215	ip link set dev $swp1 master br0
216
217	ip link add link br0 name br0.10 type vlan id 10
218	ip -6 address add 2001:db8:1::1/64 dev br0.10
219	ip link del dev br0.10
220
221	# If we leaked the previous RIF, then this should produce a trace
222	ip link add link br0 name br0.20 type vlan id 20
223	ip -6 address add 2001:db8:1::1/64 dev br0.20
224	ip link del dev br0.20
225
226	log_test "vlan interface deletion"
227
228	ip link del dev br0
229}
230
231bridge_deletion_test()
232{
233	# Test that when a bridge with VLAN interfaces is deleted, we correctly
234	# delete the associated RIFs. See commit 602b74eda813 ("mlxsw:
235	# spectrum_switchdev: Do not leak RIFs when removing bridge") for more
236	# details
237	RET=0
238
239	ip link add name br0 type bridge vlan_filtering 1
240	ip link set dev $swp1 master br0
241	ip -6 address add 2001:db8::1/64 dev br0
242
243	ip link add link br0 name br0.10 type vlan id 10
244	ip -6 address add 2001:db8:1::1/64 dev br0.10
245
246	ip link add link br0 name br0.20 type vlan id 20
247	ip -6 address add 2001:db8:2::1/64 dev br0.20
248
249	ip link del dev br0
250
251	# If we leaked previous RIFs, then this should produce a trace
252	ip -6 address add 2001:db8:1::1/64 dev $swp1
253	ip -6 address del 2001:db8:1::1/64 dev $swp1
254
255	log_test "bridge deletion"
256}
257
258bridge_vlan_flags_test()
259{
260	# Test that when bridge VLAN flags are toggled, we do not take
261	# unnecessary references on related structs. See commit 9e25826ffc94
262	# ("mlxsw: spectrum_switchdev: Fix port_vlan refcounting") for more
263	# details
264	RET=0
265
266	ip link add name br0 type bridge vlan_filtering 1
267	ip link set dev $swp1 master br0
268
269	bridge vlan add vid 10 dev $swp1 pvid untagged
270	bridge vlan add vid 10 dev $swp1 untagged
271	bridge vlan add vid 10 dev $swp1 pvid
272	bridge vlan add vid 10 dev $swp1
273	ip link del dev br0
274
275	# If we did not handle references correctly, then this should produce a
276	# trace
277	devlink dev reload "$DEVLINK_DEV"
278
279	# Allow netdevices to be re-created following the reload
280	sleep 20
281
282	log_test "bridge vlan flags"
283}
284
285vlan_1_test()
286{
287	# Test that VLAN 1 can be configured over mlxsw ports. In the past it
288	# was used internally for untagged traffic. See commit 47bf9df2e820
289	# ("mlxsw: spectrum: Forbid creation of VLAN 1 over port/LAG") for more
290	# details
291	RET=0
292
293	ip link add link $swp1 name $swp1.1 type vlan id 1
294	check_err $? "did not manage to create vlan 1 when should"
295
296	log_test "vlan 1"
297
298	ip link del dev $swp1.1
299}
300
301lag_bridge_upper_test()
302{
303	# Test that ports cannot be enslaved to LAG devices that have uppers
304	# and that failure is handled gracefully. See commit b3529af6bb0d
305	# ("spectrum: Reference count VLAN entries") for more details
306	RET=0
307
308	ip link add name bond1 type bond mode 802.3ad
309
310	ip link add name br0 type bridge vlan_filtering 1
311	ip link set dev bond1 master br0
312
313	ip link set dev $swp1 down
314	ip link set dev $swp1 master bond1 &> /dev/null
315	check_fail $? "managed to enslave port to lag when should not"
316
317	# This might generate a trace, if we did not handle the failure
318	# correctly
319	ip -6 address add 2001:db8:1::1/64 dev $swp1
320	ip -6 address del 2001:db8:1::1/64 dev $swp1
321
322	log_test "lag with bridge upper"
323
324	ip link del dev br0
325	ip link del dev bond1
326}
327
328duplicate_vlans_test()
329{
330	# Test that on a given port a VLAN is only used once. Either as VLAN
331	# in a VLAN-aware bridge or as a VLAN device
332	RET=0
333
334	ip link add name br0 type bridge vlan_filtering 1
335	ip link set dev $swp1 master br0
336	bridge vlan add vid 10 dev $swp1
337
338	ip link add link $swp1 name $swp1.10 type vlan id 10 &> /dev/null
339	check_fail $? "managed to create vlan device when should not"
340
341	bridge vlan del vid 10 dev $swp1
342	ip link add link $swp1 name $swp1.10 type vlan id 10
343	check_err $? "did not manage to create vlan device when should"
344	bridge vlan add vid 10 dev $swp1 &> /dev/null
345	check_fail $? "managed to add bridge vlan when should not"
346
347	log_test "duplicate vlans"
348
349	ip link del dev $swp1.10
350	ip link del dev br0
351}
352
353vlan_rif_refcount_test()
354{
355	# Test that RIFs representing VLAN interfaces are not affected from
356	# ports member in the VLAN. We use the offload indication on routes
357	# configured on the RIF to understand if it was created / destroyed
358	RET=0
359
360	ip link add name br0 type bridge vlan_filtering 1
361	ip link set dev $swp1 master br0
362
363	ip link set dev $swp1 up
364	ip link set dev br0 up
365
366	ip link add link br0 name br0.10 up type vlan id 10
367	ip -6 address add 2001:db8:1::1/64 dev br0.10
368
369	busywait "$TIMEOUT" wait_for_offload \
370		ip -6 route get fibmatch 2001:db8:1::2 dev br0.10
371	check_err $? "vlan rif was not created before adding port to vlan"
372
373	bridge vlan add vid 10 dev $swp1
374	busywait "$TIMEOUT" wait_for_offload \
375		ip -6 route get fibmatch 2001:db8:1::2 dev br0.10
376	check_err $? "vlan rif was destroyed after adding port to vlan"
377
378	bridge vlan del vid 10 dev $swp1
379	busywait "$TIMEOUT" wait_for_offload \
380		ip -6 route get fibmatch 2001:db8:1::2 dev br0.10
381	check_err $? "vlan rif was destroyed after removing port from vlan"
382
383	ip link set dev $swp1 nomaster
384	busywait "$TIMEOUT" not wait_for_offload \
385		ip -6 route get fibmatch 2001:db8:1::2 dev br0.10
386	check_err $? "vlan rif was not destroyed after unlinking port from bridge"
387
388	log_test "vlan rif refcount"
389
390	ip link del dev br0.10
391	ip link set dev $swp1 down
392	ip link del dev br0
393}
394
395subport_rif_refcount_test()
396{
397	# Test that RIFs representing upper devices of physical ports are
398	# reference counted correctly and destroyed when should. We use the
399	# offload indication on routes configured on the RIF to understand if
400	# it was created / destroyed
401	RET=0
402
403	ip link add name bond1 type bond mode 802.3ad
404	ip link set dev $swp1 down
405	ip link set dev $swp2 down
406	ip link set dev $swp1 master bond1
407	ip link set dev $swp2 master bond1
408
409	ip link set dev bond1 up
410	ip link add link bond1 name bond1.10 up type vlan id 10
411	ip -6 address add 2001:db8:1::1/64 dev bond1
412	ip -6 address add 2001:db8:2::1/64 dev bond1.10
413
414	busywait "$TIMEOUT" wait_for_offload \
415		ip -6 route get fibmatch 2001:db8:1::2 dev bond1
416	check_err $? "subport rif was not created on lag device"
417	busywait "$TIMEOUT" wait_for_offload \
418		ip -6 route get fibmatch 2001:db8:2::2 dev bond1.10
419	check_err $? "subport rif was not created on vlan device"
420
421	ip link set dev $swp1 nomaster
422	busywait "$TIMEOUT" wait_for_offload \
423		ip -6 route get fibmatch 2001:db8:1::2 dev bond1
424	check_err $? "subport rif of lag device was destroyed when should not"
425	busywait "$TIMEOUT" wait_for_offload \
426		ip -6 route get fibmatch 2001:db8:2::2 dev bond1.10
427	check_err $? "subport rif of vlan device was destroyed when should not"
428
429	ip link set dev $swp2 nomaster
430	busywait "$TIMEOUT" not wait_for_offload \
431		ip -6 route get fibmatch 2001:db8:1::2 dev bond1
432	check_err $? "subport rif of lag device was not destroyed when should"
433	busywait "$TIMEOUT" not wait_for_offload \
434		ip -6 route get fibmatch 2001:db8:2::2 dev bond1.10
435	check_err $? "subport rif of vlan device was not destroyed when should"
436
437	log_test "subport rif refcount"
438
439	ip link del dev bond1.10
440	ip link del dev bond1
441}
442
443vlan_dev_deletion_test()
444{
445	# Test that VLAN devices are correctly deleted / unlinked when enslaved
446	# to bridge
447	RET=0
448
449	ip link add name br10 type bridge
450	ip link add name br20 type bridge
451	ip link add name br30 type bridge
452	ip link add link $swp1 name $swp1.10 type vlan id 10
453	ip link add link $swp1 name $swp1.20 type vlan id 20
454	ip link add link $swp1 name $swp1.30 type vlan id 30
455	ip link set dev $swp1.10 master br10
456	ip link set dev $swp1.20 master br20
457	ip link set dev $swp1.30 master br30
458
459	# If we did not handle the situation correctly, then these operations
460	# might produce a trace
461	ip link set dev $swp1.30 nomaster
462	ip link del dev $swp1.20
463	# Deletion via ioctl uses different code paths from netlink
464	vconfig rem $swp1.10 &> /dev/null
465
466	log_test "vlan device deletion"
467
468	ip link del dev $swp1.30
469	ip link del dev br30
470	ip link del dev br20
471	ip link del dev br10
472}
473
474lag_create()
475{
476	ip link add name bond1 type bond mode 802.3ad
477	ip link set dev $swp1 down
478	ip link set dev $swp2 down
479	ip link set dev $swp1 master bond1
480	ip link set dev $swp2 master bond1
481
482	ip link add link bond1 name bond1.10 type vlan id 10
483	ip link add link bond1 name bond1.20 type vlan id 20
484
485	ip link add name br0 type bridge vlan_filtering 1
486	ip link set dev bond1 master br0
487
488	ip link add name br10 type bridge
489	ip link set dev bond1.10 master br10
490
491	ip link add name br20 type bridge
492	ip link set dev bond1.20 master br20
493}
494
495lag_unlink_slaves_test()
496{
497	# Test that ports are correctly unlinked from their LAG master, when
498	# the LAG and its VLAN uppers are enslaved to bridges
499	RET=0
500
501	lag_create
502
503	ip link set dev $swp1 nomaster
504	check_err $? "lag slave $swp1 was not unlinked from master"
505	ip link set dev $swp2 nomaster
506	check_err $? "lag slave $swp2 was not unlinked from master"
507
508	# Try to configure corresponding VLANs as router interfaces
509	ip -6 address add 2001:db8:1::1/64 dev $swp1
510	check_err $? "failed to configure ip address on $swp1"
511
512	ip link add link $swp1 name $swp1.10 type vlan id 10
513	ip -6 address add 2001:db8:10::1/64 dev $swp1.10
514	check_err $? "failed to configure ip address on $swp1.10"
515
516	ip link add link $swp1 name $swp1.20 type vlan id 20
517	ip -6 address add 2001:db8:20::1/64 dev $swp1.20
518	check_err $? "failed to configure ip address on $swp1.20"
519
520	log_test "lag slaves unlinking"
521
522	ip link del dev $swp1.20
523	ip link del dev $swp1.10
524	ip address flush dev $swp1
525
526	ip link del dev br20
527	ip link del dev br10
528	ip link del dev br0
529	ip link del dev bond1
530}
531
532lag_dev_deletion_test()
533{
534	# Test that LAG device is correctly deleted, when the LAG and its VLAN
535	# uppers are enslaved to bridges
536	RET=0
537
538	lag_create
539
540	ip link del dev bond1
541
542	log_test "lag device deletion"
543
544	ip link del dev br20
545	ip link del dev br10
546	ip link del dev br0
547}
548
549vlan_interface_uppers_test()
550{
551	# Test that uppers of a VLAN interface are correctly sanitized
552	RET=0
553
554	ip link add name br0 type bridge vlan_filtering 1
555	ip link set dev $swp1 master br0
556
557	ip link add link br0 name br0.10 type vlan id 10
558	ip link add link br0.10 name macvlan0 \
559		type macvlan mode private &> /dev/null
560	check_fail $? "managed to create a macvlan when should not"
561
562	ip -6 address add 2001:db8:1::1/64 dev br0.10
563	ip link add link br0.10 name macvlan0 type macvlan mode private
564	check_err $? "did not manage to create a macvlan when should"
565
566	ip link del dev macvlan0
567
568	ip link add name vrf-test type vrf table 10
569	ip link set dev br0.10 master vrf-test
570	check_err $? "did not manage to enslave vlan interface to vrf"
571	ip link del dev vrf-test
572
573	ip link add name br-test type bridge
574	ip link set dev br0.10 master br-test &> /dev/null
575	check_fail $? "managed to enslave vlan interface to bridge when should not"
576	ip link del dev br-test
577
578	log_test "vlan interface uppers"
579
580	ip link del dev br0
581}
582
583bridge_extern_learn_test()
584{
585	# Test that externally learned entries added from user space are
586	# marked as offloaded
587	RET=0
588
589	ip link add name br0 type bridge
590	ip link set dev $swp1 master br0
591
592	bridge fdb add de:ad:be:ef:13:37 dev $swp1 master extern_learn
593
594	busywait "$TIMEOUT" wait_for_offload \
595		bridge fdb show brport $swp1 de:ad:be:ef:13:37
596	check_err $? "fdb entry not marked as offloaded when should"
597
598	log_test "externally learned fdb entry"
599
600	ip link del dev br0
601}
602
603neigh_offload_test()
604{
605	# Test that IPv4 and IPv6 neighbour entries are marked as offloaded
606	RET=0
607
608	ip -4 address add 192.0.2.1/24 dev $swp1
609	ip -6 address add 2001:db8:1::1/64 dev $swp1
610
611	ip -4 neigh add 192.0.2.2 lladdr de:ad:be:ef:13:37 nud perm dev $swp1
612	ip -6 neigh add 2001:db8:1::2 lladdr de:ad:be:ef:13:37 nud perm \
613		dev $swp1
614
615	busywait "$TIMEOUT" wait_for_offload \
616		ip -4 neigh show dev $swp1 192.0.2.2
617	check_err $? "ipv4 neigh entry not marked as offloaded when should"
618	busywait "$TIMEOUT" wait_for_offload \
619		ip -6 neigh show dev $swp1 2001:db8:1::2
620	check_err $? "ipv6 neigh entry not marked as offloaded when should"
621
622	log_test "neighbour offload indication"
623
624	ip -6 neigh del 2001:db8:1::2 dev $swp1
625	ip -4 neigh del 192.0.2.2 dev $swp1
626	ip -6 address del 2001:db8:1::1/64 dev $swp1
627	ip -4 address del 192.0.2.1/24 dev $swp1
628}
629
630nexthop_offload_test()
631{
632	# Test that IPv4 and IPv6 nexthops are marked as offloaded
633	RET=0
634
635	sysctl_set net.ipv6.conf.$swp2.keep_addr_on_down 1
636	simple_if_init $swp1 192.0.2.1/24 2001:db8:1::1/64
637	simple_if_init $swp2 192.0.2.2/24 2001:db8:1::2/64
638	setup_wait
639
640	ip -4 route add 198.51.100.0/24 vrf v$swp1 \
641		nexthop via 192.0.2.2 dev $swp1
642	ip -6 route add 2001:db8:2::/64 vrf v$swp1 \
643		nexthop via 2001:db8:1::2 dev $swp1
644
645	busywait "$TIMEOUT" wait_for_offload \
646		ip -4 route show 198.51.100.0/24 vrf v$swp1
647	check_err $? "ipv4 nexthop not marked as offloaded when should"
648	busywait "$TIMEOUT" wait_for_offload \
649		ip -6 route show 2001:db8:2::/64 vrf v$swp1
650	check_err $? "ipv6 nexthop not marked as offloaded when should"
651
652	ip link set dev $swp2 down
653	sleep 1
654
655	busywait "$TIMEOUT" not wait_for_offload \
656		ip -4 route show 198.51.100.0/24 vrf v$swp1
657	check_err $? "ipv4 nexthop marked as offloaded when should not"
658	busywait "$TIMEOUT" not wait_for_offload \
659		ip -6 route show 2001:db8:2::/64 vrf v$swp1
660	check_err $? "ipv6 nexthop marked as offloaded when should not"
661
662	ip link set dev $swp2 up
663	setup_wait
664
665	busywait "$TIMEOUT" wait_for_offload \
666		ip -4 route show 198.51.100.0/24 vrf v$swp1
667	check_err $? "ipv4 nexthop not marked as offloaded after neigh add"
668	busywait "$TIMEOUT" wait_for_offload \
669		ip -6 route show 2001:db8:2::/64 vrf v$swp1
670	check_err $? "ipv6 nexthop not marked as offloaded after neigh add"
671
672	log_test "nexthop offload indication"
673
674	ip -6 route del 2001:db8:2::/64 vrf v$swp1
675	ip -4 route del 198.51.100.0/24 vrf v$swp1
676
677	simple_if_fini $swp2 192.0.2.2/24 2001:db8:1::2/64
678	simple_if_fini $swp1 192.0.2.1/24 2001:db8:1::1/64
679	sysctl_restore net.ipv6.conf.$swp2.keep_addr_on_down
680}
681
682nexthop_obj_invalid_test()
683{
684	# Test that invalid nexthop object configurations are rejected
685	RET=0
686
687	simple_if_init $swp1 192.0.2.1/24 2001:db8:1::1/64
688	simple_if_init $swp2 192.0.2.2/24 2001:db8:1::2/64
689	setup_wait
690
691	ip nexthop add id 1 via 192.0.2.3 fdb
692	check_fail $? "managed to configure an FDB nexthop when should not"
693
694	ip nexthop add id 1 encap mpls 200/300 via 192.0.2.3 dev $swp1
695	check_fail $? "managed to configure a nexthop with MPLS encap when should not"
696
697	ip nexthop add id 1 dev $swp1
698	ip nexthop add id 2 dev $swp1
699	ip nexthop add id 10 group 1/2
700	check_fail $? "managed to configure a nexthop group with device-only nexthops when should not"
701
702	log_test "nexthop objects - invalid configurations"
703
704	ip nexthop del id 2
705	ip nexthop del id 1
706
707	simple_if_fini $swp2 192.0.2.2/24 2001:db8:1::2/64
708	simple_if_fini $swp1 192.0.2.1/24 2001:db8:1::1/64
709}
710
711nexthop_obj_offload_test()
712{
713	# Test offload indication of nexthop objects
714	RET=0
715
716	simple_if_init $swp1 192.0.2.1/24 2001:db8:1::1/64
717	simple_if_init $swp2
718	setup_wait
719
720	ip nexthop add id 1 via 192.0.2.2 dev $swp1
721	ip neigh replace 192.0.2.2 lladdr 00:11:22:33:44:55 nud reachable \
722		dev $swp1
723
724	busywait "$TIMEOUT" wait_for_offload \
725		ip nexthop show id 1
726	check_err $? "nexthop not marked as offloaded when should"
727
728	ip neigh replace 192.0.2.2 nud failed dev $swp1
729	busywait "$TIMEOUT" not wait_for_offload \
730		ip nexthop show id 1
731	check_err $? "nexthop marked as offloaded after setting neigh to failed state"
732
733	ip neigh replace 192.0.2.2 lladdr 00:11:22:33:44:55 nud reachable \
734		dev $swp1
735	busywait "$TIMEOUT" wait_for_offload \
736		ip nexthop show id 1
737	check_err $? "nexthop not marked as offloaded after neigh replace"
738
739	ip nexthop replace id 1 via 192.0.2.3 dev $swp1
740	busywait "$TIMEOUT" not wait_for_offload \
741		ip nexthop show id 1
742	check_err $? "nexthop marked as offloaded after replacing to use an invalid address"
743
744	ip nexthop replace id 1 via 192.0.2.2 dev $swp1
745	busywait "$TIMEOUT" wait_for_offload \
746		ip nexthop show id 1
747	check_err $? "nexthop not marked as offloaded after replacing to use a valid address"
748
749	log_test "nexthop objects offload indication"
750
751	ip neigh del 192.0.2.2 dev $swp1
752	ip nexthop del id 1
753
754	simple_if_fini $swp2
755	simple_if_fini $swp1 192.0.2.1/24 2001:db8:1::1/64
756}
757
758nexthop_obj_group_offload_test()
759{
760	# Test offload indication of nexthop group objects
761	RET=0
762
763	simple_if_init $swp1 192.0.2.1/24 2001:db8:1::1/64
764	simple_if_init $swp2
765	setup_wait
766
767	ip nexthop add id 1 via 192.0.2.2 dev $swp1
768	ip nexthop add id 2 via 2001:db8:1::2 dev $swp1
769	ip nexthop add id 10 group 1/2
770	ip neigh replace 192.0.2.2 lladdr 00:11:22:33:44:55 nud reachable \
771		dev $swp1
772	ip neigh replace 192.0.2.3 lladdr 00:11:22:33:44:55 nud reachable \
773		dev $swp1
774	ip neigh replace 2001:db8:1::2 lladdr 00:11:22:33:44:55 nud reachable \
775		dev $swp1
776
777	busywait "$TIMEOUT" wait_for_offload \
778		ip nexthop show id 1
779	check_err $? "IPv4 nexthop not marked as offloaded when should"
780	busywait "$TIMEOUT" wait_for_offload \
781		ip nexthop show id 2
782	check_err $? "IPv6 nexthop not marked as offloaded when should"
783	busywait "$TIMEOUT" wait_for_offload \
784		ip nexthop show id 10
785	check_err $? "nexthop group not marked as offloaded when should"
786
787	# Invalidate nexthop id 1
788	ip neigh replace 192.0.2.2 nud failed dev $swp1
789	busywait "$TIMEOUT" not wait_for_offload \
790		ip nexthop show id 10
791	check_fail $? "nexthop group not marked as offloaded with one valid nexthop"
792
793	# Invalidate nexthop id 2
794	ip neigh replace 2001:db8:1::2 nud failed dev $swp1
795	busywait "$TIMEOUT" not wait_for_offload \
796		ip nexthop show id 10
797	check_err $? "nexthop group marked as offloaded when should not"
798
799	# Revalidate nexthop id 1
800	ip nexthop replace id 1 via 192.0.2.3 dev $swp1
801	busywait "$TIMEOUT" wait_for_offload \
802		ip nexthop show id 10
803	check_err $? "nexthop group not marked as offloaded after revalidating nexthop"
804
805	log_test "nexthop group objects offload indication"
806
807	ip neigh del 2001:db8:1::2 dev $swp1
808	ip neigh del 192.0.2.3 dev $swp1
809	ip neigh del 192.0.2.2 dev $swp1
810	ip nexthop del id 10
811	ip nexthop del id 2
812	ip nexthop del id 1
813
814	simple_if_fini $swp2
815	simple_if_fini $swp1 192.0.2.1/24 2001:db8:1::1/64
816}
817
818nexthop_obj_blackhole_offload_test()
819{
820	# Test offload indication of blackhole nexthop objects
821	RET=0
822
823	ip nexthop add id 1 blackhole
824	busywait "$TIMEOUT" wait_for_offload \
825		ip nexthop show id 1
826	check_err $? "Blackhole nexthop not marked as offloaded when should"
827
828	ip nexthop add id 10 group 1
829	busywait "$TIMEOUT" wait_for_offload \
830		ip nexthop show id 10
831	check_err $? "Nexthop group not marked as offloaded when should"
832
833	log_test "blackhole nexthop objects offload indication"
834
835	ip nexthop del id 10
836	ip nexthop del id 1
837}
838
839nexthop_obj_route_offload_test()
840{
841	# Test offload indication of routes using nexthop objects
842	RET=0
843
844	simple_if_init $swp1 192.0.2.1/24 2001:db8:1::1/64
845	simple_if_init $swp2
846	setup_wait
847
848	ip nexthop add id 1 via 192.0.2.2 dev $swp1
849	ip neigh replace 192.0.2.2 lladdr 00:11:22:33:44:55 nud reachable \
850		dev $swp1
851	ip neigh replace 192.0.2.3 lladdr 00:11:22:33:44:55 nud reachable \
852		dev $swp1
853
854	ip route replace 198.51.100.0/24 nhid 1
855	busywait "$TIMEOUT" wait_for_offload \
856		ip route show 198.51.100.0/24
857	check_err $? "route not marked as offloaded when using valid nexthop"
858
859	ip nexthop replace id 1 via 192.0.2.3 dev $swp1
860	busywait "$TIMEOUT" wait_for_offload \
861		ip route show 198.51.100.0/24
862	check_err $? "route not marked as offloaded after replacing valid nexthop with a valid one"
863
864	ip nexthop replace id 1 via 192.0.2.4 dev $swp1
865	busywait "$TIMEOUT" not wait_for_offload \
866		ip route show 198.51.100.0/24
867	check_err $? "route marked as offloaded after replacing valid nexthop with an invalid one"
868
869	ip nexthop replace id 1 via 192.0.2.2 dev $swp1
870	busywait "$TIMEOUT" wait_for_offload \
871		ip route show 198.51.100.0/24
872	check_err $? "route not marked as offloaded after replacing invalid nexthop with a valid one"
873
874	log_test "routes using nexthop objects offload indication"
875
876	ip route del 198.51.100.0/24
877	ip neigh del 192.0.2.3 dev $swp1
878	ip neigh del 192.0.2.2 dev $swp1
879	ip nexthop del id 1
880
881	simple_if_fini $swp2
882	simple_if_fini $swp1 192.0.2.1/24 2001:db8:1::1/64
883}
884
885devlink_reload_test()
886{
887	# Test that after executing all the above configuration tests, a
888	# devlink reload can be performed without errors
889	RET=0
890
891	devlink dev reload "$DEVLINK_DEV"
892	check_err $? "devlink reload failed"
893
894	log_test "devlink reload - last test"
895
896	sleep 20
897}
898
899trap cleanup EXIT
900
901setup_prepare
902setup_wait
903
904tests_run
905
906exit $EXIT_STATUS
907