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 up type bridge mcast_snooping 0 448 ip link add name br1 up type bridge mcast_snooping 0 449 450 ip link set dev $swp1 master br0 451 ip link set dev $swp2 master br1 452 453 ip address add $LOCAL_IP_1/$PREFIX_LEN dev lo 454 455 ip link add name vxlan0 up master br0 type vxlan id 10 nolearning \ 456 $UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 457 ip link add name vxlan1 up master br1 type vxlan id 20 nolearning \ 458 $UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 459} 460 461offload_indication_setup_destroy() 462{ 463 ip link del dev vxlan1 464 ip link del dev vxlan0 465 466 ip address del $LOCAL_IP_1/$PREFIX_LEN dev lo 467 468 ip link set dev $swp2 nomaster 469 ip link set dev $swp1 nomaster 470 471 ip link del dev br1 472 ip link del dev br0 473} 474 475offload_indication_fdb_flood_test() 476{ 477 RET=0 478 479 bridge fdb append 00:00:00:00:00:00 dev vxlan0 self dst $LOCAL_IP_2 480 481 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb 00:00:00:00:00:00 \ 482 bridge fdb show brport vxlan0 483 check_err $? 484 485 bridge fdb del 00:00:00:00:00:00 dev vxlan0 self 486 487 log_test "vxlan flood entry offload indication" 488} 489 490offload_indication_fdb_bridge_test() 491{ 492 RET=0 493 494 bridge fdb add de:ad:be:ef:13:37 dev vxlan0 self master static \ 495 dst $LOCAL_IP_2 496 497 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \ 498 de:ad:be:ef:13:37 self bridge fdb show brport vxlan0 499 check_err $? 500 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \ 501 de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan0 502 check_err $? 503 504 log_test "vxlan entry offload indication - initial state" 505 506 # Remove FDB entry from the bridge driver and check that corresponding 507 # entry in the VxLAN driver is not marked as offloaded 508 RET=0 509 510 bridge fdb del de:ad:be:ef:13:37 dev vxlan0 master 511 busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb \ 512 de:ad:be:ef:13:37 self bridge fdb show brport vxlan0 513 check_err $? 514 515 log_test "vxlan entry offload indication - after removal from bridge" 516 517 # Add the FDB entry back to the bridge driver and make sure it is 518 # marked as offloaded in both drivers 519 RET=0 520 521 bridge fdb add de:ad:be:ef:13:37 dev vxlan0 master static 522 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \ 523 de:ad:be:ef:13:37 self bridge fdb show brport vxlan0 524 check_err $? 525 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \ 526 de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan0 527 check_err $? 528 529 log_test "vxlan entry offload indication - after re-add to bridge" 530 531 # Remove FDB entry from the VxLAN driver and check that corresponding 532 # entry in the bridge driver is not marked as offloaded 533 RET=0 534 535 bridge fdb del de:ad:be:ef:13:37 dev vxlan0 self 536 busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb \ 537 de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan0 538 check_err $? 539 540 log_test "vxlan entry offload indication - after removal from vxlan" 541 542 # Add the FDB entry back to the VxLAN driver and make sure it is 543 # marked as offloaded in both drivers 544 RET=0 545 546 bridge fdb add de:ad:be:ef:13:37 dev vxlan0 self dst $LOCAL_IP_2 547 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \ 548 de:ad:be:ef:13:37 self bridge fdb show brport vxlan0 549 check_err $? 550 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \ 551 de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan0 552 check_err $? 553 554 log_test "vxlan entry offload indication - after re-add to vxlan" 555 556 bridge fdb del de:ad:be:ef:13:37 dev vxlan0 self master 557} 558 559offload_indication_fdb_test() 560{ 561 offload_indication_fdb_flood_test 562 offload_indication_fdb_bridge_test 563} 564 565offload_indication_decap_route_test() 566{ 567 RET=0 568 569 busywait "$TIMEOUT" wait_for_offload \ 570 ip $IP_FLAG route show table local $LOCAL_IP_1 571 check_err $? 572 573 ip link set dev vxlan0 down 574 busywait "$TIMEOUT" wait_for_offload \ 575 ip $IP_FLAG route show table local $LOCAL_IP_1 576 check_err $? 577 578 ip link set dev vxlan1 down 579 busywait "$TIMEOUT" not wait_for_offload \ 580 ip $IP_FLAG route show table local $LOCAL_IP_1 581 check_err $? 582 583 log_test "vxlan decap route - vxlan device down" 584 585 RET=0 586 587 ip link set dev vxlan1 up 588 busywait "$TIMEOUT" wait_for_offload \ 589 ip $IP_FLAG route show table local $LOCAL_IP_1 590 check_err $? 591 592 ip link set dev vxlan0 up 593 busywait "$TIMEOUT" wait_for_offload \ 594 ip $IP_FLAG route show table local $LOCAL_IP_1 595 check_err $? 596 597 log_test "vxlan decap route - vxlan device up" 598 599 RET=0 600 601 ip address delete $LOCAL_IP_1/$PREFIX_LEN dev lo 602 busywait "$TIMEOUT" not wait_for_offload \ 603 ip $IP_FLAG route show table local $LOCAL_IP_1 604 check_err $? 605 606 ip address add $LOCAL_IP_1/$PREFIX_LEN dev lo 607 busywait "$TIMEOUT" wait_for_offload \ 608 ip $IP_FLAG route show table local $LOCAL_IP_1 609 check_err $? 610 611 log_test "vxlan decap route - add local route" 612 613 RET=0 614 615 ip link set dev $swp1 nomaster 616 busywait "$TIMEOUT" wait_for_offload \ 617 ip $IP_FLAG route show table local $LOCAL_IP_1 618 check_err $? 619 620 ip link set dev $swp2 nomaster 621 busywait "$TIMEOUT" not wait_for_offload \ 622 ip $IP_FLAG route show table local $LOCAL_IP_1 623 check_err $? 624 625 ip link set dev $swp1 master br0 626 ip link set dev $swp2 master br1 627 busywait "$TIMEOUT" wait_for_offload \ 628 ip $IP_FLAG route show table local $LOCAL_IP_1 629 check_err $? 630 631 log_test "vxlan decap route - local ports enslavement" 632 633 RET=0 634 635 ip link del dev br0 636 busywait "$TIMEOUT" wait_for_offload \ 637 ip $IP_FLAG route show table local $LOCAL_IP_1 638 check_err $? 639 640 ip link del dev br1 641 busywait "$TIMEOUT" not wait_for_offload \ 642 ip $IP_FLAG route show table local $LOCAL_IP_1 643 check_err $? 644 645 log_test "vxlan decap route - bridge device deletion" 646 647 RET=0 648 649 ip link add name br0 up type bridge mcast_snooping 0 650 ip link add name br1 up type bridge mcast_snooping 0 651 ip link set dev $swp1 master br0 652 ip link set dev $swp2 master br1 653 ip link set dev vxlan0 master br0 654 ip link set dev vxlan1 master br1 655 busywait "$TIMEOUT" wait_for_offload \ 656 ip $IP_FLAG route show table local $LOCAL_IP_1 657 check_err $? 658 659 ip link del dev vxlan0 660 busywait "$TIMEOUT" wait_for_offload \ 661 ip $IP_FLAG route show table local $LOCAL_IP_1 662 check_err $? 663 664 ip link del dev vxlan1 665 busywait "$TIMEOUT" not wait_for_offload \ 666 ip $IP_FLAG route show table local $LOCAL_IP_1 667 check_err $? 668 669 log_test "vxlan decap route - vxlan device deletion" 670 671 ip link add name vxlan0 up master br0 type vxlan id 10 nolearning \ 672 $UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 673 ip link add name vxlan1 up master br1 type vxlan id 20 nolearning \ 674 $UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 675} 676 677check_fdb_offloaded() 678{ 679 local mac=00:11:22:33:44:55 680 local zmac=00:00:00:00:00:00 681 682 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $mac self \ 683 bridge fdb show dev vxlan0 684 check_err $? 685 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $mac master \ 686 bridge fdb show dev vxlan0 687 check_err $? 688 689 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $zmac self \ 690 bridge fdb show dev vxlan0 691 check_err $? 692} 693 694check_vxlan_fdb_not_offloaded() 695{ 696 local mac=00:11:22:33:44:55 697 local zmac=00:00:00:00:00:00 698 699 bridge fdb show dev vxlan0 | grep $mac | grep -q self 700 check_err $? 701 busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb $mac self \ 702 bridge fdb show dev vxlan0 703 check_err $? 704 705 bridge fdb show dev vxlan0 | grep $zmac | grep -q self 706 check_err $? 707 busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb $zmac self \ 708 bridge fdb show dev vxlan0 709 check_err $? 710} 711 712check_bridge_fdb_not_offloaded() 713{ 714 local mac=00:11:22:33:44:55 715 local zmac=00:00:00:00:00:00 716 717 bridge fdb show dev vxlan0 | grep $mac | grep -q master 718 check_err $? 719 busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb $mac master \ 720 bridge fdb show dev vxlan0 721 check_err $? 722} 723 724__offload_indication_join_vxlan_first() 725{ 726 local vid=$1; shift 727 728 local mac=00:11:22:33:44:55 729 local zmac=00:00:00:00:00:00 730 731 bridge fdb append $zmac dev vxlan0 self dst $LOCAL_IP_2 732 733 ip link set dev vxlan0 master br0 734 bridge fdb add dev vxlan0 $mac self master static dst $LOCAL_IP_2 735 736 RET=0 737 check_vxlan_fdb_not_offloaded 738 ip link set dev $swp1 master br0 739 sleep .1 740 check_fdb_offloaded 741 log_test "offload indication - attach vxlan first" 742 743 RET=0 744 ip link set dev vxlan0 down 745 check_vxlan_fdb_not_offloaded 746 check_bridge_fdb_not_offloaded 747 log_test "offload indication - set vxlan down" 748 749 RET=0 750 ip link set dev vxlan0 up 751 sleep .1 752 check_fdb_offloaded 753 log_test "offload indication - set vxlan up" 754 755 if [[ ! -z $vid ]]; then 756 RET=0 757 bridge vlan del dev vxlan0 vid $vid 758 check_vxlan_fdb_not_offloaded 759 check_bridge_fdb_not_offloaded 760 log_test "offload indication - delete VLAN" 761 762 RET=0 763 bridge vlan add dev vxlan0 vid $vid 764 check_vxlan_fdb_not_offloaded 765 check_bridge_fdb_not_offloaded 766 log_test "offload indication - add tagged VLAN" 767 768 RET=0 769 bridge vlan add dev vxlan0 vid $vid pvid untagged 770 sleep .1 771 check_fdb_offloaded 772 log_test "offload indication - add pvid/untagged VLAN" 773 fi 774 775 RET=0 776 ip link set dev $swp1 nomaster 777 check_vxlan_fdb_not_offloaded 778 log_test "offload indication - detach port" 779} 780 781offload_indication_join_vxlan_first() 782{ 783 ip link add dev br0 up type bridge mcast_snooping 0 784 ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \ 785 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 786 787 __offload_indication_join_vxlan_first 788 789 ip link del dev vxlan0 790 ip link del dev br0 791} 792 793__offload_indication_join_vxlan_last() 794{ 795 local zmac=00:00:00:00:00:00 796 797 RET=0 798 799 bridge fdb append $zmac dev vxlan0 self dst $LOCAL_IP_2 800 801 ip link set dev $swp1 master br0 802 803 busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb $zmac self \ 804 bridge fdb show dev vxlan0 805 check_err $? 806 807 ip link set dev vxlan0 master br0 808 809 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $zmac self \ 810 bridge fdb show dev vxlan0 811 check_err $? 812 813 log_test "offload indication - attach vxlan last" 814} 815 816offload_indication_join_vxlan_last() 817{ 818 ip link add dev br0 up type bridge mcast_snooping 0 819 ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \ 820 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 821 822 __offload_indication_join_vxlan_last 823 824 ip link del dev vxlan0 825 ip link del dev br0 826} 827 828offload_indication_test() 829{ 830 offload_indication_setup_create 831 offload_indication_fdb_test 832 offload_indication_decap_route_test 833 offload_indication_setup_destroy 834 835 log_info "offload indication - replay & cleanup" 836 offload_indication_join_vxlan_first 837 offload_indication_join_vxlan_last 838} 839 840sanitization_vlan_aware_test() 841{ 842 RET=0 843 844 ip link add dev br0 type bridge mcast_snooping 0 vlan_filtering 1 845 846 ip link add name vxlan10 up master br0 type vxlan id 10 nolearning \ 847 $UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 848 849 ip link add name vxlan20 up master br0 type vxlan id 20 nolearning \ 850 $UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 851 852 # Test that when each VNI is mapped to a different VLAN we can enslave 853 # a port to the bridge 854 bridge vlan add vid 10 dev vxlan10 pvid untagged 855 bridge vlan add vid 20 dev vxlan20 pvid untagged 856 857 ip link set dev $swp1 master br0 858 check_err $? 859 860 log_test "vlan-aware - enslavement to vlan-aware bridge" 861 862 # Try to map both VNIs to the same VLAN and make sure configuration 863 # fails 864 RET=0 865 866 bridge vlan add vid 10 dev vxlan20 pvid untagged &> /dev/null 867 check_fail $? 868 869 log_test "vlan-aware - two vnis mapped to the same vlan" 870 871 # Test that enslavement of a port to a bridge fails when two VNIs 872 # are mapped to the same VLAN 873 RET=0 874 875 ip link set dev $swp1 nomaster 876 877 bridge vlan del vid 20 dev vxlan20 pvid untagged 878 bridge vlan add vid 10 dev vxlan20 pvid untagged 879 880 ip link set dev $swp1 master br0 &> /dev/null 881 check_fail $? 882 883 log_test "vlan-aware - failed enslavement to vlan-aware bridge" 884 885 bridge vlan del vid 10 dev vxlan20 886 bridge vlan add vid 20 dev vxlan20 pvid untagged 887 888 # Test that when two VXLAN tunnels with conflicting configurations 889 # (i.e., different TTL) are enslaved to the same VLAN-aware bridge, 890 # then the enslavement of a port to the bridge is denied. 891 892 # Use the offload indication of the local route to ensure the VXLAN 893 # configuration was correctly rollbacked. 894 ip address add $LOCAL_IP_1/$PREFIX_LEN dev lo 895 896 ip link set dev vxlan10 type vxlan ttl 10 897 ip link set dev $swp1 master br0 &> /dev/null 898 check_fail $? 899 900 busywait "$TIMEOUT" not wait_for_offload \ 901 ip $IP_FLAG route show table local $LOCAL_IP_1 902 check_err $? 903 904 log_test "vlan-aware - failed enslavement to bridge due to conflict" 905 906 ip link set dev vxlan10 type vxlan ttl 20 907 ip address del $LOCAL_IP_1/$PREFIX_LEN dev lo 908 909 ip link del dev vxlan20 910 ip link del dev vxlan10 911 ip link del dev br0 912} 913 914offload_indication_vlan_aware_setup_create() 915{ 916 # Create a simple setup with two VxLAN devices and a single VLAN-aware 917 # bridge 918 ip link add name br0 up type bridge mcast_snooping 0 vlan_filtering 1 \ 919 vlan_default_pvid 0 920 921 ip link set dev $swp1 master br0 922 923 bridge vlan add vid 10 dev $swp1 924 bridge vlan add vid 20 dev $swp1 925 926 ip address add $LOCAL_IP_1/$PREFIX_LEN dev lo 927 928 ip link add name vxlan10 up master br0 type vxlan id 10 nolearning \ 929 $UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 930 ip link add name vxlan20 up master br0 type vxlan id 20 nolearning \ 931 $UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 932 933 bridge vlan add vid 10 dev vxlan10 pvid untagged 934 bridge vlan add vid 20 dev vxlan20 pvid untagged 935} 936 937offload_indication_vlan_aware_setup_destroy() 938{ 939 bridge vlan del vid 20 dev vxlan20 940 bridge vlan del vid 10 dev vxlan10 941 942 ip link del dev vxlan20 943 ip link del dev vxlan10 944 945 ip address del $LOCAL_IP_1/$PREFIX_LEN dev lo 946 947 bridge vlan del vid 20 dev $swp1 948 bridge vlan del vid 10 dev $swp1 949 950 ip link set dev $swp1 nomaster 951 952 ip link del dev br0 953} 954 955offload_indication_vlan_aware_fdb_test() 956{ 957 RET=0 958 959 log_info "vxlan entry offload indication - vlan-aware" 960 961 bridge fdb add de:ad:be:ef:13:37 dev vxlan10 self master static \ 962 dst $LOCAL_IP_2 vlan 10 963 964 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \ 965 de:ad:be:ef:13:37 self bridge fdb show brport vxlan10 966 check_err $? 967 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \ 968 de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan10 969 check_err $? 970 971 log_test "vxlan entry offload indication - initial state" 972 973 # Remove FDB entry from the bridge driver and check that corresponding 974 # entry in the VxLAN driver is not marked as offloaded 975 RET=0 976 977 bridge fdb del de:ad:be:ef:13:37 dev vxlan10 master vlan 10 978 busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb \ 979 de:ad:be:ef:13:37 self bridge fdb show brport vxlan10 980 check_err $? 981 982 log_test "vxlan entry offload indication - after removal from bridge" 983 984 # Add the FDB entry back to the bridge driver and make sure it is 985 # marked as offloaded in both drivers 986 RET=0 987 988 bridge fdb add de:ad:be:ef:13:37 dev vxlan10 master static vlan 10 989 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \ 990 de:ad:be:ef:13:37 self bridge fdb show brport vxlan10 991 check_err $? 992 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \ 993 de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan10 994 check_err $? 995 996 log_test "vxlan entry offload indication - after re-add to bridge" 997 998 # Remove FDB entry from the VxLAN driver and check that corresponding 999 # entry in the bridge driver is not marked as offloaded 1000 RET=0 1001 1002 bridge fdb del de:ad:be:ef:13:37 dev vxlan10 self 1003 busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb \ 1004 de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan10 1005 check_err $? 1006 1007 log_test "vxlan entry offload indication - after removal from vxlan" 1008 1009 # Add the FDB entry back to the VxLAN driver and make sure it is 1010 # marked as offloaded in both drivers 1011 RET=0 1012 1013 bridge fdb add de:ad:be:ef:13:37 dev vxlan10 self dst $LOCAL_IP_2 1014 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \ 1015 de:ad:be:ef:13:37 self bridge fdb show brport vxlan10 1016 check_err $? 1017 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \ 1018 de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan10 1019 check_err $? 1020 1021 log_test "vxlan entry offload indication - after re-add to vxlan" 1022 1023 bridge fdb del de:ad:be:ef:13:37 dev vxlan10 self master vlan 10 1024} 1025 1026offload_indication_vlan_aware_decap_route_test() 1027{ 1028 RET=0 1029 1030 busywait "$TIMEOUT" wait_for_offload \ 1031 ip $IP_FLAG route show table local $LOCAL_IP_1 1032 check_err $? 1033 1034 # Toggle PVID flag on one VxLAN device and make sure route is still 1035 # marked as offloaded 1036 bridge vlan add vid 10 dev vxlan10 untagged 1037 1038 busywait "$TIMEOUT" wait_for_offload \ 1039 ip $IP_FLAG route show table local $LOCAL_IP_1 1040 check_err $? 1041 1042 # Toggle PVID flag on second VxLAN device and make sure route is no 1043 # longer marked as offloaded 1044 bridge vlan add vid 20 dev vxlan20 untagged 1045 1046 busywait "$TIMEOUT" not wait_for_offload \ 1047 ip $IP_FLAG route show table local $LOCAL_IP_1 1048 check_err $? 1049 1050 # Toggle PVID flag back and make sure route is marked as offloaded 1051 bridge vlan add vid 10 dev vxlan10 pvid untagged 1052 bridge vlan add vid 20 dev vxlan20 pvid untagged 1053 1054 busywait "$TIMEOUT" wait_for_offload ip $IP_FLAG route show table local \ 1055 $LOCAL_IP_1 1056 check_err $? 1057 1058 log_test "vxlan decap route - vni map/unmap" 1059} 1060 1061offload_indication_vlan_aware_join_vxlan_first() 1062{ 1063 ip link add dev br0 up type bridge mcast_snooping 0 \ 1064 vlan_filtering 1 vlan_default_pvid 1 1065 ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \ 1066 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 1067 1068 __offload_indication_join_vxlan_first 1 1069 1070 ip link del dev vxlan0 1071 ip link del dev br0 1072} 1073 1074offload_indication_vlan_aware_join_vxlan_last() 1075{ 1076 ip link add dev br0 up type bridge mcast_snooping 0 \ 1077 vlan_filtering 1 vlan_default_pvid 1 1078 ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \ 1079 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 1080 1081 __offload_indication_join_vxlan_last 1082 1083 ip link del dev vxlan0 1084 ip link del dev br0 1085} 1086 1087offload_indication_vlan_aware_l3vni_test() 1088{ 1089 local zmac=00:00:00:00:00:00 1090 1091 RET=0 1092 1093 sysctl_set net.ipv6.conf.default.disable_ipv6 1 1094 ip link add dev br0 up type bridge mcast_snooping 0 \ 1095 vlan_filtering 1 vlan_default_pvid 0 1096 ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \ 1097 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 1098 1099 ip link set dev $swp1 master br0 1100 1101 # The test will use the offload indication on the FDB entry to 1102 # understand if the tunnel is offloaded or not 1103 bridge fdb append $zmac dev vxlan0 self dst $LOCAL_IP_2 1104 1105 ip link set dev vxlan0 master br0 1106 bridge vlan add dev vxlan0 vid 10 pvid untagged 1107 1108 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $zmac self \ 1109 bridge fdb show brport vxlan0 1110 check_err $? "vxlan tunnel not offloaded when should" 1111 1112 # Configure a VLAN interface and make sure tunnel is offloaded 1113 ip link add link br0 name br10 up type vlan id 10 1114 sysctl_set net.ipv6.conf.br10.disable_ipv6 0 1115 ip -6 address add 2001:db8:1::1/64 dev br10 1116 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $zmac self \ 1117 bridge fdb show brport vxlan0 1118 check_err $? "vxlan tunnel not offloaded when should" 1119 1120 # Unlink the VXLAN device, make sure tunnel is no longer offloaded, 1121 # then add it back to the bridge and make sure it is offloaded 1122 ip link set dev vxlan0 nomaster 1123 busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb $zmac self \ 1124 bridge fdb show brport vxlan0 1125 check_err $? "vxlan tunnel offloaded after unlinked from bridge" 1126 1127 ip link set dev vxlan0 master br0 1128 busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb $zmac self \ 1129 bridge fdb show brport vxlan0 1130 check_err $? "vxlan tunnel offloaded despite no matching vid" 1131 1132 bridge vlan add dev vxlan0 vid 10 pvid untagged 1133 busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $zmac self \ 1134 bridge fdb show brport vxlan0 1135 check_err $? "vxlan tunnel not offloaded after adding vid" 1136 1137 log_test "vxlan - l3 vni" 1138 1139 ip link del dev vxlan0 1140 ip link del dev br0 1141 sysctl_restore net.ipv6.conf.default.disable_ipv6 1142} 1143 1144offload_indication_vlan_aware_test() 1145{ 1146 offload_indication_vlan_aware_setup_create 1147 offload_indication_vlan_aware_fdb_test 1148 offload_indication_vlan_aware_decap_route_test 1149 offload_indication_vlan_aware_setup_destroy 1150 1151 log_info "offload indication - replay & cleanup - vlan aware" 1152 offload_indication_vlan_aware_join_vxlan_first 1153 offload_indication_vlan_aware_join_vxlan_last 1154 offload_indication_vlan_aware_l3vni_test 1155} 1156 1157trap cleanup EXIT 1158 1159setup_prepare 1160setup_wait 1161 1162tests_run 1163 1164exit $EXIT_STATUS 1165