Back to home page

OSCL-LXR

 
 

    


0001 #!/bin/bash
0002 # SPDX-License-Identifier: GPL-2.0
0003 #
0004 # Test various interface configuration scenarios. Observe that configurations
0005 # deemed valid by mlxsw succeed, invalid configurations fail and that no traces
0006 # are produced. To prevent the test from passing in case traces are produced,
0007 # the user can set the 'kernel.panic_on_warn' and 'kernel.panic_on_oops'
0008 # sysctls in its environment.
0009 
0010 lib_dir=$(dirname $0)/../../../net/forwarding
0011 
0012 ALL_TESTS="
0013         rif_vrf_set_addr_test
0014         rif_non_inherit_bridge_addr_test
0015         vlan_interface_deletion_test
0016         bridge_deletion_test
0017         bridge_vlan_flags_test
0018         vlan_1_test
0019         lag_bridge_upper_test
0020         duplicate_vlans_test
0021         vlan_rif_refcount_test
0022         subport_rif_refcount_test
0023         subport_rif_lag_join_test
0024         vlan_dev_deletion_test
0025         lag_unlink_slaves_test
0026         lag_dev_deletion_test
0027         vlan_interface_uppers_test
0028         bridge_extern_learn_test
0029         neigh_offload_test
0030         nexthop_offload_test
0031         nexthop_obj_invalid_test
0032         nexthop_obj_offload_test
0033         nexthop_obj_group_offload_test
0034         nexthop_obj_bucket_offload_test
0035         nexthop_obj_blackhole_offload_test
0036         nexthop_obj_route_offload_test
0037         devlink_reload_test
0038 "
0039 NUM_NETIFS=2
0040 : ${TIMEOUT:=20000} # ms
0041 source $lib_dir/lib.sh
0042 source $lib_dir/devlink_lib.sh
0043 
0044 setup_prepare()
0045 {
0046         swp1=${NETIFS[p1]}
0047         swp2=${NETIFS[p2]}
0048 
0049         ip link set dev $swp1 up
0050         ip link set dev $swp2 up
0051 }
0052 
0053 cleanup()
0054 {
0055         pre_cleanup
0056 
0057         ip link set dev $swp2 down
0058         ip link set dev $swp1 down
0059 }
0060 
0061 rif_vrf_set_addr_test()
0062 {
0063         # Test that it is possible to set an IP address on a VRF upper despite
0064         # its random MAC address.
0065         RET=0
0066 
0067         ip link add name vrf-test type vrf table 10
0068         ip link set dev $swp1 master vrf-test
0069 
0070         ip -4 address add 192.0.2.1/24 dev vrf-test
0071         check_err $? "failed to set IPv4 address on VRF"
0072         ip -6 address add 2001:db8:1::1/64 dev vrf-test
0073         check_err $? "failed to set IPv6 address on VRF"
0074 
0075         log_test "RIF - setting IP address on VRF"
0076 
0077         ip link del dev vrf-test
0078 }
0079 
0080 rif_non_inherit_bridge_addr_test()
0081 {
0082         local swp2_mac=$(mac_get $swp2)
0083 
0084         RET=0
0085 
0086         # Create first RIF
0087         ip addr add dev $swp1 192.0.2.1/28
0088         check_err $?
0089 
0090         # Create a FID RIF
0091         ip link add name br1 up type bridge vlan_filtering 0
0092         ip link set dev br1 addr $swp2_mac
0093         ip link set dev $swp2 master br1
0094         ip addr add dev br1 192.0.2.17/28
0095         check_err $?
0096 
0097         # Prepare a device with a low MAC address
0098         ip link add name d up type dummy
0099         ip link set dev d addr 00:11:22:33:44:55
0100 
0101         # Attach the device to br1. Since the bridge address was set, it should
0102         # work.
0103         ip link set dev d master br1 &>/dev/null
0104         check_err $? "Could not attach a device with low MAC to a bridge with RIF"
0105 
0106         # Port MAC address change should be allowed for a bridge with set MAC.
0107         ip link set dev $swp2 addr 00:11:22:33:44:55
0108         check_err $? "Changing swp2's MAC address not permitted"
0109 
0110         log_test "RIF - attach port with bad MAC to bridge with set MAC"
0111 
0112         ip link set dev $swp2 addr $swp2_mac
0113         ip link del dev d
0114         ip link del dev br1
0115         ip addr del dev $swp1 192.0.2.1/28
0116 }
0117 
0118 vlan_interface_deletion_test()
0119 {
0120         # Test that when a VLAN interface is deleted, its associated router
0121         # interface (RIF) is correctly deleted and not leaked. See commit
0122         # c360867ec46a ("mlxsw: spectrum: Delete RIF when VLAN device is
0123         # removed") for more details
0124         RET=0
0125 
0126         ip link add name br0 type bridge vlan_filtering 1
0127         ip link set dev $swp1 master br0
0128 
0129         ip link add link br0 name br0.10 type vlan id 10
0130         ip -6 address add 2001:db8:1::1/64 dev br0.10
0131         ip link del dev br0.10
0132 
0133         # If we leaked the previous RIF, then this should produce a trace
0134         ip link add link br0 name br0.20 type vlan id 20
0135         ip -6 address add 2001:db8:1::1/64 dev br0.20
0136         ip link del dev br0.20
0137 
0138         log_test "vlan interface deletion"
0139 
0140         ip link del dev br0
0141 }
0142 
0143 bridge_deletion_test()
0144 {
0145         # Test that when a bridge with VLAN interfaces is deleted, we correctly
0146         # delete the associated RIFs. See commit 602b74eda813 ("mlxsw:
0147         # spectrum_switchdev: Do not leak RIFs when removing bridge") for more
0148         # details
0149         RET=0
0150 
0151         ip link add name br0 type bridge vlan_filtering 1
0152         ip link set dev $swp1 master br0
0153         ip -6 address add 2001:db8::1/64 dev br0
0154 
0155         ip link add link br0 name br0.10 type vlan id 10
0156         ip -6 address add 2001:db8:1::1/64 dev br0.10
0157 
0158         ip link add link br0 name br0.20 type vlan id 20
0159         ip -6 address add 2001:db8:2::1/64 dev br0.20
0160 
0161         ip link del dev br0
0162 
0163         # If we leaked previous RIFs, then this should produce a trace
0164         ip -6 address add 2001:db8:1::1/64 dev $swp1
0165         ip -6 address del 2001:db8:1::1/64 dev $swp1
0166 
0167         log_test "bridge deletion"
0168 }
0169 
0170 bridge_vlan_flags_test()
0171 {
0172         # Test that when bridge VLAN flags are toggled, we do not take
0173         # unnecessary references on related structs. See commit 9e25826ffc94
0174         # ("mlxsw: spectrum_switchdev: Fix port_vlan refcounting") for more
0175         # details
0176         RET=0
0177 
0178         ip link add name br0 type bridge vlan_filtering 1
0179         ip link set dev $swp1 master br0
0180 
0181         bridge vlan add vid 10 dev $swp1 pvid untagged
0182         bridge vlan add vid 10 dev $swp1 untagged
0183         bridge vlan add vid 10 dev $swp1 pvid
0184         bridge vlan add vid 10 dev $swp1
0185         ip link del dev br0
0186 
0187         # If we did not handle references correctly, then this should produce a
0188         # trace
0189         devlink dev reload "$DEVLINK_DEV"
0190 
0191         # Allow netdevices to be re-created following the reload
0192         sleep 20
0193 
0194         log_test "bridge vlan flags"
0195 }
0196 
0197 vlan_1_test()
0198 {
0199         # Test that VLAN 1 can be configured over mlxsw ports. In the past it
0200         # was used internally for untagged traffic. See commit 47bf9df2e820
0201         # ("mlxsw: spectrum: Forbid creation of VLAN 1 over port/LAG") for more
0202         # details
0203         RET=0
0204 
0205         ip link add link $swp1 name $swp1.1 type vlan id 1
0206         check_err $? "did not manage to create vlan 1 when should"
0207 
0208         log_test "vlan 1"
0209 
0210         ip link del dev $swp1.1
0211 }
0212 
0213 lag_bridge_upper_test()
0214 {
0215         # Test that ports cannot be enslaved to LAG devices that have uppers
0216         # and that failure is handled gracefully. See commit b3529af6bb0d
0217         # ("spectrum: Reference count VLAN entries") for more details
0218         RET=0
0219 
0220         ip link add name bond1 type bond mode 802.3ad
0221 
0222         ip link add name br0 type bridge vlan_filtering 1
0223         ip link set dev bond1 master br0
0224 
0225         ip link set dev $swp1 down
0226         ip link set dev $swp1 master bond1 &> /dev/null
0227         check_fail $? "managed to enslave port to lag when should not"
0228 
0229         # This might generate a trace, if we did not handle the failure
0230         # correctly
0231         ip -6 address add 2001:db8:1::1/64 dev $swp1
0232         ip -6 address del 2001:db8:1::1/64 dev $swp1
0233 
0234         log_test "lag with bridge upper"
0235 
0236         ip link del dev br0
0237         ip link del dev bond1
0238 }
0239 
0240 duplicate_vlans_test()
0241 {
0242         # Test that on a given port a VLAN is only used once. Either as VLAN
0243         # in a VLAN-aware bridge or as a VLAN device
0244         RET=0
0245 
0246         ip link add name br0 type bridge vlan_filtering 1
0247         ip link set dev $swp1 master br0
0248         bridge vlan add vid 10 dev $swp1
0249 
0250         ip link add link $swp1 name $swp1.10 type vlan id 10 &> /dev/null
0251         check_fail $? "managed to create vlan device when should not"
0252 
0253         bridge vlan del vid 10 dev $swp1
0254         ip link add link $swp1 name $swp1.10 type vlan id 10
0255         check_err $? "did not manage to create vlan device when should"
0256         bridge vlan add vid 10 dev $swp1 &> /dev/null
0257         check_fail $? "managed to add bridge vlan when should not"
0258 
0259         log_test "duplicate vlans"
0260 
0261         ip link del dev $swp1.10
0262         ip link del dev br0
0263 }
0264 
0265 vlan_rif_refcount_test()
0266 {
0267         # Test that RIFs representing VLAN interfaces are not affected from
0268         # ports member in the VLAN. We use the offload indication on routes
0269         # configured on the RIF to understand if it was created / destroyed
0270         RET=0
0271 
0272         ip link add name br0 type bridge vlan_filtering 1
0273         ip link set dev $swp1 master br0
0274 
0275         ip link set dev $swp1 up
0276         ip link set dev br0 up
0277 
0278         ip link add link br0 name br0.10 up type vlan id 10
0279         ip -6 address add 2001:db8:1::1/64 dev br0.10
0280 
0281         busywait "$TIMEOUT" wait_for_offload \
0282                 ip -6 route get fibmatch 2001:db8:1::2 dev br0.10
0283         check_err $? "vlan rif was not created before adding port to vlan"
0284 
0285         bridge vlan add vid 10 dev $swp1
0286         busywait "$TIMEOUT" wait_for_offload \
0287                 ip -6 route get fibmatch 2001:db8:1::2 dev br0.10
0288         check_err $? "vlan rif was destroyed after adding port to vlan"
0289 
0290         bridge vlan del vid 10 dev $swp1
0291         busywait "$TIMEOUT" wait_for_offload \
0292                 ip -6 route get fibmatch 2001:db8:1::2 dev br0.10
0293         check_err $? "vlan rif was destroyed after removing port from vlan"
0294 
0295         ip link set dev $swp1 nomaster
0296         busywait "$TIMEOUT" not wait_for_offload \
0297                 ip -6 route get fibmatch 2001:db8:1::2 dev br0.10
0298         check_err $? "vlan rif was not destroyed after unlinking port from bridge"
0299 
0300         log_test "vlan rif refcount"
0301 
0302         ip link del dev br0.10
0303         ip link set dev $swp1 down
0304         ip link del dev br0
0305 }
0306 
0307 subport_rif_refcount_test()
0308 {
0309         # Test that RIFs representing upper devices of physical ports are
0310         # reference counted correctly and destroyed when should. We use the
0311         # offload indication on routes configured on the RIF to understand if
0312         # it was created / destroyed
0313         RET=0
0314 
0315         ip link add name bond1 type bond mode 802.3ad
0316         ip link set dev $swp1 down
0317         ip link set dev $swp2 down
0318         ip link set dev $swp1 master bond1
0319         ip link set dev $swp2 master bond1
0320 
0321         ip link set dev bond1 up
0322         ip link add link bond1 name bond1.10 up type vlan id 10
0323         ip -6 address add 2001:db8:1::1/64 dev bond1
0324         ip -6 address add 2001:db8:2::1/64 dev bond1.10
0325 
0326         busywait "$TIMEOUT" wait_for_offload \
0327                 ip -6 route get fibmatch 2001:db8:1::2 dev bond1
0328         check_err $? "subport rif was not created on lag device"
0329         busywait "$TIMEOUT" wait_for_offload \
0330                 ip -6 route get fibmatch 2001:db8:2::2 dev bond1.10
0331         check_err $? "subport rif was not created on vlan device"
0332 
0333         ip link set dev $swp1 nomaster
0334         busywait "$TIMEOUT" wait_for_offload \
0335                 ip -6 route get fibmatch 2001:db8:1::2 dev bond1
0336         check_err $? "subport rif of lag device was destroyed when should not"
0337         busywait "$TIMEOUT" wait_for_offload \
0338                 ip -6 route get fibmatch 2001:db8:2::2 dev bond1.10
0339         check_err $? "subport rif of vlan device was destroyed when should not"
0340 
0341         ip link set dev $swp2 nomaster
0342         busywait "$TIMEOUT" not wait_for_offload \
0343                 ip -6 route get fibmatch 2001:db8:1::2 dev bond1
0344         check_err $? "subport rif of lag device was not destroyed when should"
0345         busywait "$TIMEOUT" not wait_for_offload \
0346                 ip -6 route get fibmatch 2001:db8:2::2 dev bond1.10
0347         check_err $? "subport rif of vlan device was not destroyed when should"
0348 
0349         log_test "subport rif refcount"
0350 
0351         ip link del dev bond1.10
0352         ip link del dev bond1
0353 }
0354 
0355 subport_rif_lag_join_test()
0356 {
0357         # Test that the reference count of a RIF configured for a LAG is
0358         # incremented / decremented when ports join / leave the LAG. We use the
0359         # offload indication on routes configured on the RIF to understand if
0360         # it was created / destroyed
0361         RET=0
0362 
0363         ip link add name bond1 type bond mode 802.3ad
0364         ip link set dev $swp1 down
0365         ip link set dev $swp2 down
0366         ip link set dev $swp1 master bond1
0367         ip link set dev $swp2 master bond1
0368 
0369         ip link set dev bond1 up
0370         ip -6 address add 2001:db8:1::1/64 dev bond1
0371 
0372         busywait "$TIMEOUT" wait_for_offload \
0373                 ip -6 route get fibmatch 2001:db8:1::2 dev bond1
0374         check_err $? "subport rif was not created on lag device"
0375 
0376         ip link set dev $swp1 nomaster
0377         busywait "$TIMEOUT" wait_for_offload \
0378                 ip -6 route get fibmatch 2001:db8:1::2 dev bond1
0379         check_err $? "subport rif of lag device was destroyed after removing one port"
0380 
0381         ip link set dev $swp1 master bond1
0382         ip link set dev $swp2 nomaster
0383         busywait "$TIMEOUT" wait_for_offload \
0384                 ip -6 route get fibmatch 2001:db8:1::2 dev bond1
0385         check_err $? "subport rif of lag device was destroyed after re-adding a port and removing another"
0386 
0387         ip link set dev $swp1 nomaster
0388         busywait "$TIMEOUT" not wait_for_offload \
0389                 ip -6 route get fibmatch 2001:db8:1::2 dev bond1
0390         check_err $? "subport rif of lag device was not destroyed when should"
0391 
0392         log_test "subport rif lag join"
0393 
0394         ip link del dev bond1
0395 }
0396 
0397 vlan_dev_deletion_test()
0398 {
0399         # Test that VLAN devices are correctly deleted / unlinked when enslaved
0400         # to bridge
0401         RET=0
0402 
0403         ip link add name br10 type bridge
0404         ip link add name br20 type bridge
0405         ip link add name br30 type bridge
0406         ip link add link $swp1 name $swp1.10 type vlan id 10
0407         ip link add link $swp1 name $swp1.20 type vlan id 20
0408         ip link add link $swp1 name $swp1.30 type vlan id 30
0409         ip link set dev $swp1.10 master br10
0410         ip link set dev $swp1.20 master br20
0411         ip link set dev $swp1.30 master br30
0412 
0413         # If we did not handle the situation correctly, then these operations
0414         # might produce a trace
0415         ip link set dev $swp1.30 nomaster
0416         ip link del dev $swp1.20
0417         # Deletion via ioctl uses different code paths from netlink
0418         vconfig rem $swp1.10 &> /dev/null
0419 
0420         log_test "vlan device deletion"
0421 
0422         ip link del dev $swp1.30
0423         ip link del dev br30
0424         ip link del dev br20
0425         ip link del dev br10
0426 }
0427 
0428 lag_create()
0429 {
0430         ip link add name bond1 type bond mode 802.3ad
0431         ip link set dev $swp1 down
0432         ip link set dev $swp2 down
0433         ip link set dev $swp1 master bond1
0434         ip link set dev $swp2 master bond1
0435 
0436         ip link add link bond1 name bond1.10 type vlan id 10
0437         ip link add link bond1 name bond1.20 type vlan id 20
0438 
0439         ip link add name br0 type bridge vlan_filtering 1
0440         ip link set dev bond1 master br0
0441 
0442         ip link add name br10 type bridge
0443         ip link set dev bond1.10 master br10
0444 
0445         ip link add name br20 type bridge
0446         ip link set dev bond1.20 master br20
0447 }
0448 
0449 lag_unlink_slaves_test()
0450 {
0451         # Test that ports are correctly unlinked from their LAG master, when
0452         # the LAG and its VLAN uppers are enslaved to bridges
0453         RET=0
0454 
0455         lag_create
0456 
0457         ip link set dev $swp1 nomaster
0458         check_err $? "lag slave $swp1 was not unlinked from master"
0459         ip link set dev $swp2 nomaster
0460         check_err $? "lag slave $swp2 was not unlinked from master"
0461 
0462         # Try to configure corresponding VLANs as router interfaces
0463         ip -6 address add 2001:db8:1::1/64 dev $swp1
0464         check_err $? "failed to configure ip address on $swp1"
0465 
0466         ip link add link $swp1 name $swp1.10 type vlan id 10
0467         ip -6 address add 2001:db8:10::1/64 dev $swp1.10
0468         check_err $? "failed to configure ip address on $swp1.10"
0469 
0470         ip link add link $swp1 name $swp1.20 type vlan id 20
0471         ip -6 address add 2001:db8:20::1/64 dev $swp1.20
0472         check_err $? "failed to configure ip address on $swp1.20"
0473 
0474         log_test "lag slaves unlinking"
0475 
0476         ip link del dev $swp1.20
0477         ip link del dev $swp1.10
0478         ip address flush dev $swp1
0479 
0480         ip link del dev br20
0481         ip link del dev br10
0482         ip link del dev br0
0483         ip link del dev bond1
0484 }
0485 
0486 lag_dev_deletion_test()
0487 {
0488         # Test that LAG device is correctly deleted, when the LAG and its VLAN
0489         # uppers are enslaved to bridges
0490         RET=0
0491 
0492         lag_create
0493 
0494         ip link del dev bond1
0495 
0496         log_test "lag device deletion"
0497 
0498         ip link del dev br20
0499         ip link del dev br10
0500         ip link del dev br0
0501 }
0502 
0503 vlan_interface_uppers_test()
0504 {
0505         # Test that uppers of a VLAN interface are correctly sanitized
0506         RET=0
0507 
0508         ip link add name br0 type bridge vlan_filtering 1
0509         ip link set dev $swp1 master br0
0510 
0511         ip link add link br0 name br0.10 type vlan id 10
0512         ip link add link br0.10 name macvlan0 \
0513                 type macvlan mode private &> /dev/null
0514         check_fail $? "managed to create a macvlan when should not"
0515 
0516         ip -6 address add 2001:db8:1::1/64 dev br0.10
0517         ip link add link br0.10 name macvlan0 type macvlan mode private
0518         check_err $? "did not manage to create a macvlan when should"
0519 
0520         ip link del dev macvlan0
0521 
0522         ip link add name vrf-test type vrf table 10
0523         ip link set dev br0.10 master vrf-test
0524         check_err $? "did not manage to enslave vlan interface to vrf"
0525         ip link del dev vrf-test
0526 
0527         ip link add name br-test type bridge
0528         ip link set dev br0.10 master br-test &> /dev/null
0529         check_fail $? "managed to enslave vlan interface to bridge when should not"
0530         ip link del dev br-test
0531 
0532         log_test "vlan interface uppers"
0533 
0534         ip link del dev br0
0535 }
0536 
0537 bridge_extern_learn_test()
0538 {
0539         # Test that externally learned entries added from user space are
0540         # marked as offloaded
0541         RET=0
0542 
0543         ip link add name br0 type bridge
0544         ip link set dev $swp1 master br0
0545 
0546         bridge fdb add de:ad:be:ef:13:37 dev $swp1 master extern_learn
0547 
0548         busywait "$TIMEOUT" wait_for_offload \
0549                 bridge fdb show brport $swp1 de:ad:be:ef:13:37
0550         check_err $? "fdb entry not marked as offloaded when should"
0551 
0552         log_test "externally learned fdb entry"
0553 
0554         ip link del dev br0
0555 }
0556 
0557 neigh_offload_test()
0558 {
0559         # Test that IPv4 and IPv6 neighbour entries are marked as offloaded
0560         RET=0
0561 
0562         ip -4 address add 192.0.2.1/24 dev $swp1
0563         ip -6 address add 2001:db8:1::1/64 dev $swp1
0564 
0565         ip -4 neigh add 192.0.2.2 lladdr de:ad:be:ef:13:37 nud perm dev $swp1
0566         ip -6 neigh add 2001:db8:1::2 lladdr de:ad:be:ef:13:37 nud perm \
0567                 dev $swp1
0568 
0569         busywait "$TIMEOUT" wait_for_offload \
0570                 ip -4 neigh show dev $swp1 192.0.2.2
0571         check_err $? "ipv4 neigh entry not marked as offloaded when should"
0572         busywait "$TIMEOUT" wait_for_offload \
0573                 ip -6 neigh show dev $swp1 2001:db8:1::2
0574         check_err $? "ipv6 neigh entry not marked as offloaded when should"
0575 
0576         log_test "neighbour offload indication"
0577 
0578         ip -6 neigh del 2001:db8:1::2 dev $swp1
0579         ip -4 neigh del 192.0.2.2 dev $swp1
0580         ip -6 address del 2001:db8:1::1/64 dev $swp1
0581         ip -4 address del 192.0.2.1/24 dev $swp1
0582 }
0583 
0584 nexthop_offload_test()
0585 {
0586         # Test that IPv4 and IPv6 nexthops are marked as offloaded
0587         RET=0
0588 
0589         sysctl_set net.ipv6.conf.$swp2.keep_addr_on_down 1
0590         simple_if_init $swp1 192.0.2.1/24 2001:db8:1::1/64
0591         simple_if_init $swp2 192.0.2.2/24 2001:db8:1::2/64
0592         setup_wait
0593 
0594         ip -4 route add 198.51.100.0/24 vrf v$swp1 \
0595                 nexthop via 192.0.2.2 dev $swp1
0596         ip -6 route add 2001:db8:2::/64 vrf v$swp1 \
0597                 nexthop via 2001:db8:1::2 dev $swp1
0598 
0599         busywait "$TIMEOUT" wait_for_offload \
0600                 ip -4 route show 198.51.100.0/24 vrf v$swp1
0601         check_err $? "ipv4 nexthop not marked as offloaded when should"
0602         busywait "$TIMEOUT" wait_for_offload \
0603                 ip -6 route show 2001:db8:2::/64 vrf v$swp1
0604         check_err $? "ipv6 nexthop not marked as offloaded when should"
0605 
0606         ip link set dev $swp2 down
0607         sleep 1
0608 
0609         busywait "$TIMEOUT" not wait_for_offload \
0610                 ip -4 route show 198.51.100.0/24 vrf v$swp1
0611         check_err $? "ipv4 nexthop marked as offloaded when should not"
0612         busywait "$TIMEOUT" not wait_for_offload \
0613                 ip -6 route show 2001:db8:2::/64 vrf v$swp1
0614         check_err $? "ipv6 nexthop marked as offloaded when should not"
0615 
0616         ip link set dev $swp2 up
0617         setup_wait
0618 
0619         busywait "$TIMEOUT" wait_for_offload \
0620                 ip -4 route show 198.51.100.0/24 vrf v$swp1
0621         check_err $? "ipv4 nexthop not marked as offloaded after neigh add"
0622         busywait "$TIMEOUT" wait_for_offload \
0623                 ip -6 route show 2001:db8:2::/64 vrf v$swp1
0624         check_err $? "ipv6 nexthop not marked as offloaded after neigh add"
0625 
0626         log_test "nexthop offload indication"
0627 
0628         ip -6 route del 2001:db8:2::/64 vrf v$swp1
0629         ip -4 route del 198.51.100.0/24 vrf v$swp1
0630 
0631         simple_if_fini $swp2 192.0.2.2/24 2001:db8:1::2/64
0632         simple_if_fini $swp1 192.0.2.1/24 2001:db8:1::1/64
0633         sysctl_restore net.ipv6.conf.$swp2.keep_addr_on_down
0634 }
0635 
0636 nexthop_obj_invalid_test()
0637 {
0638         # Test that invalid nexthop object configurations are rejected
0639         RET=0
0640 
0641         simple_if_init $swp1 192.0.2.1/24 2001:db8:1::1/64
0642         simple_if_init $swp2 192.0.2.2/24 2001:db8:1::2/64
0643         setup_wait
0644 
0645         ip nexthop add id 1 via 192.0.2.3 fdb
0646         check_fail $? "managed to configure an FDB nexthop when should not"
0647 
0648         ip nexthop add id 1 encap mpls 200/300 via 192.0.2.3 dev $swp1
0649         check_fail $? "managed to configure a nexthop with MPLS encap when should not"
0650 
0651         ip nexthop add id 1 dev $swp1
0652         ip nexthop add id 2 dev $swp1
0653         ip nexthop add id 3 via 192.0.2.3 dev $swp1
0654         ip nexthop add id 10 group 1/2
0655         check_fail $? "managed to configure a nexthop group with device-only nexthops when should not"
0656 
0657         ip nexthop add id 10 group 3 type resilient buckets 7
0658         check_fail $? "managed to configure a too small resilient nexthop group when should not"
0659 
0660         ip nexthop add id 10 group 3 type resilient buckets 129
0661         check_fail $? "managed to configure a resilient nexthop group with invalid number of buckets when should not"
0662 
0663         ip nexthop add id 10 group 1/2 type resilient buckets 32
0664         check_fail $? "managed to configure a resilient nexthop group with device-only nexthops when should not"
0665 
0666         ip nexthop add id 10 group 3 type resilient buckets 32
0667         check_err $? "failed to configure a valid resilient nexthop group"
0668         ip nexthop replace id 3 dev $swp1
0669         check_fail $? "managed to populate a nexthop bucket with a device-only nexthop when should not"
0670 
0671         log_test "nexthop objects - invalid configurations"
0672 
0673         ip nexthop del id 10
0674         ip nexthop del id 3
0675         ip nexthop del id 2
0676         ip nexthop del id 1
0677 
0678         simple_if_fini $swp2 192.0.2.2/24 2001:db8:1::2/64
0679         simple_if_fini $swp1 192.0.2.1/24 2001:db8:1::1/64
0680 }
0681 
0682 nexthop_obj_offload_test()
0683 {
0684         # Test offload indication of nexthop objects
0685         RET=0
0686 
0687         simple_if_init $swp1 192.0.2.1/24 2001:db8:1::1/64
0688         simple_if_init $swp2
0689         setup_wait
0690 
0691         ip nexthop add id 1 via 192.0.2.2 dev $swp1
0692         ip neigh replace 192.0.2.2 lladdr 00:11:22:33:44:55 nud perm \
0693                 dev $swp1
0694 
0695         busywait "$TIMEOUT" wait_for_offload \
0696                 ip nexthop show id 1
0697         check_err $? "nexthop not marked as offloaded when should"
0698 
0699         ip neigh replace 192.0.2.2 nud failed dev $swp1
0700         busywait "$TIMEOUT" not wait_for_offload \
0701                 ip nexthop show id 1
0702         check_err $? "nexthop marked as offloaded after setting neigh to failed state"
0703 
0704         ip neigh replace 192.0.2.2 lladdr 00:11:22:33:44:55 nud perm \
0705                 dev $swp1
0706         busywait "$TIMEOUT" wait_for_offload \
0707                 ip nexthop show id 1
0708         check_err $? "nexthop not marked as offloaded after neigh replace"
0709 
0710         ip nexthop replace id 1 via 192.0.2.3 dev $swp1
0711         busywait "$TIMEOUT" not wait_for_offload \
0712                 ip nexthop show id 1
0713         check_err $? "nexthop marked as offloaded after replacing to use an invalid address"
0714 
0715         ip nexthop replace id 1 via 192.0.2.2 dev $swp1
0716         busywait "$TIMEOUT" wait_for_offload \
0717                 ip nexthop show id 1
0718         check_err $? "nexthop not marked as offloaded after replacing to use a valid address"
0719 
0720         log_test "nexthop objects offload indication"
0721 
0722         ip neigh del 192.0.2.2 dev $swp1
0723         ip nexthop del id 1
0724 
0725         simple_if_fini $swp2
0726         simple_if_fini $swp1 192.0.2.1/24 2001:db8:1::1/64
0727 }
0728 
0729 nexthop_obj_group_offload_test()
0730 {
0731         # Test offload indication of nexthop group objects
0732         RET=0
0733 
0734         simple_if_init $swp1 192.0.2.1/24 2001:db8:1::1/64
0735         simple_if_init $swp2
0736         setup_wait
0737 
0738         ip nexthop add id 1 via 192.0.2.2 dev $swp1
0739         ip nexthop add id 2 via 2001:db8:1::2 dev $swp1
0740         ip nexthop add id 10 group 1/2
0741         ip neigh replace 192.0.2.2 lladdr 00:11:22:33:44:55 nud perm \
0742                 dev $swp1
0743         ip neigh replace 192.0.2.3 lladdr 00:11:22:33:44:55 nud perm \
0744                 dev $swp1
0745         ip neigh replace 2001:db8:1::2 lladdr 00:11:22:33:44:55 nud perm \
0746                 dev $swp1
0747 
0748         busywait "$TIMEOUT" wait_for_offload \
0749                 ip nexthop show id 1
0750         check_err $? "IPv4 nexthop not marked as offloaded when should"
0751         busywait "$TIMEOUT" wait_for_offload \
0752                 ip nexthop show id 2
0753         check_err $? "IPv6 nexthop not marked as offloaded when should"
0754         busywait "$TIMEOUT" wait_for_offload \
0755                 ip nexthop show id 10
0756         check_err $? "nexthop group not marked as offloaded when should"
0757 
0758         # Invalidate nexthop id 1
0759         ip neigh replace 192.0.2.2 nud failed dev $swp1
0760         busywait "$TIMEOUT" not wait_for_offload \
0761                 ip nexthop show id 10
0762         check_fail $? "nexthop group not marked as offloaded with one valid nexthop"
0763 
0764         # Invalidate nexthop id 2
0765         ip neigh replace 2001:db8:1::2 nud failed dev $swp1
0766         busywait "$TIMEOUT" not wait_for_offload \
0767                 ip nexthop show id 10
0768         check_err $? "nexthop group marked as offloaded when should not"
0769 
0770         # Revalidate nexthop id 1
0771         ip nexthop replace id 1 via 192.0.2.3 dev $swp1
0772         busywait "$TIMEOUT" wait_for_offload \
0773                 ip nexthop show id 10
0774         check_err $? "nexthop group not marked as offloaded after revalidating nexthop"
0775 
0776         log_test "nexthop group objects offload indication"
0777 
0778         ip neigh del 2001:db8:1::2 dev $swp1
0779         ip neigh del 192.0.2.3 dev $swp1
0780         ip neigh del 192.0.2.2 dev $swp1
0781         ip nexthop del id 10
0782         ip nexthop del id 2
0783         ip nexthop del id 1
0784 
0785         simple_if_fini $swp2
0786         simple_if_fini $swp1 192.0.2.1/24 2001:db8:1::1/64
0787 }
0788 
0789 nexthop_obj_bucket_offload_test()
0790 {
0791         # Test offload indication of nexthop buckets
0792         RET=0
0793 
0794         simple_if_init $swp1 192.0.2.1/24 2001:db8:1::1/64
0795         simple_if_init $swp2
0796         setup_wait
0797 
0798         ip nexthop add id 1 via 192.0.2.2 dev $swp1
0799         ip nexthop add id 2 via 2001:db8:1::2 dev $swp1
0800         ip nexthop add id 10 group 1/2 type resilient buckets 32 idle_timer 0
0801         ip neigh replace 192.0.2.2 lladdr 00:11:22:33:44:55 nud perm \
0802                 dev $swp1
0803         ip neigh replace 192.0.2.3 lladdr 00:11:22:33:44:55 nud perm \
0804                 dev $swp1
0805         ip neigh replace 2001:db8:1::2 lladdr 00:11:22:33:44:55 nud perm \
0806                 dev $swp1
0807 
0808         busywait "$TIMEOUT" wait_for_offload \
0809                 ip nexthop bucket show nhid 1
0810         check_err $? "IPv4 nexthop buckets not marked as offloaded when should"
0811         busywait "$TIMEOUT" wait_for_offload \
0812                 ip nexthop bucket show nhid 2
0813         check_err $? "IPv6 nexthop buckets not marked as offloaded when should"
0814 
0815         # Invalidate nexthop id 1
0816         ip neigh replace 192.0.2.2 nud failed dev $swp1
0817         busywait "$TIMEOUT" wait_for_trap \
0818                 ip nexthop bucket show nhid 1
0819         check_err $? "IPv4 nexthop buckets not marked with trap when should"
0820 
0821         # Invalidate nexthop id 2
0822         ip neigh replace 2001:db8:1::2 nud failed dev $swp1
0823         busywait "$TIMEOUT" wait_for_trap \
0824                 ip nexthop bucket show nhid 2
0825         check_err $? "IPv6 nexthop buckets not marked with trap when should"
0826 
0827         # Revalidate nexthop id 1 by changing its configuration
0828         ip nexthop replace id 1 via 192.0.2.3 dev $swp1
0829         busywait "$TIMEOUT" wait_for_offload \
0830                 ip nexthop bucket show nhid 1
0831         check_err $? "nexthop bucket not marked as offloaded after revalidating nexthop"
0832 
0833         # Revalidate nexthop id 2 by changing its neighbour
0834         ip neigh replace 2001:db8:1::2 lladdr 00:11:22:33:44:55 nud perm \
0835                 dev $swp1
0836         busywait "$TIMEOUT" wait_for_offload \
0837                 ip nexthop bucket show nhid 2
0838         check_err $? "nexthop bucket not marked as offloaded after revalidating neighbour"
0839 
0840         log_test "nexthop bucket offload indication"
0841 
0842         ip neigh del 2001:db8:1::2 dev $swp1
0843         ip neigh del 192.0.2.3 dev $swp1
0844         ip neigh del 192.0.2.2 dev $swp1
0845         ip nexthop del id 10
0846         ip nexthop del id 2
0847         ip nexthop del id 1
0848 
0849         simple_if_fini $swp2
0850         simple_if_fini $swp1 192.0.2.1/24 2001:db8:1::1/64
0851 }
0852 
0853 nexthop_obj_blackhole_offload_test()
0854 {
0855         # Test offload indication of blackhole nexthop objects
0856         RET=0
0857 
0858         ip nexthop add id 1 blackhole
0859         busywait "$TIMEOUT" wait_for_offload \
0860                 ip nexthop show id 1
0861         check_err $? "Blackhole nexthop not marked as offloaded when should"
0862 
0863         ip nexthop add id 10 group 1
0864         busywait "$TIMEOUT" wait_for_offload \
0865                 ip nexthop show id 10
0866         check_err $? "Nexthop group not marked as offloaded when should"
0867 
0868         log_test "blackhole nexthop objects offload indication"
0869 
0870         ip nexthop del id 10
0871         ip nexthop del id 1
0872 }
0873 
0874 nexthop_obj_route_offload_test()
0875 {
0876         # Test offload indication of routes using nexthop objects
0877         RET=0
0878 
0879         simple_if_init $swp1 192.0.2.1/24 2001:db8:1::1/64
0880         simple_if_init $swp2
0881         setup_wait
0882 
0883         ip nexthop add id 1 via 192.0.2.2 dev $swp1
0884         ip neigh replace 192.0.2.2 lladdr 00:11:22:33:44:55 nud perm \
0885                 dev $swp1
0886         ip neigh replace 192.0.2.3 lladdr 00:11:22:33:44:55 nud perm \
0887                 dev $swp1
0888 
0889         ip route replace 198.51.100.0/24 nhid 1
0890         busywait "$TIMEOUT" wait_for_offload \
0891                 ip route show 198.51.100.0/24
0892         check_err $? "route not marked as offloaded when using valid nexthop"
0893 
0894         ip nexthop replace id 1 via 192.0.2.3 dev $swp1
0895         busywait "$TIMEOUT" wait_for_offload \
0896                 ip route show 198.51.100.0/24
0897         check_err $? "route not marked as offloaded after replacing valid nexthop with a valid one"
0898 
0899         ip nexthop replace id 1 via 192.0.2.4 dev $swp1
0900         busywait "$TIMEOUT" not wait_for_offload \
0901                 ip route show 198.51.100.0/24
0902         check_err $? "route marked as offloaded after replacing valid nexthop with an invalid one"
0903 
0904         ip nexthop replace id 1 via 192.0.2.2 dev $swp1
0905         busywait "$TIMEOUT" wait_for_offload \
0906                 ip route show 198.51.100.0/24
0907         check_err $? "route not marked as offloaded after replacing invalid nexthop with a valid one"
0908 
0909         log_test "routes using nexthop objects offload indication"
0910 
0911         ip route del 198.51.100.0/24
0912         ip neigh del 192.0.2.3 dev $swp1
0913         ip neigh del 192.0.2.2 dev $swp1
0914         ip nexthop del id 1
0915 
0916         simple_if_fini $swp2
0917         simple_if_fini $swp1 192.0.2.1/24 2001:db8:1::1/64
0918 }
0919 
0920 devlink_reload_test()
0921 {
0922         # Test that after executing all the above configuration tests, a
0923         # devlink reload can be performed without errors
0924         RET=0
0925 
0926         devlink dev reload "$DEVLINK_DEV"
0927         check_err $? "devlink reload failed"
0928 
0929         log_test "devlink reload - last test"
0930 
0931         sleep 20
0932 }
0933 
0934 trap cleanup EXIT
0935 
0936 setup_prepare
0937 setup_wait
0938 
0939 tests_run
0940 
0941 exit $EXIT_STATUS