162306a36Sopenharmony_ci#!/bin/bash
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
362306a36Sopenharmony_ci#
462306a36Sopenharmony_ci# Test various interface configuration scenarios. Observe that configurations
562306a36Sopenharmony_ci# deemed valid by mlxsw succeed, invalid configurations fail and that no traces
662306a36Sopenharmony_ci# are produced. To prevent the test from passing in case traces are produced,
762306a36Sopenharmony_ci# the user can set the 'kernel.panic_on_warn' and 'kernel.panic_on_oops'
862306a36Sopenharmony_ci# sysctls in its environment.
962306a36Sopenharmony_ci
1062306a36Sopenharmony_cilib_dir=$(dirname $0)/../../../net/forwarding
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ciALL_TESTS="
1362306a36Sopenharmony_ci	rif_vrf_set_addr_test
1462306a36Sopenharmony_ci	rif_non_inherit_bridge_addr_test
1562306a36Sopenharmony_ci	vlan_interface_deletion_test
1662306a36Sopenharmony_ci	bridge_deletion_test
1762306a36Sopenharmony_ci	bridge_vlan_flags_test
1862306a36Sopenharmony_ci	vlan_1_test
1962306a36Sopenharmony_ci	duplicate_vlans_test
2062306a36Sopenharmony_ci	vlan_rif_refcount_test
2162306a36Sopenharmony_ci	subport_rif_refcount_test
2262306a36Sopenharmony_ci	subport_rif_lag_join_test
2362306a36Sopenharmony_ci	vlan_dev_deletion_test
2462306a36Sopenharmony_ci	lag_unlink_slaves_test
2562306a36Sopenharmony_ci	lag_dev_deletion_test
2662306a36Sopenharmony_ci	vlan_interface_uppers_test
2762306a36Sopenharmony_ci	bridge_extern_learn_test
2862306a36Sopenharmony_ci	neigh_offload_test
2962306a36Sopenharmony_ci	nexthop_offload_test
3062306a36Sopenharmony_ci	nexthop_obj_invalid_test
3162306a36Sopenharmony_ci	nexthop_obj_offload_test
3262306a36Sopenharmony_ci	nexthop_obj_group_offload_test
3362306a36Sopenharmony_ci	nexthop_obj_bucket_offload_test
3462306a36Sopenharmony_ci	nexthop_obj_blackhole_offload_test
3562306a36Sopenharmony_ci	nexthop_obj_route_offload_test
3662306a36Sopenharmony_ci	bridge_locked_port_test
3762306a36Sopenharmony_ci	devlink_reload_test
3862306a36Sopenharmony_ci"
3962306a36Sopenharmony_ciNUM_NETIFS=2
4062306a36Sopenharmony_ci: ${TIMEOUT:=20000} # ms
4162306a36Sopenharmony_cisource $lib_dir/lib.sh
4262306a36Sopenharmony_cisource $lib_dir/devlink_lib.sh
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_cisetup_prepare()
4562306a36Sopenharmony_ci{
4662306a36Sopenharmony_ci	swp1=${NETIFS[p1]}
4762306a36Sopenharmony_ci	swp2=${NETIFS[p2]}
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci	ip link set dev $swp1 up
5062306a36Sopenharmony_ci	ip link set dev $swp2 up
5162306a36Sopenharmony_ci}
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_cicleanup()
5462306a36Sopenharmony_ci{
5562306a36Sopenharmony_ci	pre_cleanup
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci	ip link set dev $swp2 down
5862306a36Sopenharmony_ci	ip link set dev $swp1 down
5962306a36Sopenharmony_ci}
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_cirif_vrf_set_addr_test()
6262306a36Sopenharmony_ci{
6362306a36Sopenharmony_ci	# Test that it is possible to set an IP address on a VRF upper despite
6462306a36Sopenharmony_ci	# its random MAC address.
6562306a36Sopenharmony_ci	RET=0
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci	ip link add name vrf-test type vrf table 10
6862306a36Sopenharmony_ci	ip link set dev $swp1 master vrf-test
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci	ip -4 address add 192.0.2.1/24 dev vrf-test
7162306a36Sopenharmony_ci	check_err $? "failed to set IPv4 address on VRF"
7262306a36Sopenharmony_ci	ip -6 address add 2001:db8:1::1/64 dev vrf-test
7362306a36Sopenharmony_ci	check_err $? "failed to set IPv6 address on VRF"
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci	log_test "RIF - setting IP address on VRF"
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci	ip link del dev vrf-test
7862306a36Sopenharmony_ci}
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_cirif_non_inherit_bridge_addr_test()
8162306a36Sopenharmony_ci{
8262306a36Sopenharmony_ci	local swp2_mac=$(mac_get $swp2)
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci	RET=0
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci	# Create first RIF
8762306a36Sopenharmony_ci	ip addr add dev $swp1 192.0.2.1/28
8862306a36Sopenharmony_ci	check_err $?
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci	# Create a FID RIF
9162306a36Sopenharmony_ci	ip link add name br1 up type bridge vlan_filtering 0
9262306a36Sopenharmony_ci	ip link set dev br1 addr $swp2_mac
9362306a36Sopenharmony_ci	ip link set dev $swp2 master br1
9462306a36Sopenharmony_ci	ip addr add dev br1 192.0.2.17/28
9562306a36Sopenharmony_ci	check_err $?
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci	# Prepare a device with a low MAC address
9862306a36Sopenharmony_ci	ip link add name d up type dummy
9962306a36Sopenharmony_ci	ip link set dev d addr 00:11:22:33:44:55
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci	# Attach the device to br1. Since the bridge address was set, it should
10262306a36Sopenharmony_ci	# work.
10362306a36Sopenharmony_ci	ip link set dev d master br1 &>/dev/null
10462306a36Sopenharmony_ci	check_err $? "Could not attach a device with low MAC to a bridge with RIF"
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci	# Port MAC address change should be allowed for a bridge with set MAC.
10762306a36Sopenharmony_ci	ip link set dev $swp2 addr 00:11:22:33:44:55
10862306a36Sopenharmony_ci	check_err $? "Changing swp2's MAC address not permitted"
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci	log_test "RIF - attach port with bad MAC to bridge with set MAC"
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci	ip link set dev $swp2 addr $swp2_mac
11362306a36Sopenharmony_ci	ip link del dev d
11462306a36Sopenharmony_ci	ip link del dev br1
11562306a36Sopenharmony_ci	ip addr del dev $swp1 192.0.2.1/28
11662306a36Sopenharmony_ci}
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_civlan_interface_deletion_test()
11962306a36Sopenharmony_ci{
12062306a36Sopenharmony_ci	# Test that when a VLAN interface is deleted, its associated router
12162306a36Sopenharmony_ci	# interface (RIF) is correctly deleted and not leaked. See commit
12262306a36Sopenharmony_ci	# c360867ec46a ("mlxsw: spectrum: Delete RIF when VLAN device is
12362306a36Sopenharmony_ci	# removed") for more details
12462306a36Sopenharmony_ci	RET=0
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_ci	ip link add name br0 type bridge vlan_filtering 1
12762306a36Sopenharmony_ci	ip link set dev $swp1 master br0
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ci	ip link add link br0 name br0.10 type vlan id 10
13062306a36Sopenharmony_ci	ip -6 address add 2001:db8:1::1/64 dev br0.10
13162306a36Sopenharmony_ci	ip link del dev br0.10
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci	# If we leaked the previous RIF, then this should produce a trace
13462306a36Sopenharmony_ci	ip link add link br0 name br0.20 type vlan id 20
13562306a36Sopenharmony_ci	ip -6 address add 2001:db8:1::1/64 dev br0.20
13662306a36Sopenharmony_ci	ip link del dev br0.20
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ci	log_test "vlan interface deletion"
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_ci	ip link del dev br0
14162306a36Sopenharmony_ci}
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_cibridge_deletion_test()
14462306a36Sopenharmony_ci{
14562306a36Sopenharmony_ci	# Test that when a bridge with VLAN interfaces is deleted, we correctly
14662306a36Sopenharmony_ci	# delete the associated RIFs. See commit 602b74eda813 ("mlxsw:
14762306a36Sopenharmony_ci	# spectrum_switchdev: Do not leak RIFs when removing bridge") for more
14862306a36Sopenharmony_ci	# details
14962306a36Sopenharmony_ci	RET=0
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_ci	ip link add name br0 type bridge vlan_filtering 1
15262306a36Sopenharmony_ci	ip link set dev $swp1 master br0
15362306a36Sopenharmony_ci	ip -6 address add 2001:db8::1/64 dev br0
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_ci	ip link add link br0 name br0.10 type vlan id 10
15662306a36Sopenharmony_ci	ip -6 address add 2001:db8:1::1/64 dev br0.10
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci	ip link add link br0 name br0.20 type vlan id 20
15962306a36Sopenharmony_ci	ip -6 address add 2001:db8:2::1/64 dev br0.20
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ci	ip link del dev br0
16262306a36Sopenharmony_ci
16362306a36Sopenharmony_ci	# If we leaked previous RIFs, then this should produce a trace
16462306a36Sopenharmony_ci	ip -6 address add 2001:db8:1::1/64 dev $swp1
16562306a36Sopenharmony_ci	ip -6 address del 2001:db8:1::1/64 dev $swp1
16662306a36Sopenharmony_ci
16762306a36Sopenharmony_ci	log_test "bridge deletion"
16862306a36Sopenharmony_ci}
16962306a36Sopenharmony_ci
17062306a36Sopenharmony_cibridge_vlan_flags_test()
17162306a36Sopenharmony_ci{
17262306a36Sopenharmony_ci	# Test that when bridge VLAN flags are toggled, we do not take
17362306a36Sopenharmony_ci	# unnecessary references on related structs. See commit 9e25826ffc94
17462306a36Sopenharmony_ci	# ("mlxsw: spectrum_switchdev: Fix port_vlan refcounting") for more
17562306a36Sopenharmony_ci	# details
17662306a36Sopenharmony_ci	RET=0
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_ci	ip link add name br0 type bridge vlan_filtering 1
17962306a36Sopenharmony_ci	ip link set dev $swp1 master br0
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_ci	bridge vlan add vid 10 dev $swp1 pvid untagged
18262306a36Sopenharmony_ci	bridge vlan add vid 10 dev $swp1 untagged
18362306a36Sopenharmony_ci	bridge vlan add vid 10 dev $swp1 pvid
18462306a36Sopenharmony_ci	bridge vlan add vid 10 dev $swp1
18562306a36Sopenharmony_ci	ip link del dev br0
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_ci	# If we did not handle references correctly, then this should produce a
18862306a36Sopenharmony_ci	# trace
18962306a36Sopenharmony_ci	devlink dev reload "$DEVLINK_DEV"
19062306a36Sopenharmony_ci
19162306a36Sopenharmony_ci	# Allow netdevices to be re-created following the reload
19262306a36Sopenharmony_ci	sleep 20
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_ci	log_test "bridge vlan flags"
19562306a36Sopenharmony_ci}
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_civlan_1_test()
19862306a36Sopenharmony_ci{
19962306a36Sopenharmony_ci	# Test that VLAN 1 can be configured over mlxsw ports. In the past it
20062306a36Sopenharmony_ci	# was used internally for untagged traffic. See commit 47bf9df2e820
20162306a36Sopenharmony_ci	# ("mlxsw: spectrum: Forbid creation of VLAN 1 over port/LAG") for more
20262306a36Sopenharmony_ci	# details
20362306a36Sopenharmony_ci	RET=0
20462306a36Sopenharmony_ci
20562306a36Sopenharmony_ci	ip link add link $swp1 name $swp1.1 type vlan id 1
20662306a36Sopenharmony_ci	check_err $? "did not manage to create vlan 1 when should"
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_ci	log_test "vlan 1"
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_ci	ip link del dev $swp1.1
21162306a36Sopenharmony_ci}
21262306a36Sopenharmony_ci
21362306a36Sopenharmony_ciduplicate_vlans_test()
21462306a36Sopenharmony_ci{
21562306a36Sopenharmony_ci	# Test that on a given port a VLAN is only used once. Either as VLAN
21662306a36Sopenharmony_ci	# in a VLAN-aware bridge or as a VLAN device
21762306a36Sopenharmony_ci	RET=0
21862306a36Sopenharmony_ci
21962306a36Sopenharmony_ci	ip link add name br0 type bridge vlan_filtering 1
22062306a36Sopenharmony_ci	ip link set dev $swp1 master br0
22162306a36Sopenharmony_ci	bridge vlan add vid 10 dev $swp1
22262306a36Sopenharmony_ci
22362306a36Sopenharmony_ci	ip link add link $swp1 name $swp1.10 type vlan id 10 &> /dev/null
22462306a36Sopenharmony_ci	check_fail $? "managed to create vlan device when should not"
22562306a36Sopenharmony_ci
22662306a36Sopenharmony_ci	bridge vlan del vid 10 dev $swp1
22762306a36Sopenharmony_ci	ip link add link $swp1 name $swp1.10 type vlan id 10
22862306a36Sopenharmony_ci	check_err $? "did not manage to create vlan device when should"
22962306a36Sopenharmony_ci	bridge vlan add vid 10 dev $swp1 &> /dev/null
23062306a36Sopenharmony_ci	check_fail $? "managed to add bridge vlan when should not"
23162306a36Sopenharmony_ci
23262306a36Sopenharmony_ci	log_test "duplicate vlans"
23362306a36Sopenharmony_ci
23462306a36Sopenharmony_ci	ip link del dev $swp1.10
23562306a36Sopenharmony_ci	ip link del dev br0
23662306a36Sopenharmony_ci}
23762306a36Sopenharmony_ci
23862306a36Sopenharmony_civlan_rif_refcount_test()
23962306a36Sopenharmony_ci{
24062306a36Sopenharmony_ci	# Test that RIFs representing VLAN interfaces are not affected from
24162306a36Sopenharmony_ci	# ports member in the VLAN. We use the offload indication on routes
24262306a36Sopenharmony_ci	# configured on the RIF to understand if it was created / destroyed
24362306a36Sopenharmony_ci	RET=0
24462306a36Sopenharmony_ci
24562306a36Sopenharmony_ci	ip link add name br0 type bridge vlan_filtering 1
24662306a36Sopenharmony_ci	ip link set dev $swp1 master br0
24762306a36Sopenharmony_ci
24862306a36Sopenharmony_ci	ip link set dev $swp1 up
24962306a36Sopenharmony_ci	ip link set dev br0 up
25062306a36Sopenharmony_ci
25162306a36Sopenharmony_ci	ip link add link br0 name br0.10 up type vlan id 10
25262306a36Sopenharmony_ci	ip -6 address add 2001:db8:1::1/64 dev br0.10
25362306a36Sopenharmony_ci
25462306a36Sopenharmony_ci	busywait "$TIMEOUT" wait_for_offload \
25562306a36Sopenharmony_ci		ip -6 route get fibmatch 2001:db8:1::2 dev br0.10
25662306a36Sopenharmony_ci	check_err $? "vlan rif was not created before adding port to vlan"
25762306a36Sopenharmony_ci
25862306a36Sopenharmony_ci	bridge vlan add vid 10 dev $swp1
25962306a36Sopenharmony_ci	busywait "$TIMEOUT" wait_for_offload \
26062306a36Sopenharmony_ci		ip -6 route get fibmatch 2001:db8:1::2 dev br0.10
26162306a36Sopenharmony_ci	check_err $? "vlan rif was destroyed after adding port to vlan"
26262306a36Sopenharmony_ci
26362306a36Sopenharmony_ci	bridge vlan del vid 10 dev $swp1
26462306a36Sopenharmony_ci	busywait "$TIMEOUT" wait_for_offload \
26562306a36Sopenharmony_ci		ip -6 route get fibmatch 2001:db8:1::2 dev br0.10
26662306a36Sopenharmony_ci	check_err $? "vlan rif was destroyed after removing port from vlan"
26762306a36Sopenharmony_ci
26862306a36Sopenharmony_ci	ip link set dev $swp1 nomaster
26962306a36Sopenharmony_ci	busywait "$TIMEOUT" not wait_for_offload \
27062306a36Sopenharmony_ci		ip -6 route get fibmatch 2001:db8:1::2 dev br0.10
27162306a36Sopenharmony_ci	check_err $? "vlan rif was not destroyed after unlinking port from bridge"
27262306a36Sopenharmony_ci
27362306a36Sopenharmony_ci	log_test "vlan rif refcount"
27462306a36Sopenharmony_ci
27562306a36Sopenharmony_ci	ip link del dev br0.10
27662306a36Sopenharmony_ci	ip link set dev $swp1 down
27762306a36Sopenharmony_ci	ip link del dev br0
27862306a36Sopenharmony_ci}
27962306a36Sopenharmony_ci
28062306a36Sopenharmony_cisubport_rif_refcount_test()
28162306a36Sopenharmony_ci{
28262306a36Sopenharmony_ci	# Test that RIFs representing upper devices of physical ports are
28362306a36Sopenharmony_ci	# reference counted correctly and destroyed when should. We use the
28462306a36Sopenharmony_ci	# offload indication on routes configured on the RIF to understand if
28562306a36Sopenharmony_ci	# it was created / destroyed
28662306a36Sopenharmony_ci	RET=0
28762306a36Sopenharmony_ci
28862306a36Sopenharmony_ci	ip link add name bond1 type bond mode 802.3ad
28962306a36Sopenharmony_ci	ip link set dev $swp1 down
29062306a36Sopenharmony_ci	ip link set dev $swp2 down
29162306a36Sopenharmony_ci	ip link set dev $swp1 master bond1
29262306a36Sopenharmony_ci	ip link set dev $swp2 master bond1
29362306a36Sopenharmony_ci
29462306a36Sopenharmony_ci	ip link set dev bond1 up
29562306a36Sopenharmony_ci	ip link add link bond1 name bond1.10 up type vlan id 10
29662306a36Sopenharmony_ci	ip -6 address add 2001:db8:1::1/64 dev bond1
29762306a36Sopenharmony_ci	ip -6 address add 2001:db8:2::1/64 dev bond1.10
29862306a36Sopenharmony_ci
29962306a36Sopenharmony_ci	busywait "$TIMEOUT" wait_for_offload \
30062306a36Sopenharmony_ci		ip -6 route get fibmatch 2001:db8:1::2 dev bond1
30162306a36Sopenharmony_ci	check_err $? "subport rif was not created on lag device"
30262306a36Sopenharmony_ci	busywait "$TIMEOUT" wait_for_offload \
30362306a36Sopenharmony_ci		ip -6 route get fibmatch 2001:db8:2::2 dev bond1.10
30462306a36Sopenharmony_ci	check_err $? "subport rif was not created on vlan device"
30562306a36Sopenharmony_ci
30662306a36Sopenharmony_ci	ip link set dev $swp1 nomaster
30762306a36Sopenharmony_ci	busywait "$TIMEOUT" wait_for_offload \
30862306a36Sopenharmony_ci		ip -6 route get fibmatch 2001:db8:1::2 dev bond1
30962306a36Sopenharmony_ci	check_err $? "subport rif of lag device was destroyed when should not"
31062306a36Sopenharmony_ci	busywait "$TIMEOUT" wait_for_offload \
31162306a36Sopenharmony_ci		ip -6 route get fibmatch 2001:db8:2::2 dev bond1.10
31262306a36Sopenharmony_ci	check_err $? "subport rif of vlan device was destroyed when should not"
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_ci	ip link set dev $swp2 nomaster
31562306a36Sopenharmony_ci	busywait "$TIMEOUT" not wait_for_offload \
31662306a36Sopenharmony_ci		ip -6 route get fibmatch 2001:db8:1::2 dev bond1
31762306a36Sopenharmony_ci	check_err $? "subport rif of lag device was not destroyed when should"
31862306a36Sopenharmony_ci	busywait "$TIMEOUT" not wait_for_offload \
31962306a36Sopenharmony_ci		ip -6 route get fibmatch 2001:db8:2::2 dev bond1.10
32062306a36Sopenharmony_ci	check_err $? "subport rif of vlan device was not destroyed when should"
32162306a36Sopenharmony_ci
32262306a36Sopenharmony_ci	log_test "subport rif refcount"
32362306a36Sopenharmony_ci
32462306a36Sopenharmony_ci	ip link del dev bond1.10
32562306a36Sopenharmony_ci	ip link del dev bond1
32662306a36Sopenharmony_ci}
32762306a36Sopenharmony_ci
32862306a36Sopenharmony_cisubport_rif_lag_join_test()
32962306a36Sopenharmony_ci{
33062306a36Sopenharmony_ci	# Test that the reference count of a RIF configured for a LAG is
33162306a36Sopenharmony_ci	# incremented / decremented when ports join / leave the LAG. We use the
33262306a36Sopenharmony_ci	# offload indication on routes configured on the RIF to understand if
33362306a36Sopenharmony_ci	# it was created / destroyed
33462306a36Sopenharmony_ci	RET=0
33562306a36Sopenharmony_ci
33662306a36Sopenharmony_ci	ip link add name bond1 type bond mode 802.3ad
33762306a36Sopenharmony_ci	ip link set dev $swp1 down
33862306a36Sopenharmony_ci	ip link set dev $swp2 down
33962306a36Sopenharmony_ci	ip link set dev $swp1 master bond1
34062306a36Sopenharmony_ci	ip link set dev $swp2 master bond1
34162306a36Sopenharmony_ci
34262306a36Sopenharmony_ci	ip link set dev bond1 up
34362306a36Sopenharmony_ci	ip -6 address add 2001:db8:1::1/64 dev bond1
34462306a36Sopenharmony_ci
34562306a36Sopenharmony_ci	busywait "$TIMEOUT" wait_for_offload \
34662306a36Sopenharmony_ci		ip -6 route get fibmatch 2001:db8:1::2 dev bond1
34762306a36Sopenharmony_ci	check_err $? "subport rif was not created on lag device"
34862306a36Sopenharmony_ci
34962306a36Sopenharmony_ci	ip link set dev $swp1 nomaster
35062306a36Sopenharmony_ci	busywait "$TIMEOUT" wait_for_offload \
35162306a36Sopenharmony_ci		ip -6 route get fibmatch 2001:db8:1::2 dev bond1
35262306a36Sopenharmony_ci	check_err $? "subport rif of lag device was destroyed after removing one port"
35362306a36Sopenharmony_ci
35462306a36Sopenharmony_ci	ip link set dev $swp1 master bond1
35562306a36Sopenharmony_ci	ip link set dev $swp2 nomaster
35662306a36Sopenharmony_ci	busywait "$TIMEOUT" wait_for_offload \
35762306a36Sopenharmony_ci		ip -6 route get fibmatch 2001:db8:1::2 dev bond1
35862306a36Sopenharmony_ci	check_err $? "subport rif of lag device was destroyed after re-adding a port and removing another"
35962306a36Sopenharmony_ci
36062306a36Sopenharmony_ci	ip link set dev $swp1 nomaster
36162306a36Sopenharmony_ci	busywait "$TIMEOUT" not wait_for_offload \
36262306a36Sopenharmony_ci		ip -6 route get fibmatch 2001:db8:1::2 dev bond1
36362306a36Sopenharmony_ci	check_err $? "subport rif of lag device was not destroyed when should"
36462306a36Sopenharmony_ci
36562306a36Sopenharmony_ci	log_test "subport rif lag join"
36662306a36Sopenharmony_ci
36762306a36Sopenharmony_ci	ip link del dev bond1
36862306a36Sopenharmony_ci}
36962306a36Sopenharmony_ci
37062306a36Sopenharmony_civlan_dev_deletion_test()
37162306a36Sopenharmony_ci{
37262306a36Sopenharmony_ci	# Test that VLAN devices are correctly deleted / unlinked when enslaved
37362306a36Sopenharmony_ci	# to bridge
37462306a36Sopenharmony_ci	RET=0
37562306a36Sopenharmony_ci
37662306a36Sopenharmony_ci	ip link add name br10 type bridge
37762306a36Sopenharmony_ci	ip link add name br20 type bridge
37862306a36Sopenharmony_ci	ip link add name br30 type bridge
37962306a36Sopenharmony_ci	ip link add link $swp1 name $swp1.10 type vlan id 10
38062306a36Sopenharmony_ci	ip link add link $swp1 name $swp1.20 type vlan id 20
38162306a36Sopenharmony_ci	ip link add link $swp1 name $swp1.30 type vlan id 30
38262306a36Sopenharmony_ci	ip link set dev $swp1.10 master br10
38362306a36Sopenharmony_ci	ip link set dev $swp1.20 master br20
38462306a36Sopenharmony_ci	ip link set dev $swp1.30 master br30
38562306a36Sopenharmony_ci
38662306a36Sopenharmony_ci	# If we did not handle the situation correctly, then these operations
38762306a36Sopenharmony_ci	# might produce a trace
38862306a36Sopenharmony_ci	ip link set dev $swp1.30 nomaster
38962306a36Sopenharmony_ci	ip link del dev $swp1.20
39062306a36Sopenharmony_ci	# Deletion via ioctl uses different code paths from netlink
39162306a36Sopenharmony_ci	vconfig rem $swp1.10 &> /dev/null
39262306a36Sopenharmony_ci
39362306a36Sopenharmony_ci	log_test "vlan device deletion"
39462306a36Sopenharmony_ci
39562306a36Sopenharmony_ci	ip link del dev $swp1.30
39662306a36Sopenharmony_ci	ip link del dev br30
39762306a36Sopenharmony_ci	ip link del dev br20
39862306a36Sopenharmony_ci	ip link del dev br10
39962306a36Sopenharmony_ci}
40062306a36Sopenharmony_ci
40162306a36Sopenharmony_cilag_create()
40262306a36Sopenharmony_ci{
40362306a36Sopenharmony_ci	ip link add name bond1 type bond mode 802.3ad
40462306a36Sopenharmony_ci	ip link set dev $swp1 down
40562306a36Sopenharmony_ci	ip link set dev $swp2 down
40662306a36Sopenharmony_ci	ip link set dev $swp1 master bond1
40762306a36Sopenharmony_ci	ip link set dev $swp2 master bond1
40862306a36Sopenharmony_ci
40962306a36Sopenharmony_ci	ip link add link bond1 name bond1.10 type vlan id 10
41062306a36Sopenharmony_ci	ip link add link bond1 name bond1.20 type vlan id 20
41162306a36Sopenharmony_ci
41262306a36Sopenharmony_ci	ip link add name br0 type bridge vlan_filtering 1
41362306a36Sopenharmony_ci	ip link set dev bond1 master br0
41462306a36Sopenharmony_ci
41562306a36Sopenharmony_ci	ip link add name br10 type bridge
41662306a36Sopenharmony_ci	ip link set dev bond1.10 master br10
41762306a36Sopenharmony_ci
41862306a36Sopenharmony_ci	ip link add name br20 type bridge
41962306a36Sopenharmony_ci	ip link set dev bond1.20 master br20
42062306a36Sopenharmony_ci}
42162306a36Sopenharmony_ci
42262306a36Sopenharmony_cilag_unlink_slaves_test()
42362306a36Sopenharmony_ci{
42462306a36Sopenharmony_ci	# Test that ports are correctly unlinked from their LAG master, when
42562306a36Sopenharmony_ci	# the LAG and its VLAN uppers are enslaved to bridges
42662306a36Sopenharmony_ci	RET=0
42762306a36Sopenharmony_ci
42862306a36Sopenharmony_ci	lag_create
42962306a36Sopenharmony_ci
43062306a36Sopenharmony_ci	ip link set dev $swp1 nomaster
43162306a36Sopenharmony_ci	check_err $? "lag slave $swp1 was not unlinked from master"
43262306a36Sopenharmony_ci	ip link set dev $swp2 nomaster
43362306a36Sopenharmony_ci	check_err $? "lag slave $swp2 was not unlinked from master"
43462306a36Sopenharmony_ci
43562306a36Sopenharmony_ci	# Try to configure corresponding VLANs as router interfaces
43662306a36Sopenharmony_ci	ip -6 address add 2001:db8:1::1/64 dev $swp1
43762306a36Sopenharmony_ci	check_err $? "failed to configure ip address on $swp1"
43862306a36Sopenharmony_ci
43962306a36Sopenharmony_ci	ip link add link $swp1 name $swp1.10 type vlan id 10
44062306a36Sopenharmony_ci	ip -6 address add 2001:db8:10::1/64 dev $swp1.10
44162306a36Sopenharmony_ci	check_err $? "failed to configure ip address on $swp1.10"
44262306a36Sopenharmony_ci
44362306a36Sopenharmony_ci	ip link add link $swp1 name $swp1.20 type vlan id 20
44462306a36Sopenharmony_ci	ip -6 address add 2001:db8:20::1/64 dev $swp1.20
44562306a36Sopenharmony_ci	check_err $? "failed to configure ip address on $swp1.20"
44662306a36Sopenharmony_ci
44762306a36Sopenharmony_ci	log_test "lag slaves unlinking"
44862306a36Sopenharmony_ci
44962306a36Sopenharmony_ci	ip link del dev $swp1.20
45062306a36Sopenharmony_ci	ip link del dev $swp1.10
45162306a36Sopenharmony_ci	ip address flush dev $swp1
45262306a36Sopenharmony_ci
45362306a36Sopenharmony_ci	ip link del dev br20
45462306a36Sopenharmony_ci	ip link del dev br10
45562306a36Sopenharmony_ci	ip link del dev br0
45662306a36Sopenharmony_ci	ip link del dev bond1
45762306a36Sopenharmony_ci}
45862306a36Sopenharmony_ci
45962306a36Sopenharmony_cilag_dev_deletion_test()
46062306a36Sopenharmony_ci{
46162306a36Sopenharmony_ci	# Test that LAG device is correctly deleted, when the LAG and its VLAN
46262306a36Sopenharmony_ci	# uppers are enslaved to bridges
46362306a36Sopenharmony_ci	RET=0
46462306a36Sopenharmony_ci
46562306a36Sopenharmony_ci	lag_create
46662306a36Sopenharmony_ci
46762306a36Sopenharmony_ci	ip link del dev bond1
46862306a36Sopenharmony_ci
46962306a36Sopenharmony_ci	log_test "lag device deletion"
47062306a36Sopenharmony_ci
47162306a36Sopenharmony_ci	ip link del dev br20
47262306a36Sopenharmony_ci	ip link del dev br10
47362306a36Sopenharmony_ci	ip link del dev br0
47462306a36Sopenharmony_ci}
47562306a36Sopenharmony_ci
47662306a36Sopenharmony_civlan_interface_uppers_test()
47762306a36Sopenharmony_ci{
47862306a36Sopenharmony_ci	# Test that uppers of a VLAN interface are correctly sanitized
47962306a36Sopenharmony_ci	RET=0
48062306a36Sopenharmony_ci
48162306a36Sopenharmony_ci	ip link add name br0 type bridge vlan_filtering 1
48262306a36Sopenharmony_ci	ip link set dev $swp1 master br0
48362306a36Sopenharmony_ci
48462306a36Sopenharmony_ci	ip link add link br0 name br0.10 type vlan id 10
48562306a36Sopenharmony_ci
48662306a36Sopenharmony_ci	ip -6 address add 2001:db8:1::1/64 dev br0.10
48762306a36Sopenharmony_ci	ip link add link br0.10 name macvlan0 type macvlan mode private
48862306a36Sopenharmony_ci	check_err $? "did not manage to create a macvlan when should"
48962306a36Sopenharmony_ci
49062306a36Sopenharmony_ci	ip link del dev macvlan0
49162306a36Sopenharmony_ci
49262306a36Sopenharmony_ci	ip link add name vrf-test type vrf table 10
49362306a36Sopenharmony_ci	ip link set dev br0.10 master vrf-test
49462306a36Sopenharmony_ci	check_err $? "did not manage to enslave vlan interface to vrf"
49562306a36Sopenharmony_ci	ip link del dev vrf-test
49662306a36Sopenharmony_ci
49762306a36Sopenharmony_ci	ip link add name br-test type bridge
49862306a36Sopenharmony_ci	ip link set dev br0.10 master br-test &> /dev/null
49962306a36Sopenharmony_ci	check_fail $? "managed to enslave vlan interface to bridge when should not"
50062306a36Sopenharmony_ci	ip link del dev br-test
50162306a36Sopenharmony_ci
50262306a36Sopenharmony_ci	log_test "vlan interface uppers"
50362306a36Sopenharmony_ci
50462306a36Sopenharmony_ci	ip link del dev br0
50562306a36Sopenharmony_ci}
50662306a36Sopenharmony_ci
50762306a36Sopenharmony_cibridge_extern_learn_test()
50862306a36Sopenharmony_ci{
50962306a36Sopenharmony_ci	# Test that externally learned entries added from user space are
51062306a36Sopenharmony_ci	# marked as offloaded
51162306a36Sopenharmony_ci	RET=0
51262306a36Sopenharmony_ci
51362306a36Sopenharmony_ci	ip link add name br0 type bridge
51462306a36Sopenharmony_ci	ip link set dev $swp1 master br0
51562306a36Sopenharmony_ci
51662306a36Sopenharmony_ci	bridge fdb add de:ad:be:ef:13:37 dev $swp1 master extern_learn
51762306a36Sopenharmony_ci
51862306a36Sopenharmony_ci	busywait "$TIMEOUT" wait_for_offload \
51962306a36Sopenharmony_ci		bridge fdb show brport $swp1 de:ad:be:ef:13:37
52062306a36Sopenharmony_ci	check_err $? "fdb entry not marked as offloaded when should"
52162306a36Sopenharmony_ci
52262306a36Sopenharmony_ci	log_test "externally learned fdb entry"
52362306a36Sopenharmony_ci
52462306a36Sopenharmony_ci	ip link del dev br0
52562306a36Sopenharmony_ci}
52662306a36Sopenharmony_ci
52762306a36Sopenharmony_cineigh_offload_test()
52862306a36Sopenharmony_ci{
52962306a36Sopenharmony_ci	# Test that IPv4 and IPv6 neighbour entries are marked as offloaded
53062306a36Sopenharmony_ci	RET=0
53162306a36Sopenharmony_ci
53262306a36Sopenharmony_ci	ip -4 address add 192.0.2.1/24 dev $swp1
53362306a36Sopenharmony_ci	ip -6 address add 2001:db8:1::1/64 dev $swp1
53462306a36Sopenharmony_ci
53562306a36Sopenharmony_ci	ip -4 neigh add 192.0.2.2 lladdr de:ad:be:ef:13:37 nud perm dev $swp1
53662306a36Sopenharmony_ci	ip -6 neigh add 2001:db8:1::2 lladdr de:ad:be:ef:13:37 nud perm \
53762306a36Sopenharmony_ci		dev $swp1
53862306a36Sopenharmony_ci
53962306a36Sopenharmony_ci	busywait "$TIMEOUT" wait_for_offload \
54062306a36Sopenharmony_ci		ip -4 neigh show dev $swp1 192.0.2.2
54162306a36Sopenharmony_ci	check_err $? "ipv4 neigh entry not marked as offloaded when should"
54262306a36Sopenharmony_ci	busywait "$TIMEOUT" wait_for_offload \
54362306a36Sopenharmony_ci		ip -6 neigh show dev $swp1 2001:db8:1::2
54462306a36Sopenharmony_ci	check_err $? "ipv6 neigh entry not marked as offloaded when should"
54562306a36Sopenharmony_ci
54662306a36Sopenharmony_ci	log_test "neighbour offload indication"
54762306a36Sopenharmony_ci
54862306a36Sopenharmony_ci	ip -6 neigh del 2001:db8:1::2 dev $swp1
54962306a36Sopenharmony_ci	ip -4 neigh del 192.0.2.2 dev $swp1
55062306a36Sopenharmony_ci	ip -6 address del 2001:db8:1::1/64 dev $swp1
55162306a36Sopenharmony_ci	ip -4 address del 192.0.2.1/24 dev $swp1
55262306a36Sopenharmony_ci}
55362306a36Sopenharmony_ci
55462306a36Sopenharmony_cinexthop_offload_test()
55562306a36Sopenharmony_ci{
55662306a36Sopenharmony_ci	# Test that IPv4 and IPv6 nexthops are marked as offloaded
55762306a36Sopenharmony_ci	RET=0
55862306a36Sopenharmony_ci
55962306a36Sopenharmony_ci	sysctl_set net.ipv6.conf.$swp2.keep_addr_on_down 1
56062306a36Sopenharmony_ci	simple_if_init $swp1 192.0.2.1/24 2001:db8:1::1/64
56162306a36Sopenharmony_ci	simple_if_init $swp2 192.0.2.2/24 2001:db8:1::2/64
56262306a36Sopenharmony_ci	setup_wait
56362306a36Sopenharmony_ci
56462306a36Sopenharmony_ci	ip -4 route add 198.51.100.0/24 vrf v$swp1 \
56562306a36Sopenharmony_ci		nexthop via 192.0.2.2 dev $swp1
56662306a36Sopenharmony_ci	ip -6 route add 2001:db8:2::/64 vrf v$swp1 \
56762306a36Sopenharmony_ci		nexthop via 2001:db8:1::2 dev $swp1
56862306a36Sopenharmony_ci
56962306a36Sopenharmony_ci	busywait "$TIMEOUT" wait_for_offload \
57062306a36Sopenharmony_ci		ip -4 route show 198.51.100.0/24 vrf v$swp1
57162306a36Sopenharmony_ci	check_err $? "ipv4 nexthop not marked as offloaded when should"
57262306a36Sopenharmony_ci	busywait "$TIMEOUT" wait_for_offload \
57362306a36Sopenharmony_ci		ip -6 route show 2001:db8:2::/64 vrf v$swp1
57462306a36Sopenharmony_ci	check_err $? "ipv6 nexthop not marked as offloaded when should"
57562306a36Sopenharmony_ci
57662306a36Sopenharmony_ci	ip link set dev $swp2 down
57762306a36Sopenharmony_ci	sleep 1
57862306a36Sopenharmony_ci
57962306a36Sopenharmony_ci	busywait "$TIMEOUT" not wait_for_offload \
58062306a36Sopenharmony_ci		ip -4 route show 198.51.100.0/24 vrf v$swp1
58162306a36Sopenharmony_ci	check_err $? "ipv4 nexthop marked as offloaded when should not"
58262306a36Sopenharmony_ci	busywait "$TIMEOUT" not wait_for_offload \
58362306a36Sopenharmony_ci		ip -6 route show 2001:db8:2::/64 vrf v$swp1
58462306a36Sopenharmony_ci	check_err $? "ipv6 nexthop marked as offloaded when should not"
58562306a36Sopenharmony_ci
58662306a36Sopenharmony_ci	ip link set dev $swp2 up
58762306a36Sopenharmony_ci	setup_wait
58862306a36Sopenharmony_ci
58962306a36Sopenharmony_ci	busywait "$TIMEOUT" wait_for_offload \
59062306a36Sopenharmony_ci		ip -4 route show 198.51.100.0/24 vrf v$swp1
59162306a36Sopenharmony_ci	check_err $? "ipv4 nexthop not marked as offloaded after neigh add"
59262306a36Sopenharmony_ci	busywait "$TIMEOUT" wait_for_offload \
59362306a36Sopenharmony_ci		ip -6 route show 2001:db8:2::/64 vrf v$swp1
59462306a36Sopenharmony_ci	check_err $? "ipv6 nexthop not marked as offloaded after neigh add"
59562306a36Sopenharmony_ci
59662306a36Sopenharmony_ci	log_test "nexthop offload indication"
59762306a36Sopenharmony_ci
59862306a36Sopenharmony_ci	ip -6 route del 2001:db8:2::/64 vrf v$swp1
59962306a36Sopenharmony_ci	ip -4 route del 198.51.100.0/24 vrf v$swp1
60062306a36Sopenharmony_ci
60162306a36Sopenharmony_ci	simple_if_fini $swp2 192.0.2.2/24 2001:db8:1::2/64
60262306a36Sopenharmony_ci	simple_if_fini $swp1 192.0.2.1/24 2001:db8:1::1/64
60362306a36Sopenharmony_ci	sysctl_restore net.ipv6.conf.$swp2.keep_addr_on_down
60462306a36Sopenharmony_ci}
60562306a36Sopenharmony_ci
60662306a36Sopenharmony_cinexthop_obj_invalid_test()
60762306a36Sopenharmony_ci{
60862306a36Sopenharmony_ci	# Test that invalid nexthop object configurations are rejected
60962306a36Sopenharmony_ci	RET=0
61062306a36Sopenharmony_ci
61162306a36Sopenharmony_ci	simple_if_init $swp1 192.0.2.1/24 2001:db8:1::1/64
61262306a36Sopenharmony_ci	simple_if_init $swp2 192.0.2.2/24 2001:db8:1::2/64
61362306a36Sopenharmony_ci	setup_wait
61462306a36Sopenharmony_ci
61562306a36Sopenharmony_ci	ip nexthop add id 1 via 192.0.2.3 fdb
61662306a36Sopenharmony_ci	check_fail $? "managed to configure an FDB nexthop when should not"
61762306a36Sopenharmony_ci
61862306a36Sopenharmony_ci	ip nexthop add id 1 encap mpls 200/300 via 192.0.2.3 dev $swp1
61962306a36Sopenharmony_ci	check_fail $? "managed to configure a nexthop with MPLS encap when should not"
62062306a36Sopenharmony_ci
62162306a36Sopenharmony_ci	ip nexthop add id 1 dev $swp1
62262306a36Sopenharmony_ci	ip nexthop add id 2 dev $swp1
62362306a36Sopenharmony_ci	ip nexthop add id 3 via 192.0.2.3 dev $swp1
62462306a36Sopenharmony_ci	ip nexthop add id 10 group 1/2
62562306a36Sopenharmony_ci	check_fail $? "managed to configure a nexthop group with device-only nexthops when should not"
62662306a36Sopenharmony_ci
62762306a36Sopenharmony_ci	ip nexthop add id 10 group 3 type resilient buckets 7
62862306a36Sopenharmony_ci	check_fail $? "managed to configure a too small resilient nexthop group when should not"
62962306a36Sopenharmony_ci
63062306a36Sopenharmony_ci	ip nexthop add id 10 group 3 type resilient buckets 129
63162306a36Sopenharmony_ci	check_fail $? "managed to configure a resilient nexthop group with invalid number of buckets when should not"
63262306a36Sopenharmony_ci
63362306a36Sopenharmony_ci	ip nexthop add id 10 group 1/2 type resilient buckets 32
63462306a36Sopenharmony_ci	check_fail $? "managed to configure a resilient nexthop group with device-only nexthops when should not"
63562306a36Sopenharmony_ci
63662306a36Sopenharmony_ci	ip nexthop add id 10 group 3 type resilient buckets 32
63762306a36Sopenharmony_ci	check_err $? "failed to configure a valid resilient nexthop group"
63862306a36Sopenharmony_ci	ip nexthop replace id 3 dev $swp1
63962306a36Sopenharmony_ci	check_fail $? "managed to populate a nexthop bucket with a device-only nexthop when should not"
64062306a36Sopenharmony_ci
64162306a36Sopenharmony_ci	log_test "nexthop objects - invalid configurations"
64262306a36Sopenharmony_ci
64362306a36Sopenharmony_ci	ip nexthop del id 10
64462306a36Sopenharmony_ci	ip nexthop del id 3
64562306a36Sopenharmony_ci	ip nexthop del id 2
64662306a36Sopenharmony_ci	ip nexthop del id 1
64762306a36Sopenharmony_ci
64862306a36Sopenharmony_ci	simple_if_fini $swp2 192.0.2.2/24 2001:db8:1::2/64
64962306a36Sopenharmony_ci	simple_if_fini $swp1 192.0.2.1/24 2001:db8:1::1/64
65062306a36Sopenharmony_ci}
65162306a36Sopenharmony_ci
65262306a36Sopenharmony_cinexthop_obj_offload_test()
65362306a36Sopenharmony_ci{
65462306a36Sopenharmony_ci	# Test offload indication of nexthop objects
65562306a36Sopenharmony_ci	RET=0
65662306a36Sopenharmony_ci
65762306a36Sopenharmony_ci	simple_if_init $swp1 192.0.2.1/24 2001:db8:1::1/64
65862306a36Sopenharmony_ci	simple_if_init $swp2
65962306a36Sopenharmony_ci	setup_wait
66062306a36Sopenharmony_ci
66162306a36Sopenharmony_ci	ip nexthop add id 1 via 192.0.2.2 dev $swp1
66262306a36Sopenharmony_ci	ip neigh replace 192.0.2.2 lladdr 00:11:22:33:44:55 nud perm \
66362306a36Sopenharmony_ci		dev $swp1
66462306a36Sopenharmony_ci
66562306a36Sopenharmony_ci	busywait "$TIMEOUT" wait_for_offload \
66662306a36Sopenharmony_ci		ip nexthop show id 1
66762306a36Sopenharmony_ci	check_err $? "nexthop not marked as offloaded when should"
66862306a36Sopenharmony_ci
66962306a36Sopenharmony_ci	ip neigh replace 192.0.2.2 nud failed dev $swp1
67062306a36Sopenharmony_ci	busywait "$TIMEOUT" not wait_for_offload \
67162306a36Sopenharmony_ci		ip nexthop show id 1
67262306a36Sopenharmony_ci	check_err $? "nexthop marked as offloaded after setting neigh to failed state"
67362306a36Sopenharmony_ci
67462306a36Sopenharmony_ci	ip neigh replace 192.0.2.2 lladdr 00:11:22:33:44:55 nud perm \
67562306a36Sopenharmony_ci		dev $swp1
67662306a36Sopenharmony_ci	busywait "$TIMEOUT" wait_for_offload \
67762306a36Sopenharmony_ci		ip nexthop show id 1
67862306a36Sopenharmony_ci	check_err $? "nexthop not marked as offloaded after neigh replace"
67962306a36Sopenharmony_ci
68062306a36Sopenharmony_ci	ip nexthop replace id 1 via 192.0.2.3 dev $swp1
68162306a36Sopenharmony_ci	busywait "$TIMEOUT" not wait_for_offload \
68262306a36Sopenharmony_ci		ip nexthop show id 1
68362306a36Sopenharmony_ci	check_err $? "nexthop marked as offloaded after replacing to use an invalid address"
68462306a36Sopenharmony_ci
68562306a36Sopenharmony_ci	ip nexthop replace id 1 via 192.0.2.2 dev $swp1
68662306a36Sopenharmony_ci	busywait "$TIMEOUT" wait_for_offload \
68762306a36Sopenharmony_ci		ip nexthop show id 1
68862306a36Sopenharmony_ci	check_err $? "nexthop not marked as offloaded after replacing to use a valid address"
68962306a36Sopenharmony_ci
69062306a36Sopenharmony_ci	log_test "nexthop objects offload indication"
69162306a36Sopenharmony_ci
69262306a36Sopenharmony_ci	ip neigh del 192.0.2.2 dev $swp1
69362306a36Sopenharmony_ci	ip nexthop del id 1
69462306a36Sopenharmony_ci
69562306a36Sopenharmony_ci	simple_if_fini $swp2
69662306a36Sopenharmony_ci	simple_if_fini $swp1 192.0.2.1/24 2001:db8:1::1/64
69762306a36Sopenharmony_ci}
69862306a36Sopenharmony_ci
69962306a36Sopenharmony_cinexthop_obj_group_offload_test()
70062306a36Sopenharmony_ci{
70162306a36Sopenharmony_ci	# Test offload indication of nexthop group objects
70262306a36Sopenharmony_ci	RET=0
70362306a36Sopenharmony_ci
70462306a36Sopenharmony_ci	simple_if_init $swp1 192.0.2.1/24 2001:db8:1::1/64
70562306a36Sopenharmony_ci	simple_if_init $swp2
70662306a36Sopenharmony_ci	setup_wait
70762306a36Sopenharmony_ci
70862306a36Sopenharmony_ci	ip nexthop add id 1 via 192.0.2.2 dev $swp1
70962306a36Sopenharmony_ci	ip nexthop add id 2 via 2001:db8:1::2 dev $swp1
71062306a36Sopenharmony_ci	ip nexthop add id 10 group 1/2
71162306a36Sopenharmony_ci	ip neigh replace 192.0.2.2 lladdr 00:11:22:33:44:55 nud perm \
71262306a36Sopenharmony_ci		dev $swp1
71362306a36Sopenharmony_ci	ip neigh replace 192.0.2.3 lladdr 00:11:22:33:44:55 nud perm \
71462306a36Sopenharmony_ci		dev $swp1
71562306a36Sopenharmony_ci	ip neigh replace 2001:db8:1::2 lladdr 00:11:22:33:44:55 nud perm \
71662306a36Sopenharmony_ci		dev $swp1
71762306a36Sopenharmony_ci
71862306a36Sopenharmony_ci	busywait "$TIMEOUT" wait_for_offload \
71962306a36Sopenharmony_ci		ip nexthop show id 1
72062306a36Sopenharmony_ci	check_err $? "IPv4 nexthop not marked as offloaded when should"
72162306a36Sopenharmony_ci	busywait "$TIMEOUT" wait_for_offload \
72262306a36Sopenharmony_ci		ip nexthop show id 2
72362306a36Sopenharmony_ci	check_err $? "IPv6 nexthop not marked as offloaded when should"
72462306a36Sopenharmony_ci	busywait "$TIMEOUT" wait_for_offload \
72562306a36Sopenharmony_ci		ip nexthop show id 10
72662306a36Sopenharmony_ci	check_err $? "nexthop group not marked as offloaded when should"
72762306a36Sopenharmony_ci
72862306a36Sopenharmony_ci	# Invalidate nexthop id 1
72962306a36Sopenharmony_ci	ip neigh replace 192.0.2.2 nud failed dev $swp1
73062306a36Sopenharmony_ci	busywait "$TIMEOUT" not wait_for_offload \
73162306a36Sopenharmony_ci		ip nexthop show id 10
73262306a36Sopenharmony_ci	check_fail $? "nexthop group not marked as offloaded with one valid nexthop"
73362306a36Sopenharmony_ci
73462306a36Sopenharmony_ci	# Invalidate nexthop id 2
73562306a36Sopenharmony_ci	ip neigh replace 2001:db8:1::2 nud failed dev $swp1
73662306a36Sopenharmony_ci	busywait "$TIMEOUT" not wait_for_offload \
73762306a36Sopenharmony_ci		ip nexthop show id 10
73862306a36Sopenharmony_ci	check_err $? "nexthop group marked as offloaded when should not"
73962306a36Sopenharmony_ci
74062306a36Sopenharmony_ci	# Revalidate nexthop id 1
74162306a36Sopenharmony_ci	ip nexthop replace id 1 via 192.0.2.3 dev $swp1
74262306a36Sopenharmony_ci	busywait "$TIMEOUT" wait_for_offload \
74362306a36Sopenharmony_ci		ip nexthop show id 10
74462306a36Sopenharmony_ci	check_err $? "nexthop group not marked as offloaded after revalidating nexthop"
74562306a36Sopenharmony_ci
74662306a36Sopenharmony_ci	log_test "nexthop group objects offload indication"
74762306a36Sopenharmony_ci
74862306a36Sopenharmony_ci	ip neigh del 2001:db8:1::2 dev $swp1
74962306a36Sopenharmony_ci	ip neigh del 192.0.2.3 dev $swp1
75062306a36Sopenharmony_ci	ip neigh del 192.0.2.2 dev $swp1
75162306a36Sopenharmony_ci	ip nexthop del id 10
75262306a36Sopenharmony_ci	ip nexthop del id 2
75362306a36Sopenharmony_ci	ip nexthop del id 1
75462306a36Sopenharmony_ci
75562306a36Sopenharmony_ci	simple_if_fini $swp2
75662306a36Sopenharmony_ci	simple_if_fini $swp1 192.0.2.1/24 2001:db8:1::1/64
75762306a36Sopenharmony_ci}
75862306a36Sopenharmony_ci
75962306a36Sopenharmony_cinexthop_obj_bucket_offload_test()
76062306a36Sopenharmony_ci{
76162306a36Sopenharmony_ci	# Test offload indication of nexthop buckets
76262306a36Sopenharmony_ci	RET=0
76362306a36Sopenharmony_ci
76462306a36Sopenharmony_ci	simple_if_init $swp1 192.0.2.1/24 2001:db8:1::1/64
76562306a36Sopenharmony_ci	simple_if_init $swp2
76662306a36Sopenharmony_ci	setup_wait
76762306a36Sopenharmony_ci
76862306a36Sopenharmony_ci	ip nexthop add id 1 via 192.0.2.2 dev $swp1
76962306a36Sopenharmony_ci	ip nexthop add id 2 via 2001:db8:1::2 dev $swp1
77062306a36Sopenharmony_ci	ip nexthop add id 10 group 1/2 type resilient buckets 32 idle_timer 0
77162306a36Sopenharmony_ci	ip neigh replace 192.0.2.2 lladdr 00:11:22:33:44:55 nud perm \
77262306a36Sopenharmony_ci		dev $swp1
77362306a36Sopenharmony_ci	ip neigh replace 192.0.2.3 lladdr 00:11:22:33:44:55 nud perm \
77462306a36Sopenharmony_ci		dev $swp1
77562306a36Sopenharmony_ci	ip neigh replace 2001:db8:1::2 lladdr 00:11:22:33:44:55 nud perm \
77662306a36Sopenharmony_ci		dev $swp1
77762306a36Sopenharmony_ci
77862306a36Sopenharmony_ci	busywait "$TIMEOUT" wait_for_offload \
77962306a36Sopenharmony_ci		ip nexthop bucket show nhid 1
78062306a36Sopenharmony_ci	check_err $? "IPv4 nexthop buckets not marked as offloaded when should"
78162306a36Sopenharmony_ci	busywait "$TIMEOUT" wait_for_offload \
78262306a36Sopenharmony_ci		ip nexthop bucket show nhid 2
78362306a36Sopenharmony_ci	check_err $? "IPv6 nexthop buckets not marked as offloaded when should"
78462306a36Sopenharmony_ci
78562306a36Sopenharmony_ci	# Invalidate nexthop id 1
78662306a36Sopenharmony_ci	ip neigh replace 192.0.2.2 nud failed dev $swp1
78762306a36Sopenharmony_ci	busywait "$TIMEOUT" wait_for_trap \
78862306a36Sopenharmony_ci		ip nexthop bucket show nhid 1
78962306a36Sopenharmony_ci	check_err $? "IPv4 nexthop buckets not marked with trap when should"
79062306a36Sopenharmony_ci
79162306a36Sopenharmony_ci	# Invalidate nexthop id 2
79262306a36Sopenharmony_ci	ip neigh replace 2001:db8:1::2 nud failed dev $swp1
79362306a36Sopenharmony_ci	busywait "$TIMEOUT" wait_for_trap \
79462306a36Sopenharmony_ci		ip nexthop bucket show nhid 2
79562306a36Sopenharmony_ci	check_err $? "IPv6 nexthop buckets not marked with trap when should"
79662306a36Sopenharmony_ci
79762306a36Sopenharmony_ci	# Revalidate nexthop id 1 by changing its configuration
79862306a36Sopenharmony_ci	ip nexthop replace id 1 via 192.0.2.3 dev $swp1
79962306a36Sopenharmony_ci	busywait "$TIMEOUT" wait_for_offload \
80062306a36Sopenharmony_ci		ip nexthop bucket show nhid 1
80162306a36Sopenharmony_ci	check_err $? "nexthop bucket not marked as offloaded after revalidating nexthop"
80262306a36Sopenharmony_ci
80362306a36Sopenharmony_ci	# Revalidate nexthop id 2 by changing its neighbour
80462306a36Sopenharmony_ci	ip neigh replace 2001:db8:1::2 lladdr 00:11:22:33:44:55 nud perm \
80562306a36Sopenharmony_ci		dev $swp1
80662306a36Sopenharmony_ci	busywait "$TIMEOUT" wait_for_offload \
80762306a36Sopenharmony_ci		ip nexthop bucket show nhid 2
80862306a36Sopenharmony_ci	check_err $? "nexthop bucket not marked as offloaded after revalidating neighbour"
80962306a36Sopenharmony_ci
81062306a36Sopenharmony_ci	log_test "nexthop bucket offload indication"
81162306a36Sopenharmony_ci
81262306a36Sopenharmony_ci	ip neigh del 2001:db8:1::2 dev $swp1
81362306a36Sopenharmony_ci	ip neigh del 192.0.2.3 dev $swp1
81462306a36Sopenharmony_ci	ip neigh del 192.0.2.2 dev $swp1
81562306a36Sopenharmony_ci	ip nexthop del id 10
81662306a36Sopenharmony_ci	ip nexthop del id 2
81762306a36Sopenharmony_ci	ip nexthop del id 1
81862306a36Sopenharmony_ci
81962306a36Sopenharmony_ci	simple_if_fini $swp2
82062306a36Sopenharmony_ci	simple_if_fini $swp1 192.0.2.1/24 2001:db8:1::1/64
82162306a36Sopenharmony_ci}
82262306a36Sopenharmony_ci
82362306a36Sopenharmony_cinexthop_obj_blackhole_offload_test()
82462306a36Sopenharmony_ci{
82562306a36Sopenharmony_ci	# Test offload indication of blackhole nexthop objects
82662306a36Sopenharmony_ci	RET=0
82762306a36Sopenharmony_ci
82862306a36Sopenharmony_ci	ip nexthop add id 1 blackhole
82962306a36Sopenharmony_ci	busywait "$TIMEOUT" wait_for_offload \
83062306a36Sopenharmony_ci		ip nexthop show id 1
83162306a36Sopenharmony_ci	check_err $? "Blackhole nexthop not marked as offloaded when should"
83262306a36Sopenharmony_ci
83362306a36Sopenharmony_ci	ip nexthop add id 10 group 1
83462306a36Sopenharmony_ci	busywait "$TIMEOUT" wait_for_offload \
83562306a36Sopenharmony_ci		ip nexthop show id 10
83662306a36Sopenharmony_ci	check_err $? "Nexthop group not marked as offloaded when should"
83762306a36Sopenharmony_ci
83862306a36Sopenharmony_ci	log_test "blackhole nexthop objects offload indication"
83962306a36Sopenharmony_ci
84062306a36Sopenharmony_ci	ip nexthop del id 10
84162306a36Sopenharmony_ci	ip nexthop del id 1
84262306a36Sopenharmony_ci}
84362306a36Sopenharmony_ci
84462306a36Sopenharmony_cinexthop_obj_route_offload_test()
84562306a36Sopenharmony_ci{
84662306a36Sopenharmony_ci	# Test offload indication of routes using nexthop objects
84762306a36Sopenharmony_ci	RET=0
84862306a36Sopenharmony_ci
84962306a36Sopenharmony_ci	simple_if_init $swp1 192.0.2.1/24 2001:db8:1::1/64
85062306a36Sopenharmony_ci	simple_if_init $swp2
85162306a36Sopenharmony_ci	setup_wait
85262306a36Sopenharmony_ci
85362306a36Sopenharmony_ci	ip nexthop add id 1 via 192.0.2.2 dev $swp1
85462306a36Sopenharmony_ci	ip neigh replace 192.0.2.2 lladdr 00:11:22:33:44:55 nud perm \
85562306a36Sopenharmony_ci		dev $swp1
85662306a36Sopenharmony_ci	ip neigh replace 192.0.2.3 lladdr 00:11:22:33:44:55 nud perm \
85762306a36Sopenharmony_ci		dev $swp1
85862306a36Sopenharmony_ci
85962306a36Sopenharmony_ci	ip route replace 198.51.100.0/24 nhid 1
86062306a36Sopenharmony_ci	busywait "$TIMEOUT" wait_for_offload \
86162306a36Sopenharmony_ci		ip route show 198.51.100.0/24
86262306a36Sopenharmony_ci	check_err $? "route not marked as offloaded when using valid nexthop"
86362306a36Sopenharmony_ci
86462306a36Sopenharmony_ci	ip nexthop replace id 1 via 192.0.2.3 dev $swp1
86562306a36Sopenharmony_ci	busywait "$TIMEOUT" wait_for_offload \
86662306a36Sopenharmony_ci		ip route show 198.51.100.0/24
86762306a36Sopenharmony_ci	check_err $? "route not marked as offloaded after replacing valid nexthop with a valid one"
86862306a36Sopenharmony_ci
86962306a36Sopenharmony_ci	ip nexthop replace id 1 via 192.0.2.4 dev $swp1
87062306a36Sopenharmony_ci	busywait "$TIMEOUT" not wait_for_offload \
87162306a36Sopenharmony_ci		ip route show 198.51.100.0/24
87262306a36Sopenharmony_ci	check_err $? "route marked as offloaded after replacing valid nexthop with an invalid one"
87362306a36Sopenharmony_ci
87462306a36Sopenharmony_ci	ip nexthop replace id 1 via 192.0.2.2 dev $swp1
87562306a36Sopenharmony_ci	busywait "$TIMEOUT" wait_for_offload \
87662306a36Sopenharmony_ci		ip route show 198.51.100.0/24
87762306a36Sopenharmony_ci	check_err $? "route not marked as offloaded after replacing invalid nexthop with a valid one"
87862306a36Sopenharmony_ci
87962306a36Sopenharmony_ci	log_test "routes using nexthop objects offload indication"
88062306a36Sopenharmony_ci
88162306a36Sopenharmony_ci	ip route del 198.51.100.0/24
88262306a36Sopenharmony_ci	ip neigh del 192.0.2.3 dev $swp1
88362306a36Sopenharmony_ci	ip neigh del 192.0.2.2 dev $swp1
88462306a36Sopenharmony_ci	ip nexthop del id 1
88562306a36Sopenharmony_ci
88662306a36Sopenharmony_ci	simple_if_fini $swp2
88762306a36Sopenharmony_ci	simple_if_fini $swp1 192.0.2.1/24 2001:db8:1::1/64
88862306a36Sopenharmony_ci}
88962306a36Sopenharmony_ci
89062306a36Sopenharmony_cibridge_locked_port_test()
89162306a36Sopenharmony_ci{
89262306a36Sopenharmony_ci	RET=0
89362306a36Sopenharmony_ci
89462306a36Sopenharmony_ci	ip link add name br1 up type bridge vlan_filtering 0
89562306a36Sopenharmony_ci
89662306a36Sopenharmony_ci	ip link add link $swp1 name $swp1.10 type vlan id 10
89762306a36Sopenharmony_ci	ip link set dev $swp1.10 master br1
89862306a36Sopenharmony_ci
89962306a36Sopenharmony_ci	bridge link set dev $swp1.10 locked on
90062306a36Sopenharmony_ci	check_fail $? "managed to set locked flag on a VLAN upper"
90162306a36Sopenharmony_ci
90262306a36Sopenharmony_ci	ip link set dev $swp1.10 nomaster
90362306a36Sopenharmony_ci	ip link set dev $swp1 master br1
90462306a36Sopenharmony_ci
90562306a36Sopenharmony_ci	bridge link set dev $swp1 locked on
90662306a36Sopenharmony_ci	check_fail $? "managed to set locked flag on a bridge port that has a VLAN upper"
90762306a36Sopenharmony_ci
90862306a36Sopenharmony_ci	ip link del dev $swp1.10
90962306a36Sopenharmony_ci	bridge link set dev $swp1 locked on
91062306a36Sopenharmony_ci
91162306a36Sopenharmony_ci	ip link add link $swp1 name $swp1.10 type vlan id 10
91262306a36Sopenharmony_ci	check_fail $? "managed to configure a VLAN upper on a locked port"
91362306a36Sopenharmony_ci
91462306a36Sopenharmony_ci	log_test "bridge locked port"
91562306a36Sopenharmony_ci
91662306a36Sopenharmony_ci	ip link del dev $swp1.10 &> /dev/null
91762306a36Sopenharmony_ci	ip link del dev br1
91862306a36Sopenharmony_ci}
91962306a36Sopenharmony_ci
92062306a36Sopenharmony_cidevlink_reload_test()
92162306a36Sopenharmony_ci{
92262306a36Sopenharmony_ci	# Test that after executing all the above configuration tests, a
92362306a36Sopenharmony_ci	# devlink reload can be performed without errors
92462306a36Sopenharmony_ci	RET=0
92562306a36Sopenharmony_ci
92662306a36Sopenharmony_ci	devlink dev reload "$DEVLINK_DEV"
92762306a36Sopenharmony_ci	check_err $? "devlink reload failed"
92862306a36Sopenharmony_ci
92962306a36Sopenharmony_ci	log_test "devlink reload - last test"
93062306a36Sopenharmony_ci
93162306a36Sopenharmony_ci	sleep 20
93262306a36Sopenharmony_ci}
93362306a36Sopenharmony_ci
93462306a36Sopenharmony_citrap cleanup EXIT
93562306a36Sopenharmony_ci
93662306a36Sopenharmony_cisetup_prepare
93762306a36Sopenharmony_cisetup_wait
93862306a36Sopenharmony_ci
93962306a36Sopenharmony_citests_run
94062306a36Sopenharmony_ci
94162306a36Sopenharmony_ciexit $EXIT_STATUS
942