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