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