Back to home page

OSCL-LXR

 
 

    


0001 #!/bin/bash
0002 # SPDX-License-Identifier: GPL-2.0
0003 #
0004 # Test various aspects of VxLAN offloading which are specific to mlxsw, such
0005 # as sanitization of invalid configurations and offload indication.
0006 
0007 : ${ADDR_FAMILY:=ipv4}
0008 export ADDR_FAMILY
0009 
0010 : ${LOCAL_IP_1:=198.51.100.1}
0011 export LOCAL_IP_1
0012 
0013 : ${LOCAL_IP_2:=198.51.100.2}
0014 export LOCAL_IP_2
0015 
0016 : ${PREFIX_LEN:=32}
0017 export PREFIX_LEN
0018 
0019 : ${UDPCSUM_FLAFS:=noudpcsum}
0020 export UDPCSUM_FLAFS
0021 
0022 : ${MC_IP:=239.0.0.1}
0023 export MC_IP
0024 
0025 : ${IP_FLAG:=""}
0026 export IP_FLAG
0027 
0028 : ${ALL_TESTS:="
0029         sanitization_test
0030         offload_indication_test
0031         sanitization_vlan_aware_test
0032         offload_indication_vlan_aware_test
0033 "}
0034 
0035 lib_dir=$(dirname $0)/../../../net/forwarding
0036 NUM_NETIFS=2
0037 : ${TIMEOUT:=20000} # ms
0038 source $lib_dir/lib.sh
0039 
0040 setup_prepare()
0041 {
0042         swp1=${NETIFS[p1]}
0043         swp2=${NETIFS[p2]}
0044 
0045         ip link set dev $swp1 up
0046         ip link set dev $swp2 up
0047 }
0048 
0049 cleanup()
0050 {
0051         pre_cleanup
0052 
0053         ip link set dev $swp2 down
0054         ip link set dev $swp1 down
0055 }
0056 
0057 sanitization_single_dev_test_pass()
0058 {
0059         ip link set dev $swp1 master br0
0060         check_err $?
0061         ip link set dev vxlan0 master br0
0062         check_err $?
0063 
0064         ip link set dev $swp1 nomaster
0065 
0066         ip link set dev $swp1 master br0
0067         check_err $?
0068 }
0069 
0070 sanitization_single_dev_test_fail()
0071 {
0072         ip link set dev $swp1 master br0
0073         check_err $?
0074         ip link set dev vxlan0 master br0 &> /dev/null
0075         check_fail $?
0076 
0077         ip link set dev $swp1 nomaster
0078 
0079         ip link set dev vxlan0 master br0
0080         check_err $?
0081         ip link set dev $swp1 master br0 &> /dev/null
0082         check_fail $?
0083 }
0084 
0085 sanitization_single_dev_valid_test()
0086 {
0087         RET=0
0088 
0089         ip link add dev br0 type bridge mcast_snooping 0
0090 
0091         ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
0092                 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
0093 
0094         sanitization_single_dev_test_pass
0095 
0096         ip link del dev vxlan0
0097         ip link del dev br0
0098 
0099         log_test "vxlan device - valid configuration"
0100 }
0101 
0102 sanitization_single_dev_vlan_aware_test()
0103 {
0104         RET=0
0105 
0106         ip link add dev br0 type bridge mcast_snooping 0 vlan_filtering 1
0107 
0108         ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
0109                 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
0110 
0111         sanitization_single_dev_test_pass
0112 
0113         ip link del dev vxlan0
0114         ip link del dev br0
0115 
0116         log_test "vxlan device with a vlan-aware bridge"
0117 }
0118 
0119 sanitization_single_dev_mcast_enabled_test()
0120 {
0121         RET=0
0122 
0123         ip link add dev br0 type bridge
0124 
0125         ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
0126                 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
0127 
0128         sanitization_single_dev_test_fail
0129 
0130         ip link del dev vxlan0
0131         ip link del dev br0
0132 
0133         log_test "vxlan device with a multicast enabled bridge"
0134 }
0135 
0136 sanitization_single_dev_mcast_group_test()
0137 {
0138         RET=0
0139 
0140         ip link add dev br0 type bridge mcast_snooping 0
0141         ip link add name dummy1 up type dummy
0142 
0143         ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
0144                 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 \
0145                 dev dummy1 group $MC_IP
0146 
0147         sanitization_single_dev_test_fail
0148 
0149         ip link del dev vxlan0
0150         ip link del dev dummy1
0151         ip link del dev br0
0152 
0153         log_test "vxlan device with a multicast group"
0154 }
0155 
0156 sanitization_single_dev_no_local_ip_test()
0157 {
0158         RET=0
0159 
0160         ip link add dev br0 type bridge mcast_snooping 0
0161 
0162         ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
0163                 ttl 20 tos inherit dstport 4789
0164 
0165         sanitization_single_dev_test_fail
0166 
0167         ip link del dev vxlan0
0168         ip link del dev br0
0169 
0170         log_test "vxlan device with no local ip"
0171 }
0172 
0173 sanitization_single_dev_learning_enabled_ipv4_test()
0174 {
0175         RET=0
0176 
0177         ip link add dev br0 type bridge mcast_snooping 0
0178 
0179         ip link add name vxlan0 up type vxlan id 10 learning $UDPCSUM_FLAFS \
0180                 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
0181 
0182         sanitization_single_dev_test_pass
0183 
0184         ip link del dev vxlan0
0185         ip link del dev br0
0186 
0187         log_test "vxlan device with learning enabled"
0188 }
0189 
0190 sanitization_single_dev_local_interface_test()
0191 {
0192         RET=0
0193 
0194         ip link add dev br0 type bridge mcast_snooping 0
0195         ip link add name dummy1 up type dummy
0196 
0197         ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
0198                 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 dev dummy1
0199 
0200         sanitization_single_dev_test_fail
0201 
0202         ip link del dev vxlan0
0203         ip link del dev dummy1
0204         ip link del dev br0
0205 
0206         log_test "vxlan device with local interface"
0207 }
0208 
0209 sanitization_single_dev_port_range_test()
0210 {
0211         RET=0
0212 
0213         ip link add dev br0 type bridge mcast_snooping 0
0214 
0215         ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
0216                 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 \
0217                 srcport 4000 5000
0218 
0219         sanitization_single_dev_test_fail
0220 
0221         ip link del dev vxlan0
0222         ip link del dev br0
0223 
0224         log_test "vxlan device with udp source port range"
0225 }
0226 
0227 sanitization_single_dev_tos_static_test()
0228 {
0229         RET=0
0230 
0231         ip link add dev br0 type bridge mcast_snooping 0
0232 
0233         ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
0234                 ttl 20 tos 20 local $LOCAL_IP_1 dstport 4789
0235 
0236         sanitization_single_dev_test_fail
0237 
0238         ip link del dev vxlan0
0239         ip link del dev br0
0240 
0241         log_test "vxlan device with static tos"
0242 }
0243 
0244 sanitization_single_dev_ttl_inherit_test()
0245 {
0246         RET=0
0247 
0248         ip link add dev br0 type bridge mcast_snooping 0
0249 
0250         ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
0251                 ttl inherit tos inherit local $LOCAL_IP_1 dstport 4789
0252 
0253         sanitization_single_dev_test_fail
0254 
0255         ip link del dev vxlan0
0256         ip link del dev br0
0257 
0258         log_test "vxlan device with inherit ttl"
0259 }
0260 
0261 sanitization_single_dev_udp_checksum_ipv4_test()
0262 {
0263         RET=0
0264 
0265         ip link add dev br0 type bridge mcast_snooping 0
0266 
0267         ip link add name vxlan0 up type vxlan id 10 nolearning udpcsum \
0268                 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
0269 
0270         sanitization_single_dev_test_fail
0271 
0272         ip link del dev vxlan0
0273         ip link del dev br0
0274 
0275         log_test "vxlan device with udp checksum"
0276 }
0277 
0278 sanitization_single_dev_test()
0279 {
0280         # These tests make sure that we correctly sanitize VxLAN device
0281         # configurations we do not support
0282         sanitization_single_dev_valid_test
0283         sanitization_single_dev_vlan_aware_test
0284         sanitization_single_dev_mcast_enabled_test
0285         sanitization_single_dev_mcast_group_test
0286         sanitization_single_dev_no_local_ip_test
0287         sanitization_single_dev_learning_enabled_"$ADDR_FAMILY"_test
0288         sanitization_single_dev_local_interface_test
0289         sanitization_single_dev_port_range_test
0290         sanitization_single_dev_tos_static_test
0291         sanitization_single_dev_ttl_inherit_test
0292         sanitization_single_dev_udp_checksum_"$ADDR_FAMILY"_test
0293 }
0294 
0295 sanitization_multi_devs_test_pass()
0296 {
0297         ip link set dev $swp1 master br0
0298         check_err $?
0299         ip link set dev vxlan0 master br0
0300         check_err $?
0301         ip link set dev $swp2 master br1
0302         check_err $?
0303         ip link set dev vxlan1 master br1
0304         check_err $?
0305 
0306         ip link set dev $swp2 nomaster
0307         ip link set dev $swp1 nomaster
0308 
0309         ip link set dev $swp1 master br0
0310         check_err $?
0311         ip link set dev $swp2 master br1
0312         check_err $?
0313 }
0314 
0315 sanitization_multi_devs_test_fail()
0316 {
0317         ip link set dev $swp1 master br0
0318         check_err $?
0319         ip link set dev vxlan0 master br0
0320         check_err $?
0321         ip link set dev $swp2 master br1
0322         check_err $?
0323         ip link set dev vxlan1 master br1 &> /dev/null
0324         check_fail $?
0325 
0326         ip link set dev $swp2 nomaster
0327         ip link set dev $swp1 nomaster
0328 
0329         ip link set dev vxlan1 master br1
0330         check_err $?
0331         ip link set dev $swp1 master br0
0332         check_err $?
0333         ip link set dev $swp2 master br1 &> /dev/null
0334         check_fail $?
0335 }
0336 
0337 sanitization_multi_devs_valid_test()
0338 {
0339         RET=0
0340 
0341         ip link add dev br0 type bridge mcast_snooping 0
0342         ip link add dev br1 type bridge mcast_snooping 0
0343 
0344         ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
0345                 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
0346         ip link add name vxlan1 up type vxlan id 20 nolearning $UDPCSUM_FLAFS \
0347                 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
0348 
0349         sanitization_multi_devs_test_pass
0350 
0351         ip link del dev vxlan1
0352         ip link del dev vxlan0
0353         ip link del dev br1
0354         ip link del dev br0
0355 
0356         log_test "multiple vxlan devices - valid configuration"
0357 }
0358 
0359 sanitization_multi_devs_ttl_test()
0360 {
0361         RET=0
0362 
0363         ip link add dev br0 type bridge mcast_snooping 0
0364         ip link add dev br1 type bridge mcast_snooping 0
0365 
0366         ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
0367                 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
0368         ip link add name vxlan1 up type vxlan id 20 nolearning $UDPCSUM_FLAFS \
0369                 ttl 40 tos inherit local $LOCAL_IP_1 dstport 4789
0370 
0371         sanitization_multi_devs_test_fail
0372 
0373         ip link del dev vxlan1
0374         ip link del dev vxlan0
0375         ip link del dev br1
0376         ip link del dev br0
0377 
0378         log_test "multiple vxlan devices with different ttl"
0379 }
0380 
0381 sanitization_multi_devs_udp_dstport_test()
0382 {
0383         RET=0
0384 
0385         ip link add dev br0 type bridge mcast_snooping 0
0386         ip link add dev br1 type bridge mcast_snooping 0
0387 
0388         ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
0389                 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
0390         ip link add name vxlan1 up type vxlan id 20 nolearning $UDPCSUM_FLAFS \
0391                 ttl 20 tos inherit local $LOCAL_IP_1 dstport 5789
0392 
0393         sanitization_multi_devs_test_fail
0394 
0395         ip link del dev vxlan1
0396         ip link del dev vxlan0
0397         ip link del dev br1
0398         ip link del dev br0
0399 
0400         log_test "multiple vxlan devices with different udp destination port"
0401 }
0402 
0403 sanitization_multi_devs_local_ip_test()
0404 {
0405         RET=0
0406 
0407         ip link add dev br0 type bridge mcast_snooping 0
0408         ip link add dev br1 type bridge mcast_snooping 0
0409 
0410         ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
0411                 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
0412         ip link add name vxlan1 up type vxlan id 20 nolearning $UDPCSUM_FLAFS \
0413                 ttl 20 tos inherit local $LOCAL_IP_2 dstport 4789
0414 
0415         sanitization_multi_devs_test_fail
0416 
0417         ip link del dev vxlan1
0418         ip link del dev vxlan0
0419         ip link del dev br1
0420         ip link del dev br0
0421 
0422         log_test "multiple vxlan devices with different local ip"
0423 }
0424 
0425 sanitization_multi_devs_test()
0426 {
0427         # The device has a single VTEP, which means all the VxLAN devices
0428         # we offload must share certain properties such as source IP and
0429         # UDP destination port. These tests make sure that we forbid
0430         # configurations that violate this limitation
0431         sanitization_multi_devs_valid_test
0432         sanitization_multi_devs_ttl_test
0433         sanitization_multi_devs_udp_dstport_test
0434         sanitization_multi_devs_local_ip_test
0435 }
0436 
0437 sanitization_test()
0438 {
0439         sanitization_single_dev_test
0440         sanitization_multi_devs_test
0441 }
0442 
0443 offload_indication_setup_create()
0444 {
0445         # Create a simple setup with two bridges, each with a VxLAN device
0446         # and one local port
0447         ip link add name br0 up type bridge mcast_snooping 0
0448         ip link add name br1 up type bridge mcast_snooping 0
0449 
0450         ip link set dev $swp1 master br0
0451         ip link set dev $swp2 master br1
0452 
0453         ip address add $LOCAL_IP_1/$PREFIX_LEN dev lo
0454 
0455         ip link add name vxlan0 up master br0 type vxlan id 10 nolearning \
0456                 $UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
0457         ip link add name vxlan1 up master br1 type vxlan id 20 nolearning \
0458                 $UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
0459 }
0460 
0461 offload_indication_setup_destroy()
0462 {
0463         ip link del dev vxlan1
0464         ip link del dev vxlan0
0465 
0466         ip address del $LOCAL_IP_1/$PREFIX_LEN dev lo
0467 
0468         ip link set dev $swp2 nomaster
0469         ip link set dev $swp1 nomaster
0470 
0471         ip link del dev br1
0472         ip link del dev br0
0473 }
0474 
0475 offload_indication_fdb_flood_test()
0476 {
0477         RET=0
0478 
0479         bridge fdb append 00:00:00:00:00:00 dev vxlan0 self dst $LOCAL_IP_2
0480 
0481         busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb 00:00:00:00:00:00 \
0482                 bridge fdb show brport vxlan0
0483         check_err $?
0484 
0485         bridge fdb del 00:00:00:00:00:00 dev vxlan0 self
0486 
0487         log_test "vxlan flood entry offload indication"
0488 }
0489 
0490 offload_indication_fdb_bridge_test()
0491 {
0492         RET=0
0493 
0494         bridge fdb add de:ad:be:ef:13:37 dev vxlan0 self master static \
0495                 dst $LOCAL_IP_2
0496 
0497         busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
0498                 de:ad:be:ef:13:37 self bridge fdb show brport vxlan0
0499         check_err $?
0500         busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
0501                 de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan0
0502         check_err $?
0503 
0504         log_test "vxlan entry offload indication - initial state"
0505 
0506         # Remove FDB entry from the bridge driver and check that corresponding
0507         # entry in the VxLAN driver is not marked as offloaded
0508         RET=0
0509 
0510         bridge fdb del de:ad:be:ef:13:37 dev vxlan0 master
0511         busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb \
0512                 de:ad:be:ef:13:37 self bridge fdb show brport vxlan0
0513         check_err $?
0514 
0515         log_test "vxlan entry offload indication - after removal from bridge"
0516 
0517         # Add the FDB entry back to the bridge driver and make sure it is
0518         # marked as offloaded in both drivers
0519         RET=0
0520 
0521         bridge fdb add de:ad:be:ef:13:37 dev vxlan0 master static
0522         busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
0523                 de:ad:be:ef:13:37 self bridge fdb show brport vxlan0
0524         check_err $?
0525         busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
0526                 de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan0
0527         check_err $?
0528 
0529         log_test "vxlan entry offload indication - after re-add to bridge"
0530 
0531         # Remove FDB entry from the VxLAN driver and check that corresponding
0532         # entry in the bridge driver is not marked as offloaded
0533         RET=0
0534 
0535         bridge fdb del de:ad:be:ef:13:37 dev vxlan0 self
0536         busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb \
0537                 de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan0
0538         check_err $?
0539 
0540         log_test "vxlan entry offload indication - after removal from vxlan"
0541 
0542         # Add the FDB entry back to the VxLAN driver and make sure it is
0543         # marked as offloaded in both drivers
0544         RET=0
0545 
0546         bridge fdb add de:ad:be:ef:13:37 dev vxlan0 self dst $LOCAL_IP_2
0547         busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
0548                 de:ad:be:ef:13:37 self bridge fdb show brport vxlan0
0549         check_err $?
0550         busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
0551                 de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan0
0552         check_err $?
0553 
0554         log_test "vxlan entry offload indication - after re-add to vxlan"
0555 
0556         bridge fdb del de:ad:be:ef:13:37 dev vxlan0 self master
0557 }
0558 
0559 offload_indication_fdb_test()
0560 {
0561         offload_indication_fdb_flood_test
0562         offload_indication_fdb_bridge_test
0563 }
0564 
0565 offload_indication_decap_route_test()
0566 {
0567         RET=0
0568 
0569         busywait "$TIMEOUT" wait_for_offload \
0570                 ip $IP_FLAG route show table local $LOCAL_IP_1
0571         check_err $?
0572 
0573         ip link set dev vxlan0 down
0574         busywait "$TIMEOUT" wait_for_offload \
0575                 ip $IP_FLAG route show table local $LOCAL_IP_1
0576         check_err $?
0577 
0578         ip link set dev vxlan1 down
0579         busywait "$TIMEOUT" not wait_for_offload \
0580                 ip $IP_FLAG route show table local $LOCAL_IP_1
0581         check_err $?
0582 
0583         log_test "vxlan decap route - vxlan device down"
0584 
0585         RET=0
0586 
0587         ip link set dev vxlan1 up
0588         busywait "$TIMEOUT" wait_for_offload \
0589                 ip $IP_FLAG route show table local $LOCAL_IP_1
0590         check_err $?
0591 
0592         ip link set dev vxlan0 up
0593         busywait "$TIMEOUT" wait_for_offload \
0594                 ip $IP_FLAG route show table local $LOCAL_IP_1
0595         check_err $?
0596 
0597         log_test "vxlan decap route - vxlan device up"
0598 
0599         RET=0
0600 
0601         ip address delete $LOCAL_IP_1/$PREFIX_LEN dev lo
0602         busywait "$TIMEOUT" not wait_for_offload \
0603                 ip $IP_FLAG route show table local $LOCAL_IP_1
0604         check_err $?
0605 
0606         ip address add $LOCAL_IP_1/$PREFIX_LEN dev lo
0607         busywait "$TIMEOUT" wait_for_offload \
0608                 ip $IP_FLAG route show table local $LOCAL_IP_1
0609         check_err $?
0610 
0611         log_test "vxlan decap route - add local route"
0612 
0613         RET=0
0614 
0615         ip link set dev $swp1 nomaster
0616         busywait "$TIMEOUT" wait_for_offload \
0617                 ip $IP_FLAG route show table local $LOCAL_IP_1
0618         check_err $?
0619 
0620         ip link set dev $swp2 nomaster
0621         busywait "$TIMEOUT" not wait_for_offload \
0622                 ip $IP_FLAG route show table local $LOCAL_IP_1
0623         check_err $?
0624 
0625         ip link set dev $swp1 master br0
0626         ip link set dev $swp2 master br1
0627         busywait "$TIMEOUT" wait_for_offload \
0628                 ip $IP_FLAG route show table local $LOCAL_IP_1
0629         check_err $?
0630 
0631         log_test "vxlan decap route - local ports enslavement"
0632 
0633         RET=0
0634 
0635         ip link del dev br0
0636         busywait "$TIMEOUT" wait_for_offload \
0637                 ip $IP_FLAG route show table local $LOCAL_IP_1
0638         check_err $?
0639 
0640         ip link del dev br1
0641         busywait "$TIMEOUT" not wait_for_offload \
0642                 ip $IP_FLAG route show table local $LOCAL_IP_1
0643         check_err $?
0644 
0645         log_test "vxlan decap route - bridge device deletion"
0646 
0647         RET=0
0648 
0649         ip link add name br0 up type bridge mcast_snooping 0
0650         ip link add name br1 up type bridge mcast_snooping 0
0651         ip link set dev $swp1 master br0
0652         ip link set dev $swp2 master br1
0653         ip link set dev vxlan0 master br0
0654         ip link set dev vxlan1 master br1
0655         busywait "$TIMEOUT" wait_for_offload \
0656                 ip $IP_FLAG route show table local $LOCAL_IP_1
0657         check_err $?
0658 
0659         ip link del dev vxlan0
0660         busywait "$TIMEOUT" wait_for_offload \
0661                 ip $IP_FLAG route show table local $LOCAL_IP_1
0662         check_err $?
0663 
0664         ip link del dev vxlan1
0665         busywait "$TIMEOUT" not wait_for_offload \
0666                 ip $IP_FLAG route show table local $LOCAL_IP_1
0667         check_err $?
0668 
0669         log_test "vxlan decap route - vxlan device deletion"
0670 
0671         ip link add name vxlan0 up master br0 type vxlan id 10 nolearning \
0672                 $UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
0673         ip link add name vxlan1 up master br1 type vxlan id 20 nolearning \
0674                 $UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
0675 }
0676 
0677 check_fdb_offloaded()
0678 {
0679         local mac=00:11:22:33:44:55
0680         local zmac=00:00:00:00:00:00
0681 
0682         busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $mac self \
0683                 bridge fdb show dev vxlan0
0684         check_err $?
0685         busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $mac master \
0686                 bridge fdb show dev vxlan0
0687         check_err $?
0688 
0689         busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $zmac self \
0690                 bridge fdb show dev vxlan0
0691         check_err $?
0692 }
0693 
0694 check_vxlan_fdb_not_offloaded()
0695 {
0696         local mac=00:11:22:33:44:55
0697         local zmac=00:00:00:00:00:00
0698 
0699         bridge fdb show dev vxlan0 | grep $mac | grep -q self
0700         check_err $?
0701         busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb $mac self \
0702                 bridge fdb show dev vxlan0
0703         check_err $?
0704 
0705         bridge fdb show dev vxlan0 | grep $zmac | grep -q self
0706         check_err $?
0707         busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb $zmac self \
0708                 bridge fdb show dev vxlan0
0709         check_err $?
0710 }
0711 
0712 check_bridge_fdb_not_offloaded()
0713 {
0714         local mac=00:11:22:33:44:55
0715         local zmac=00:00:00:00:00:00
0716 
0717         bridge fdb show dev vxlan0 | grep $mac | grep -q master
0718         check_err $?
0719         busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb $mac master \
0720                 bridge fdb show dev vxlan0
0721         check_err $?
0722 }
0723 
0724 __offload_indication_join_vxlan_first()
0725 {
0726         local vid=$1; shift
0727 
0728         local mac=00:11:22:33:44:55
0729         local zmac=00:00:00:00:00:00
0730 
0731         bridge fdb append $zmac dev vxlan0 self dst $LOCAL_IP_2
0732 
0733         ip link set dev vxlan0 master br0
0734         bridge fdb add dev vxlan0 $mac self master static dst $LOCAL_IP_2
0735 
0736         RET=0
0737         check_vxlan_fdb_not_offloaded
0738         ip link set dev $swp1 master br0
0739         sleep .1
0740         check_fdb_offloaded
0741         log_test "offload indication - attach vxlan first"
0742 
0743         RET=0
0744         ip link set dev vxlan0 down
0745         check_vxlan_fdb_not_offloaded
0746         check_bridge_fdb_not_offloaded
0747         log_test "offload indication - set vxlan down"
0748 
0749         RET=0
0750         ip link set dev vxlan0 up
0751         sleep .1
0752         check_fdb_offloaded
0753         log_test "offload indication - set vxlan up"
0754 
0755         if [[ ! -z $vid ]]; then
0756                 RET=0
0757                 bridge vlan del dev vxlan0 vid $vid
0758                 check_vxlan_fdb_not_offloaded
0759                 check_bridge_fdb_not_offloaded
0760                 log_test "offload indication - delete VLAN"
0761 
0762                 RET=0
0763                 bridge vlan add dev vxlan0 vid $vid
0764                 check_vxlan_fdb_not_offloaded
0765                 check_bridge_fdb_not_offloaded
0766                 log_test "offload indication - add tagged VLAN"
0767 
0768                 RET=0
0769                 bridge vlan add dev vxlan0 vid $vid pvid untagged
0770                 sleep .1
0771                 check_fdb_offloaded
0772                 log_test "offload indication - add pvid/untagged VLAN"
0773         fi
0774 
0775         RET=0
0776         ip link set dev $swp1 nomaster
0777         check_vxlan_fdb_not_offloaded
0778         log_test "offload indication - detach port"
0779 }
0780 
0781 offload_indication_join_vxlan_first()
0782 {
0783         ip link add dev br0 up type bridge mcast_snooping 0
0784         ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
0785                 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
0786 
0787         __offload_indication_join_vxlan_first
0788 
0789         ip link del dev vxlan0
0790         ip link del dev br0
0791 }
0792 
0793 __offload_indication_join_vxlan_last()
0794 {
0795         local zmac=00:00:00:00:00:00
0796 
0797         RET=0
0798 
0799         bridge fdb append $zmac dev vxlan0 self dst $LOCAL_IP_2
0800 
0801         ip link set dev $swp1 master br0
0802 
0803         busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb $zmac self \
0804                 bridge fdb show dev vxlan0
0805         check_err $?
0806 
0807         ip link set dev vxlan0 master br0
0808 
0809         busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $zmac self \
0810                 bridge fdb show dev vxlan0
0811         check_err $?
0812 
0813         log_test "offload indication - attach vxlan last"
0814 }
0815 
0816 offload_indication_join_vxlan_last()
0817 {
0818         ip link add dev br0 up type bridge mcast_snooping 0
0819         ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
0820                 ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
0821 
0822         __offload_indication_join_vxlan_last
0823 
0824         ip link del dev vxlan0
0825         ip link del dev br0
0826 }
0827 
0828 offload_indication_test()
0829 {
0830         offload_indication_setup_create
0831         offload_indication_fdb_test
0832         offload_indication_decap_route_test
0833         offload_indication_setup_destroy
0834 
0835         log_info "offload indication - replay & cleanup"
0836         offload_indication_join_vxlan_first
0837         offload_indication_join_vxlan_last
0838 }
0839 
0840 sanitization_vlan_aware_test()
0841 {
0842         RET=0
0843 
0844         ip link add dev br0 type bridge mcast_snooping 0 vlan_filtering 1
0845 
0846         ip link add name vxlan10 up master br0 type vxlan id 10 nolearning \
0847                 $UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
0848 
0849         ip link add name vxlan20 up master br0 type vxlan id 20 nolearning \
0850                 $UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
0851 
0852         # Test that when each VNI is mapped to a different VLAN we can enslave
0853         # a port to the bridge
0854         bridge vlan add vid 10 dev vxlan10 pvid untagged
0855         bridge vlan add vid 20 dev vxlan20 pvid untagged
0856 
0857         ip link set dev $swp1 master br0
0858         check_err $?
0859 
0860         log_test "vlan-aware - enslavement to vlan-aware bridge"
0861 
0862         # Try to map both VNIs to the same VLAN and make sure configuration
0863         # fails
0864         RET=0
0865 
0866         bridge vlan add vid 10 dev vxlan20 pvid untagged &> /dev/null
0867         check_fail $?
0868 
0869         log_test "vlan-aware - two vnis mapped to the same vlan"
0870 
0871         # Test that enslavement of a port to a bridge fails when two VNIs
0872         # are mapped to the same VLAN
0873         RET=0
0874 
0875         ip link set dev $swp1 nomaster
0876 
0877         bridge vlan del vid 20 dev vxlan20 pvid untagged
0878         bridge vlan add vid 10 dev vxlan20 pvid untagged
0879 
0880         ip link set dev $swp1 master br0 &> /dev/null
0881         check_fail $?
0882 
0883         log_test "vlan-aware - failed enslavement to vlan-aware bridge"
0884 
0885         bridge vlan del vid 10 dev vxlan20
0886         bridge vlan add vid 20 dev vxlan20 pvid untagged
0887 
0888         # Test that when two VXLAN tunnels with conflicting configurations
0889         # (i.e., different TTL) are enslaved to the same VLAN-aware bridge,
0890         # then the enslavement of a port to the bridge is denied.
0891 
0892         # Use the offload indication of the local route to ensure the VXLAN
0893         # configuration was correctly rollbacked.
0894         ip address add $LOCAL_IP_1/$PREFIX_LEN dev lo
0895 
0896         ip link set dev vxlan10 type vxlan ttl 10
0897         ip link set dev $swp1 master br0 &> /dev/null
0898         check_fail $?
0899 
0900         busywait "$TIMEOUT" not wait_for_offload \
0901                 ip $IP_FLAG route show table local $LOCAL_IP_1
0902         check_err $?
0903 
0904         log_test "vlan-aware - failed enslavement to bridge due to conflict"
0905 
0906         ip link set dev vxlan10 type vxlan ttl 20
0907         ip address del $LOCAL_IP_1/$PREFIX_LEN dev lo
0908 
0909         ip link del dev vxlan20
0910         ip link del dev vxlan10
0911         ip link del dev br0
0912 }
0913 
0914 offload_indication_vlan_aware_setup_create()
0915 {
0916         # Create a simple setup with two VxLAN devices and a single VLAN-aware
0917         # bridge
0918         ip link add name br0 up type bridge mcast_snooping 0 vlan_filtering 1 \
0919                 vlan_default_pvid 0
0920 
0921         ip link set dev $swp1 master br0
0922 
0923         bridge vlan add vid 10 dev $swp1
0924         bridge vlan add vid 20 dev $swp1
0925 
0926         ip address add $LOCAL_IP_1/$PREFIX_LEN dev lo
0927 
0928         ip link add name vxlan10 up master br0 type vxlan id 10 nolearning \
0929                 $UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
0930         ip link add name vxlan20 up master br0 type vxlan id 20 nolearning \
0931                 $UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
0932 
0933         bridge vlan add vid 10 dev vxlan10 pvid untagged
0934         bridge vlan add vid 20 dev vxlan20 pvid untagged
0935 }
0936 
0937 offload_indication_vlan_aware_setup_destroy()
0938 {
0939         bridge vlan del vid 20 dev vxlan20
0940         bridge vlan del vid 10 dev vxlan10
0941 
0942         ip link del dev vxlan20
0943         ip link del dev vxlan10
0944 
0945         ip address del $LOCAL_IP_1/$PREFIX_LEN dev lo
0946 
0947         bridge vlan del vid 20 dev $swp1
0948         bridge vlan del vid 10 dev $swp1
0949 
0950         ip link set dev $swp1 nomaster
0951 
0952         ip link del dev br0
0953 }
0954 
0955 offload_indication_vlan_aware_fdb_test()
0956 {
0957         RET=0
0958 
0959         log_info "vxlan entry offload indication - vlan-aware"
0960 
0961         bridge fdb add de:ad:be:ef:13:37 dev vxlan10 self master static \
0962                 dst $LOCAL_IP_2 vlan 10
0963 
0964         busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
0965                 de:ad:be:ef:13:37 self bridge fdb show brport vxlan10
0966         check_err $?
0967         busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
0968                 de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan10
0969         check_err $?
0970 
0971         log_test "vxlan entry offload indication - initial state"
0972 
0973         # Remove FDB entry from the bridge driver and check that corresponding
0974         # entry in the VxLAN driver is not marked as offloaded
0975         RET=0
0976 
0977         bridge fdb del de:ad:be:ef:13:37 dev vxlan10 master vlan 10
0978         busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb \
0979                 de:ad:be:ef:13:37 self bridge fdb show brport vxlan10
0980         check_err $?
0981 
0982         log_test "vxlan entry offload indication - after removal from bridge"
0983 
0984         # Add the FDB entry back to the bridge driver and make sure it is
0985         # marked as offloaded in both drivers
0986         RET=0
0987 
0988         bridge fdb add de:ad:be:ef:13:37 dev vxlan10 master static vlan 10
0989         busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
0990                 de:ad:be:ef:13:37 self bridge fdb show brport vxlan10
0991         check_err $?
0992         busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
0993                 de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan10
0994         check_err $?
0995 
0996         log_test "vxlan entry offload indication - after re-add to bridge"
0997 
0998         # Remove FDB entry from the VxLAN driver and check that corresponding
0999         # 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 
1026 offload_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 
1061 offload_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 
1074 offload_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 
1087 offload_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 
1144 offload_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 
1157 trap cleanup EXIT
1158 
1159 setup_prepare
1160 setup_wait
1161 
1162 tests_run
1163 
1164 exit $EXIT_STATUS