Merge branch 'mlxsw-tests'

Amit Cohen says:

====================
mlxsw: Add tests for VxLAN with IPv6 underlay

mlxsw driver lately added support for VxLAN with IPv6 underlay.
This set adds tests for IPv6, which are dedicated for mlxsw.

Patch set overview:
Patches #1-#2 make vxlan.sh test more flexible and extend it for IPv6
Patches #3-#4 make vxlan_fdb_veto.sh test more flexible and extend it
for IPv6
Patches #5-#6 add tests for VxLAN flooding for different ASICs
Patches #7-#8 add test for VxLAN related traps and align the existing
test
====================

Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
David S. Miller 2021-12-23 11:24:01 +00:00
commit bb53bcb2b1
8 changed files with 1232 additions and 113 deletions

View File

@ -217,9 +217,11 @@ short_payload_get()
dest_mac=$(mac_get $h1)
p=$(:
)"08:"$( : VXLAN flags
)"01:00:00:"$( : VXLAN reserved
)"00:00:00:"$( : VXLAN reserved
)"00:03:e8:"$( : VXLAN VNI : 1000
)"00:"$( : VXLAN reserved
)"$dest_mac:"$( : ETH daddr
)"00:00:00:00:00:00:"$( : ETH saddr
)
echo $p
}
@ -263,7 +265,8 @@ decap_error_test()
corrupted_packet_test "Decap error: Reserved bits in use" \
"reserved_bits_payload_get"
corrupted_packet_test "Decap error: No L2 header" "short_payload_get"
corrupted_packet_test "Decap error: Too short inner packet" \
"short_payload_get"
}
mc_smac_payload_get()

View File

@ -0,0 +1,342 @@
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
#
# Test devlink-trap tunnel drops and exceptions functionality over mlxsw.
# Check all traps to make sure they are triggered under the right
# conditions.
# +------------------------+
# | H1 (vrf) |
# | + $h1 |
# | | 2001:db8:1::1/64 |
# +----|-------------------+
# |
# +----|----------------------------------------------------------------------+
# | SW | |
# | +--|--------------------------------------------------------------------+ |
# | | + $swp1 BR1 (802.1d) | |
# | | | |
# | | + vx1 (vxlan) | |
# | | local 2001:db8:3::1 | |
# | | id 1000 dstport $VXPORT | |
# | +-----------------------------------------------------------------------+ |
# | |
# | + $rp1 |
# | | 2001:db8:3::1/64 |
# +----|----------------------------------------------------------------------+
# |
# +----|--------------------------------------------------------+
# | | VRF2 |
# | + $rp2 |
# | 2001:db8:3::2/64 |
# | |
# +-------------------------------------------------------------+
lib_dir=$(dirname $0)/../../../net/forwarding
ALL_TESTS="
decap_error_test
overlay_smac_is_mc_test
"
NUM_NETIFS=4
source $lib_dir/lib.sh
source $lib_dir/tc_common.sh
source $lib_dir/devlink_lib.sh
: ${VXPORT:=4789}
export VXPORT
h1_create()
{
simple_if_init $h1 2001:db8:1::1/64
}
h1_destroy()
{
simple_if_fini $h1 2001:db8:1::1/64
}
switch_create()
{
ip link add name br1 type bridge vlan_filtering 0 mcast_snooping 0
# Make sure the bridge uses the MAC address of the local port and not
# that of the VxLAN's device.
ip link set dev br1 address $(mac_get $swp1)
ip link set dev br1 up
tc qdisc add dev $swp1 clsact
ip link set dev $swp1 master br1
ip link set dev $swp1 up
ip link add name vx1 type vxlan id 1000 local 2001:db8:3::1 \
dstport "$VXPORT" nolearning udp6zerocsumrx udp6zerocsumtx \
tos inherit ttl 100
ip link set dev vx1 master br1
ip link set dev vx1 up
ip link set dev $rp1 up
ip address add dev $rp1 2001:db8:3::1/64
}
switch_destroy()
{
ip address del dev $rp1 2001:db8:3::1/64
ip link set dev $rp1 down
ip link set dev vx1 down
ip link set dev vx1 nomaster
ip link del dev vx1
ip link set dev $swp1 down
ip link set dev $swp1 nomaster
tc qdisc del dev $swp1 clsact
ip link set dev br1 down
ip link del dev br1
}
vrf2_create()
{
simple_if_init $rp2 2001:db8:3::2/64
}
vrf2_destroy()
{
simple_if_fini $rp2 2001:db8:3::2/64
}
setup_prepare()
{
h1=${NETIFS[p1]}
swp1=${NETIFS[p2]}
rp1=${NETIFS[p3]}
rp2=${NETIFS[p4]}
vrf_prepare
forwarding_enable
h1_create
switch_create
vrf2_create
}
cleanup()
{
pre_cleanup
vrf2_destroy
switch_destroy
h1_destroy
forwarding_restore
vrf_cleanup
}
ecn_payload_get()
{
local dest_mac=$(mac_get $h1)
local saddr="20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:03"
local daddr="20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:01"
p=$(:
)"08:"$( : VXLAN flags
)"00:00:00:"$( : VXLAN reserved
)"00:03:e8:"$( : VXLAN VNI : 1000
)"00:"$( : VXLAN reserved
)"$dest_mac:"$( : ETH daddr
)"00:00:00:00:00:00:"$( : ETH saddr
)"86:dd:"$( : ETH type
)"6"$( : IP version
)"0:0"$( : Traffic class
)"0:00:00:"$( : Flow label
)"00:08:"$( : Payload length
)"3a:"$( : Next header
)"04:"$( : Hop limit
)"$saddr:"$( : IP saddr
)"$daddr:"$( : IP daddr
)"80:"$( : ICMPv6.type
)"00:"$( : ICMPv6.code
)"00:"$( : ICMPv6.checksum
)
echo $p
}
ecn_decap_test()
{
local trap_name="decap_error"
local desc=$1; shift
local ecn_desc=$1; shift
local outer_tos=$1; shift
local mz_pid
RET=0
tc filter add dev $swp1 egress protocol ipv6 pref 1 handle 101 \
flower src_ip 2001:db8:1::3 dst_ip 2001:db8:1::1 action pass
rp1_mac=$(mac_get $rp1)
payload=$(ecn_payload_get)
ip vrf exec v$rp2 $MZ -6 $rp2 -c 0 -d 1msec -b $rp1_mac \
-B 2001:db8:3::1 -t udp \
sp=12345,dp=$VXPORT,tos=$outer_tos,p=$payload -q &
mz_pid=$!
devlink_trap_exception_test $trap_name
tc_check_packets "dev $swp1 egress" 101 0
check_err $? "Packets were not dropped"
log_test "$desc: Inner ECN is not ECT and outer is $ecn_desc"
kill $mz_pid && wait $mz_pid &> /dev/null
tc filter del dev $swp1 egress protocol ipv6 pref 1 handle 101 flower
}
reserved_bits_payload_get()
{
local dest_mac=$(mac_get $h1)
local saddr="20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:03"
local daddr="20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:01"
p=$(:
)"08:"$( : VXLAN flags
)"01:00:00:"$( : VXLAN reserved
)"00:03:e8:"$( : VXLAN VNI : 1000
)"00:"$( : VXLAN reserved
)"$dest_mac:"$( : ETH daddr
)"00:00:00:00:00:00:"$( : ETH saddr
)"86:dd:"$( : ETH type
)"6"$( : IP version
)"0:0"$( : Traffic class
)"0:00:00:"$( : Flow label
)"00:08:"$( : Payload length
)"3a:"$( : Next header
)"04:"$( : Hop limit
)"$saddr:"$( : IP saddr
)"$daddr:"$( : IP daddr
)"80:"$( : ICMPv6.type
)"00:"$( : ICMPv6.code
)"00:"$( : ICMPv6.checksum
)
echo $p
}
short_payload_get()
{
dest_mac=$(mac_get $h1)
p=$(:
)"08:"$( : VXLAN flags
)"00:00:00:"$( : VXLAN reserved
)"00:03:e8:"$( : VXLAN VNI : 1000
)"00:"$( : VXLAN reserved
)"$dest_mac:"$( : ETH daddr
)"00:00:00:00:00:00:"$( : ETH saddr
)
echo $p
}
corrupted_packet_test()
{
local trap_name="decap_error"
local desc=$1; shift
local payload_get=$1; shift
local mz_pid
RET=0
# In case of too short packet, there is no any inner packet,
# so the matching will always succeed
tc filter add dev $swp1 egress protocol ipv6 pref 1 handle 101 \
flower skip_hw src_ip 2001:db8:3::1 dst_ip 2001:db8:1::1 \
action pass
rp1_mac=$(mac_get $rp1)
payload=$($payload_get)
ip vrf exec v$rp2 $MZ -6 $rp2 -c 0 -d 1msec -b $rp1_mac \
-B 2001:db8:3::1 -t udp sp=12345,dp=$VXPORT,p=$payload -q &
mz_pid=$!
devlink_trap_exception_test $trap_name
tc_check_packets "dev $swp1 egress" 101 0
check_err $? "Packets were not dropped"
log_test "$desc"
kill $mz_pid && wait $mz_pid &> /dev/null
tc filter del dev $swp1 egress protocol ipv6 pref 1 handle 101 flower
}
decap_error_test()
{
ecn_decap_test "Decap error" "ECT(1)" 01
ecn_decap_test "Decap error" "ECT(0)" 02
ecn_decap_test "Decap error" "CE" 03
corrupted_packet_test "Decap error: Reserved bits in use" \
"reserved_bits_payload_get"
corrupted_packet_test "Decap error: Too short inner packet" \
"short_payload_get"
}
mc_smac_payload_get()
{
local dest_mac=$(mac_get $h1)
local source_mac="01:02:03:04:05:06"
local saddr="20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:03"
local daddr="20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:01"
p=$(:
)"08:"$( : VXLAN flags
)"00:00:00:"$( : VXLAN reserved
)"00:03:e8:"$( : VXLAN VNI : 1000
)"00:"$( : VXLAN reserved
)"$dest_mac:"$( : ETH daddr
)"$source_mac:"$( : ETH saddr
)"86:dd:"$( : ETH type
)"6"$( : IP version
)"0:0"$( : Traffic class
)"0:00:00:"$( : Flow label
)"00:08:"$( : Payload length
)"3a:"$( : Next header
)"04:"$( : Hop limit
)"$saddr:"$( : IP saddr
)"$daddr:"$( : IP daddr
)"80:"$( : ICMPv6.type
)"00:"$( : ICMPv6.code
)"00:"$( : ICMPv6.checksum
)
echo $p
}
overlay_smac_is_mc_test()
{
local trap_name="overlay_smac_is_mc"
local mz_pid
RET=0
# The matching will be checked on devlink_trap_drop_test()
# and the filter will be removed on devlink_trap_drop_cleanup()
tc filter add dev $swp1 egress protocol ipv6 pref 1 handle 101 \
flower src_mac 01:02:03:04:05:06 action pass
rp1_mac=$(mac_get $rp1)
payload=$(mc_smac_payload_get)
ip vrf exec v$rp2 $MZ -6 $rp2 -c 0 -d 1msec -b $rp1_mac \
-B 2001:db8:3::1 -t udp sp=12345,dp=$VXPORT,p=$payload -q &
mz_pid=$!
devlink_trap_drop_test $trap_name $swp1 101
log_test "Overlay source MAC is multicast"
devlink_trap_drop_cleanup $mz_pid $swp1 "ipv6" 1 101
}
trap cleanup EXIT
setup_prepare
setup_wait
tests_run
exit $EXIT_STATUS

View File

@ -0,0 +1,322 @@
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
#
# Test VxLAN flooding. The device stores flood records in a singly linked list
# where each record stores up to four IPv6 addresses of remote VTEPs. The test
# verifies that packets are correctly flooded in various cases such as deletion
# of a record in the middle of the list.
#
# +-----------------------+
# | H1 (vrf) |
# | + $h1 |
# | | 2001:db8:1::1/64 |
# +----|------------------+
# |
# +----|----------------------------------------------------------------------+
# | SW | |
# | +--|--------------------------------------------------------------------+ |
# | | + $swp1 BR0 (802.1d) | |
# | | | |
# | | + vxlan0 (vxlan) | |
# | | local 2001:db8:2::1 | |
# | | remote 2001:db8:2::{2..17} | |
# | | id 10 dstport 4789 | |
# | +-----------------------------------------------------------------------+ |
# | |
# | 2001:db8:2::0/64 via 2001:db8:3::2 |
# | |
# | + $rp1 |
# | | 2001:db8:3::1/64 |
# +----|----------------------------------------------------------------------+
# |
# +----|--------------------------------------------------------+
# | | R2 (vrf) |
# | + $rp2 |
# | 2001:db8:3::2/64 |
# | |
# +-------------------------------------------------------------+
lib_dir=$(dirname $0)/../../../../net/forwarding
ALL_TESTS="flooding_test"
NUM_NETIFS=4
source $lib_dir/tc_common.sh
source $lib_dir/lib.sh
h1_create()
{
simple_if_init $h1 2001:db8:1::1/64
}
h1_destroy()
{
simple_if_fini $h1 2001:db8:1::1/64
}
switch_create()
{
# Make sure the bridge uses the MAC address of the local port and
# not that of the VxLAN's device
ip link add dev br0 type bridge mcast_snooping 0
ip link set dev br0 address $(mac_get $swp1)
ip link add name vxlan0 type vxlan id 10 nolearning \
udp6zerocsumrx udp6zerocsumtx ttl 20 tos inherit \
local 2001:db8:2::1 dstport 4789
ip address add 2001:db8:2::1/128 dev lo
ip link set dev $swp1 master br0
ip link set dev vxlan0 master br0
ip link set dev br0 up
ip link set dev $swp1 up
ip link set dev vxlan0 up
}
switch_destroy()
{
ip link set dev vxlan0 down
ip link set dev $swp1 down
ip link set dev br0 down
ip link set dev vxlan0 nomaster
ip link set dev $swp1 nomaster
ip address del 2001:db8:2::1/128 dev lo
ip link del dev vxlan0
ip link del dev br0
}
router1_create()
{
# This router is in the default VRF, where the VxLAN device is
# performing the L3 lookup
ip link set dev $rp1 up
ip address add 2001:db8:3::1/64 dev $rp1
ip route add 2001:db8:2::0/64 via 2001:db8:3::2
}
router1_destroy()
{
ip route del 2001:db8:2::0/64 via 2001:db8:3::2
ip address del 2001:db8:3::1/64 dev $rp1
ip link set dev $rp1 down
}
router2_create()
{
# This router is not in the default VRF, so use simple_if_init()
simple_if_init $rp2 2001:db8:3::2/64
}
router2_destroy()
{
simple_if_fini $rp2 2001:db8:3::2/64
}
setup_prepare()
{
h1=${NETIFS[p1]}
swp1=${NETIFS[p2]}
rp1=${NETIFS[p3]}
rp2=${NETIFS[p4]}
vrf_prepare
h1_create
switch_create
router1_create
router2_create
forwarding_enable
}
cleanup()
{
pre_cleanup
forwarding_restore
router2_destroy
router1_destroy
switch_destroy
h1_destroy
vrf_cleanup
}
flooding_remotes_add()
{
local num_remotes=$1
local lsb
local i
for i in $(eval echo {1..$num_remotes}); do
lsb=$((i + 1))
bridge fdb append 00:00:00:00:00:00 dev vxlan0 self \
dst 2001:db8:2::$lsb
done
}
flooding_filters_add()
{
local num_remotes=$1
local lsb
local i
tc qdisc add dev $rp2 clsact
for i in $(eval echo {1..$num_remotes}); do
lsb=$((i + 1))
tc filter add dev $rp2 ingress protocol ipv6 pref $i handle $i \
flower ip_proto udp dst_ip 2001:db8:2::$lsb \
dst_port 4789 skip_sw action drop
done
}
flooding_filters_del()
{
local num_remotes=$1
local i
for i in $(eval echo {1..$num_remotes}); do
tc filter del dev $rp2 ingress protocol ipv6 pref $i \
handle $i flower
done
tc qdisc del dev $rp2 clsact
}
flooding_check_packets()
{
local packets=("$@")
local num_remotes=${#packets[@]}
local i
for i in $(eval echo {1..$num_remotes}); do
tc_check_packets "dev $rp2 ingress" $i ${packets[i - 1]}
check_err $? "remote $i - did not get expected number of packets"
done
}
flooding_test()
{
# Use 16 remote VTEPs that will be stored in 4 records. The array
# 'packets' will store how many packets are expected to be received
# by each remote VTEP at each stage of the test
declare -a packets=(1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
local num_remotes=16
RET=0
# Add FDB entries for remote VTEPs and corresponding tc filters on the
# ingress of the nexthop router. These filters will count how many
# packets were flooded to each remote VTEP
flooding_remotes_add $num_remotes
flooding_filters_add $num_remotes
# Send one packet and make sure it is flooded to all the remote VTEPs
$MZ $h1 -q -p 64 -b de:ad:be:ef:13:37 -t ip -c 1
flooding_check_packets "${packets[@]}"
log_test "flood after 1 packet"
# Delete the third record which corresponds to VTEPs with LSB 10..13
# and check that packet is flooded correctly when we remove a record
# from the middle of the list
RET=0
packets=(2 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2)
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::10
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::11
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::12
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::13
$MZ $h1 -q -p 64 -b de:ad:be:ef:13:37 -t ip -c 1
flooding_check_packets "${packets[@]}"
log_test "flood after 2 packets"
# Delete the first record and make sure the packet is flooded correctly
RET=0
packets=(2 2 2 2 3 3 3 3 1 1 1 1 3 3 3 3)
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::2
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::3
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::4
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::5
$MZ $h1 -q -p 64 -b de:ad:be:ef:13:37 -t ip -c 1
flooding_check_packets "${packets[@]}"
log_test "flood after 3 packets"
# Delete the last record and make sure the packet is flooded correctly
RET=0
packets=(2 2 2 2 4 4 4 4 1 1 1 1 3 3 3 3)
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::14
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::15
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::16
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::17
$MZ -6 $h1 -q -p 64 -b de:ad:be:ef:13:37 -t ip -c 1
flooding_check_packets "${packets[@]}"
log_test "flood after 4 packets"
# Delete the last record, one entry at a time and make sure single
# entries are correctly removed
RET=0
packets=(2 2 2 2 4 5 5 5 1 1 1 1 3 3 3 3)
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::6
$MZ -6 $h1 -q -p 64 -b de:ad:be:ef:13:37 -t ip -c 1
flooding_check_packets "${packets[@]}"
log_test "flood after 5 packets"
RET=0
packets=(2 2 2 2 4 5 6 6 1 1 1 1 3 3 3 3)
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::7
$MZ -6 $h1 -q -p 64 -b de:ad:be:ef:13:37 -t ip -c 1
flooding_check_packets "${packets[@]}"
log_test "flood after 6 packets"
RET=0
packets=(2 2 2 2 4 5 6 7 1 1 1 1 3 3 3 3)
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::8
$MZ -6 $h1 -q -p 64 -b de:ad:be:ef:13:37 -t ip -c 1
flooding_check_packets "${packets[@]}"
log_test "flood after 7 packets"
RET=0
packets=(2 2 2 2 4 5 6 7 1 1 1 1 3 3 3 3)
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::9
$MZ -6 $h1 -q -p 64 -b de:ad:be:ef:13:37 -t ip -c 1
flooding_check_packets "${packets[@]}"
log_test "flood after 8 packets"
flooding_filters_del $num_remotes
}
trap cleanup EXIT
setup_prepare
setup_wait
tests_run
exit $EXIT_STATUS

View File

@ -0,0 +1,334 @@
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
#
# Test VxLAN flooding. The device stores flood records in a singly linked list
# where each record stores up to five IPv6 addresses of remote VTEPs. The test
# verifies that packets are correctly flooded in various cases such as deletion
# of a record in the middle of the list.
#
# +-----------------------+
# | H1 (vrf) |
# | + $h1 |
# | | 2001:db8:1::1/64 |
# +----|------------------+
# |
# +----|----------------------------------------------------------------------+
# | SW | |
# | +--|--------------------------------------------------------------------+ |
# | | + $swp1 BR0 (802.1d) | |
# | | | |
# | | + vxlan0 (vxlan) | |
# | | local 2001:db8:2::1 | |
# | | remote 2001:db8:2::{2..21} | |
# | | id 10 dstport 4789 | |
# | +-----------------------------------------------------------------------+ |
# | |
# | 2001:db8:2::0/64 via 2001:db8:3::2 |
# | |
# | + $rp1 |
# | | 2001:db8:3::1/64 |
# +----|----------------------------------------------------------------------+
# |
# +----|--------------------------------------------------------+
# | | R2 (vrf) |
# | + $rp2 |
# | 2001:db8:3::2/64 |
# | |
# +-------------------------------------------------------------+
lib_dir=$(dirname $0)/../../../../net/forwarding
ALL_TESTS="flooding_test"
NUM_NETIFS=4
source $lib_dir/tc_common.sh
source $lib_dir/lib.sh
h1_create()
{
simple_if_init $h1 2001:db8:1::1/64
}
h1_destroy()
{
simple_if_fini $h1 2001:db8:1::1/64
}
switch_create()
{
# Make sure the bridge uses the MAC address of the local port and
# not that of the VxLAN's device
ip link add dev br0 type bridge mcast_snooping 0
ip link set dev br0 address $(mac_get $swp1)
ip link add name vxlan0 type vxlan id 10 nolearning \
udp6zerocsumrx udp6zerocsumtx ttl 20 tos inherit \
local 2001:db8:2::1 dstport 4789
ip address add 2001:db8:2::1/128 dev lo
ip link set dev $swp1 master br0
ip link set dev vxlan0 master br0
ip link set dev br0 up
ip link set dev $swp1 up
ip link set dev vxlan0 up
}
switch_destroy()
{
ip link set dev vxlan0 down
ip link set dev $swp1 down
ip link set dev br0 down
ip link set dev vxlan0 nomaster
ip link set dev $swp1 nomaster
ip address del 2001:db8:2::1/128 dev lo
ip link del dev vxlan0
ip link del dev br0
}
router1_create()
{
# This router is in the default VRF, where the VxLAN device is
# performing the L3 lookup
ip link set dev $rp1 up
ip address add 2001:db8:3::1/64 dev $rp1
ip route add 2001:db8:2::0/64 via 2001:db8:3::2
}
router1_destroy()
{
ip route del 2001:db8:2::0/64 via 2001:db8:3::2
ip address del 2001:db8:3::1/64 dev $rp1
ip link set dev $rp1 down
}
router2_create()
{
# This router is not in the default VRF, so use simple_if_init()
simple_if_init $rp2 2001:db8:3::2/64
}
router2_destroy()
{
simple_if_fini $rp2 2001:db8:3::2/64
}
setup_prepare()
{
h1=${NETIFS[p1]}
swp1=${NETIFS[p2]}
rp1=${NETIFS[p3]}
rp2=${NETIFS[p4]}
vrf_prepare
h1_create
switch_create
router1_create
router2_create
forwarding_enable
}
cleanup()
{
pre_cleanup
forwarding_restore
router2_destroy
router1_destroy
switch_destroy
h1_destroy
vrf_cleanup
}
flooding_remotes_add()
{
local num_remotes=$1
local lsb
local i
for i in $(eval echo {1..$num_remotes}); do
lsb=$((i + 1))
bridge fdb append 00:00:00:00:00:00 dev vxlan0 self \
dst 2001:db8:2::$lsb
done
}
flooding_filters_add()
{
local num_remotes=$1
local lsb
local i
tc qdisc add dev $rp2 clsact
for i in $(eval echo {1..$num_remotes}); do
lsb=$((i + 1))
tc filter add dev $rp2 ingress protocol ipv6 pref $i handle $i \
flower ip_proto udp dst_ip 2001:db8:2::$lsb \
dst_port 4789 skip_sw action drop
done
}
flooding_filters_del()
{
local num_remotes=$1
local i
for i in $(eval echo {1..$num_remotes}); do
tc filter del dev $rp2 ingress protocol ipv6 pref $i \
handle $i flower
done
tc qdisc del dev $rp2 clsact
}
flooding_check_packets()
{
local packets=("$@")
local num_remotes=${#packets[@]}
local i
for i in $(eval echo {1..$num_remotes}); do
tc_check_packets "dev $rp2 ingress" $i ${packets[i - 1]}
check_err $? "remote $i - did not get expected number of packets"
done
}
flooding_test()
{
# Use 20 remote VTEPs that will be stored in 4 records. The array
# 'packets' will store how many packets are expected to be received
# by each remote VTEP at each stage of the test
declare -a packets=(1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
local num_remotes=20
RET=0
# Add FDB entries for remote VTEPs and corresponding tc filters on the
# ingress of the nexthop router. These filters will count how many
# packets were flooded to each remote VTEP
flooding_remotes_add $num_remotes
flooding_filters_add $num_remotes
# Send one packet and make sure it is flooded to all the remote VTEPs
$MZ -6 $h1 -q -p 64 -b de:ad:be:ef:13:37 -t ip -c 1
flooding_check_packets "${packets[@]}"
log_test "flood after 1 packet"
# Delete the third record which corresponds to VTEPs with LSB 12..16
# and check that packet is flooded correctly when we remove a record
# from the middle of the list
RET=0
packets=(2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 2 2 2 2 2)
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::12
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::13
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::14
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::15
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::16
$MZ -6 $h1 -q -p 64 -b de:ad:be:ef:13:37 -t ip -c 1
flooding_check_packets "${packets[@]}"
log_test "flood after 2 packets"
# Delete the first record and make sure the packet is flooded correctly
RET=0
packets=(2 2 2 2 2 3 3 3 3 3 1 1 1 1 1 3 3 3 3 3)
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::2
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::3
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::4
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::5
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::6
$MZ -6 $h1 -q -p 64 -b de:ad:be:ef:13:37 -t ip -c 1
flooding_check_packets "${packets[@]}"
log_test "flood after 3 packets"
# Delete the last record and make sure the packet is flooded correctly
RET=0
packets=(2 2 2 2 2 4 4 4 4 4 1 1 1 1 1 3 3 3 3 3)
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::17
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::18
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::19
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::20
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::21
$MZ -6 $h1 -q -p 64 -b de:ad:be:ef:13:37 -t ip -c 1
flooding_check_packets "${packets[@]}"
log_test "flood after 4 packets"
# Delete the last record, one entry at a time and make sure single
# entries are correctly removed
RET=0
packets=(2 2 2 2 2 4 5 5 5 5 1 1 1 1 1 3 3 3 3 3)
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::7
$MZ -6 $h1 -q -p 64 -b de:ad:be:ef:13:37 -t ip -c 1
flooding_check_packets "${packets[@]}"
log_test "flood after 5 packets"
RET=0
packets=(2 2 2 2 2 4 5 6 6 6 1 1 1 1 1 3 3 3 3 3)
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::8
$MZ -6 $h1 -q -p 64 -b de:ad:be:ef:13:37 -t ip -c 1
flooding_check_packets "${packets[@]}"
log_test "flood after 6 packets"
RET=0
packets=(2 2 2 2 2 4 5 6 7 7 1 1 1 1 1 3 3 3 3 3)
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::9
$MZ -6 $h1 -q -p 64 -b de:ad:be:ef:13:37 -t ip -c 1
flooding_check_packets "${packets[@]}"
log_test "flood after 7 packets"
RET=0
packets=(2 2 2 2 2 4 5 6 7 8 1 1 1 1 1 3 3 3 3 3)
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::10
$MZ -6 $h1 -q -p 64 -b de:ad:be:ef:13:37 -t ip -c 1
flooding_check_packets "${packets[@]}"
log_test "flood after 8 packets"
RET=0
packets=(2 2 2 2 2 4 5 6 7 8 1 1 1 1 1 3 3 3 3 3)
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 2001:db8:2::11
$MZ -6 $h1 -q -p 64 -b de:ad:be:ef:13:37 -t ip -c 1
flooding_check_packets "${packets[@]}"
log_test "flood after 9 packets"
flooding_filters_del $num_remotes
}
trap cleanup EXIT
setup_prepare
setup_wait
tests_run
exit $EXIT_STATUS

View File

@ -4,10 +4,35 @@
# Test various aspects of VxLAN offloading which are specific to mlxsw, such
# as sanitization of invalid configurations and offload indication.
lib_dir=$(dirname $0)/../../../net/forwarding
: ${ADDR_FAMILY:=ipv4}
export ADDR_FAMILY
ALL_TESTS="sanitization_test offload_indication_test \
sanitization_vlan_aware_test offload_indication_vlan_aware_test"
: ${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
@ -63,8 +88,8 @@ sanitization_single_dev_valid_test()
ip link add dev br0 type bridge mcast_snooping 0
ip link add name vxlan0 up type vxlan id 10 nolearning noudpcsum \
ttl 20 tos inherit local 198.51.100.1 dstport 4789
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
@ -80,8 +105,8 @@ sanitization_single_dev_vlan_aware_test()
ip link add dev br0 type bridge mcast_snooping 0 vlan_filtering 1
ip link add name vxlan0 up type vxlan id 10 nolearning noudpcsum \
ttl 20 tos inherit local 198.51.100.1 dstport 4789
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
@ -97,8 +122,8 @@ sanitization_single_dev_mcast_enabled_test()
ip link add dev br0 type bridge
ip link add name vxlan0 up type vxlan id 10 nolearning noudpcsum \
ttl 20 tos inherit local 198.51.100.1 dstport 4789
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
@ -115,9 +140,9 @@ sanitization_single_dev_mcast_group_test()
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 noudpcsum \
ttl 20 tos inherit local 198.51.100.1 dstport 4789 \
dev dummy1 group 239.0.0.1
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
@ -134,7 +159,7 @@ sanitization_single_dev_no_local_ip_test()
ip link add dev br0 type bridge mcast_snooping 0
ip link add name vxlan0 up type vxlan id 10 nolearning noudpcsum \
ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
ttl 20 tos inherit dstport 4789
sanitization_single_dev_test_fail
@ -145,14 +170,14 @@ sanitization_single_dev_no_local_ip_test()
log_test "vxlan device with no local ip"
}
sanitization_single_dev_learning_enabled_test()
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 noudpcsum \
ttl 20 tos inherit local 198.51.100.1 dstport 4789
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
@ -169,8 +194,8 @@ sanitization_single_dev_local_interface_test()
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 noudpcsum \
ttl 20 tos inherit local 198.51.100.1 dstport 4789 dev dummy1
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
@ -187,8 +212,8 @@ sanitization_single_dev_port_range_test()
ip link add dev br0 type bridge mcast_snooping 0
ip link add name vxlan0 up type vxlan id 10 nolearning noudpcsum \
ttl 20 tos inherit local 198.51.100.1 dstport 4789 \
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
@ -205,8 +230,8 @@ sanitization_single_dev_tos_static_test()
ip link add dev br0 type bridge mcast_snooping 0
ip link add name vxlan0 up type vxlan id 10 nolearning noudpcsum \
ttl 20 tos 20 local 198.51.100.1 dstport 4789
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
@ -222,8 +247,8 @@ sanitization_single_dev_ttl_inherit_test()
ip link add dev br0 type bridge mcast_snooping 0
ip link add name vxlan0 up type vxlan id 10 nolearning noudpcsum \
ttl inherit tos inherit local 198.51.100.1 dstport 4789
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
@ -233,14 +258,14 @@ sanitization_single_dev_ttl_inherit_test()
log_test "vxlan device with inherit ttl"
}
sanitization_single_dev_udp_checksum_test()
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 198.51.100.1 dstport 4789
ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
sanitization_single_dev_test_fail
@ -259,12 +284,12 @@ sanitization_single_dev_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_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_test
sanitization_single_dev_udp_checksum_"$ADDR_FAMILY"_test
}
sanitization_multi_devs_test_pass()
@ -316,10 +341,10 @@ sanitization_multi_devs_valid_test()
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 noudpcsum \
ttl 20 tos inherit local 198.51.100.1 dstport 4789
ip link add name vxlan1 up type vxlan id 20 nolearning noudpcsum \
ttl 20 tos inherit local 198.51.100.1 dstport 4789
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
@ -338,10 +363,10 @@ sanitization_multi_devs_ttl_test()
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 noudpcsum \
ttl 20 tos inherit local 198.51.100.1 dstport 4789
ip link add name vxlan1 up type vxlan id 20 nolearning noudpcsum \
ttl 40 tos inherit local 198.51.100.1 dstport 4789
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
@ -360,10 +385,10 @@ sanitization_multi_devs_udp_dstport_test()
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 noudpcsum \
ttl 20 tos inherit local 198.51.100.1 dstport 4789
ip link add name vxlan1 up type vxlan id 20 nolearning noudpcsum \
ttl 20 tos inherit local 198.51.100.1 dstport 5789
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
@ -382,10 +407,10 @@ sanitization_multi_devs_local_ip_test()
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 noudpcsum \
ttl 20 tos inherit local 198.51.100.1 dstport 4789
ip link add name vxlan1 up type vxlan id 20 nolearning noudpcsum \
ttl 20 tos inherit local 198.51.100.2 dstport 4789
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
@ -425,12 +450,12 @@ offload_indication_setup_create()
ip link set dev $swp1 master br0
ip link set dev $swp2 master br1
ip address add 198.51.100.1/32 dev lo
ip address add $LOCAL_IP_1/$PREFIX_LEN dev lo
ip link add name vxlan0 up master br0 type vxlan id 10 nolearning \
noudpcsum ttl 20 tos inherit local 198.51.100.1 dstport 4789
$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 \
noudpcsum ttl 20 tos inherit local 198.51.100.1 dstport 4789
$UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
}
offload_indication_setup_destroy()
@ -438,7 +463,7 @@ offload_indication_setup_destroy()
ip link del dev vxlan1
ip link del dev vxlan0
ip address del 198.51.100.1/32 dev lo
ip address del $LOCAL_IP_1/$PREFIX_LEN dev lo
ip link set dev $swp2 nomaster
ip link set dev $swp1 nomaster
@ -451,7 +476,7 @@ offload_indication_fdb_flood_test()
{
RET=0
bridge fdb append 00:00:00:00:00:00 dev vxlan0 self dst 198.51.100.2
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
@ -467,7 +492,7 @@ offload_indication_fdb_bridge_test()
RET=0
bridge fdb add de:ad:be:ef:13:37 dev vxlan0 self master static \
dst 198.51.100.2
dst $LOCAL_IP_2
busywait "$TIMEOUT" wait_for_offload grep_bridge_fdb \
de:ad:be:ef:13:37 self bridge fdb show brport vxlan0
@ -518,7 +543,7 @@ offload_indication_fdb_bridge_test()
# marked as offloaded in both drivers
RET=0
bridge fdb add de:ad:be:ef:13:37 dev vxlan0 self dst 198.51.100.2
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 $?
@ -542,17 +567,17 @@ offload_indication_decap_route_test()
RET=0
busywait "$TIMEOUT" wait_for_offload \
ip route show table local 198.51.100.1
ip $IP_FLAG route show table local $LOCAL_IP_1
check_err $?
ip link set dev vxlan0 down
busywait "$TIMEOUT" wait_for_offload \
ip route show table local 198.51.100.1
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 route show table local 198.51.100.1
ip $IP_FLAG route show table local $LOCAL_IP_1
check_err $?
log_test "vxlan decap route - vxlan device down"
@ -561,26 +586,26 @@ offload_indication_decap_route_test()
ip link set dev vxlan1 up
busywait "$TIMEOUT" wait_for_offload \
ip route show table local 198.51.100.1
ip $IP_FLAG route show table local $LOCAL_IP_1
check_err $?
ip link set dev vxlan0 up
busywait "$TIMEOUT" wait_for_offload \
ip route show table local 198.51.100.1
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 198.51.100.1/32 dev lo
ip address delete $LOCAL_IP_1/$PREFIX_LEN dev lo
busywait "$TIMEOUT" not wait_for_offload \
ip route show table local 198.51.100.1
ip $IP_FLAG route show table local $LOCAL_IP_1
check_err $?
ip address add 198.51.100.1/32 dev lo
ip address add $LOCAL_IP_1/$PREFIX_LEN dev lo
busywait "$TIMEOUT" wait_for_offload \
ip route show table local 198.51.100.1
ip $IP_FLAG route show table local $LOCAL_IP_1
check_err $?
log_test "vxlan decap route - add local route"
@ -589,18 +614,18 @@ offload_indication_decap_route_test()
ip link set dev $swp1 nomaster
busywait "$TIMEOUT" wait_for_offload \
ip route show table local 198.51.100.1
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 route show table local 198.51.100.1
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 route show table local 198.51.100.1
ip $IP_FLAG route show table local $LOCAL_IP_1
check_err $?
log_test "vxlan decap route - local ports enslavement"
@ -609,12 +634,12 @@ offload_indication_decap_route_test()
ip link del dev br0
busywait "$TIMEOUT" wait_for_offload \
ip route show table local 198.51.100.1
ip $IP_FLAG route show table local $LOCAL_IP_1
check_err $?
ip link del dev br1
busywait "$TIMEOUT" not wait_for_offload \
ip route show table local 198.51.100.1
ip $IP_FLAG route show table local $LOCAL_IP_1
check_err $?
log_test "vxlan decap route - bridge device deletion"
@ -628,25 +653,25 @@ offload_indication_decap_route_test()
ip link set dev vxlan0 master br0
ip link set dev vxlan1 master br1
busywait "$TIMEOUT" wait_for_offload \
ip route show table local 198.51.100.1
ip $IP_FLAG route show table local $LOCAL_IP_1
check_err $?
ip link del dev vxlan0
busywait "$TIMEOUT" wait_for_offload \
ip route show table local 198.51.100.1
ip $IP_FLAG route show table local $LOCAL_IP_1
check_err $?
ip link del dev vxlan1
busywait "$TIMEOUT" not wait_for_offload \
ip route show table local 198.51.100.1
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 \
noudpcsum ttl 20 tos inherit local 198.51.100.1 dstport 4789
$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 \
noudpcsum ttl 20 tos inherit local 198.51.100.1 dstport 4789
$UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
}
check_fdb_offloaded()
@ -703,10 +728,10 @@ __offload_indication_join_vxlan_first()
local mac=00:11:22:33:44:55
local zmac=00:00:00:00:00:00
bridge fdb append $zmac dev vxlan0 self dst 198.51.100.2
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 198.51.100.2
bridge fdb add dev vxlan0 $mac self master static dst $LOCAL_IP_2
RET=0
check_vxlan_fdb_not_offloaded
@ -756,8 +781,8 @@ __offload_indication_join_vxlan_first()
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 noudpcsum \
ttl 20 tos inherit local 198.51.100.1 dstport 4789
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
@ -771,7 +796,7 @@ __offload_indication_join_vxlan_last()
RET=0
bridge fdb append $zmac dev vxlan0 self dst 198.51.100.2
bridge fdb append $zmac dev vxlan0 self dst $LOCAL_IP_2
ip link set dev $swp1 master br0
@ -791,8 +816,8 @@ __offload_indication_join_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 noudpcsum \
ttl 20 tos inherit local 198.51.100.1 dstport 4789
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
@ -819,10 +844,10 @@ sanitization_vlan_aware_test()
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 \
noudpcsum ttl 20 tos inherit local 198.51.100.1 dstport 4789
$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 \
noudpcsum ttl 20 tos inherit local 198.51.100.1 dstport 4789
$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
@ -866,20 +891,20 @@ sanitization_vlan_aware_test()
# Use the offload indication of the local route to ensure the VXLAN
# configuration was correctly rollbacked.
ip address add 198.51.100.1/32 dev lo
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 route show table local 198.51.100.1
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 198.51.100.1/32 dev lo
ip address del $LOCAL_IP_1/$PREFIX_LEN dev lo
ip link del dev vxlan20
ip link del dev vxlan10
@ -898,12 +923,12 @@ offload_indication_vlan_aware_setup_create()
bridge vlan add vid 10 dev $swp1
bridge vlan add vid 20 dev $swp1
ip address add 198.51.100.1/32 dev lo
ip address add $LOCAL_IP_1/$PREFIX_LEN dev lo
ip link add name vxlan10 up master br0 type vxlan id 10 nolearning \
noudpcsum ttl 20 tos inherit local 198.51.100.1 dstport 4789
$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 \
noudpcsum ttl 20 tos inherit local 198.51.100.1 dstport 4789
$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
@ -917,7 +942,7 @@ offload_indication_vlan_aware_setup_destroy()
ip link del dev vxlan20
ip link del dev vxlan10
ip address del 198.51.100.1/32 dev lo
ip address del $LOCAL_IP_1/$PREFIX_LEN dev lo
bridge vlan del vid 20 dev $swp1
bridge vlan del vid 10 dev $swp1
@ -934,7 +959,7 @@ offload_indication_vlan_aware_fdb_test()
log_info "vxlan entry offload indication - vlan-aware"
bridge fdb add de:ad:be:ef:13:37 dev vxlan10 self master static \
dst 198.51.100.2 vlan 10
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
@ -985,7 +1010,7 @@ offload_indication_vlan_aware_fdb_test()
# marked as offloaded in both drivers
RET=0
bridge fdb add de:ad:be:ef:13:37 dev vxlan10 self dst 198.51.100.2
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 $?
@ -1003,7 +1028,7 @@ offload_indication_vlan_aware_decap_route_test()
RET=0
busywait "$TIMEOUT" wait_for_offload \
ip route show table local 198.51.100.1
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
@ -1011,7 +1036,7 @@ offload_indication_vlan_aware_decap_route_test()
bridge vlan add vid 10 dev vxlan10 untagged
busywait "$TIMEOUT" wait_for_offload \
ip route show table local 198.51.100.1
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
@ -1019,14 +1044,15 @@ offload_indication_vlan_aware_decap_route_test()
bridge vlan add vid 20 dev vxlan20 untagged
busywait "$TIMEOUT" not wait_for_offload \
ip route show table local 198.51.100.1
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 route show table local 198.51.100.1
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"
@ -1036,8 +1062,8 @@ 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 noudpcsum \
ttl 20 tos inherit local 198.51.100.1 dstport 4789
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
@ -1049,8 +1075,8 @@ 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 noudpcsum \
ttl 20 tos inherit local 198.51.100.1 dstport 4789
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
@ -1067,14 +1093,14 @@ offload_indication_vlan_aware_l3vni_test()
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 noudpcsum \
ttl 20 tos inherit local 198.51.100.1 dstport 4789
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 192.0.2.1
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

View File

@ -4,6 +4,21 @@
# Test vetoing of FDB entries that mlxsw can not offload. This exercises several
# different veto vectors to test various rollback scenarios in the vxlan driver.
: ${LOCAL_IP:=198.51.100.1}
export LOCAL_IP
: ${REMOTE_IP_1:=198.51.100.2}
export REMOTE_IP_1
: ${REMOTE_IP_2:=198.51.100.3}
export REMOTE_IP_2
: ${UDPCSUM_FLAFS:=noudpcsum}
export UDPCSUM_FLAFS
: ${MC_IP:=224.0.0.1}
export MC_IP
lib_dir=$(dirname $0)/../../../net/forwarding
ALL_TESTS="
@ -26,8 +41,8 @@ setup_prepare()
ip link set dev $swp1 master br0
ip link set dev $swp2 up
ip link add name vxlan0 up type vxlan id 10 nolearning noudpcsum \
ttl 20 tos inherit local 198.51.100.1 dstport 4789
ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
ttl 20 tos inherit local $LOCAL_IP dstport 4789
ip link set dev vxlan0 master br0
}
@ -50,11 +65,11 @@ fdb_create_veto_test()
RET=0
bridge fdb add 01:02:03:04:05:06 dev vxlan0 self static \
dst 198.51.100.2 2>/dev/null
dst $REMOTE_IP_1 2>/dev/null
check_fail $? "multicast MAC not rejected"
bridge fdb add 01:02:03:04:05:06 dev vxlan0 self static \
dst 198.51.100.2 2>&1 >/dev/null | grep -q mlxsw_spectrum
dst $REMOTE_IP_1 2>&1 >/dev/null | grep -q mlxsw_spectrum
check_err $? "multicast MAC rejected without extack"
log_test "vxlan FDB veto - create"
@ -65,15 +80,15 @@ fdb_replace_veto_test()
RET=0
bridge fdb add 00:01:02:03:04:05 dev vxlan0 self static \
dst 198.51.100.2
dst $REMOTE_IP_1
check_err $? "valid FDB rejected"
bridge fdb replace 00:01:02:03:04:05 dev vxlan0 self static \
dst 198.51.100.2 port 1234 2>/dev/null
dst $REMOTE_IP_1 port 1234 2>/dev/null
check_fail $? "FDB with an explicit port not rejected"
bridge fdb replace 00:01:02:03:04:05 dev vxlan0 self static \
dst 198.51.100.2 port 1234 2>&1 >/dev/null \
dst $REMOTE_IP_1 port 1234 2>&1 >/dev/null \
| grep -q mlxsw_spectrum
check_err $? "FDB with an explicit port rejected without extack"
@ -85,15 +100,15 @@ fdb_append_veto_test()
RET=0
bridge fdb add 00:00:00:00:00:00 dev vxlan0 self static \
dst 198.51.100.2
dst $REMOTE_IP_1
check_err $? "valid FDB rejected"
bridge fdb append 00:00:00:00:00:00 dev vxlan0 self static \
dst 198.51.100.3 port 1234 2>/dev/null
dst $REMOTE_IP_2 port 1234 2>/dev/null
check_fail $? "FDB with an explicit port not rejected"
bridge fdb append 00:00:00:00:00:00 dev vxlan0 self static \
dst 198.51.100.3 port 1234 2>&1 >/dev/null \
dst $REMOTE_IP_2 port 1234 2>&1 >/dev/null \
| grep -q mlxsw_spectrum
check_err $? "FDB with an explicit port rejected without extack"
@ -105,11 +120,11 @@ fdb_changelink_veto_test()
RET=0
ip link set dev vxlan0 type vxlan \
group 224.0.0.1 dev lo 2>/dev/null
group $MC_IP dev lo 2>/dev/null
check_fail $? "FDB with a multicast IP not rejected"
ip link set dev vxlan0 type vxlan \
group 224.0.0.1 dev lo 2>&1 >/dev/null \
group $MC_IP dev lo 2>&1 >/dev/null \
| grep -q mlxsw_spectrum
check_err $? "FDB with a multicast IP rejected without extack"

View File

@ -0,0 +1,12 @@
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
# A wrapper to run VXLAN test for IPv6.
LOCAL_IP=2001:db8:1::1
REMOTE_IP_1=2001:db8:2::1
REMOTE_IP_2=2001:db8:3::1
UDPCSUM_FLAFS="udp6zerocsumrx udp6zerocsumtx"
MC_IP=FF02::2
source vxlan_fdb_veto.sh

View File

@ -0,0 +1,65 @@
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
# A wrapper to run VXLAN test for IPv6.
ADDR_FAMILY=ipv6
LOCAL_IP_1=2001:db8:1::1
LOCAL_IP_2=2001:db8:1::2
PREFIX_LEN=128
UDPCSUM_FLAFS="udp6zerocsumrx udp6zerocsumtx"
MC_IP=FF02::2
IP_FLAG="-6"
ALL_TESTS="
sanitization_test
offload_indication_test
sanitization_vlan_aware_test
offload_indication_vlan_aware_test
"
sanitization_single_dev_learning_enabled_ipv6_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_fail
ip link del dev vxlan0
ip link del dev br0
log_test "vxlan device with learning enabled"
}
sanitization_single_dev_udp_checksum_ipv6_test()
{
RET=0
ip link add dev br0 type bridge mcast_snooping 0
ip link add name vxlan0 up type vxlan id 10 nolearning \
noudp6zerocsumrx udp6zerocsumtx ttl 20 tos inherit \
local $LOCAL_IP_1 dstport 4789
sanitization_single_dev_test_fail
log_test "vxlan device without zero udp checksum at RX"
ip link del dev vxlan0
ip link add name vxlan0 up type vxlan id 10 nolearning \
udp6zerocsumrx noudp6zerocsumtx ttl 20 tos inherit \
local $LOCAL_IP_1 dstport 4789
sanitization_single_dev_test_fail
log_test "vxlan device without zero udp checksum at TX"
ip link del dev vxlan0
ip link del dev br0
}
source vxlan.sh