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