1165 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			1165 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/bin/bash
 | 
						|
# SPDX-License-Identifier: GPL-2.0
 | 
						|
#
 | 
						|
# Test various aspects of VxLAN offloading which are specific to mlxsw, such
 | 
						|
# as sanitization of invalid configurations and offload indication.
 | 
						|
 | 
						|
: ${ADDR_FAMILY:=ipv4}
 | 
						|
export ADDR_FAMILY
 | 
						|
 | 
						|
: ${LOCAL_IP_1:=198.51.100.1}
 | 
						|
export LOCAL_IP_1
 | 
						|
 | 
						|
: ${LOCAL_IP_2:=198.51.100.2}
 | 
						|
export LOCAL_IP_2
 | 
						|
 | 
						|
: ${PREFIX_LEN:=32}
 | 
						|
export PREFIX_LEN
 | 
						|
 | 
						|
: ${UDPCSUM_FLAFS:=noudpcsum}
 | 
						|
export UDPCSUM_FLAFS
 | 
						|
 | 
						|
: ${MC_IP:=239.0.0.1}
 | 
						|
export MC_IP
 | 
						|
 | 
						|
: ${IP_FLAG:=""}
 | 
						|
export IP_FLAG
 | 
						|
 | 
						|
: ${ALL_TESTS:="
 | 
						|
	sanitization_test
 | 
						|
	offload_indication_test
 | 
						|
	sanitization_vlan_aware_test
 | 
						|
	offload_indication_vlan_aware_test
 | 
						|
"}
 | 
						|
 | 
						|
lib_dir=$(dirname $0)/../../../net/forwarding
 | 
						|
NUM_NETIFS=2
 | 
						|
: ${TIMEOUT:=20000} # ms
 | 
						|
source $lib_dir/lib.sh
 | 
						|
 | 
						|
setup_prepare()
 | 
						|
{
 | 
						|
	swp1=${NETIFS[p1]}
 | 
						|
	swp2=${NETIFS[p2]}
 | 
						|
 | 
						|
	ip link set dev $swp1 up
 | 
						|
	ip link set dev $swp2 up
 | 
						|
}
 | 
						|
 | 
						|
cleanup()
 | 
						|
{
 | 
						|
	pre_cleanup
 | 
						|
 | 
						|
	ip link set dev $swp2 down
 | 
						|
	ip link set dev $swp1 down
 | 
						|
}
 | 
						|
 | 
						|
sanitization_single_dev_test_pass()
 | 
						|
{
 | 
						|
	ip link set dev $swp1 master br0
 | 
						|
	check_err $?
 | 
						|
	ip link set dev vxlan0 master br0
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	ip link set dev $swp1 nomaster
 | 
						|
 | 
						|
	ip link set dev $swp1 master br0
 | 
						|
	check_err $?
 | 
						|
}
 | 
						|
 | 
						|
sanitization_single_dev_test_fail()
 | 
						|
{
 | 
						|
	ip link set dev $swp1 master br0
 | 
						|
	check_err $?
 | 
						|
	ip link set dev vxlan0 master br0 &> /dev/null
 | 
						|
	check_fail $?
 | 
						|
 | 
						|
	ip link set dev $swp1 nomaster
 | 
						|
 | 
						|
	ip link set dev vxlan0 master br0
 | 
						|
	check_err $?
 | 
						|
	ip link set dev $swp1 master br0 &> /dev/null
 | 
						|
	check_fail $?
 | 
						|
}
 | 
						|
 | 
						|
sanitization_single_dev_valid_test()
 | 
						|
{
 | 
						|
	RET=0
 | 
						|
 | 
						|
	ip link add dev br0 type bridge mcast_snooping 0
 | 
						|
 | 
						|
	ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
 | 
						|
		ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
 | 
						|
 | 
						|
	sanitization_single_dev_test_pass
 | 
						|
 | 
						|
	ip link del dev vxlan0
 | 
						|
	ip link del dev br0
 | 
						|
 | 
						|
	log_test "vxlan device - valid configuration"
 | 
						|
}
 | 
						|
 | 
						|
sanitization_single_dev_vlan_aware_test()
 | 
						|
{
 | 
						|
	RET=0
 | 
						|
 | 
						|
	ip link add dev br0 type bridge mcast_snooping 0 vlan_filtering 1
 | 
						|
 | 
						|
	ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
 | 
						|
		ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
 | 
						|
 | 
						|
	sanitization_single_dev_test_pass
 | 
						|
 | 
						|
	ip link del dev vxlan0
 | 
						|
	ip link del dev br0
 | 
						|
 | 
						|
	log_test "vxlan device with a vlan-aware bridge"
 | 
						|
}
 | 
						|
 | 
						|
sanitization_single_dev_mcast_enabled_test()
 | 
						|
{
 | 
						|
	RET=0
 | 
						|
 | 
						|
	ip link add dev br0 type bridge
 | 
						|
 | 
						|
	ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
 | 
						|
		ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
 | 
						|
 | 
						|
	sanitization_single_dev_test_fail
 | 
						|
 | 
						|
	ip link del dev vxlan0
 | 
						|
	ip link del dev br0
 | 
						|
 | 
						|
	log_test "vxlan device with a multicast enabled bridge"
 | 
						|
}
 | 
						|
 | 
						|
sanitization_single_dev_mcast_group_test()
 | 
						|
{
 | 
						|
	RET=0
 | 
						|
 | 
						|
	ip link add dev br0 type bridge mcast_snooping 0
 | 
						|
	ip link add name dummy1 up type dummy
 | 
						|
 | 
						|
	ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
 | 
						|
		ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 \
 | 
						|
		dev dummy1 group $MC_IP
 | 
						|
 | 
						|
	sanitization_single_dev_test_fail
 | 
						|
 | 
						|
	ip link del dev vxlan0
 | 
						|
	ip link del dev dummy1
 | 
						|
	ip link del dev br0
 | 
						|
 | 
						|
	log_test "vxlan device with a multicast group"
 | 
						|
}
 | 
						|
 | 
						|
sanitization_single_dev_no_local_ip_test()
 | 
						|
{
 | 
						|
	RET=0
 | 
						|
 | 
						|
	ip link add dev br0 type bridge mcast_snooping 0
 | 
						|
 | 
						|
	ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
 | 
						|
		ttl 20 tos inherit dstport 4789
 | 
						|
 | 
						|
	sanitization_single_dev_test_fail
 | 
						|
 | 
						|
	ip link del dev vxlan0
 | 
						|
	ip link del dev br0
 | 
						|
 | 
						|
	log_test "vxlan device with no local ip"
 | 
						|
}
 | 
						|
 | 
						|
sanitization_single_dev_learning_enabled_ipv4_test()
 | 
						|
{
 | 
						|
	RET=0
 | 
						|
 | 
						|
	ip link add dev br0 type bridge mcast_snooping 0
 | 
						|
 | 
						|
	ip link add name vxlan0 up type vxlan id 10 learning $UDPCSUM_FLAFS \
 | 
						|
		ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
 | 
						|
 | 
						|
	sanitization_single_dev_test_pass
 | 
						|
 | 
						|
	ip link del dev vxlan0
 | 
						|
	ip link del dev br0
 | 
						|
 | 
						|
	log_test "vxlan device with learning enabled"
 | 
						|
}
 | 
						|
 | 
						|
sanitization_single_dev_local_interface_test()
 | 
						|
{
 | 
						|
	RET=0
 | 
						|
 | 
						|
	ip link add dev br0 type bridge mcast_snooping 0
 | 
						|
	ip link add name dummy1 up type dummy
 | 
						|
 | 
						|
	ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
 | 
						|
		ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 dev dummy1
 | 
						|
 | 
						|
	sanitization_single_dev_test_fail
 | 
						|
 | 
						|
	ip link del dev vxlan0
 | 
						|
	ip link del dev dummy1
 | 
						|
	ip link del dev br0
 | 
						|
 | 
						|
	log_test "vxlan device with local interface"
 | 
						|
}
 | 
						|
 | 
						|
sanitization_single_dev_port_range_test()
 | 
						|
{
 | 
						|
	RET=0
 | 
						|
 | 
						|
	ip link add dev br0 type bridge mcast_snooping 0
 | 
						|
 | 
						|
	ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
 | 
						|
		ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789 \
 | 
						|
		srcport 4000 5000
 | 
						|
 | 
						|
	sanitization_single_dev_test_fail
 | 
						|
 | 
						|
	ip link del dev vxlan0
 | 
						|
	ip link del dev br0
 | 
						|
 | 
						|
	log_test "vxlan device with udp source port range"
 | 
						|
}
 | 
						|
 | 
						|
sanitization_single_dev_tos_static_test()
 | 
						|
{
 | 
						|
	RET=0
 | 
						|
 | 
						|
	ip link add dev br0 type bridge mcast_snooping 0
 | 
						|
 | 
						|
	ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
 | 
						|
		ttl 20 tos 20 local $LOCAL_IP_1 dstport 4789
 | 
						|
 | 
						|
	sanitization_single_dev_test_fail
 | 
						|
 | 
						|
	ip link del dev vxlan0
 | 
						|
	ip link del dev br0
 | 
						|
 | 
						|
	log_test "vxlan device with static tos"
 | 
						|
}
 | 
						|
 | 
						|
sanitization_single_dev_ttl_inherit_test()
 | 
						|
{
 | 
						|
	RET=0
 | 
						|
 | 
						|
	ip link add dev br0 type bridge mcast_snooping 0
 | 
						|
 | 
						|
	ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
 | 
						|
		ttl inherit tos inherit local $LOCAL_IP_1 dstport 4789
 | 
						|
 | 
						|
	sanitization_single_dev_test_fail
 | 
						|
 | 
						|
	ip link del dev vxlan0
 | 
						|
	ip link del dev br0
 | 
						|
 | 
						|
	log_test "vxlan device with inherit ttl"
 | 
						|
}
 | 
						|
 | 
						|
sanitization_single_dev_udp_checksum_ipv4_test()
 | 
						|
{
 | 
						|
	RET=0
 | 
						|
 | 
						|
	ip link add dev br0 type bridge mcast_snooping 0
 | 
						|
 | 
						|
	ip link add name vxlan0 up type vxlan id 10 nolearning udpcsum \
 | 
						|
		ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
 | 
						|
 | 
						|
	sanitization_single_dev_test_fail
 | 
						|
 | 
						|
	ip link del dev vxlan0
 | 
						|
	ip link del dev br0
 | 
						|
 | 
						|
	log_test "vxlan device with udp checksum"
 | 
						|
}
 | 
						|
 | 
						|
sanitization_single_dev_test()
 | 
						|
{
 | 
						|
	# These tests make sure that we correctly sanitize VxLAN device
 | 
						|
	# configurations we do not support
 | 
						|
	sanitization_single_dev_valid_test
 | 
						|
	sanitization_single_dev_vlan_aware_test
 | 
						|
	sanitization_single_dev_mcast_enabled_test
 | 
						|
	sanitization_single_dev_mcast_group_test
 | 
						|
	sanitization_single_dev_no_local_ip_test
 | 
						|
	sanitization_single_dev_learning_enabled_"$ADDR_FAMILY"_test
 | 
						|
	sanitization_single_dev_local_interface_test
 | 
						|
	sanitization_single_dev_port_range_test
 | 
						|
	sanitization_single_dev_tos_static_test
 | 
						|
	sanitization_single_dev_ttl_inherit_test
 | 
						|
	sanitization_single_dev_udp_checksum_"$ADDR_FAMILY"_test
 | 
						|
}
 | 
						|
 | 
						|
sanitization_multi_devs_test_pass()
 | 
						|
{
 | 
						|
	ip link set dev $swp1 master br0
 | 
						|
	check_err $?
 | 
						|
	ip link set dev vxlan0 master br0
 | 
						|
	check_err $?
 | 
						|
	ip link set dev $swp2 master br1
 | 
						|
	check_err $?
 | 
						|
	ip link set dev vxlan1 master br1
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	ip link set dev $swp2 nomaster
 | 
						|
	ip link set dev $swp1 nomaster
 | 
						|
 | 
						|
	ip link set dev $swp1 master br0
 | 
						|
	check_err $?
 | 
						|
	ip link set dev $swp2 master br1
 | 
						|
	check_err $?
 | 
						|
}
 | 
						|
 | 
						|
sanitization_multi_devs_test_fail()
 | 
						|
{
 | 
						|
	ip link set dev $swp1 master br0
 | 
						|
	check_err $?
 | 
						|
	ip link set dev vxlan0 master br0
 | 
						|
	check_err $?
 | 
						|
	ip link set dev $swp2 master br1
 | 
						|
	check_err $?
 | 
						|
	ip link set dev vxlan1 master br1 &> /dev/null
 | 
						|
	check_fail $?
 | 
						|
 | 
						|
	ip link set dev $swp2 nomaster
 | 
						|
	ip link set dev $swp1 nomaster
 | 
						|
 | 
						|
	ip link set dev vxlan1 master br1
 | 
						|
	check_err $?
 | 
						|
	ip link set dev $swp1 master br0
 | 
						|
	check_err $?
 | 
						|
	ip link set dev $swp2 master br1 &> /dev/null
 | 
						|
	check_fail $?
 | 
						|
}
 | 
						|
 | 
						|
sanitization_multi_devs_valid_test()
 | 
						|
{
 | 
						|
	RET=0
 | 
						|
 | 
						|
	ip link add dev br0 type bridge mcast_snooping 0
 | 
						|
	ip link add dev br1 type bridge mcast_snooping 0
 | 
						|
 | 
						|
	ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
 | 
						|
		ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
 | 
						|
	ip link add name vxlan1 up type vxlan id 20 nolearning $UDPCSUM_FLAFS \
 | 
						|
		ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
 | 
						|
 | 
						|
	sanitization_multi_devs_test_pass
 | 
						|
 | 
						|
	ip link del dev vxlan1
 | 
						|
	ip link del dev vxlan0
 | 
						|
	ip link del dev br1
 | 
						|
	ip link del dev br0
 | 
						|
 | 
						|
	log_test "multiple vxlan devices - valid configuration"
 | 
						|
}
 | 
						|
 | 
						|
sanitization_multi_devs_ttl_test()
 | 
						|
{
 | 
						|
	RET=0
 | 
						|
 | 
						|
	ip link add dev br0 type bridge mcast_snooping 0
 | 
						|
	ip link add dev br1 type bridge mcast_snooping 0
 | 
						|
 | 
						|
	ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
 | 
						|
		ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
 | 
						|
	ip link add name vxlan1 up type vxlan id 20 nolearning $UDPCSUM_FLAFS \
 | 
						|
		ttl 40 tos inherit local $LOCAL_IP_1 dstport 4789
 | 
						|
 | 
						|
	sanitization_multi_devs_test_fail
 | 
						|
 | 
						|
	ip link del dev vxlan1
 | 
						|
	ip link del dev vxlan0
 | 
						|
	ip link del dev br1
 | 
						|
	ip link del dev br0
 | 
						|
 | 
						|
	log_test "multiple vxlan devices with different ttl"
 | 
						|
}
 | 
						|
 | 
						|
sanitization_multi_devs_udp_dstport_test()
 | 
						|
{
 | 
						|
	RET=0
 | 
						|
 | 
						|
	ip link add dev br0 type bridge mcast_snooping 0
 | 
						|
	ip link add dev br1 type bridge mcast_snooping 0
 | 
						|
 | 
						|
	ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
 | 
						|
		ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
 | 
						|
	ip link add name vxlan1 up type vxlan id 20 nolearning $UDPCSUM_FLAFS \
 | 
						|
		ttl 20 tos inherit local $LOCAL_IP_1 dstport 5789
 | 
						|
 | 
						|
	sanitization_multi_devs_test_fail
 | 
						|
 | 
						|
	ip link del dev vxlan1
 | 
						|
	ip link del dev vxlan0
 | 
						|
	ip link del dev br1
 | 
						|
	ip link del dev br0
 | 
						|
 | 
						|
	log_test "multiple vxlan devices with different udp destination port"
 | 
						|
}
 | 
						|
 | 
						|
sanitization_multi_devs_local_ip_test()
 | 
						|
{
 | 
						|
	RET=0
 | 
						|
 | 
						|
	ip link add dev br0 type bridge mcast_snooping 0
 | 
						|
	ip link add dev br1 type bridge mcast_snooping 0
 | 
						|
 | 
						|
	ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
 | 
						|
		ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
 | 
						|
	ip link add name vxlan1 up type vxlan id 20 nolearning $UDPCSUM_FLAFS \
 | 
						|
		ttl 20 tos inherit local $LOCAL_IP_2 dstport 4789
 | 
						|
 | 
						|
	sanitization_multi_devs_test_fail
 | 
						|
 | 
						|
	ip link del dev vxlan1
 | 
						|
	ip link del dev vxlan0
 | 
						|
	ip link del dev br1
 | 
						|
	ip link del dev br0
 | 
						|
 | 
						|
	log_test "multiple vxlan devices with different local ip"
 | 
						|
}
 | 
						|
 | 
						|
sanitization_multi_devs_test()
 | 
						|
{
 | 
						|
	# The device has a single VTEP, which means all the VxLAN devices
 | 
						|
	# we offload must share certain properties such as source IP and
 | 
						|
	# UDP destination port. These tests make sure that we forbid
 | 
						|
	# configurations that violate this limitation
 | 
						|
	sanitization_multi_devs_valid_test
 | 
						|
	sanitization_multi_devs_ttl_test
 | 
						|
	sanitization_multi_devs_udp_dstport_test
 | 
						|
	sanitization_multi_devs_local_ip_test
 | 
						|
}
 | 
						|
 | 
						|
sanitization_test()
 | 
						|
{
 | 
						|
	sanitization_single_dev_test
 | 
						|
	sanitization_multi_devs_test
 | 
						|
}
 | 
						|
 | 
						|
offload_indication_setup_create()
 | 
						|
{
 | 
						|
	# Create a simple setup with two bridges, each with a VxLAN device
 | 
						|
	# and one local port
 | 
						|
	ip link add name br0 up type bridge mcast_snooping 0
 | 
						|
	ip link add name br1 up type bridge mcast_snooping 0
 | 
						|
 | 
						|
	ip link set dev $swp1 master br0
 | 
						|
	ip link set dev $swp2 master br1
 | 
						|
 | 
						|
	ip address add $LOCAL_IP_1/$PREFIX_LEN dev lo
 | 
						|
 | 
						|
	ip link add name vxlan0 up master br0 type vxlan id 10 nolearning \
 | 
						|
		$UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
 | 
						|
	ip link add name vxlan1 up master br1 type vxlan id 20 nolearning \
 | 
						|
		$UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
 | 
						|
}
 | 
						|
 | 
						|
offload_indication_setup_destroy()
 | 
						|
{
 | 
						|
	ip link del dev vxlan1
 | 
						|
	ip link del dev vxlan0
 | 
						|
 | 
						|
	ip address del $LOCAL_IP_1/$PREFIX_LEN dev lo
 | 
						|
 | 
						|
	ip link set dev $swp2 nomaster
 | 
						|
	ip link set dev $swp1 nomaster
 | 
						|
 | 
						|
	ip link del dev br1
 | 
						|
	ip link del dev br0
 | 
						|
}
 | 
						|
 | 
						|
offload_indication_fdb_flood_test()
 | 
						|
{
 | 
						|
	RET=0
 | 
						|
 | 
						|
	bridge fdb append 00:00:00:00:00:00 dev vxlan0 self dst $LOCAL_IP_2
 | 
						|
 | 
						|
	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb 00:00:00:00:00:00 \
 | 
						|
		bridge fdb show brport vxlan0
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	bridge fdb del 00:00:00:00:00:00 dev vxlan0 self
 | 
						|
 | 
						|
	log_test "vxlan flood entry offload indication"
 | 
						|
}
 | 
						|
 | 
						|
offload_indication_fdb_bridge_test()
 | 
						|
{
 | 
						|
	RET=0
 | 
						|
 | 
						|
	bridge fdb add de:ad:be:ef:13:37 dev vxlan0 self master static \
 | 
						|
		dst $LOCAL_IP_2
 | 
						|
 | 
						|
	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
 | 
						|
		de:ad:be:ef:13:37 self bridge fdb show brport vxlan0
 | 
						|
	check_err $?
 | 
						|
	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
 | 
						|
		de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan0
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	log_test "vxlan entry offload indication - initial state"
 | 
						|
 | 
						|
	# Remove FDB entry from the bridge driver and check that corresponding
 | 
						|
	# entry in the VxLAN driver is not marked as offloaded
 | 
						|
	RET=0
 | 
						|
 | 
						|
	bridge fdb del de:ad:be:ef:13:37 dev vxlan0 master
 | 
						|
	busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb \
 | 
						|
		de:ad:be:ef:13:37 self bridge fdb show brport vxlan0
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	log_test "vxlan entry offload indication - after removal from bridge"
 | 
						|
 | 
						|
	# Add the FDB entry back to the bridge driver and make sure it is
 | 
						|
	# marked as offloaded in both drivers
 | 
						|
	RET=0
 | 
						|
 | 
						|
	bridge fdb add de:ad:be:ef:13:37 dev vxlan0 master static
 | 
						|
	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
 | 
						|
		de:ad:be:ef:13:37 self bridge fdb show brport vxlan0
 | 
						|
	check_err $?
 | 
						|
	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
 | 
						|
		de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan0
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	log_test "vxlan entry offload indication - after re-add to bridge"
 | 
						|
 | 
						|
	# Remove FDB entry from the VxLAN driver and check that corresponding
 | 
						|
	# entry in the bridge driver is not marked as offloaded
 | 
						|
	RET=0
 | 
						|
 | 
						|
	bridge fdb del de:ad:be:ef:13:37 dev vxlan0 self
 | 
						|
	busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb \
 | 
						|
		de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan0
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	log_test "vxlan entry offload indication - after removal from vxlan"
 | 
						|
 | 
						|
	# Add the FDB entry back to the VxLAN driver and make sure it is
 | 
						|
	# marked as offloaded in both drivers
 | 
						|
	RET=0
 | 
						|
 | 
						|
	bridge fdb add de:ad:be:ef:13:37 dev vxlan0 self dst $LOCAL_IP_2
 | 
						|
	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
 | 
						|
		de:ad:be:ef:13:37 self bridge fdb show brport vxlan0
 | 
						|
	check_err $?
 | 
						|
	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
 | 
						|
		de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan0
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	log_test "vxlan entry offload indication - after re-add to vxlan"
 | 
						|
 | 
						|
	bridge fdb del de:ad:be:ef:13:37 dev vxlan0 self master
 | 
						|
}
 | 
						|
 | 
						|
offload_indication_fdb_test()
 | 
						|
{
 | 
						|
	offload_indication_fdb_flood_test
 | 
						|
	offload_indication_fdb_bridge_test
 | 
						|
}
 | 
						|
 | 
						|
offload_indication_decap_route_test()
 | 
						|
{
 | 
						|
	RET=0
 | 
						|
 | 
						|
	busywait "$TIMEOUT" wait_for_offload \
 | 
						|
		ip $IP_FLAG route show table local $LOCAL_IP_1
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	ip link set dev vxlan0 down
 | 
						|
	busywait "$TIMEOUT" wait_for_offload \
 | 
						|
		ip $IP_FLAG route show table local $LOCAL_IP_1
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	ip link set dev vxlan1 down
 | 
						|
	busywait "$TIMEOUT" not wait_for_offload \
 | 
						|
		ip $IP_FLAG route show table local $LOCAL_IP_1
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	log_test "vxlan decap route - vxlan device down"
 | 
						|
 | 
						|
	RET=0
 | 
						|
 | 
						|
	ip link set dev vxlan1 up
 | 
						|
	busywait "$TIMEOUT" wait_for_offload \
 | 
						|
		ip $IP_FLAG route show table local $LOCAL_IP_1
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	ip link set dev vxlan0 up
 | 
						|
	busywait "$TIMEOUT" wait_for_offload \
 | 
						|
		ip $IP_FLAG route show table local $LOCAL_IP_1
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	log_test "vxlan decap route - vxlan device up"
 | 
						|
 | 
						|
	RET=0
 | 
						|
 | 
						|
	ip address delete $LOCAL_IP_1/$PREFIX_LEN dev lo
 | 
						|
	busywait "$TIMEOUT" not wait_for_offload \
 | 
						|
		ip $IP_FLAG route show table local $LOCAL_IP_1
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	ip address add $LOCAL_IP_1/$PREFIX_LEN dev lo
 | 
						|
	busywait "$TIMEOUT" wait_for_offload \
 | 
						|
		ip $IP_FLAG route show table local $LOCAL_IP_1
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	log_test "vxlan decap route - add local route"
 | 
						|
 | 
						|
	RET=0
 | 
						|
 | 
						|
	ip link set dev $swp1 nomaster
 | 
						|
	busywait "$TIMEOUT" wait_for_offload \
 | 
						|
		ip $IP_FLAG route show table local $LOCAL_IP_1
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	ip link set dev $swp2 nomaster
 | 
						|
	busywait "$TIMEOUT" not wait_for_offload \
 | 
						|
		ip $IP_FLAG route show table local $LOCAL_IP_1
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	ip link set dev $swp1 master br0
 | 
						|
	ip link set dev $swp2 master br1
 | 
						|
	busywait "$TIMEOUT" wait_for_offload \
 | 
						|
		ip $IP_FLAG route show table local $LOCAL_IP_1
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	log_test "vxlan decap route - local ports enslavement"
 | 
						|
 | 
						|
	RET=0
 | 
						|
 | 
						|
	ip link del dev br0
 | 
						|
	busywait "$TIMEOUT" wait_for_offload \
 | 
						|
		ip $IP_FLAG route show table local $LOCAL_IP_1
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	ip link del dev br1
 | 
						|
	busywait "$TIMEOUT" not wait_for_offload \
 | 
						|
		ip $IP_FLAG route show table local $LOCAL_IP_1
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	log_test "vxlan decap route - bridge device deletion"
 | 
						|
 | 
						|
	RET=0
 | 
						|
 | 
						|
	ip link add name br0 up type bridge mcast_snooping 0
 | 
						|
	ip link add name br1 up type bridge mcast_snooping 0
 | 
						|
	ip link set dev $swp1 master br0
 | 
						|
	ip link set dev $swp2 master br1
 | 
						|
	ip link set dev vxlan0 master br0
 | 
						|
	ip link set dev vxlan1 master br1
 | 
						|
	busywait "$TIMEOUT" wait_for_offload \
 | 
						|
		ip $IP_FLAG route show table local $LOCAL_IP_1
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	ip link del dev vxlan0
 | 
						|
	busywait "$TIMEOUT" wait_for_offload \
 | 
						|
		ip $IP_FLAG route show table local $LOCAL_IP_1
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	ip link del dev vxlan1
 | 
						|
	busywait "$TIMEOUT" not wait_for_offload \
 | 
						|
		ip $IP_FLAG route show table local $LOCAL_IP_1
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	log_test "vxlan decap route - vxlan device deletion"
 | 
						|
 | 
						|
	ip link add name vxlan0 up master br0 type vxlan id 10 nolearning \
 | 
						|
		$UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
 | 
						|
	ip link add name vxlan1 up master br1 type vxlan id 20 nolearning \
 | 
						|
		$UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
 | 
						|
}
 | 
						|
 | 
						|
check_fdb_offloaded()
 | 
						|
{
 | 
						|
	local mac=00:11:22:33:44:55
 | 
						|
	local zmac=00:00:00:00:00:00
 | 
						|
 | 
						|
	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $mac self \
 | 
						|
		bridge fdb show dev vxlan0
 | 
						|
	check_err $?
 | 
						|
	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $mac master \
 | 
						|
		bridge fdb show dev vxlan0
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $zmac self \
 | 
						|
		bridge fdb show dev vxlan0
 | 
						|
	check_err $?
 | 
						|
}
 | 
						|
 | 
						|
check_vxlan_fdb_not_offloaded()
 | 
						|
{
 | 
						|
	local mac=00:11:22:33:44:55
 | 
						|
	local zmac=00:00:00:00:00:00
 | 
						|
 | 
						|
	bridge fdb show dev vxlan0 | grep $mac | grep -q self
 | 
						|
	check_err $?
 | 
						|
	busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb $mac self \
 | 
						|
		bridge fdb show dev vxlan0
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	bridge fdb show dev vxlan0 | grep $zmac | grep -q self
 | 
						|
	check_err $?
 | 
						|
	busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb $zmac self \
 | 
						|
		bridge fdb show dev vxlan0
 | 
						|
	check_err $?
 | 
						|
}
 | 
						|
 | 
						|
check_bridge_fdb_not_offloaded()
 | 
						|
{
 | 
						|
	local mac=00:11:22:33:44:55
 | 
						|
	local zmac=00:00:00:00:00:00
 | 
						|
 | 
						|
	bridge fdb show dev vxlan0 | grep $mac | grep -q master
 | 
						|
	check_err $?
 | 
						|
	busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb $mac master \
 | 
						|
		bridge fdb show dev vxlan0
 | 
						|
	check_err $?
 | 
						|
}
 | 
						|
 | 
						|
__offload_indication_join_vxlan_first()
 | 
						|
{
 | 
						|
	local vid=$1; shift
 | 
						|
 | 
						|
	local mac=00:11:22:33:44:55
 | 
						|
	local zmac=00:00:00:00:00:00
 | 
						|
 | 
						|
	bridge fdb append $zmac dev vxlan0 self dst $LOCAL_IP_2
 | 
						|
 | 
						|
	ip link set dev vxlan0 master br0
 | 
						|
	bridge fdb add dev vxlan0 $mac self master static dst $LOCAL_IP_2
 | 
						|
 | 
						|
	RET=0
 | 
						|
	check_vxlan_fdb_not_offloaded
 | 
						|
	ip link set dev $swp1 master br0
 | 
						|
	sleep .1
 | 
						|
	check_fdb_offloaded
 | 
						|
	log_test "offload indication - attach vxlan first"
 | 
						|
 | 
						|
	RET=0
 | 
						|
	ip link set dev vxlan0 down
 | 
						|
	check_vxlan_fdb_not_offloaded
 | 
						|
	check_bridge_fdb_not_offloaded
 | 
						|
	log_test "offload indication - set vxlan down"
 | 
						|
 | 
						|
	RET=0
 | 
						|
	ip link set dev vxlan0 up
 | 
						|
	sleep .1
 | 
						|
	check_fdb_offloaded
 | 
						|
	log_test "offload indication - set vxlan up"
 | 
						|
 | 
						|
	if [[ ! -z $vid ]]; then
 | 
						|
		RET=0
 | 
						|
		bridge vlan del dev vxlan0 vid $vid
 | 
						|
		check_vxlan_fdb_not_offloaded
 | 
						|
		check_bridge_fdb_not_offloaded
 | 
						|
		log_test "offload indication - delete VLAN"
 | 
						|
 | 
						|
		RET=0
 | 
						|
		bridge vlan add dev vxlan0 vid $vid
 | 
						|
		check_vxlan_fdb_not_offloaded
 | 
						|
		check_bridge_fdb_not_offloaded
 | 
						|
		log_test "offload indication - add tagged VLAN"
 | 
						|
 | 
						|
		RET=0
 | 
						|
		bridge vlan add dev vxlan0 vid $vid pvid untagged
 | 
						|
		sleep .1
 | 
						|
		check_fdb_offloaded
 | 
						|
		log_test "offload indication - add pvid/untagged VLAN"
 | 
						|
	fi
 | 
						|
 | 
						|
	RET=0
 | 
						|
	ip link set dev $swp1 nomaster
 | 
						|
	check_vxlan_fdb_not_offloaded
 | 
						|
	log_test "offload indication - detach port"
 | 
						|
}
 | 
						|
 | 
						|
offload_indication_join_vxlan_first()
 | 
						|
{
 | 
						|
	ip link add dev br0 up type bridge mcast_snooping 0
 | 
						|
	ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
 | 
						|
		ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
 | 
						|
 | 
						|
	__offload_indication_join_vxlan_first
 | 
						|
 | 
						|
	ip link del dev vxlan0
 | 
						|
	ip link del dev br0
 | 
						|
}
 | 
						|
 | 
						|
__offload_indication_join_vxlan_last()
 | 
						|
{
 | 
						|
	local zmac=00:00:00:00:00:00
 | 
						|
 | 
						|
	RET=0
 | 
						|
 | 
						|
	bridge fdb append $zmac dev vxlan0 self dst $LOCAL_IP_2
 | 
						|
 | 
						|
	ip link set dev $swp1 master br0
 | 
						|
 | 
						|
	busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb $zmac self \
 | 
						|
		bridge fdb show dev vxlan0
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	ip link set dev vxlan0 master br0
 | 
						|
 | 
						|
	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $zmac self \
 | 
						|
		bridge fdb show dev vxlan0
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	log_test "offload indication - attach vxlan last"
 | 
						|
}
 | 
						|
 | 
						|
offload_indication_join_vxlan_last()
 | 
						|
{
 | 
						|
	ip link add dev br0 up type bridge mcast_snooping 0
 | 
						|
	ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
 | 
						|
		ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
 | 
						|
 | 
						|
	__offload_indication_join_vxlan_last
 | 
						|
 | 
						|
	ip link del dev vxlan0
 | 
						|
	ip link del dev br0
 | 
						|
}
 | 
						|
 | 
						|
offload_indication_test()
 | 
						|
{
 | 
						|
	offload_indication_setup_create
 | 
						|
	offload_indication_fdb_test
 | 
						|
	offload_indication_decap_route_test
 | 
						|
	offload_indication_setup_destroy
 | 
						|
 | 
						|
	log_info "offload indication - replay & cleanup"
 | 
						|
	offload_indication_join_vxlan_first
 | 
						|
	offload_indication_join_vxlan_last
 | 
						|
}
 | 
						|
 | 
						|
sanitization_vlan_aware_test()
 | 
						|
{
 | 
						|
	RET=0
 | 
						|
 | 
						|
	ip link add dev br0 type bridge mcast_snooping 0 vlan_filtering 1
 | 
						|
 | 
						|
	ip link add name vxlan10 up master br0 type vxlan id 10 nolearning \
 | 
						|
		$UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
 | 
						|
 | 
						|
	ip link add name vxlan20 up master br0 type vxlan id 20 nolearning \
 | 
						|
		$UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
 | 
						|
 | 
						|
	# Test that when each VNI is mapped to a different VLAN we can enslave
 | 
						|
	# a port to the bridge
 | 
						|
	bridge vlan add vid 10 dev vxlan10 pvid untagged
 | 
						|
	bridge vlan add vid 20 dev vxlan20 pvid untagged
 | 
						|
 | 
						|
	ip link set dev $swp1 master br0
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	log_test "vlan-aware - enslavement to vlan-aware bridge"
 | 
						|
 | 
						|
	# Try to map both VNIs to the same VLAN and make sure configuration
 | 
						|
	# fails
 | 
						|
	RET=0
 | 
						|
 | 
						|
	bridge vlan add vid 10 dev vxlan20 pvid untagged &> /dev/null
 | 
						|
	check_fail $?
 | 
						|
 | 
						|
	log_test "vlan-aware - two vnis mapped to the same vlan"
 | 
						|
 | 
						|
	# Test that enslavement of a port to a bridge fails when two VNIs
 | 
						|
	# are mapped to the same VLAN
 | 
						|
	RET=0
 | 
						|
 | 
						|
	ip link set dev $swp1 nomaster
 | 
						|
 | 
						|
	bridge vlan del vid 20 dev vxlan20 pvid untagged
 | 
						|
	bridge vlan add vid 10 dev vxlan20 pvid untagged
 | 
						|
 | 
						|
	ip link set dev $swp1 master br0 &> /dev/null
 | 
						|
	check_fail $?
 | 
						|
 | 
						|
	log_test "vlan-aware - failed enslavement to vlan-aware bridge"
 | 
						|
 | 
						|
	bridge vlan del vid 10 dev vxlan20
 | 
						|
	bridge vlan add vid 20 dev vxlan20 pvid untagged
 | 
						|
 | 
						|
	# Test that when two VXLAN tunnels with conflicting configurations
 | 
						|
	# (i.e., different TTL) are enslaved to the same VLAN-aware bridge,
 | 
						|
	# then the enslavement of a port to the bridge is denied.
 | 
						|
 | 
						|
	# Use the offload indication of the local route to ensure the VXLAN
 | 
						|
	# configuration was correctly rollbacked.
 | 
						|
	ip address add $LOCAL_IP_1/$PREFIX_LEN dev lo
 | 
						|
 | 
						|
	ip link set dev vxlan10 type vxlan ttl 10
 | 
						|
	ip link set dev $swp1 master br0 &> /dev/null
 | 
						|
	check_fail $?
 | 
						|
 | 
						|
	busywait "$TIMEOUT" not wait_for_offload \
 | 
						|
		ip $IP_FLAG route show table local $LOCAL_IP_1
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	log_test "vlan-aware - failed enslavement to bridge due to conflict"
 | 
						|
 | 
						|
	ip link set dev vxlan10 type vxlan ttl 20
 | 
						|
	ip address del $LOCAL_IP_1/$PREFIX_LEN dev lo
 | 
						|
 | 
						|
	ip link del dev vxlan20
 | 
						|
	ip link del dev vxlan10
 | 
						|
	ip link del dev br0
 | 
						|
}
 | 
						|
 | 
						|
offload_indication_vlan_aware_setup_create()
 | 
						|
{
 | 
						|
	# Create a simple setup with two VxLAN devices and a single VLAN-aware
 | 
						|
	# bridge
 | 
						|
	ip link add name br0 up type bridge mcast_snooping 0 vlan_filtering 1 \
 | 
						|
		vlan_default_pvid 0
 | 
						|
 | 
						|
	ip link set dev $swp1 master br0
 | 
						|
 | 
						|
	bridge vlan add vid 10 dev $swp1
 | 
						|
	bridge vlan add vid 20 dev $swp1
 | 
						|
 | 
						|
	ip address add $LOCAL_IP_1/$PREFIX_LEN dev lo
 | 
						|
 | 
						|
	ip link add name vxlan10 up master br0 type vxlan id 10 nolearning \
 | 
						|
		$UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
 | 
						|
	ip link add name vxlan20 up master br0 type vxlan id 20 nolearning \
 | 
						|
		$UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
 | 
						|
 | 
						|
	bridge vlan add vid 10 dev vxlan10 pvid untagged
 | 
						|
	bridge vlan add vid 20 dev vxlan20 pvid untagged
 | 
						|
}
 | 
						|
 | 
						|
offload_indication_vlan_aware_setup_destroy()
 | 
						|
{
 | 
						|
	bridge vlan del vid 20 dev vxlan20
 | 
						|
	bridge vlan del vid 10 dev vxlan10
 | 
						|
 | 
						|
	ip link del dev vxlan20
 | 
						|
	ip link del dev vxlan10
 | 
						|
 | 
						|
	ip address del $LOCAL_IP_1/$PREFIX_LEN dev lo
 | 
						|
 | 
						|
	bridge vlan del vid 20 dev $swp1
 | 
						|
	bridge vlan del vid 10 dev $swp1
 | 
						|
 | 
						|
	ip link set dev $swp1 nomaster
 | 
						|
 | 
						|
	ip link del dev br0
 | 
						|
}
 | 
						|
 | 
						|
offload_indication_vlan_aware_fdb_test()
 | 
						|
{
 | 
						|
	RET=0
 | 
						|
 | 
						|
	log_info "vxlan entry offload indication - vlan-aware"
 | 
						|
 | 
						|
	bridge fdb add de:ad:be:ef:13:37 dev vxlan10 self master static \
 | 
						|
		dst $LOCAL_IP_2 vlan 10
 | 
						|
 | 
						|
	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
 | 
						|
		de:ad:be:ef:13:37 self bridge fdb show brport vxlan10
 | 
						|
	check_err $?
 | 
						|
	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
 | 
						|
		de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan10
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	log_test "vxlan entry offload indication - initial state"
 | 
						|
 | 
						|
	# Remove FDB entry from the bridge driver and check that corresponding
 | 
						|
	# entry in the VxLAN driver is not marked as offloaded
 | 
						|
	RET=0
 | 
						|
 | 
						|
	bridge fdb del de:ad:be:ef:13:37 dev vxlan10 master vlan 10
 | 
						|
	busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb \
 | 
						|
		de:ad:be:ef:13:37 self bridge fdb show brport vxlan10
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	log_test "vxlan entry offload indication - after removal from bridge"
 | 
						|
 | 
						|
	# Add the FDB entry back to the bridge driver and make sure it is
 | 
						|
	# marked as offloaded in both drivers
 | 
						|
	RET=0
 | 
						|
 | 
						|
	bridge fdb add de:ad:be:ef:13:37 dev vxlan10 master static vlan 10
 | 
						|
	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
 | 
						|
		de:ad:be:ef:13:37 self bridge fdb show brport vxlan10
 | 
						|
	check_err $?
 | 
						|
	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
 | 
						|
		de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan10
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	log_test "vxlan entry offload indication - after re-add to bridge"
 | 
						|
 | 
						|
	# Remove FDB entry from the VxLAN driver and check that corresponding
 | 
						|
	# entry in the bridge driver is not marked as offloaded
 | 
						|
	RET=0
 | 
						|
 | 
						|
	bridge fdb del de:ad:be:ef:13:37 dev vxlan10 self
 | 
						|
	busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb \
 | 
						|
		de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan10
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	log_test "vxlan entry offload indication - after removal from vxlan"
 | 
						|
 | 
						|
	# Add the FDB entry back to the VxLAN driver and make sure it is
 | 
						|
	# marked as offloaded in both drivers
 | 
						|
	RET=0
 | 
						|
 | 
						|
	bridge fdb add de:ad:be:ef:13:37 dev vxlan10 self dst $LOCAL_IP_2
 | 
						|
	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
 | 
						|
		de:ad:be:ef:13:37 self bridge fdb show brport vxlan10
 | 
						|
	check_err $?
 | 
						|
	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
 | 
						|
		de:ad:be:ef:13:37 self -v bridge fdb show brport vxlan10
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	log_test "vxlan entry offload indication - after re-add to vxlan"
 | 
						|
 | 
						|
	bridge fdb del de:ad:be:ef:13:37 dev vxlan10 self master vlan 10
 | 
						|
}
 | 
						|
 | 
						|
offload_indication_vlan_aware_decap_route_test()
 | 
						|
{
 | 
						|
	RET=0
 | 
						|
 | 
						|
	busywait "$TIMEOUT" wait_for_offload \
 | 
						|
		ip $IP_FLAG route show table local $LOCAL_IP_1
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	# Toggle PVID flag on one VxLAN device and make sure route is still
 | 
						|
	# marked as offloaded
 | 
						|
	bridge vlan add vid 10 dev vxlan10 untagged
 | 
						|
 | 
						|
	busywait "$TIMEOUT" wait_for_offload \
 | 
						|
		ip $IP_FLAG route show table local $LOCAL_IP_1
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	# Toggle PVID flag on second VxLAN device and make sure route is no
 | 
						|
	# longer marked as offloaded
 | 
						|
	bridge vlan add vid 20 dev vxlan20 untagged
 | 
						|
 | 
						|
	busywait "$TIMEOUT" not wait_for_offload \
 | 
						|
		ip $IP_FLAG route show table local $LOCAL_IP_1
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	# Toggle PVID flag back and make sure route is marked as offloaded
 | 
						|
	bridge vlan add vid 10 dev vxlan10 pvid untagged
 | 
						|
	bridge vlan add vid 20 dev vxlan20 pvid untagged
 | 
						|
 | 
						|
	busywait "$TIMEOUT" wait_for_offload ip $IP_FLAG route show table local \
 | 
						|
		$LOCAL_IP_1
 | 
						|
	check_err $?
 | 
						|
 | 
						|
	log_test "vxlan decap route - vni map/unmap"
 | 
						|
}
 | 
						|
 | 
						|
offload_indication_vlan_aware_join_vxlan_first()
 | 
						|
{
 | 
						|
	ip link add dev br0 up type bridge mcast_snooping 0 \
 | 
						|
		vlan_filtering 1 vlan_default_pvid 1
 | 
						|
	ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
 | 
						|
		ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
 | 
						|
 | 
						|
	__offload_indication_join_vxlan_first 1
 | 
						|
 | 
						|
	ip link del dev vxlan0
 | 
						|
	ip link del dev br0
 | 
						|
}
 | 
						|
 | 
						|
offload_indication_vlan_aware_join_vxlan_last()
 | 
						|
{
 | 
						|
	ip link add dev br0 up type bridge mcast_snooping 0 \
 | 
						|
		vlan_filtering 1 vlan_default_pvid 1
 | 
						|
	ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
 | 
						|
		ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
 | 
						|
 | 
						|
	__offload_indication_join_vxlan_last
 | 
						|
 | 
						|
	ip link del dev vxlan0
 | 
						|
	ip link del dev br0
 | 
						|
}
 | 
						|
 | 
						|
offload_indication_vlan_aware_l3vni_test()
 | 
						|
{
 | 
						|
	local zmac=00:00:00:00:00:00
 | 
						|
 | 
						|
	RET=0
 | 
						|
 | 
						|
	sysctl_set net.ipv6.conf.default.disable_ipv6 1
 | 
						|
	ip link add dev br0 up type bridge mcast_snooping 0 \
 | 
						|
		vlan_filtering 1 vlan_default_pvid 0
 | 
						|
	ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
 | 
						|
		ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
 | 
						|
 | 
						|
	ip link set dev $swp1 master br0
 | 
						|
 | 
						|
	# The test will use the offload indication on the FDB entry to
 | 
						|
	# understand if the tunnel is offloaded or not
 | 
						|
	bridge fdb append $zmac dev vxlan0 self dst $LOCAL_IP_2
 | 
						|
 | 
						|
	ip link set dev vxlan0 master br0
 | 
						|
	bridge vlan add dev vxlan0 vid 10 pvid untagged
 | 
						|
 | 
						|
	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $zmac self \
 | 
						|
		bridge fdb show brport vxlan0
 | 
						|
	check_err $? "vxlan tunnel not offloaded when should"
 | 
						|
 | 
						|
	# Configure a VLAN interface and make sure tunnel is offloaded
 | 
						|
	ip link add link br0 name br10 up type vlan id 10
 | 
						|
	sysctl_set net.ipv6.conf.br10.disable_ipv6 0
 | 
						|
	ip -6 address add 2001:db8:1::1/64 dev br10
 | 
						|
	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $zmac self \
 | 
						|
		bridge fdb show brport vxlan0
 | 
						|
	check_err $? "vxlan tunnel not offloaded when should"
 | 
						|
 | 
						|
	# Unlink the VXLAN device, make sure tunnel is no longer offloaded,
 | 
						|
	# then add it back to the bridge and make sure it is offloaded
 | 
						|
	ip link set dev vxlan0 nomaster
 | 
						|
	busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb $zmac self \
 | 
						|
		bridge fdb show brport vxlan0
 | 
						|
	check_err $? "vxlan tunnel offloaded after unlinked from bridge"
 | 
						|
 | 
						|
	ip link set dev vxlan0 master br0
 | 
						|
	busywait "$TIMEOUT" not wait_for_offload grep_bridge_fdb $zmac self \
 | 
						|
		bridge fdb show brport vxlan0
 | 
						|
	check_err $? "vxlan tunnel offloaded despite no matching vid"
 | 
						|
 | 
						|
	bridge vlan add dev vxlan0 vid 10 pvid untagged
 | 
						|
	busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb $zmac self \
 | 
						|
		bridge fdb show brport vxlan0
 | 
						|
	check_err $? "vxlan tunnel not offloaded after adding vid"
 | 
						|
 | 
						|
	log_test "vxlan - l3 vni"
 | 
						|
 | 
						|
	ip link del dev vxlan0
 | 
						|
	ip link del dev br0
 | 
						|
	sysctl_restore net.ipv6.conf.default.disable_ipv6
 | 
						|
}
 | 
						|
 | 
						|
offload_indication_vlan_aware_test()
 | 
						|
{
 | 
						|
	offload_indication_vlan_aware_setup_create
 | 
						|
	offload_indication_vlan_aware_fdb_test
 | 
						|
	offload_indication_vlan_aware_decap_route_test
 | 
						|
	offload_indication_vlan_aware_setup_destroy
 | 
						|
 | 
						|
	log_info "offload indication - replay & cleanup - vlan aware"
 | 
						|
	offload_indication_vlan_aware_join_vxlan_first
 | 
						|
	offload_indication_vlan_aware_join_vxlan_last
 | 
						|
	offload_indication_vlan_aware_l3vni_test
 | 
						|
}
 | 
						|
 | 
						|
trap cleanup EXIT
 | 
						|
 | 
						|
setup_prepare
 | 
						|
setup_wait
 | 
						|
 | 
						|
tests_run
 | 
						|
 | 
						|
exit $EXIT_STATUS
 |