Commit 43478201 authored by David S. Miller's avatar David S. Miller

Merge branch 'selftests-Add-tests-for-VXLAN-at-an-802-1d-bridge'

Ido Schimmel says:

====================
selftests: Add tests for VXLAN at an 802.1d bridge

Petr says:

This patchset adds several tests for VXLAN attached to an 802.1d bridge
and fixes a related bug.

First patch #1 fixes a bug in propagating SKB already-forwarded marks
over veth to bridges, where they are irrelevant. This bug causes the
vxlan_bridge_1d test suite from this patchset to fail as the packets
aren't forwarded by br2.

In patches #2 and #3, lib.sh is extended to support network namespaces.
The use of namespaces is necessitated by VXLAN, which allows only one
VXLAN device with a given VNI per namespace. Thus to host full topology
on a single box for selftests, the "remote" endpoints need to be in
namespaces.

In patches #4-#6, lib.sh is extended in other ways to facilitate the
following patches.

In patches #7-#15, first the skeleton, and later the generic tests
themselves are added.

Patch #16 then adds another test that serves as a wrapper around the
previous one, and runs it with a non-default port number.

Patches #17 and #18 add mlxsw-specific tests. About those, Ido writes:

The first test creates various configurations with regards to the VxLAN
and bridge devices and makes sure the driver correctly forbids
unsupported configuration and permits supported ones. It also verifies
that the driver correctly sets the offload indication on FDB entries and
the local route used for VxLAN decapsulation.

The second test verifies that the driver correctly configures the singly
linked list used to flood BUM traffic and that traffic is flooded as
expected.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 7abaf9a8 94d302de
......@@ -4882,6 +4882,11 @@ void skb_scrub_packet(struct sk_buff *skb, bool xnet)
nf_reset(skb);
nf_reset_trace(skb);
#ifdef CONFIG_NET_SWITCHDEV
skb->offload_fwd_mark = 0;
skb->offload_mr_fwd_mark = 0;
#endif
if (!xnet)
return;
......
#!/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.
lib_dir=$(dirname $0)/../../../net/forwarding
ALL_TESTS="sanitization_test offload_indication_test"
NUM_NETIFS=2
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 noudpcsum \
ttl 20 tos inherit local 198.51.100.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 noudpcsum \
ttl 20 tos inherit local 198.51.100.1 dstport 4789
sanitization_single_dev_test_fail
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 noudpcsum \
ttl 20 tos inherit local 198.51.100.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 vxlan0 up type vxlan id 10 nolearning noudpcsum \
ttl 20 tos inherit local 198.51.100.1 dstport 4789 \
dev $swp2 group 239.0.0.1
sanitization_single_dev_test_fail
ip link del dev vxlan0
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 noudpcsum \
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_local_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 noudpcsum \
ttl 20 tos inherit local 2001:db8::1 dstport 4789
sanitization_single_dev_test_fail
ip link del dev vxlan0
ip link del dev br0
log_test "vxlan device with local ipv6 address"
}
sanitization_single_dev_learning_enabled_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
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_local_interface_test()
{
RET=0
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 dev $swp2
sanitization_single_dev_test_fail
ip link del dev vxlan0
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 noudpcsum \
ttl 20 tos inherit local 198.51.100.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 noudpcsum \
ttl 20 tos 20 local 198.51.100.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 noudpcsum \
ttl inherit tos inherit local 198.51.100.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_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
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_local_ipv6_test
sanitization_single_dev_learning_enabled_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_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 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
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 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
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 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
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 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
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 198.51.100.1/32 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
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
}
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 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 198.51.100.2
bridge fdb show brport vxlan0 | grep 00:00:00:00:00:00 \
| grep -q offload
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 198.51.100.2
bridge fdb show brport vxlan0 | grep de:ad:be:ef:13:37 | grep self \
| grep -q offload
check_err $?
bridge fdb show brport vxlan0 | grep de:ad:be:ef:13:37 | grep -v self \
| grep -q offload
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
bridge fdb show brport vxlan0 | grep de:ad:be:ef:13:37 | grep self \
| grep -q offload
check_fail $?
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
bridge fdb show brport vxlan0 | grep de:ad:be:ef:13:37 | grep self \
| grep -q offload
check_err $?
bridge fdb show brport vxlan0 | grep de:ad:be:ef:13:37 | grep -v self \
| grep -q offload
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
bridge fdb show brport vxlan0 | grep de:ad:be:ef:13:37 | grep -v self \
| grep -q offload
check_fail $?
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 198.51.100.2
bridge fdb show brport vxlan0 | grep de:ad:be:ef:13:37 | grep self \
| grep -q offload
check_err $?
bridge fdb show brport vxlan0 | grep de:ad:be:ef:13:37 | grep -v self \
| grep -q offload
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
ip route show table local | grep 198.51.100.1 | grep -q offload
check_err $?
ip link set dev vxlan0 down
ip route show table local | grep 198.51.100.1 | grep -q offload
check_err $?
ip link set dev vxlan1 down
ip route show table local | grep 198.51.100.1 | grep -q offload
check_fail $?
log_test "vxlan decap route - vxlan device down"
RET=0
ip link set dev vxlan1 up
ip route show table local | grep 198.51.100.1 | grep -q offload
check_err $?
ip link set dev vxlan0 up
ip route show table local | grep 198.51.100.1 | grep -q offload
check_err $?
log_test "vxlan decap route - vxlan device up"
RET=0
ip address delete 198.51.100.1/32 dev lo
ip route show table local | grep 198.51.100.1 | grep -q offload
check_fail $?
ip address add 198.51.100.1/32 dev lo
ip route show table local | grep 198.51.100.1 | grep -q offload
check_err $?
log_test "vxlan decap route - add local route"
RET=0
ip link set dev $swp1 nomaster
ip route show table local | grep 198.51.100.1 | grep -q offload
check_err $?
ip link set dev $swp2 nomaster
ip route show table local | grep 198.51.100.1 | grep -q offload
check_fail $?
ip link set dev $swp1 master br0
ip link set dev $swp2 master br1
ip route show table local | grep 198.51.100.1 | grep -q offload
check_err $?
log_test "vxlan decap route - local ports enslavement"
RET=0
ip link del dev br0
ip route show table local | grep 198.51.100.1 | grep -q offload
check_err $?
ip link del dev br1
ip route show table local | grep 198.51.100.1 | grep -q offload
check_fail $?
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
ip route show table local | grep 198.51.100.1 | grep -q offload
check_err $?
ip link del dev vxlan0
ip route show table local | grep 198.51.100.1 | grep -q offload
check_err $?
ip link del dev vxlan1
ip route show table local | grep 198.51.100.1 | grep -q offload
check_fail $?
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
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
}
offload_indication_test()
{
offload_indication_setup_create
offload_indication_fdb_test
offload_indication_decap_route_test
offload_indication_setup_destroy
}
trap cleanup EXIT
setup_prepare
setup_wait
tests_run
exit $EXIT_STATUS
#!/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 three IPv4 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 |
# | | 203.0.113.1/24|
# +----|---------------+
# |
# +----|----------------------------------------------------------------------+
# | SW | |
# | +--|--------------------------------------------------------------------+ |
# | | + $swp1 BR0 (802.1d) | |
# | | | |
# | | + vxlan0 (vxlan) | |
# | | local 198.51.100.1 | |
# | | remote 198.51.100.{2..13} | |
# | | id 10 dstport 4789 | |
# | +-----------------------------------------------------------------------+ |
# | |
# | 198.51.100.0/24 via 192.0.2.2 |
# | |
# | + $rp1 |
# | | 192.0.2.1/24 |
# +----|----------------------------------------------------------------------+
# |
# +----|--------------------------------------------------------+
# | | R2 (vrf) |
# | + $rp2 |
# | 192.0.2.2/24 |
# | |
# +-------------------------------------------------------------+
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 203.0.113.1/24
}
h1_destroy()
{
simple_if_fini $h1 203.0.113.1/24
}
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 noudpcsum \
ttl 20 tos inherit local 198.51.100.1 dstport 4789
ip address add 198.51.100.1/32 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 198.51.100.1/32 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 192.0.2.1/24 dev $rp1
ip route add 198.51.100.0/24 via 192.0.2.2
}
router1_destroy()
{
ip route del 198.51.100.0/24 via 192.0.2.2
ip address del 192.0.2.1/24 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 192.0.2.2/24
}
router2_destroy()
{
simple_if_fini $rp2 192.0.2.2/24
}
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 198.51.100.$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 ip pref $i handle $i \
flower ip_proto udp dst_ip 198.51.100.$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 ip 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 12 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)
local num_remotes=12
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 8..10
# 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 1 1 1 2 2 2)
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 198.51.100.8
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 198.51.100.9
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 198.51.100.10
$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 3 3 3 1 1 1 3 3 3)
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 198.51.100.2
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 198.51.100.3
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 198.51.100.4
$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 4 4 4 1 1 1 3 3 3)
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 198.51.100.11
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 198.51.100.12
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 198.51.100.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 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 4 5 5 1 1 1 3 3 3)
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 198.51.100.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 5 packets"
RET=0
packets=(2 2 2 4 5 6 1 1 1 3 3 3)
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 198.51.100.6
$MZ $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 4 5 6 1 1 1 3 3 3)
bridge fdb del 00:00:00:00:00:00 dev vxlan0 self dst 198.51.100.7
$MZ $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"
flooding_filters_del $num_remotes
}
trap cleanup EXIT
setup_prepare
setup_wait
tests_run
exit $EXIT_STATUS
......@@ -104,7 +104,7 @@ create_netif_veth()
{
local i
for i in $(eval echo {1..$NUM_NETIFS}); do
for ((i = 1; i <= NUM_NETIFS; ++i)); do
local j=$((i+1))
ip link show dev ${NETIFS[p$i]} &> /dev/null
......@@ -135,7 +135,7 @@ if [[ "$NETIF_CREATE" = "yes" ]]; then
create_netif
fi
for i in $(eval echo {1..$NUM_NETIFS}); do
for ((i = 1; i <= NUM_NETIFS; ++i)); do
ip link show dev ${NETIFS[p$i]} &> /dev/null
if [[ $? -ne 0 ]]; then
echo "SKIP: could not find all required interfaces"
......@@ -477,11 +477,24 @@ master_name_get()
ip -j link show dev $if_name | jq -r '.[]["master"]'
}
link_stats_get()
{
local if_name=$1; shift
local dir=$1; shift
local stat=$1; shift
ip -j -s link show dev $if_name \
| jq '.[]["stats64"]["'$dir'"]["'$stat'"]'
}
link_stats_tx_packets_get()
{
local if_name=$1
link_stats_get $1 tx packets
}
ip -j -s link show dev $if_name | jq '.[]["stats64"]["tx"]["packets"]'
link_stats_rx_errors_get()
{
link_stats_get $1 rx errors
}
tc_rule_stats_get()
......@@ -783,6 +796,17 @@ multipath_eval()
log_info "Expected ratio $weights_ratio Measured ratio $packets_ratio"
}
in_ns()
{
local name=$1; shift
ip netns exec $name bash <<-EOF
NUM_NETIFS=0
source lib.sh
$(for a in "$@"; do printf "%q${IFS:0:1}" "$a"; done)
EOF
}
##############################################################################
# Tests
......@@ -790,10 +814,11 @@ ping_do()
{
local if_name=$1
local dip=$2
local args=$3
local vrf_name
vrf_name=$(master_name_get $if_name)
ip vrf exec $vrf_name $PING $dip -c 10 -i 0.1 -w 2 &> /dev/null
ip vrf exec $vrf_name $PING $args $dip -c 10 -i 0.1 -w 2 &> /dev/null
}
ping_test()
......@@ -802,17 +827,18 @@ ping_test()
ping_do $1 $2
check_err $?
log_test "ping"
log_test "ping$3"
}
ping6_do()
{
local if_name=$1
local dip=$2
local args=$3
local vrf_name
vrf_name=$(master_name_get $if_name)
ip vrf exec $vrf_name $PING6 $dip -c 10 -i 0.1 -w 2 &> /dev/null
ip vrf exec $vrf_name $PING6 $args $dip -c 10 -i 0.1 -w 2 &> /dev/null
}
ping6_test()
......@@ -821,7 +847,7 @@ ping6_test()
ping6_do $1 $2
check_err $?
log_test "ping6"
log_test "ping6$3"
}
learning_test()
......
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
# +--------------------+ +----------------------+
# | H1 (vrf) | | H2 (vrf) |
# | + $h1 | | + $h2 |
# | | 192.0.2.1/28 | | | 192.0.2.2/28 |
# +----|---------------+ +--|-------------------+
# | |
# +----|--------------------------------------------------|-------------------+
# | SW | | |
# | +--|--------------------------------------------------|-----------------+ |
# | | + $swp1 BR1 (802.1d) + $swp2 | |
# | | | |
# | | + vx1 (vxlan) | |
# | | local 192.0.2.17 | |
# | | remote 192.0.2.34 192.0.2.50 | |
# | | id 1000 dstport $VXPORT | |
# | +-----------------------------------------------------------------------+ |
# | |
# | 192.0.2.32/28 via 192.0.2.18 |
# | 192.0.2.48/28 via 192.0.2.18 |
# | |
# | + $rp1 |
# | | 192.0.2.17/28 |
# +----|----------------------------------------------------------------------+
# |
# +----|--------------------------------------------------------+
# | | VRP2 (vrf) |
# | + $rp2 |
# | 192.0.2.18/28 |
# | | (maybe) HW
# =============================================================================
# | | (likely) SW
# | + v1 (veth) + v3 (veth) |
# | | 192.0.2.33/28 | 192.0.2.49/28 |
# +----|---------------------------------------|----------------+
# | |
# +----|------------------------------+ +----|------------------------------+
# | + v2 (veth) NS1 (netns) | | + v4 (veth) NS2 (netns) |
# | 192.0.2.34/28 | | 192.0.2.50/28 |
# | | | |
# | 192.0.2.16/28 via 192.0.2.33 | | 192.0.2.16/28 via 192.0.2.49 |
# | 192.0.2.50/32 via 192.0.2.33 | | 192.0.2.34/32 via 192.0.2.49 |
# | | | |
# | +-------------------------------+ | | +-------------------------------+ |
# | | BR2 (802.1d) | | | | BR2 (802.1d) | |
# | | + vx2 (vxlan) | | | | + vx2 (vxlan) | |
# | | local 192.0.2.34 | | | | local 192.0.2.50 | |
# | | remote 192.0.2.17 | | | | remote 192.0.2.17 | |
# | | remote 192.0.2.50 | | | | remote 192.0.2.34 | |
# | | id 1000 dstport $VXPORT | | | | id 1000 dstport $VXPORT | |
# | | | | | | | |
# | | + w1 (veth) | | | | + w1 (veth) | |
# | +--|----------------------------+ | | +--|----------------------------+ |
# | | | | | |
# | +--|----------------------------+ | | +--|----------------------------+ |
# | | | VW2 (vrf) | | | | | VW2 (vrf) | |
# | | + w2 (veth) | | | | + w2 (veth) | |
# | | 192.0.2.3/28 | | | | 192.0.2.4/28 | |
# | +-------------------------------+ | | +-------------------------------+ |
# +-----------------------------------+ +-----------------------------------+
: ${VXPORT:=4789}
export VXPORT
: ${ALL_TESTS:="
ping_ipv4
test_flood
test_unicast
test_ttl
test_tos
test_ecn_encap
test_ecn_decap
reapply_config
ping_ipv4
test_flood
test_unicast
"}
NUM_NETIFS=6
source lib.sh
h1_create()
{
simple_if_init $h1 192.0.2.1/28
tc qdisc add dev $h1 clsact
}
h1_destroy()
{
tc qdisc del dev $h1 clsact
simple_if_fini $h1 192.0.2.1/28
}
h2_create()
{
simple_if_init $h2 192.0.2.2/28
tc qdisc add dev $h2 clsact
}
h2_destroy()
{
tc qdisc del dev $h2 clsact
simple_if_fini $h2 192.0.2.2/28
}
rp1_set_addr()
{
ip address add dev $rp1 192.0.2.17/28
ip route add 192.0.2.32/28 nexthop via 192.0.2.18
ip route add 192.0.2.48/28 nexthop via 192.0.2.18
}
rp1_unset_addr()
{
ip route del 192.0.2.48/28 nexthop via 192.0.2.18
ip route del 192.0.2.32/28 nexthop via 192.0.2.18
ip address del dev $rp1 192.0.2.17/28
}
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
ip link set dev $rp1 up
rp1_set_addr
ip link add name vx1 type vxlan id 1000 \
local 192.0.2.17 dstport "$VXPORT" \
nolearning noudpcsum tos inherit ttl 100
ip link set dev vx1 up
ip link set dev vx1 master br1
ip link set dev $swp1 master br1
ip link set dev $swp1 up
ip link set dev $swp2 master br1
ip link set dev $swp2 up
bridge fdb append dev vx1 00:00:00:00:00:00 dst 192.0.2.34 self
bridge fdb append dev vx1 00:00:00:00:00:00 dst 192.0.2.50 self
}
switch_destroy()
{
rp1_unset_addr
ip link set dev $rp1 down
bridge fdb del dev vx1 00:00:00:00:00:00 dst 192.0.2.50 self
bridge fdb del dev vx1 00:00:00:00:00:00 dst 192.0.2.34 self
ip link set dev vx1 nomaster
ip link set dev vx1 down
ip link del dev vx1
ip link set dev $swp2 down
ip link set dev $swp2 nomaster
ip link set dev $swp1 down
ip link set dev $swp1 nomaster
ip link set dev br1 down
ip link del dev br1
}
vrp2_create()
{
simple_if_init $rp2 192.0.2.18/28
__simple_if_init v1 v$rp2 192.0.2.33/28
__simple_if_init v3 v$rp2 192.0.2.49/28
tc qdisc add dev v1 clsact
}
vrp2_destroy()
{
tc qdisc del dev v1 clsact
__simple_if_fini v3 192.0.2.49/28
__simple_if_fini v1 192.0.2.33/28
simple_if_fini $rp2 192.0.2.18/28
}
ns_init_common()
{
local in_if=$1; shift
local in_addr=$1; shift
local other_in_addr=$1; shift
local nh_addr=$1; shift
local host_addr=$1; shift
ip link set dev $in_if up
ip address add dev $in_if $in_addr/28
tc qdisc add dev $in_if clsact
ip link add name br2 type bridge vlan_filtering 0
ip link set dev br2 up
ip link add name w1 type veth peer name w2
ip link set dev w1 master br2
ip link set dev w1 up
ip link add name vx2 type vxlan id 1000 local $in_addr dstport "$VXPORT"
ip link set dev vx2 up
bridge fdb append dev vx2 00:00:00:00:00:00 dst 192.0.2.17 self
bridge fdb append dev vx2 00:00:00:00:00:00 dst $other_in_addr self
ip link set dev vx2 master br2
tc qdisc add dev vx2 clsact
simple_if_init w2 $host_addr/28
ip route add 192.0.2.16/28 nexthop via $nh_addr
ip route add $other_in_addr/32 nexthop via $nh_addr
}
export -f ns_init_common
ns1_create()
{
ip netns add ns1
ip link set dev v2 netns ns1
in_ns ns1 \
ns_init_common v2 192.0.2.34 192.0.2.50 192.0.2.33 192.0.2.3
}
ns1_destroy()
{
ip netns exec ns1 ip link set dev v2 netns 1
ip netns del ns1
}
ns2_create()
{
ip netns add ns2
ip link set dev v4 netns ns2
in_ns ns2 \
ns_init_common v4 192.0.2.50 192.0.2.34 192.0.2.49 192.0.2.4
}
ns2_destroy()
{
ip netns exec ns2 ip link set dev v4 netns 1
ip netns del ns2
}
setup_prepare()
{
h1=${NETIFS[p1]}
swp1=${NETIFS[p2]}
swp2=${NETIFS[p3]}
h2=${NETIFS[p4]}
rp1=${NETIFS[p5]}
rp2=${NETIFS[p6]}
vrf_prepare
forwarding_enable
h1_create
h2_create
switch_create
ip link add name v1 type veth peer name v2
ip link add name v3 type veth peer name v4
vrp2_create
ns1_create
ns2_create
r1_mac=$(in_ns ns1 mac_get w2)
r2_mac=$(in_ns ns2 mac_get w2)
h2_mac=$(mac_get $h2)
}
cleanup()
{
pre_cleanup
ns2_destroy
ns1_destroy
vrp2_destroy
ip link del dev v3
ip link del dev v1
switch_destroy
h2_destroy
h1_destroy
forwarding_restore
vrf_cleanup
}
# For the first round of tests, vx1 is the first device to get attached to the
# bridge, and that at the point that the local IP is already configured. Try the
# other scenario of attaching the device to an already-offloaded bridge, and
# only then attach the local IP.
reapply_config()
{
echo "Reapplying configuration"
bridge fdb del dev vx1 00:00:00:00:00:00 dst 192.0.2.50 self
bridge fdb del dev vx1 00:00:00:00:00:00 dst 192.0.2.34 self
rp1_unset_addr
ip link set dev vx1 nomaster
sleep 5
ip link set dev vx1 master br1
bridge fdb append dev vx1 00:00:00:00:00:00 dst 192.0.2.34 self
bridge fdb append dev vx1 00:00:00:00:00:00 dst 192.0.2.50 self
sleep 1
rp1_set_addr
sleep 5
}
ping_ipv4()
{
ping_test $h1 192.0.2.2 ": local->local"
ping_test $h1 192.0.2.3 ": local->remote 1"
ping_test $h1 192.0.2.4 ": local->remote 2"
}
maybe_in_ns()
{
echo ${1:+in_ns} $1
}
__flood_counter_add_del()
{
local add_del=$1; shift
local dev=$1; shift
local ns=$1; shift
# Putting the ICMP capture both to HW and to SW will end up
# double-counting the packets that are trapped to slow path, such as for
# the unicast test. Adding either skip_hw or skip_sw fixes this problem,
# but with skip_hw, the flooded packets are not counted at all, because
# those are dropped due to MAC address mismatch; and skip_sw is a no-go
# for veth-based topologies.
#
# So try to install with skip_sw and fall back to skip_sw if that fails.
$(maybe_in_ns $ns) __icmp_capture_add_del \
$add_del 100 "" $dev skip_sw 2>/dev/null || \
$(maybe_in_ns $ns) __icmp_capture_add_del \
$add_del 100 "" $dev skip_hw
}
flood_counter_install()
{
__flood_counter_add_del add "$@"
}
flood_counter_uninstall()
{
__flood_counter_add_del del "$@"
}
flood_fetch_stat()
{
local dev=$1; shift
local ns=$1; shift
$(maybe_in_ns $ns) tc_rule_stats_get $dev 100 ingress
}
flood_fetch_stats()
{
local counters=("${@}")
local counter
for counter in "${counters[@]}"; do
flood_fetch_stat $counter
done
}
vxlan_flood_test()
{
local mac=$1; shift
local dst=$1; shift
local -a expects=("${@}")
local -a counters=($h2 "vx2 ns1" "vx2 ns2")
local counter
local key
for counter in "${counters[@]}"; do
flood_counter_install $counter
done
local -a t0s=($(flood_fetch_stats "${counters[@]}"))
$MZ $h1 -c 10 -d 100msec -p 64 -b $mac -B $dst -t icmp -q
sleep 1
local -a t1s=($(flood_fetch_stats "${counters[@]}"))
for key in ${!t0s[@]}; do
local delta=$((t1s[$key] - t0s[$key]))
local expect=${expects[$key]}
((expect == delta))
check_err $? "${counters[$key]}: Expected to capture $expect packets, got $delta."
done
for counter in "${counters[@]}"; do
flood_counter_uninstall $counter
done
}
__test_flood()
{
local mac=$1; shift
local dst=$1; shift
local what=$1; shift
RET=0
vxlan_flood_test $mac $dst 10 10 10
log_test "VXLAN: $what"
}
test_flood()
{
__test_flood de:ad:be:ef:13:37 192.0.2.100 "flood"
}
vxlan_fdb_add_del()
{
local add_del=$1; shift
local mac=$1; shift
local dev=$1; shift
local dst=$1; shift
bridge fdb $add_del dev $dev $mac self static permanent \
${dst:+dst} $dst 2>/dev/null
bridge fdb $add_del dev $dev $mac master static 2>/dev/null
}
__test_unicast()
{
local mac=$1; shift
local dst=$1; shift
local hit_idx=$1; shift
local what=$1; shift
RET=0
local -a expects=(0 0 0)
expects[$hit_idx]=10
vxlan_flood_test $mac $dst "${expects[@]}"
log_test "VXLAN: $what"
}
test_unicast()
{
local -a targets=("$h2_mac $h2"
"$r1_mac vx1 192.0.2.34"
"$r2_mac vx1 192.0.2.50")
local target
for target in "${targets[@]}"; do
vxlan_fdb_add_del add $target
done
__test_unicast $h2_mac 192.0.2.2 0 "local MAC unicast"
__test_unicast $r1_mac 192.0.2.3 1 "remote MAC 1 unicast"
__test_unicast $r2_mac 192.0.2.4 2 "remote MAC 2 unicast"
for target in "${targets[@]}"; do
vxlan_fdb_add_del del $target
done
}
vxlan_ping_test()
{
local ping_dev=$1; shift
local ping_dip=$1; shift
local ping_args=$1; shift
local capture_dev=$1; shift
local capture_dir=$1; shift
local capture_pref=$1; shift
local expect=$1; shift
local t0=$(tc_rule_stats_get $capture_dev $capture_pref $capture_dir)
ping_do $ping_dev $ping_dip "$ping_args"
local t1=$(tc_rule_stats_get $capture_dev $capture_pref $capture_dir)
local delta=$((t1 - t0))
# Tolerate a couple stray extra packets.
((expect <= delta && delta <= expect + 2))
check_err $? "$capture_dev: Expected to capture $expect packets, got $delta."
}
test_ttl()
{
RET=0
tc filter add dev v1 egress pref 77 prot ip \
flower ip_ttl 99 action pass
vxlan_ping_test $h1 192.0.2.3 "" v1 egress 77 10
tc filter del dev v1 egress pref 77 prot ip
log_test "VXLAN: envelope TTL"
}
test_tos()
{
RET=0
tc filter add dev v1 egress pref 77 prot ip \
flower ip_tos 0x40 action pass
vxlan_ping_test $h1 192.0.2.3 "-Q 0x40" v1 egress 77 10
vxlan_ping_test $h1 192.0.2.3 "-Q 0x30" v1 egress 77 0
tc filter del dev v1 egress pref 77 prot ip
log_test "VXLAN: envelope TOS inheritance"
}
__test_ecn_encap()
{
local q=$1; shift
local tos=$1; shift
RET=0
tc filter add dev v1 egress pref 77 prot ip \
flower ip_tos $tos action pass
sleep 1
vxlan_ping_test $h1 192.0.2.3 "-Q $q" v1 egress 77 10
tc filter del dev v1 egress pref 77 prot ip
log_test "VXLAN: ECN encap: $q->$tos"
}
test_ecn_encap()
{
# In accordance with INET_ECN_encapsulate()
__test_ecn_encap 0x00 0x00
__test_ecn_encap 0x01 0x01
__test_ecn_encap 0x02 0x02
__test_ecn_encap 0x03 0x02
}
vxlan_encapped_ping_do()
{
local count=$1; shift
local dev=$1; shift
local next_hop_mac=$1; shift
local dest_ip=$1; shift
local dest_mac=$1; shift
local inner_tos=$1; shift
local outer_tos=$1; shift
$MZ $dev -c $count -d 100msec -q \
-b $next_hop_mac -B $dest_ip \
-t udp tos=$outer_tos,sp=23456,dp=$VXPORT,p=$(:
)"08:"$( : VXLAN flags
)"00:00:00:"$( : VXLAN reserved
)"00:03:e8:"$( : VXLAN VNI
)"00:"$( : VXLAN reserved
)"$dest_mac:"$( : ETH daddr
)"$(mac_get w2):"$( : ETH saddr
)"08:00:"$( : ETH type
)"45:"$( : IP version + IHL
)"$inner_tos:"$( : IP TOS
)"00:54:"$( : IP total length
)"99:83:"$( : IP identification
)"40:00:"$( : IP flags + frag off
)"40:"$( : IP TTL
)"01:"$( : IP proto
)"00:00:"$( : IP header csum
)"c0:00:02:03:"$( : IP saddr: 192.0.2.3
)"c0:00:02:01:"$( : IP daddr: 192.0.2.1
)"08:"$( : ICMP type
)"00:"$( : ICMP code
)"8b:f2:"$( : ICMP csum
)"1f:6a:"$( : ICMP request identifier
)"00:01:"$( : ICMP request sequence number
)"4f:ff:c5:5b:00:00:00:00:"$( : ICMP payload
)"6d:74:0b:00:00:00:00:00:"$( :
)"10:11:12:13:14:15:16:17:"$( :
)"18:19:1a:1b:1c:1d:1e:1f:"$( :
)"20:21:22:23:24:25:26:27:"$( :
)"28:29:2a:2b:2c:2d:2e:2f:"$( :
)"30:31:32:33:34:35:36:37"
}
export -f vxlan_encapped_ping_do
vxlan_encapped_ping_test()
{
local ping_dev=$1; shift
local nh_dev=$1; shift
local ping_dip=$1; shift
local inner_tos=$1; shift
local outer_tos=$1; shift
local stat_get=$1; shift
local expect=$1; shift
local t0=$($stat_get)
in_ns ns1 \
vxlan_encapped_ping_do 10 $ping_dev $(mac_get $nh_dev) \
$ping_dip $(mac_get $h1) \
$inner_tos $outer_tos
local t1=$($stat_get)
local delta=$((t1 - t0))
# Tolerate a couple stray extra packets.
((expect <= delta && delta <= expect + 2))
check_err $? "Expected to capture $expect packets, got $delta."
}
export -f vxlan_encapped_ping_test
__test_ecn_decap()
{
local orig_inner_tos=$1; shift
local orig_outer_tos=$1; shift
local decapped_tos=$1; shift
RET=0
tc filter add dev $h1 ingress pref 77 prot ip \
flower ip_tos $decapped_tos action pass
sleep 1
vxlan_encapped_ping_test v2 v1 192.0.2.17 \
$orig_inner_tos $orig_outer_tos \
"tc_rule_stats_get $h1 77 ingress" 10
tc filter del dev $h1 ingress pref 77
log_test "VXLAN: ECN decap: $orig_outer_tos/$orig_inner_tos->$decapped_tos"
}
test_ecn_decap_error()
{
local orig_inner_tos=00
local orig_outer_tos=03
RET=0
vxlan_encapped_ping_test v2 v1 192.0.2.17 \
$orig_inner_tos $orig_outer_tos \
"link_stats_rx_errors_get vx1" 10
log_test "VXLAN: ECN decap: $orig_outer_tos/$orig_inner_tos->error"
}
test_ecn_decap()
{
# In accordance with INET_ECN_decapsulate()
__test_ecn_decap 00 00 0x00
__test_ecn_decap 01 01 0x01
__test_ecn_decap 02 01 0x02
__test_ecn_decap 01 03 0x03
__test_ecn_decap 02 03 0x03
test_ecn_decap_error
}
test_all()
{
echo "Running tests with UDP port $VXPORT"
tests_run
}
trap cleanup EXIT
setup_prepare
setup_wait
test_all
exit $EXIT_STATUS
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
# A wrapper to run VXLAN tests with an unusual port number.
VXPORT=8472
ALL_TESTS="
ping_ipv4
"
source vxlan_bridge_1d.sh
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment