1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3# 4# Test various aspects of VxLAN offloading which are specific to mlxsw, such 5# as sanitization of invalid configurations and offload indication. 6 7: ${ADDR_FAMILY:=ipv4} 8export ADDR_FAMILY 9 10: ${LOCAL_IP_1:=198.51.100.1} 11export LOCAL_IP_1 12 13: ${LOCAL_IP_2:=198.51.100.2} 14export LOCAL_IP_2 15 16: ${PREFIX_LEN:=32} 17export PREFIX_LEN 18 19: ${UDPCSUM_FLAFS:=noudpcsum} 20export UDPCSUM_FLAFS 21 22: ${MC_IP:=239.0.0.1} 23export MC_IP 24 25: ${IP_FLAG:=""} 26export IP_FLAG 27 28: ${ALL_TESTS:=" 29 sanitization_test 30 offload_indication_test 31 sanitization_vlan_aware_test 32 offload_indication_vlan_aware_test 33"} 34 35lib_dir=$(dirname $0)/../../../net/forwarding 36NUM_NETIFS=2 37: ${TIMEOUT:=20000} # ms 38source $lib_dir/lib.sh 39 40setup_prepare() 41{ 42 swp1=${NETIFS[p1]} 43 swp2=${NETIFS[p2]} 44 45 ip link set dev $swp1 up 46 ip link set dev $swp2 up 47} 48 49cleanup() 50{ 51 pre_cleanup 52 53 ip link set dev $swp2 down 54 ip link set dev $swp1 down 55} 56 57sanitization_single_dev_test_pass() 58{ 59 ip link set dev $swp1 master br0 60 check_err $? 61 ip link set dev vxlan0 master br0 62 check_err $? 63 64 ip link set dev $swp1 nomaster 65 66 ip link set dev $swp1 master br0 67 check_err $? 68} 69 70sanitization_single_dev_test_fail() 71{ 72 ip link set dev $swp1 master br0 73 check_err $? 74 ip link set dev vxlan0 master br0 &> /dev/null 75 check_fail $? 76 77 ip link set dev $swp1 nomaster 78 79 ip link set dev vxlan0 master br0 80 check_err $? 81 ip link set dev $swp1 master br0 &> /dev/null 82 check_fail $? 83} 84 85sanitization_single_dev_valid_test() 86{ 87 RET=0 88 89 ip link add dev br0 type bridge mcast_snooping 0 90 91 ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \ 92 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 93 94 sanitization_single_dev_test_pass 95 96 ip link del dev vxlan0 97 ip link del dev br0 98 99 log_test "vxlan device - valid configuration" 100} 101 102sanitization_single_dev_vlan_aware_test() 103{ 104 RET=0 105 106 ip link add dev br0 type bridge mcast_snooping 0 vlan_filtering 1 107 108 ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \ 109 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 110 111 sanitization_single_dev_test_pass 112 113 ip link del dev vxlan0 114 ip link del dev br0 115 116 log_test "vxlan device with a vlan-aware bridge" 117} 118 119sanitization_single_dev_mcast_enabled_test() 120{ 121 RET=0 122 123 ip link add dev br0 type bridge 124 125 ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \ 126 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 127 128 sanitization_single_dev_test_fail 129 130 ip link del dev vxlan0 131 ip link del dev br0 132 133 log_test "vxlan device with a multicast enabled bridge" 134} 135 136sanitization_single_dev_mcast_group_test() 137{ 138 RET=0 139 140 ip link add dev br0 type bridge mcast_snooping 0 141 ip link add name dummy1 up type dummy 142 143 ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \ 144 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 \ 145 dev dummy1 group $MC_IP 146 147 sanitization_single_dev_test_fail 148 149 ip link del dev vxlan0 150 ip link del dev dummy1 151 ip link del dev br0 152 153 log_test "vxlan device with a multicast group" 154} 155 156sanitization_single_dev_no_local_ip_test() 157{ 158 RET=0 159 160 ip link add dev br0 type bridge mcast_snooping 0 161 162 ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \ 163 ttl 20 tos inherit dstport 4789 164 165 sanitization_single_dev_test_fail 166 167 ip link del dev vxlan0 168 ip link del dev br0 169 170 log_test "vxlan device with no local ip" 171} 172 173sanitization_single_dev_learning_enabled_ipv4_test() 174{ 175 RET=0 176 177 ip link add dev br0 type bridge mcast_snooping 0 178 179 ip link add name vxlan0 up type vxlan id 10 learning $UDPCSUM_FLAFS \ 180 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 181 182 sanitization_single_dev_test_pass 183 184 ip link del dev vxlan0 185 ip link del dev br0 186 187 log_test "vxlan device with learning enabled" 188} 189 190sanitization_single_dev_local_interface_test() 191{ 192 RET=0 193 194 ip link add dev br0 type bridge mcast_snooping 0 195 ip link add name dummy1 up type dummy 196 197 ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \ 198 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 dev dummy1 199 200 sanitization_single_dev_test_fail 201 202 ip link del dev vxlan0 203 ip link del dev dummy1 204 ip link del dev br0 205 206 log_test "vxlan device with local interface" 207} 208 209sanitization_single_dev_port_range_test() 210{ 211 RET=0 212 213 ip link add dev br0 type bridge mcast_snooping 0 214 215 ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \ 216 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 \ 217 srcport 4000 5000 218 219 sanitization_single_dev_test_fail 220 221 ip link del dev vxlan0 222 ip link del dev br0 223 224 log_test "vxlan device with udp source port range" 225} 226 227sanitization_single_dev_tos_static_test() 228{ 229 RET=0 230 231 ip link add dev br0 type bridge mcast_snooping 0 232 233 ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \ 234 ttl 20 tos 20 local $LOCAL_IP_1 dstport 4789 235 236 sanitization_single_dev_test_fail 237 238 ip link del dev vxlan0 239 ip link del dev br0 240 241 log_test "vxlan device with static tos" 242} 243 244sanitization_single_dev_ttl_inherit_test() 245{ 246 RET=0 247 248 ip link add dev br0 type bridge mcast_snooping 0 249 250 ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \ 251 ttl inherit tos inherit local $LOCAL_IP_1 dstport 4789 252 253 sanitization_single_dev_test_fail 254 255 ip link del dev vxlan0 256 ip link del dev br0 257 258 log_test "vxlan device with inherit ttl" 259} 260 261sanitization_single_dev_udp_checksum_ipv4_test() 262{ 263 RET=0 264 265 ip link add dev br0 type bridge mcast_snooping 0 266 267 ip link add name vxlan0 up type vxlan id 10 nolearning udpcsum \ 268 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 269 270 sanitization_single_dev_test_fail 271 272 ip link del dev vxlan0 273 ip link del dev br0 274 275 log_test "vxlan device with udp checksum" 276} 277 278sanitization_single_dev_test() 279{ 280 # These tests make sure that we correctly sanitize VxLAN device 281 # configurations we do not support 282 sanitization_single_dev_valid_test 283 sanitization_single_dev_vlan_aware_test 284 sanitization_single_dev_mcast_enabled_test 285 sanitization_single_dev_mcast_group_test 286 sanitization_single_dev_no_local_ip_test 287 sanitization_single_dev_learning_enabled_"$ADDR_FAMILY"_test 288 sanitization_single_dev_local_interface_test 289 sanitization_single_dev_port_range_test 290 sanitization_single_dev_tos_static_test 291 sanitization_single_dev_ttl_inherit_test 292 sanitization_single_dev_udp_checksum_"$ADDR_FAMILY"_test 293} 294 295sanitization_multi_devs_test_pass() 296{ 297 ip link set dev $swp1 master br0 298 check_err $? 299 ip link set dev vxlan0 master br0 300 check_err $? 301 ip link set dev $swp2 master br1 302 check_err $? 303 ip link set dev vxlan1 master br1 304 check_err $? 305 306 ip link set dev $swp2 nomaster 307 ip link set dev $swp1 nomaster 308 309 ip link set dev $swp1 master br0 310 check_err $? 311 ip link set dev $swp2 master br1 312 check_err $? 313} 314 315sanitization_multi_devs_test_fail() 316{ 317 ip link set dev $swp1 master br0 318 check_err $? 319 ip link set dev vxlan0 master br0 320 check_err $? 321 ip link set dev $swp2 master br1 322 check_err $? 323 ip link set dev vxlan1 master br1 &> /dev/null 324 check_fail $? 325 326 ip link set dev $swp2 nomaster 327 ip link set dev $swp1 nomaster 328 329 ip link set dev vxlan1 master br1 330 check_err $? 331 ip link set dev $swp1 master br0 332 check_err $? 333 ip link set dev $swp2 master br1 &> /dev/null 334 check_fail $? 335} 336 337sanitization_multi_devs_valid_test() 338{ 339 RET=0 340 341 ip link add dev br0 type bridge mcast_snooping 0 342 ip link add dev br1 type bridge mcast_snooping 0 343 344 ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \ 345 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 346 ip link add name vxlan1 up type vxlan id 20 nolearning $UDPCSUM_FLAFS \ 347 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 348 349 sanitization_multi_devs_test_pass 350 351 ip link del dev vxlan1 352 ip link del dev vxlan0 353 ip link del dev br1 354 ip link del dev br0 355 356 log_test "multiple vxlan devices - valid configuration" 357} 358 359sanitization_multi_devs_ttl_test() 360{ 361 RET=0 362 363 ip link add dev br0 type bridge mcast_snooping 0 364 ip link add dev br1 type bridge mcast_snooping 0 365 366 ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \ 367 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 368 ip link add name vxlan1 up type vxlan id 20 nolearning $UDPCSUM_FLAFS \ 369 ttl 40 tos inherit local $LOCAL_IP_1 dstport 4789 370 371 sanitization_multi_devs_test_fail 372 373 ip link del dev vxlan1 374 ip link del dev vxlan0 375 ip link del dev br1 376 ip link del dev br0 377 378 log_test "multiple vxlan devices with different ttl" 379} 380 381sanitization_multi_devs_udp_dstport_test() 382{ 383 RET=0 384 385 ip link add dev br0 type bridge mcast_snooping 0 386 ip link add dev br1 type bridge mcast_snooping 0 387 388 ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \ 389 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 390 ip link add name vxlan1 up type vxlan id 20 nolearning $UDPCSUM_FLAFS \ 391 ttl 20 tos inherit local $LOCAL_IP_1 dstport 5789 392 393 sanitization_multi_devs_test_fail 394 395 ip link del dev vxlan1 396 ip link del dev vxlan0 397 ip link del dev br1 398 ip link del dev br0 399 400 log_test "multiple vxlan devices with different udp destination port" 401} 402 403sanitization_multi_devs_local_ip_test() 404{ 405 RET=0 406 407 ip link add dev br0 type bridge mcast_snooping 0 408 ip link add dev br1 type bridge mcast_snooping 0 409 410 ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \ 411 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 412 ip link add name vxlan1 up type vxlan id 20 nolearning $UDPCSUM_FLAFS \ 413 ttl 20 tos inherit local $LOCAL_IP_2 dstport 4789 414 415 sanitization_multi_devs_test_fail 416 417 ip link del dev vxlan1 418 ip link del dev vxlan0 419 ip link del dev br1 420 ip link del dev br0 421 422 log_test "multiple vxlan devices with different local ip" 423} 424 425sanitization_multi_devs_test() 426{ 427 # The device has a single VTEP, which means all the VxLAN devices 428 # we offload must share certain properties such as source IP and 429 # UDP destination port. These tests make sure that we forbid 430 # configurations that violate this limitation 431 sanitization_multi_devs_valid_test 432 sanitization_multi_devs_ttl_test 433 sanitization_multi_devs_udp_dstport_test 434 sanitization_multi_devs_local_ip_test 435} 436 437sanitization_test() 438{ 439 sanitization_single_dev_test 440 sanitization_multi_devs_test 441} 442 443offload_indication_setup_create() 444{ 445 # Create a simple setup with two bridges, each with a VxLAN device 446 # and one local port 447 ip link add name br0 type bridge mcast_snooping 0 448 ip link set dev br0 addrgenmode none 449 ip link set dev br0 up 450 ip link add name br1 type bridge mcast_snooping 0 451 ip link set dev br1 addrgenmode none 452 ip link set dev br1 up 453 454 ip link set dev $swp1 master br0 455 ip link set dev $swp2 master br1 456 457 ip address add $LOCAL_IP_1/$PREFIX_LEN dev lo 458 459 ip link add name vxlan0 up master br0 type vxlan id 10 nolearning \ 460 $UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 461 ip link add name vxlan1 up master br1 type vxlan id 20 nolearning \ 462 $UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 463} 464 465offload_indication_setup_destroy() 466{ 467 ip link del dev vxlan1 468 ip link del dev vxlan0 469 470 ip address del $LOCAL_IP_1/$PREFIX_LEN dev lo 471 472 ip link set dev $swp2 nomaster 473 ip link set dev $swp1 nomaster 474 475 ip link del dev br1 476 ip link del dev br0 477} 478 479offload_indication_fdb_flood_test() 480{ 481 RET=0 482 483 bridge fdb append 00:00:00:00:00:00 dev vxlan0 self dst $LOCAL_IP_2 484 485 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb 00:00:00:00:00:00 \ 486 bridge fdb show brport vxlan0 487 check_err $? 488 489 bridge fdb del 00:00:00:00:00:00 dev vxlan0 self 490 491 log_test "vxlan flood entry offload indication" 492} 493 494offload_indication_fdb_bridge_test() 495{ 496 RET=0 497 498 bridge fdb add de:ad:be:ef:13:37 dev vxlan0 self master static \ 499 dst $LOCAL_IP_2 500 501 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \ 502 de:ad:be:ef:13:37 self bridge fdb show brport vxlan0 503 check_err $? 504 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \ 505 de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan0 506 check_err $? 507 508 log_test "vxlan entry offload indication - initial state" 509 510 # Remove FDB entry from the bridge driver and check that corresponding 511 # entry in the VxLAN driver is not marked as offloaded 512 RET=0 513 514 bridge fdb del de:ad:be:ef:13:37 dev vxlan0 master 515 busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb \ 516 de:ad:be:ef:13:37 self bridge fdb show brport vxlan0 517 check_err $? 518 519 log_test "vxlan entry offload indication - after removal from bridge" 520 521 # Add the FDB entry back to the bridge driver and make sure it is 522 # marked as offloaded in both drivers 523 RET=0 524 525 bridge fdb add de:ad:be:ef:13:37 dev vxlan0 master static 526 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \ 527 de:ad:be:ef:13:37 self bridge fdb show brport vxlan0 528 check_err $? 529 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \ 530 de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan0 531 check_err $? 532 533 log_test "vxlan entry offload indication - after re-add to bridge" 534 535 # Remove FDB entry from the VxLAN driver and check that corresponding 536 # entry in the bridge driver is not marked as offloaded 537 RET=0 538 539 bridge fdb del de:ad:be:ef:13:37 dev vxlan0 self 540 busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb \ 541 de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan0 542 check_err $? 543 544 log_test "vxlan entry offload indication - after removal from vxlan" 545 546 # Add the FDB entry back to the VxLAN driver and make sure it is 547 # marked as offloaded in both drivers 548 RET=0 549 550 bridge fdb add de:ad:be:ef:13:37 dev vxlan0 self dst $LOCAL_IP_2 551 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \ 552 de:ad:be:ef:13:37 self bridge fdb show brport vxlan0 553 check_err $? 554 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \ 555 de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan0 556 check_err $? 557 558 log_test "vxlan entry offload indication - after re-add to vxlan" 559 560 bridge fdb del de:ad:be:ef:13:37 dev vxlan0 self master 561} 562 563offload_indication_fdb_test() 564{ 565 offload_indication_fdb_flood_test 566 offload_indication_fdb_bridge_test 567} 568 569offload_indication_decap_route_test() 570{ 571 RET=0 572 573 busywait "$TIMEOUT" wait_for_offload \ 574 ip $IP_FLAG route show table local $LOCAL_IP_1 575 check_err $? 576 577 ip link set dev vxlan0 down 578 busywait "$TIMEOUT" wait_for_offload \ 579 ip $IP_FLAG route show table local $LOCAL_IP_1 580 check_err $? 581 582 ip link set dev vxlan1 down 583 busywait "$TIMEOUT" not wait_for_offload \ 584 ip $IP_FLAG route show table local $LOCAL_IP_1 585 check_err $? 586 587 log_test "vxlan decap route - vxlan device down" 588 589 RET=0 590 591 ip link set dev vxlan1 up 592 busywait "$TIMEOUT" wait_for_offload \ 593 ip $IP_FLAG route show table local $LOCAL_IP_1 594 check_err $? 595 596 ip link set dev vxlan0 up 597 busywait "$TIMEOUT" wait_for_offload \ 598 ip $IP_FLAG route show table local $LOCAL_IP_1 599 check_err $? 600 601 log_test "vxlan decap route - vxlan device up" 602 603 RET=0 604 605 ip address delete $LOCAL_IP_1/$PREFIX_LEN dev lo 606 busywait "$TIMEOUT" not wait_for_offload \ 607 ip $IP_FLAG route show table local $LOCAL_IP_1 608 check_err $? 609 610 ip address add $LOCAL_IP_1/$PREFIX_LEN dev lo 611 busywait "$TIMEOUT" wait_for_offload \ 612 ip $IP_FLAG route show table local $LOCAL_IP_1 613 check_err $? 614 615 log_test "vxlan decap route - add local route" 616 617 RET=0 618 619 ip link set dev $swp1 nomaster 620 busywait "$TIMEOUT" wait_for_offload \ 621 ip $IP_FLAG route show table local $LOCAL_IP_1 622 check_err $? 623 624 ip link set dev $swp2 nomaster 625 busywait "$TIMEOUT" not wait_for_offload \ 626 ip $IP_FLAG route show table local $LOCAL_IP_1 627 check_err $? 628 629 ip link set dev $swp1 master br0 630 ip link set dev $swp2 master br1 631 busywait "$TIMEOUT" wait_for_offload \ 632 ip $IP_FLAG route show table local $LOCAL_IP_1 633 check_err $? 634 635 log_test "vxlan decap route - local ports enslavement" 636 637 RET=0 638 639 ip link del dev br0 640 busywait "$TIMEOUT" wait_for_offload \ 641 ip $IP_FLAG route show table local $LOCAL_IP_1 642 check_err $? 643 644 ip link del dev br1 645 busywait "$TIMEOUT" not wait_for_offload \ 646 ip $IP_FLAG route show table local $LOCAL_IP_1 647 check_err $? 648 649 log_test "vxlan decap route - bridge device deletion" 650 651 RET=0 652 653 ip link add name br0 type bridge mcast_snooping 0 654 ip link set dev br0 addrgenmode none 655 ip link set dev br0 up 656 ip link add name br1 type bridge mcast_snooping 0 657 ip link set dev br1 addrgenmode none 658 ip link set dev br1 up 659 ip link set dev $swp1 master br0 660 ip link set dev $swp2 master br1 661 ip link set dev vxlan0 master br0 662 ip link set dev vxlan1 master br1 663 busywait "$TIMEOUT" wait_for_offload \ 664 ip $IP_FLAG route show table local $LOCAL_IP_1 665 check_err $? 666 667 ip link del dev vxlan0 668 busywait "$TIMEOUT" wait_for_offload \ 669 ip $IP_FLAG route show table local $LOCAL_IP_1 670 check_err $? 671 672 ip link del dev vxlan1 673 busywait "$TIMEOUT" not wait_for_offload \ 674 ip $IP_FLAG route show table local $LOCAL_IP_1 675 check_err $? 676 677 log_test "vxlan decap route - vxlan device deletion" 678 679 ip link add name vxlan0 up master br0 type vxlan id 10 nolearning \ 680 $UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 681 ip link add name vxlan1 up master br1 type vxlan id 20 nolearning \ 682 $UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 683} 684 685check_fdb_offloaded() 686{ 687 local mac=00:11:22:33:44:55 688 local zmac=00:00:00:00:00:00 689 690 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $mac self \ 691 bridge fdb show dev vxlan0 692 check_err $? 693 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $mac master \ 694 bridge fdb show dev vxlan0 695 check_err $? 696 697 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $zmac self \ 698 bridge fdb show dev vxlan0 699 check_err $? 700} 701 702check_vxlan_fdb_not_offloaded() 703{ 704 local mac=00:11:22:33:44:55 705 local zmac=00:00:00:00:00:00 706 707 bridge fdb show dev vxlan0 | grep $mac | grep -q self 708 check_err $? 709 busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb $mac self \ 710 bridge fdb show dev vxlan0 711 check_err $? 712 713 bridge fdb show dev vxlan0 | grep $zmac | grep -q self 714 check_err $? 715 busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb $zmac self \ 716 bridge fdb show dev vxlan0 717 check_err $? 718} 719 720check_bridge_fdb_not_offloaded() 721{ 722 local mac=00:11:22:33:44:55 723 local zmac=00:00:00:00:00:00 724 725 bridge fdb show dev vxlan0 | grep $mac | grep -q master 726 check_err $? 727 busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb $mac master \ 728 bridge fdb show dev vxlan0 729 check_err $? 730} 731 732__offload_indication_join_vxlan_first() 733{ 734 local vid=$1; shift 735 736 local mac=00:11:22:33:44:55 737 local zmac=00:00:00:00:00:00 738 739 bridge fdb append $zmac dev vxlan0 self dst $LOCAL_IP_2 740 741 ip link set dev vxlan0 master br0 742 bridge fdb add dev vxlan0 $mac self master static dst $LOCAL_IP_2 743 744 RET=0 745 check_vxlan_fdb_not_offloaded 746 ip link set dev $swp1 master br0 747 sleep .1 748 check_fdb_offloaded 749 log_test "offload indication - attach vxlan first" 750 751 RET=0 752 ip link set dev vxlan0 down 753 check_vxlan_fdb_not_offloaded 754 check_bridge_fdb_not_offloaded 755 log_test "offload indication - set vxlan down" 756 757 RET=0 758 ip link set dev vxlan0 up 759 sleep .1 760 check_fdb_offloaded 761 log_test "offload indication - set vxlan up" 762 763 if [[ ! -z $vid ]]; then 764 RET=0 765 bridge vlan del dev vxlan0 vid $vid 766 check_vxlan_fdb_not_offloaded 767 check_bridge_fdb_not_offloaded 768 log_test "offload indication - delete VLAN" 769 770 RET=0 771 bridge vlan add dev vxlan0 vid $vid 772 check_vxlan_fdb_not_offloaded 773 check_bridge_fdb_not_offloaded 774 log_test "offload indication - add tagged VLAN" 775 776 RET=0 777 bridge vlan add dev vxlan0 vid $vid pvid untagged 778 sleep .1 779 check_fdb_offloaded 780 log_test "offload indication - add pvid/untagged VLAN" 781 fi 782 783 RET=0 784 ip link set dev $swp1 nomaster 785 check_vxlan_fdb_not_offloaded 786 log_test "offload indication - detach port" 787} 788 789offload_indication_join_vxlan_first() 790{ 791 ip link add dev br0 type bridge mcast_snooping 0 792 ip link set dev br0 addrgenmode none 793 ip link set dev br0 up 794 ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \ 795 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 796 797 __offload_indication_join_vxlan_first 798 799 ip link del dev vxlan0 800 ip link del dev br0 801} 802 803__offload_indication_join_vxlan_last() 804{ 805 local zmac=00:00:00:00:00:00 806 807 RET=0 808 809 bridge fdb append $zmac dev vxlan0 self dst $LOCAL_IP_2 810 811 ip link set dev $swp1 master br0 812 813 busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb $zmac self \ 814 bridge fdb show dev vxlan0 815 check_err $? 816 817 ip link set dev vxlan0 master br0 818 819 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $zmac self \ 820 bridge fdb show dev vxlan0 821 check_err $? 822 823 log_test "offload indication - attach vxlan last" 824} 825 826offload_indication_join_vxlan_last() 827{ 828 ip link add dev br0 type bridge mcast_snooping 0 829 ip link set dev br0 addrgenmode none 830 ip link set dev br0 up 831 ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \ 832 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 833 834 __offload_indication_join_vxlan_last 835 836 ip link del dev vxlan0 837 ip link del dev br0 838} 839 840offload_indication_test() 841{ 842 offload_indication_setup_create 843 offload_indication_fdb_test 844 offload_indication_decap_route_test 845 offload_indication_setup_destroy 846 847 log_info "offload indication - replay & cleanup" 848 offload_indication_join_vxlan_first 849 offload_indication_join_vxlan_last 850} 851 852sanitization_vlan_aware_test() 853{ 854 RET=0 855 856 ip link add dev br0 type bridge mcast_snooping 0 vlan_filtering 1 857 ip link set dev br0 addrgenmode none 858 859 ip link add name vxlan10 up master br0 type vxlan id 10 nolearning \ 860 $UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 861 862 ip link add name vxlan20 up master br0 type vxlan id 20 nolearning \ 863 $UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 864 865 # Test that when each VNI is mapped to a different VLAN we can enslave 866 # a port to the bridge 867 bridge vlan add vid 10 dev vxlan10 pvid untagged 868 bridge vlan add vid 20 dev vxlan20 pvid untagged 869 870 ip link set dev $swp1 master br0 871 check_err $? 872 873 log_test "vlan-aware - enslavement to vlan-aware bridge" 874 875 # Try to map both VNIs to the same VLAN and make sure configuration 876 # fails 877 RET=0 878 879 bridge vlan add vid 10 dev vxlan20 pvid untagged &> /dev/null 880 check_fail $? 881 882 log_test "vlan-aware - two vnis mapped to the same vlan" 883 884 # Test that enslavement of a port to a bridge fails when two VNIs 885 # are mapped to the same VLAN 886 RET=0 887 888 ip link set dev $swp1 nomaster 889 890 bridge vlan del vid 20 dev vxlan20 pvid untagged 891 bridge vlan add vid 10 dev vxlan20 pvid untagged 892 893 ip link set dev $swp1 master br0 &> /dev/null 894 check_fail $? 895 896 log_test "vlan-aware - failed enslavement to vlan-aware bridge" 897 898 bridge vlan del vid 10 dev vxlan20 899 bridge vlan add vid 20 dev vxlan20 pvid untagged 900 901 # Test that when two VXLAN tunnels with conflicting configurations 902 # (i.e., different TTL) are enslaved to the same VLAN-aware bridge, 903 # then the enslavement of a port to the bridge is denied. 904 905 # Use the offload indication of the local route to ensure the VXLAN 906 # configuration was correctly rollbacked. 907 ip address add $LOCAL_IP_1/$PREFIX_LEN dev lo 908 909 ip link set dev vxlan10 type vxlan ttl 10 910 ip link set dev $swp1 master br0 &> /dev/null 911 check_fail $? 912 913 busywait "$TIMEOUT" not wait_for_offload \ 914 ip $IP_FLAG route show table local $LOCAL_IP_1 915 check_err $? 916 917 log_test "vlan-aware - failed enslavement to bridge due to conflict" 918 919 ip link set dev vxlan10 type vxlan ttl 20 920 ip address del $LOCAL_IP_1/$PREFIX_LEN dev lo 921 922 ip link del dev vxlan20 923 ip link del dev vxlan10 924 ip link del dev br0 925} 926 927offload_indication_vlan_aware_setup_create() 928{ 929 # Create a simple setup with two VxLAN devices and a single VLAN-aware 930 # bridge 931 ip link add name br0 type bridge mcast_snooping 0 vlan_filtering 1 \ 932 vlan_default_pvid 0 933 ip link set dev br0 addrgenmode none 934 ip link set dev br0 up 935 936 ip link set dev $swp1 master br0 937 938 bridge vlan add vid 10 dev $swp1 939 bridge vlan add vid 20 dev $swp1 940 941 ip address add $LOCAL_IP_1/$PREFIX_LEN dev lo 942 943 ip link add name vxlan10 up master br0 type vxlan id 10 nolearning \ 944 $UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 945 ip link add name vxlan20 up master br0 type vxlan id 20 nolearning \ 946 $UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 947 948 bridge vlan add vid 10 dev vxlan10 pvid untagged 949 bridge vlan add vid 20 dev vxlan20 pvid untagged 950} 951 952offload_indication_vlan_aware_setup_destroy() 953{ 954 bridge vlan del vid 20 dev vxlan20 955 bridge vlan del vid 10 dev vxlan10 956 957 ip link del dev vxlan20 958 ip link del dev vxlan10 959 960 ip address del $LOCAL_IP_1/$PREFIX_LEN dev lo 961 962 bridge vlan del vid 20 dev $swp1 963 bridge vlan del vid 10 dev $swp1 964 965 ip link set dev $swp1 nomaster 966 967 ip link del dev br0 968} 969 970offload_indication_vlan_aware_fdb_test() 971{ 972 RET=0 973 974 log_info "vxlan entry offload indication - vlan-aware" 975 976 bridge fdb add de:ad:be:ef:13:37 dev vxlan10 self master static \ 977 dst $LOCAL_IP_2 vlan 10 978 979 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \ 980 de:ad:be:ef:13:37 self bridge fdb show brport vxlan10 981 check_err $? 982 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \ 983 de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan10 984 check_err $? 985 986 log_test "vxlan entry offload indication - initial state" 987 988 # Remove FDB entry from the bridge driver and check that corresponding 989 # entry in the VxLAN driver is not marked as offloaded 990 RET=0 991 992 bridge fdb del de:ad:be:ef:13:37 dev vxlan10 master vlan 10 993 busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb \ 994 de:ad:be:ef:13:37 self bridge fdb show brport vxlan10 995 check_err $? 996 997 log_test "vxlan entry offload indication - after removal from bridge" 998 999 # Add the FDB entry back to the bridge driver and make sure it is 1000 # marked as offloaded in both drivers 1001 RET=0 1002 1003 bridge fdb add de:ad:be:ef:13:37 dev vxlan10 master static vlan 10 1004 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \ 1005 de:ad:be:ef:13:37 self bridge fdb show brport vxlan10 1006 check_err $? 1007 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \ 1008 de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan10 1009 check_err $? 1010 1011 log_test "vxlan entry offload indication - after re-add to bridge" 1012 1013 # Remove FDB entry from the VxLAN driver and check that corresponding 1014 # entry in the bridge driver is not marked as offloaded 1015 RET=0 1016 1017 bridge fdb del de:ad:be:ef:13:37 dev vxlan10 self 1018 busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb \ 1019 de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan10 1020 check_err $? 1021 1022 log_test "vxlan entry offload indication - after removal from vxlan" 1023 1024 # Add the FDB entry back to the VxLAN driver and make sure it is 1025 # marked as offloaded in both drivers 1026 RET=0 1027 1028 bridge fdb add de:ad:be:ef:13:37 dev vxlan10 self dst $LOCAL_IP_2 1029 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \ 1030 de:ad:be:ef:13:37 self bridge fdb show brport vxlan10 1031 check_err $? 1032 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \ 1033 de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan10 1034 check_err $? 1035 1036 log_test "vxlan entry offload indication - after re-add to vxlan" 1037 1038 bridge fdb del de:ad:be:ef:13:37 dev vxlan10 self master vlan 10 1039} 1040 1041offload_indication_vlan_aware_decap_route_test() 1042{ 1043 RET=0 1044 1045 busywait "$TIMEOUT" wait_for_offload \ 1046 ip $IP_FLAG route show table local $LOCAL_IP_1 1047 check_err $? 1048 1049 # Toggle PVID flag on one VxLAN device and make sure route is still 1050 # marked as offloaded 1051 bridge vlan add vid 10 dev vxlan10 untagged 1052 1053 busywait "$TIMEOUT" wait_for_offload \ 1054 ip $IP_FLAG route show table local $LOCAL_IP_1 1055 check_err $? 1056 1057 # Toggle PVID flag on second VxLAN device and make sure route is no 1058 # longer marked as offloaded 1059 bridge vlan add vid 20 dev vxlan20 untagged 1060 1061 busywait "$TIMEOUT" not wait_for_offload \ 1062 ip $IP_FLAG route show table local $LOCAL_IP_1 1063 check_err $? 1064 1065 # Toggle PVID flag back and make sure route is marked as offloaded 1066 bridge vlan add vid 10 dev vxlan10 pvid untagged 1067 bridge vlan add vid 20 dev vxlan20 pvid untagged 1068 1069 busywait "$TIMEOUT" wait_for_offload ip $IP_FLAG route show table local \ 1070 $LOCAL_IP_1 1071 check_err $? 1072 1073 log_test "vxlan decap route - vni map/unmap" 1074} 1075 1076offload_indication_vlan_aware_join_vxlan_first() 1077{ 1078 ip link add dev br0 type bridge mcast_snooping 0 \ 1079 vlan_filtering 1 vlan_default_pvid 1 1080 ip link set dev br0 addrgenmode none 1081 ip link set dev br0 up 1082 ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \ 1083 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 1084 1085 __offload_indication_join_vxlan_first 1 1086 1087 ip link del dev vxlan0 1088 ip link del dev br0 1089} 1090 1091offload_indication_vlan_aware_join_vxlan_last() 1092{ 1093 ip link add dev br0 type bridge mcast_snooping 0 \ 1094 vlan_filtering 1 vlan_default_pvid 1 1095 ip link set dev br0 addrgenmode none 1096 ip link set dev br0 up 1097 ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \ 1098 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 1099 1100 __offload_indication_join_vxlan_last 1101 1102 ip link del dev vxlan0 1103 ip link del dev br0 1104} 1105 1106offload_indication_vlan_aware_l3vni_test() 1107{ 1108 local zmac=00:00:00:00:00:00 1109 1110 RET=0 1111 1112 sysctl_set net.ipv6.conf.default.disable_ipv6 1 1113 ip link add dev br0 type bridge mcast_snooping 0 \ 1114 vlan_filtering 1 vlan_default_pvid 0 1115 ip link set dev br0 addrgenmode none 1116 ip link set dev br0 up 1117 ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \ 1118 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 1119 1120 ip link set dev $swp1 master br0 1121 1122 # The test will use the offload indication on the FDB entry to 1123 # understand if the tunnel is offloaded or not 1124 bridge fdb append $zmac dev vxlan0 self dst $LOCAL_IP_2 1125 1126 ip link set dev vxlan0 master br0 1127 bridge vlan add dev vxlan0 vid 10 pvid untagged 1128 1129 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $zmac self \ 1130 bridge fdb show brport vxlan0 1131 check_err $? "vxlan tunnel not offloaded when should" 1132 1133 # Configure a VLAN interface and make sure tunnel is offloaded 1134 ip link add link br0 name br10 up type vlan id 10 1135 sysctl_set net.ipv6.conf.br10.disable_ipv6 0 1136 ip -6 address add 2001:db8:1::1/64 dev br10 1137 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $zmac self \ 1138 bridge fdb show brport vxlan0 1139 check_err $? "vxlan tunnel not offloaded when should" 1140 1141 # Unlink the VXLAN device, make sure tunnel is no longer offloaded, 1142 # then add it back to the bridge and make sure it is offloaded 1143 ip link set dev vxlan0 nomaster 1144 busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb $zmac self \ 1145 bridge fdb show brport vxlan0 1146 check_err $? "vxlan tunnel offloaded after unlinked from bridge" 1147 1148 ip link set dev vxlan0 master br0 1149 busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb $zmac self \ 1150 bridge fdb show brport vxlan0 1151 check_err $? "vxlan tunnel offloaded despite no matching vid" 1152 1153 bridge vlan add dev vxlan0 vid 10 pvid untagged 1154 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $zmac self \ 1155 bridge fdb show brport vxlan0 1156 check_err $? "vxlan tunnel not offloaded after adding vid" 1157 1158 log_test "vxlan - l3 vni" 1159 1160 ip link del dev vxlan0 1161 ip link del dev br0 1162 sysctl_restore net.ipv6.conf.default.disable_ipv6 1163} 1164 1165offload_indication_vlan_aware_test() 1166{ 1167 offload_indication_vlan_aware_setup_create 1168 offload_indication_vlan_aware_fdb_test 1169 offload_indication_vlan_aware_decap_route_test 1170 offload_indication_vlan_aware_setup_destroy 1171 1172 log_info "offload indication - replay & cleanup - vlan aware" 1173 offload_indication_vlan_aware_join_vxlan_first 1174 offload_indication_vlan_aware_join_vxlan_last 1175 offload_indication_vlan_aware_l3vni_test 1176} 1177 1178trap cleanup EXIT 1179 1180setup_prepare 1181setup_wait 1182 1183tests_run 1184 1185exit $EXIT_STATUS 1186