mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-16 07:24:39 +08:00
8a7746982e
Rename some test cases to avoid overlapping test names which is problematic for the kernel test robot. No changes in the test's logic. Suggested-by: Yujie Liu <yujie.liu@intel.com> Signed-off-by: Ido Schimmel <idosch@nvidia.com> Link: https://lore.kernel.org/r/20240227170418.491442-1-idosch@nvidia.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2512 lines
90 KiB
Bash
Executable File
2512 lines
90 KiB
Bash
Executable File
#!/bin/bash
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
#
|
|
# This test is for checking VXLAN MDB functionality. The topology consists of
|
|
# two sets of namespaces: One for the testing of IPv4 underlay and another for
|
|
# IPv6. In both cases, both IPv4 and IPv6 overlay traffic are tested.
|
|
#
|
|
# Data path functionality is tested by sending traffic from one of the upper
|
|
# namespaces and checking using ingress tc filters that the expected traffic
|
|
# was received by one of the lower namespaces.
|
|
#
|
|
# +------------------------------------+ +------------------------------------+
|
|
# | ns1_v4 | | ns1_v6 |
|
|
# | | | |
|
|
# | br0.10 br0.4000 br0.20 | | br0.10 br0.4000 br0.20 |
|
|
# | + + + | | + + + |
|
|
# | | | | | | | | | |
|
|
# | | | | | | | | | |
|
|
# | +---------+---------+ | | +---------+---------+ |
|
|
# | | | | | |
|
|
# | | | | | |
|
|
# | + | | + |
|
|
# | br0 | | br0 |
|
|
# | + | | + |
|
|
# | | | | | |
|
|
# | | | | | |
|
|
# | + | | + |
|
|
# | vx0 | | vx0 |
|
|
# | | | |
|
|
# | | | |
|
|
# | veth0 | | veth0 |
|
|
# | + | | + |
|
|
# +-----------------|------------------+ +-----------------|------------------+
|
|
# | |
|
|
# +-----------------|------------------+ +-----------------|------------------+
|
|
# | + | | + |
|
|
# | veth0 | | veth0 |
|
|
# | | | |
|
|
# | | | |
|
|
# | vx0 | | vx0 |
|
|
# | + | | + |
|
|
# | | | | | |
|
|
# | | | | | |
|
|
# | + | | + |
|
|
# | br0 | | br0 |
|
|
# | + | | + |
|
|
# | | | | | |
|
|
# | | | | | |
|
|
# | +---------+---------+ | | +---------+---------+ |
|
|
# | | | | | | | | | |
|
|
# | | | | | | | | | |
|
|
# | + + + | | + + + |
|
|
# | br0.10 br0.4000 br0.10 | | br0.10 br0.4000 br0.20 |
|
|
# | | | |
|
|
# | ns2_v4 | | ns2_v6 |
|
|
# +------------------------------------+ +------------------------------------+
|
|
|
|
source lib.sh
|
|
ret=0
|
|
|
|
CONTROL_PATH_TESTS="
|
|
basic_star_g_ipv4_ipv4
|
|
basic_star_g_ipv6_ipv4
|
|
basic_star_g_ipv4_ipv6
|
|
basic_star_g_ipv6_ipv6
|
|
basic_sg_ipv4_ipv4
|
|
basic_sg_ipv6_ipv4
|
|
basic_sg_ipv4_ipv6
|
|
basic_sg_ipv6_ipv6
|
|
star_g_ipv4_ipv4
|
|
star_g_ipv6_ipv4
|
|
star_g_ipv4_ipv6
|
|
star_g_ipv6_ipv6
|
|
sg_ipv4_ipv4
|
|
sg_ipv6_ipv4
|
|
sg_ipv4_ipv6
|
|
sg_ipv6_ipv6
|
|
dump_ipv4_ipv4
|
|
dump_ipv6_ipv4
|
|
dump_ipv4_ipv6
|
|
dump_ipv6_ipv6
|
|
flush
|
|
"
|
|
|
|
DATA_PATH_TESTS="
|
|
encap_params_ipv4_ipv4
|
|
encap_params_ipv6_ipv4
|
|
encap_params_ipv4_ipv6
|
|
encap_params_ipv6_ipv6
|
|
starg_exclude_ir_ipv4_ipv4
|
|
starg_exclude_ir_ipv6_ipv4
|
|
starg_exclude_ir_ipv4_ipv6
|
|
starg_exclude_ir_ipv6_ipv6
|
|
starg_include_ir_ipv4_ipv4
|
|
starg_include_ir_ipv6_ipv4
|
|
starg_include_ir_ipv4_ipv6
|
|
starg_include_ir_ipv6_ipv6
|
|
starg_exclude_p2mp_ipv4_ipv4
|
|
starg_exclude_p2mp_ipv6_ipv4
|
|
starg_exclude_p2mp_ipv4_ipv6
|
|
starg_exclude_p2mp_ipv6_ipv6
|
|
starg_include_p2mp_ipv4_ipv4
|
|
starg_include_p2mp_ipv6_ipv4
|
|
starg_include_p2mp_ipv4_ipv6
|
|
starg_include_p2mp_ipv6_ipv6
|
|
egress_vni_translation_ipv4_ipv4
|
|
egress_vni_translation_ipv6_ipv4
|
|
egress_vni_translation_ipv4_ipv6
|
|
egress_vni_translation_ipv6_ipv6
|
|
all_zeros_mdb_ipv4
|
|
all_zeros_mdb_ipv6
|
|
mdb_fdb_ipv4_ipv4
|
|
mdb_fdb_ipv6_ipv4
|
|
mdb_fdb_ipv4_ipv6
|
|
mdb_fdb_ipv6_ipv6
|
|
mdb_torture_ipv4_ipv4
|
|
mdb_torture_ipv6_ipv4
|
|
mdb_torture_ipv4_ipv6
|
|
mdb_torture_ipv6_ipv6
|
|
"
|
|
|
|
# All tests in this script. Can be overridden with -t option.
|
|
TESTS="
|
|
$CONTROL_PATH_TESTS
|
|
$DATA_PATH_TESTS
|
|
"
|
|
VERBOSE=0
|
|
PAUSE_ON_FAIL=no
|
|
PAUSE=no
|
|
|
|
################################################################################
|
|
# Utilities
|
|
|
|
log_test()
|
|
{
|
|
local rc=$1
|
|
local expected=$2
|
|
local msg="$3"
|
|
|
|
if [ ${rc} -eq ${expected} ]; then
|
|
printf "TEST: %-60s [ OK ]\n" "${msg}"
|
|
nsuccess=$((nsuccess+1))
|
|
else
|
|
ret=1
|
|
nfail=$((nfail+1))
|
|
printf "TEST: %-60s [FAIL]\n" "${msg}"
|
|
if [ "$VERBOSE" = "1" ]; then
|
|
echo " rc=$rc, expected $expected"
|
|
fi
|
|
|
|
if [ "${PAUSE_ON_FAIL}" = "yes" ]; then
|
|
echo
|
|
echo "hit enter to continue, 'q' to quit"
|
|
read a
|
|
[ "$a" = "q" ] && exit 1
|
|
fi
|
|
fi
|
|
|
|
if [ "${PAUSE}" = "yes" ]; then
|
|
echo
|
|
echo "hit enter to continue, 'q' to quit"
|
|
read a
|
|
[ "$a" = "q" ] && exit 1
|
|
fi
|
|
|
|
[ "$VERBOSE" = "1" ] && echo
|
|
}
|
|
|
|
run_cmd()
|
|
{
|
|
local cmd="$1"
|
|
local out
|
|
local stderr="2>/dev/null"
|
|
|
|
if [ "$VERBOSE" = "1" ]; then
|
|
printf "COMMAND: $cmd\n"
|
|
stderr=
|
|
fi
|
|
|
|
out=$(eval $cmd $stderr)
|
|
rc=$?
|
|
if [ "$VERBOSE" = "1" -a -n "$out" ]; then
|
|
echo " $out"
|
|
fi
|
|
|
|
return $rc
|
|
}
|
|
|
|
tc_check_packets()
|
|
{
|
|
local ns=$1; shift
|
|
local id=$1; shift
|
|
local handle=$1; shift
|
|
local count=$1; shift
|
|
local pkts
|
|
|
|
sleep 0.1
|
|
pkts=$(tc -n $ns -j -s filter show $id \
|
|
| jq ".[] | select(.options.handle == $handle) | \
|
|
.options.actions[0].stats.packets")
|
|
[[ $pkts == $count ]]
|
|
}
|
|
|
|
################################################################################
|
|
# Setup
|
|
|
|
setup_common_ns()
|
|
{
|
|
local ns=$1; shift
|
|
local local_addr=$1; shift
|
|
|
|
ip netns exec $ns sysctl -qw net.ipv4.ip_forward=1
|
|
ip netns exec $ns sysctl -qw net.ipv4.fib_multipath_use_neigh=1
|
|
ip netns exec $ns sysctl -qw net.ipv4.conf.default.ignore_routes_with_linkdown=1
|
|
ip netns exec $ns sysctl -qw net.ipv6.conf.all.keep_addr_on_down=1
|
|
ip netns exec $ns sysctl -qw net.ipv6.conf.all.forwarding=1
|
|
ip netns exec $ns sysctl -qw net.ipv6.conf.default.forwarding=1
|
|
ip netns exec $ns sysctl -qw net.ipv6.conf.default.ignore_routes_with_linkdown=1
|
|
ip netns exec $ns sysctl -qw net.ipv6.conf.all.accept_dad=0
|
|
ip netns exec $ns sysctl -qw net.ipv6.conf.default.accept_dad=0
|
|
|
|
ip -n $ns link set dev lo up
|
|
ip -n $ns address add $local_addr dev lo
|
|
|
|
ip -n $ns link set dev veth0 up
|
|
|
|
ip -n $ns link add name br0 up type bridge vlan_filtering 1 \
|
|
vlan_default_pvid 0 mcast_snooping 0
|
|
|
|
ip -n $ns link add link br0 name br0.10 up type vlan id 10
|
|
bridge -n $ns vlan add vid 10 dev br0 self
|
|
|
|
ip -n $ns link add link br0 name br0.20 up type vlan id 20
|
|
bridge -n $ns vlan add vid 20 dev br0 self
|
|
|
|
ip -n $ns link add link br0 name br0.4000 up type vlan id 4000
|
|
bridge -n $ns vlan add vid 4000 dev br0 self
|
|
|
|
ip -n $ns link add name vx0 up master br0 type vxlan \
|
|
local $local_addr dstport 4789 external vnifilter
|
|
bridge -n $ns link set dev vx0 vlan_tunnel on
|
|
|
|
bridge -n $ns vlan add vid 10 dev vx0
|
|
bridge -n $ns vlan add vid 10 dev vx0 tunnel_info id 10010
|
|
bridge -n $ns vni add vni 10010 dev vx0
|
|
|
|
bridge -n $ns vlan add vid 20 dev vx0
|
|
bridge -n $ns vlan add vid 20 dev vx0 tunnel_info id 10020
|
|
bridge -n $ns vni add vni 10020 dev vx0
|
|
|
|
bridge -n $ns vlan add vid 4000 dev vx0 pvid
|
|
bridge -n $ns vlan add vid 4000 dev vx0 tunnel_info id 14000
|
|
bridge -n $ns vni add vni 14000 dev vx0
|
|
}
|
|
|
|
setup_common()
|
|
{
|
|
local ns1=$1; shift
|
|
local ns2=$1; shift
|
|
local local_addr1=$1; shift
|
|
local local_addr2=$1; shift
|
|
|
|
ip link add name veth0 type veth peer name veth1
|
|
ip link set dev veth0 netns $ns1 name veth0
|
|
ip link set dev veth1 netns $ns2 name veth0
|
|
|
|
setup_common_ns $ns1 $local_addr1
|
|
setup_common_ns $ns2 $local_addr2
|
|
}
|
|
|
|
setup_v4()
|
|
{
|
|
setup_ns ns1_v4 ns2_v4
|
|
setup_common $ns1_v4 $ns2_v4 192.0.2.1 192.0.2.2
|
|
|
|
ip -n $ns1_v4 address add 192.0.2.17/28 dev veth0
|
|
ip -n $ns2_v4 address add 192.0.2.18/28 dev veth0
|
|
|
|
ip -n $ns1_v4 route add default via 192.0.2.18
|
|
ip -n $ns2_v4 route add default via 192.0.2.17
|
|
}
|
|
|
|
cleanup_v4()
|
|
{
|
|
cleanup_ns $ns2_v4 $ns1_v4
|
|
}
|
|
|
|
setup_v6()
|
|
{
|
|
setup_ns ns1_v6 ns2_v6
|
|
setup_common $ns1_v6 $ns2_v6 2001:db8:1::1 2001:db8:1::2
|
|
|
|
ip -n $ns1_v6 address add 2001:db8:2::1/64 dev veth0 nodad
|
|
ip -n $ns2_v6 address add 2001:db8:2::2/64 dev veth0 nodad
|
|
|
|
ip -n $ns1_v6 route add default via 2001:db8:2::2
|
|
ip -n $ns2_v6 route add default via 2001:db8:2::1
|
|
}
|
|
|
|
cleanup_v6()
|
|
{
|
|
cleanup_ns $ns2_v6 $ns1_v6
|
|
}
|
|
|
|
setup()
|
|
{
|
|
set -e
|
|
|
|
setup_v4
|
|
setup_v6
|
|
|
|
sleep 5
|
|
|
|
set +e
|
|
}
|
|
|
|
cleanup()
|
|
{
|
|
cleanup_v6 &> /dev/null
|
|
cleanup_v4 &> /dev/null
|
|
}
|
|
|
|
################################################################################
|
|
# Tests - Control path
|
|
|
|
basic_common()
|
|
{
|
|
local ns1=$1; shift
|
|
local grp_key=$1; shift
|
|
local vtep_ip=$1; shift
|
|
|
|
# Test basic control path operations common to all MDB entry types.
|
|
|
|
# Basic add, replace and delete behavior.
|
|
run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni 10010"
|
|
log_test $? 0 "MDB entry addition"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 $grp_key src_vni 10010"
|
|
log_test $? 0 "MDB entry presence after addition"
|
|
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni 10010"
|
|
log_test $? 0 "MDB entry replacement"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 $grp_key src_vni 10010"
|
|
log_test $? 0 "MDB entry presence after replacement"
|
|
|
|
run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 $grp_key dst $vtep_ip src_vni 10010"
|
|
log_test $? 0 "MDB entry deletion"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 $grp_key src_vni 10010"
|
|
log_test $? 254 "MDB entry presence after deletion"
|
|
|
|
run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 $grp_key dst $vtep_ip src_vni 10010"
|
|
log_test $? 255 "Non-existent MDB entry deletion"
|
|
|
|
# Default protocol and replacement.
|
|
run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni 10010"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 $grp_key src_vni 10010 | grep \"proto static\""
|
|
log_test $? 0 "MDB entry default protocol"
|
|
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 $grp_key permanent proto 123 dst $vtep_ip src_vni 10010"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 $grp_key src_vni 10010 | grep \"proto 123\""
|
|
log_test $? 0 "MDB entry protocol replacement"
|
|
|
|
run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 $grp_key dst $vtep_ip src_vni 10010"
|
|
|
|
# Default destination port and replacement.
|
|
run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni 10010"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 $grp_key src_vni 10010 | grep \" dst_port \""
|
|
log_test $? 1 "MDB entry default destination port"
|
|
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 $grp_key permanent dst $vtep_ip dst_port 1234 src_vni 10010"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 $grp_key src_vni 10010 | grep \"dst_port 1234\""
|
|
log_test $? 0 "MDB entry destination port replacement"
|
|
|
|
run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 $grp_key dst $vtep_ip src_vni 10010"
|
|
|
|
# Default destination VNI and replacement.
|
|
run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni 10010"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 $grp_key src_vni 10010 | grep \" vni \""
|
|
log_test $? 1 "MDB entry default destination VNI"
|
|
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 $grp_key permanent dst $vtep_ip vni 1234 src_vni 10010"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 $grp_key src_vni 10010 | grep \"vni 1234\""
|
|
log_test $? 0 "MDB entry destination VNI replacement"
|
|
|
|
run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 $grp_key dst $vtep_ip src_vni 10010"
|
|
|
|
# Default outgoing interface and replacement.
|
|
run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni 10010"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 $grp_key src_vni 10010 | grep \" via \""
|
|
log_test $? 1 "MDB entry default outgoing interface"
|
|
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni 10010 via veth0"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 $grp_key src_vni 10010 | grep \"via veth0\""
|
|
log_test $? 0 "MDB entry outgoing interface replacement"
|
|
|
|
run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 $grp_key dst $vtep_ip src_vni 10010"
|
|
|
|
# Common error cases.
|
|
run_cmd "bridge -n $ns1 mdb add dev vx0 port veth0 $grp_key permanent dst $vtep_ip src_vni 10010"
|
|
log_test $? 255 "MDB entry with mismatch between device and port"
|
|
|
|
run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key temp dst $vtep_ip src_vni 10010"
|
|
log_test $? 255 "MDB entry with temp state"
|
|
|
|
run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent vid 10 dst $vtep_ip src_vni 10010"
|
|
log_test $? 255 "MDB entry with VLAN"
|
|
|
|
run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp 01:02:03:04:05:06 permanent dst $vtep_ip src_vni 10010"
|
|
log_test $? 255 "MDB entry MAC address"
|
|
|
|
run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent"
|
|
log_test $? 255 "MDB entry without extended parameters"
|
|
|
|
run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent proto 3 dst $vtep_ip src_vni 10010"
|
|
log_test $? 255 "MDB entry with an invalid protocol"
|
|
|
|
run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent dst $vtep_ip vni $((2 ** 24)) src_vni 10010"
|
|
log_test $? 255 "MDB entry with an invalid destination VNI"
|
|
|
|
run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni $((2 ** 24))"
|
|
log_test $? 255 "MDB entry with an invalid source VNI"
|
|
|
|
run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent src_vni 10010"
|
|
log_test $? 255 "MDB entry without a remote destination IP"
|
|
|
|
run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni 10010"
|
|
run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 $grp_key permanent dst $vtep_ip src_vni 10010"
|
|
log_test $? 255 "Duplicate MDB entries"
|
|
run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 $grp_key dst $vtep_ip src_vni 10010"
|
|
}
|
|
|
|
basic_star_g_ipv4_ipv4()
|
|
{
|
|
local ns1=$ns1_v4
|
|
local grp_key="grp 239.1.1.1"
|
|
local vtep_ip=198.51.100.100
|
|
|
|
echo
|
|
echo "Control path: Basic (*, G) operations - IPv4 overlay / IPv4 underlay"
|
|
echo "--------------------------------------------------------------------"
|
|
|
|
basic_common $ns1 "$grp_key" $vtep_ip
|
|
}
|
|
|
|
basic_star_g_ipv6_ipv4()
|
|
{
|
|
local ns1=$ns1_v4
|
|
local grp_key="grp ff0e::1"
|
|
local vtep_ip=198.51.100.100
|
|
|
|
echo
|
|
echo "Control path: Basic (*, G) operations - IPv6 overlay / IPv4 underlay"
|
|
echo "--------------------------------------------------------------------"
|
|
|
|
basic_common $ns1 "$grp_key" $vtep_ip
|
|
}
|
|
|
|
basic_star_g_ipv4_ipv6()
|
|
{
|
|
local ns1=$ns1_v6
|
|
local grp_key="grp 239.1.1.1"
|
|
local vtep_ip=2001:db8:1000::1
|
|
|
|
echo
|
|
echo "Control path: Basic (*, G) operations - IPv4 overlay / IPv6 underlay"
|
|
echo "--------------------------------------------------------------------"
|
|
|
|
basic_common $ns1 "$grp_key" $vtep_ip
|
|
}
|
|
|
|
basic_star_g_ipv6_ipv6()
|
|
{
|
|
local ns1=$ns1_v6
|
|
local grp_key="grp ff0e::1"
|
|
local vtep_ip=2001:db8:1000::1
|
|
|
|
echo
|
|
echo "Control path: Basic (*, G) operations - IPv6 overlay / IPv6 underlay"
|
|
echo "--------------------------------------------------------------------"
|
|
|
|
basic_common $ns1 "$grp_key" $vtep_ip
|
|
}
|
|
|
|
basic_sg_ipv4_ipv4()
|
|
{
|
|
local ns1=$ns1_v4
|
|
local grp_key="grp 239.1.1.1 src 192.0.2.129"
|
|
local vtep_ip=198.51.100.100
|
|
|
|
echo
|
|
echo "Control path: Basic (S, G) operations - IPv4 overlay / IPv4 underlay"
|
|
echo "--------------------------------------------------------------------"
|
|
|
|
basic_common $ns1 "$grp_key" $vtep_ip
|
|
}
|
|
|
|
basic_sg_ipv6_ipv4()
|
|
{
|
|
local ns1=$ns1_v4
|
|
local grp_key="grp ff0e::1 src 2001:db8:100::1"
|
|
local vtep_ip=198.51.100.100
|
|
|
|
echo
|
|
echo "Control path: Basic (S, G) operations - IPv6 overlay / IPv4 underlay"
|
|
echo "---------------------------------------------------------------------"
|
|
|
|
basic_common $ns1 "$grp_key" $vtep_ip
|
|
}
|
|
|
|
basic_sg_ipv4_ipv6()
|
|
{
|
|
local ns1=$ns1_v6
|
|
local grp_key="grp 239.1.1.1 src 192.0.2.129"
|
|
local vtep_ip=2001:db8:1000::1
|
|
|
|
echo
|
|
echo "Control path: Basic (S, G) operations - IPv4 overlay / IPv6 underlay"
|
|
echo "--------------------------------------------------------------------"
|
|
|
|
basic_common $ns1 "$grp_key" $vtep_ip
|
|
}
|
|
|
|
basic_sg_ipv6_ipv6()
|
|
{
|
|
local ns1=$ns1_v6
|
|
local grp_key="grp ff0e::1 src 2001:db8:100::1"
|
|
local vtep_ip=2001:db8:1000::1
|
|
|
|
echo
|
|
echo "Control path: Basic (S, G) operations - IPv6 overlay / IPv6 underlay"
|
|
echo "--------------------------------------------------------------------"
|
|
|
|
basic_common $ns1 "$grp_key" $vtep_ip
|
|
}
|
|
|
|
star_g_common()
|
|
{
|
|
local ns1=$1; shift
|
|
local grp=$1; shift
|
|
local src1=$1; shift
|
|
local src2=$1; shift
|
|
local src3=$1; shift
|
|
local vtep_ip=$1; shift
|
|
local all_zeros_grp=$1; shift
|
|
|
|
# Test control path operations specific to (*, G) entries.
|
|
|
|
# Basic add, replace and delete behavior.
|
|
run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1 dst $vtep_ip src_vni 10010"
|
|
log_test $? 0 "(*, G) MDB entry addition with source list"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010"
|
|
log_test $? 0 "(*, G) MDB entry presence after addition"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010"
|
|
log_test $? 0 "(S, G) MDB entry presence after addition"
|
|
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1 dst $vtep_ip src_vni 10010"
|
|
log_test $? 0 "(*, G) MDB entry replacement with source list"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010"
|
|
log_test $? 0 "(*, G) MDB entry presence after replacement"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010"
|
|
log_test $? 0 "(S, G) MDB entry presence after replacement"
|
|
|
|
run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"
|
|
log_test $? 0 "(*, G) MDB entry deletion"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010"
|
|
log_test $? 254 "(*, G) MDB entry presence after deletion"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010"
|
|
log_test $? 254 "(S, G) MDB entry presence after deletion"
|
|
|
|
# Default filter mode and replacement.
|
|
run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp permanent dst $vtep_ip src_vni 10010"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010 | grep exclude"
|
|
log_test $? 0 "(*, G) MDB entry default filter mode"
|
|
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode include source_list $src1 dst $vtep_ip src_vni 10010"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010 | grep include"
|
|
log_test $? 0 "(*, G) MDB entry after replacing filter mode to \"include\""
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010"
|
|
log_test $? 0 "(S, G) MDB entry after replacing filter mode to \"include\""
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010 | grep blocked"
|
|
log_test $? 1 "\"blocked\" flag after replacing filter mode to \"include\""
|
|
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1 dst $vtep_ip src_vni 10010"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010 | grep exclude"
|
|
log_test $? 0 "(*, G) MDB entry after replacing filter mode to \"exclude\""
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grep grp $grp src $src1 src_vni 10010"
|
|
log_test $? 0 "(S, G) MDB entry after replacing filter mode to \"exclude\""
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010 | grep blocked"
|
|
log_test $? 0 "\"blocked\" flag after replacing filter mode to \"exclude\""
|
|
|
|
run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"
|
|
|
|
# Default source list and replacement.
|
|
run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp permanent dst $vtep_ip src_vni 10010"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010 | grep source_list"
|
|
log_test $? 1 "(*, G) MDB entry default source list"
|
|
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1,$src2,$src3 dst $vtep_ip src_vni 10010"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010"
|
|
log_test $? 0 "(S, G) MDB entry of 1st source after replacing source list"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src2 src_vni 10010"
|
|
log_test $? 0 "(S, G) MDB entry of 2nd source after replacing source list"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src3 src_vni 10010"
|
|
log_test $? 0 "(S, G) MDB entry of 3rd source after replacing source list"
|
|
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1,$src3 dst $vtep_ip src_vni 10010"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010"
|
|
log_test $? 0 "(S, G) MDB entry of 1st source after removing source"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src2 src_vni 10010"
|
|
log_test $? 254 "(S, G) MDB entry of 2nd source after removing source"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src3 src_vni 10010"
|
|
log_test $? 0 "(S, G) MDB entry of 3rd source after removing source"
|
|
|
|
run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"
|
|
|
|
# Default protocol and replacement.
|
|
run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1 dst $vtep_ip src_vni 10010"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010 | grep \"proto static\""
|
|
log_test $? 0 "(*, G) MDB entry default protocol"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010 | grep \"proto static\""
|
|
log_test $? 0 "(S, G) MDB entry default protocol"
|
|
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1 proto bgp dst $vtep_ip src_vni 10010"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010 | grep \"proto bgp\""
|
|
log_test $? 0 "(*, G) MDB entry protocol after replacement"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010 | grep \"proto bgp\""
|
|
log_test $? 0 "(S, G) MDB entry protocol after replacement"
|
|
|
|
run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"
|
|
|
|
# Default destination port and replacement.
|
|
run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1 dst $vtep_ip src_vni 10010"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010 | grep \" dst_port \""
|
|
log_test $? 1 "(*, G) MDB entry default destination port"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010 | grep \" dst_port \""
|
|
log_test $? 1 "(S, G) MDB entry default destination port"
|
|
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1 dst $vtep_ip dst_port 1234 src_vni 10010"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010 | grep \" dst_port 1234 \""
|
|
log_test $? 0 "(*, G) MDB entry destination port after replacement"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010 | grep \" dst_port 1234 \""
|
|
log_test $? 0 "(S, G) MDB entry destination port after replacement"
|
|
|
|
run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"
|
|
|
|
# Default destination VNI and replacement.
|
|
run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1 dst $vtep_ip src_vni 10010"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010 | grep \" vni \""
|
|
log_test $? 1 "(*, G) MDB entry default destination VNI"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010 | grep \" vni \""
|
|
log_test $? 1 "(S, G) MDB entry default destination VNI"
|
|
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1 dst $vtep_ip vni 1234 src_vni 10010"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010 | grep \" vni 1234 \""
|
|
log_test $? 0 "(*, G) MDB entry destination VNI after replacement"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010 | grep \" vni 1234 \""
|
|
log_test $? 0 "(S, G) MDB entry destination VNI after replacement"
|
|
|
|
run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"
|
|
|
|
# Default outgoing interface and replacement.
|
|
run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1 dst $vtep_ip src_vni 10010"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010 | grep \" via \""
|
|
log_test $? 1 "(*, G) MDB entry default outgoing interface"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010 | grep \" via \""
|
|
log_test $? 1 "(S, G) MDB entry default outgoing interface"
|
|
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $src1 dst $vtep_ip src_vni 10010 via veth0"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src_vni 10010 | grep \" via veth0 \""
|
|
log_test $? 0 "(*, G) MDB entry outgoing interface after replacement"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src1 src_vni 10010 | grep \" via veth0 \""
|
|
log_test $? 0 "(S, G) MDB entry outgoing interface after replacement"
|
|
|
|
run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep_ip src_vni 10010"
|
|
|
|
# Error cases.
|
|
run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $all_zeros_grp permanent filter_mode exclude dst $vtep_ip src_vni 10010"
|
|
log_test $? 255 "All-zeros group with filter mode"
|
|
|
|
run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $all_zeros_grp permanent source_list $src1 dst $vtep_ip src_vni 10010"
|
|
log_test $? 255 "All-zeros group with source list"
|
|
|
|
run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp permanent filter_mode include dst $vtep_ip src_vni 10010"
|
|
log_test $? 255 "(*, G) INCLUDE with an empty source list"
|
|
|
|
run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $grp dst $vtep_ip src_vni 10010"
|
|
log_test $? 255 "Invalid source in source list"
|
|
|
|
run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp permanent source_list $src1 dst $vtep_ip src_vni 10010"
|
|
log_test $? 255 "Source list without filter mode"
|
|
}
|
|
|
|
star_g_ipv4_ipv4()
|
|
{
|
|
local ns1=$ns1_v4
|
|
local grp=239.1.1.1
|
|
local src1=192.0.2.129
|
|
local src2=192.0.2.130
|
|
local src3=192.0.2.131
|
|
local vtep_ip=198.51.100.100
|
|
local all_zeros_grp=0.0.0.0
|
|
|
|
echo
|
|
echo "Control path: (*, G) operations - IPv4 overlay / IPv4 underlay"
|
|
echo "--------------------------------------------------------------"
|
|
|
|
star_g_common $ns1 $grp $src1 $src2 $src3 $vtep_ip $all_zeros_grp
|
|
}
|
|
|
|
star_g_ipv6_ipv4()
|
|
{
|
|
local ns1=$ns1_v4
|
|
local grp=ff0e::1
|
|
local src1=2001:db8:100::1
|
|
local src2=2001:db8:100::2
|
|
local src3=2001:db8:100::3
|
|
local vtep_ip=198.51.100.100
|
|
local all_zeros_grp=::
|
|
|
|
echo
|
|
echo "Control path: (*, G) operations - IPv6 overlay / IPv4 underlay"
|
|
echo "--------------------------------------------------------------"
|
|
|
|
star_g_common $ns1 $grp $src1 $src2 $src3 $vtep_ip $all_zeros_grp
|
|
}
|
|
|
|
star_g_ipv4_ipv6()
|
|
{
|
|
local ns1=$ns1_v6
|
|
local grp=239.1.1.1
|
|
local src1=192.0.2.129
|
|
local src2=192.0.2.130
|
|
local src3=192.0.2.131
|
|
local vtep_ip=2001:db8:1000::1
|
|
local all_zeros_grp=0.0.0.0
|
|
|
|
echo
|
|
echo "Control path: (*, G) operations - IPv4 overlay / IPv6 underlay"
|
|
echo "--------------------------------------------------------------"
|
|
|
|
star_g_common $ns1 $grp $src1 $src2 $src3 $vtep_ip $all_zeros_grp
|
|
}
|
|
|
|
star_g_ipv6_ipv6()
|
|
{
|
|
local ns1=$ns1_v6
|
|
local grp=ff0e::1
|
|
local src1=2001:db8:100::1
|
|
local src2=2001:db8:100::2
|
|
local src3=2001:db8:100::3
|
|
local vtep_ip=2001:db8:1000::1
|
|
local all_zeros_grp=::
|
|
|
|
echo
|
|
echo "Control path: (*, G) operations - IPv6 overlay / IPv6 underlay"
|
|
echo "--------------------------------------------------------------"
|
|
|
|
star_g_common $ns1 $grp $src1 $src2 $src3 $vtep_ip $all_zeros_grp
|
|
}
|
|
|
|
sg_common()
|
|
{
|
|
local ns1=$1; shift
|
|
local grp=$1; shift
|
|
local src=$1; shift
|
|
local vtep_ip=$1; shift
|
|
local all_zeros_grp=$1; shift
|
|
|
|
# Test control path operations specific to (S, G) entries.
|
|
|
|
# Default filter mode.
|
|
run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp src $src permanent dst $vtep_ip src_vni 10010"
|
|
run_cmd "bridge -n $ns1 -d -s mdb get dev vx0 grp $grp src $src src_vni 10010 | grep include"
|
|
log_test $? 0 "(S, G) MDB entry default filter mode"
|
|
|
|
run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp src $src permanent dst $vtep_ip src_vni 10010"
|
|
|
|
# Error cases.
|
|
run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp src $src permanent filter_mode include dst $vtep_ip src_vni 10010"
|
|
log_test $? 255 "(S, G) with filter mode"
|
|
|
|
run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp src $src permanent source_list $src dst $vtep_ip src_vni 10010"
|
|
log_test $? 255 "(S, G) with source list"
|
|
|
|
run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp src $grp permanent dst $vtep_ip src_vni 10010"
|
|
log_test $? 255 "(S, G) with an invalid source list"
|
|
|
|
run_cmd "bridge -n $ns1 mdb add dev vx0 port vx0 grp $all_zeros_grp src $src permanent dst $vtep_ip src_vni 10010"
|
|
log_test $? 255 "All-zeros group with source"
|
|
}
|
|
|
|
sg_ipv4_ipv4()
|
|
{
|
|
local ns1=$ns1_v4
|
|
local grp=239.1.1.1
|
|
local src=192.0.2.129
|
|
local vtep_ip=198.51.100.100
|
|
local all_zeros_grp=0.0.0.0
|
|
|
|
echo
|
|
echo "Control path: (S, G) operations - IPv4 overlay / IPv4 underlay"
|
|
echo "--------------------------------------------------------------"
|
|
|
|
sg_common $ns1 $grp $src $vtep_ip $all_zeros_grp
|
|
}
|
|
|
|
sg_ipv6_ipv4()
|
|
{
|
|
local ns1=$ns1_v4
|
|
local grp=ff0e::1
|
|
local src=2001:db8:100::1
|
|
local vtep_ip=198.51.100.100
|
|
local all_zeros_grp=::
|
|
|
|
echo
|
|
echo "Control path: (S, G) operations - IPv6 overlay / IPv4 underlay"
|
|
echo "--------------------------------------------------------------"
|
|
|
|
sg_common $ns1 $grp $src $vtep_ip $all_zeros_grp
|
|
}
|
|
|
|
sg_ipv4_ipv6()
|
|
{
|
|
local ns1=$ns1_v6
|
|
local grp=239.1.1.1
|
|
local src=192.0.2.129
|
|
local vtep_ip=2001:db8:1000::1
|
|
local all_zeros_grp=0.0.0.0
|
|
|
|
echo
|
|
echo "Control path: (S, G) operations - IPv4 overlay / IPv6 underlay"
|
|
echo "--------------------------------------------------------------"
|
|
|
|
sg_common $ns1 $grp $src $vtep_ip $all_zeros_grp
|
|
}
|
|
|
|
sg_ipv6_ipv6()
|
|
{
|
|
local ns1=$ns1_v6
|
|
local grp=ff0e::1
|
|
local src=2001:db8:100::1
|
|
local vtep_ip=2001:db8:1000::1
|
|
local all_zeros_grp=::
|
|
|
|
echo
|
|
echo "Control path: (S, G) operations - IPv6 overlay / IPv6 underlay"
|
|
echo "--------------------------------------------------------------"
|
|
|
|
sg_common $ns1 $grp $src $vtep_ip $all_zeros_grp
|
|
}
|
|
|
|
ipv4_grps_get()
|
|
{
|
|
local max_grps=$1; shift
|
|
local i
|
|
|
|
for i in $(seq 0 $((max_grps - 1))); do
|
|
echo "239.1.1.$i"
|
|
done
|
|
}
|
|
|
|
ipv6_grps_get()
|
|
{
|
|
local max_grps=$1; shift
|
|
local i
|
|
|
|
for i in $(seq 0 $((max_grps - 1))); do
|
|
echo "ff0e::$(printf %x $i)"
|
|
done
|
|
}
|
|
|
|
dump_common()
|
|
{
|
|
local ns1=$1; shift
|
|
local local_addr=$1; shift
|
|
local remote_prefix=$1; shift
|
|
local fn=$1; shift
|
|
local max_vxlan_devs=2
|
|
local max_remotes=64
|
|
local max_grps=256
|
|
local num_entries
|
|
local batch_file
|
|
local grp
|
|
local i j
|
|
|
|
# The kernel maintains various markers for the MDB dump. Add a test for
|
|
# large scale MDB dump to make sure that all the configured entries are
|
|
# dumped and that the markers are used correctly.
|
|
|
|
# Create net devices.
|
|
for i in $(seq 1 $max_vxlan_devs); do
|
|
ip -n $ns1 link add name vx-test${i} up type vxlan \
|
|
local $local_addr dstport 4789 external vnifilter
|
|
done
|
|
|
|
# Create batch file with MDB entries.
|
|
batch_file=$(mktemp)
|
|
for i in $(seq 1 $max_vxlan_devs); do
|
|
for j in $(seq 1 $max_remotes); do
|
|
for grp in $($fn $max_grps); do
|
|
echo "mdb add dev vx-test${i} port vx-test${i} grp $grp permanent dst ${remote_prefix}${j}" >> $batch_file
|
|
done
|
|
done
|
|
done
|
|
|
|
# Program the batch file and check for expected number of entries.
|
|
bridge -n $ns1 -b $batch_file
|
|
for i in $(seq 1 $max_vxlan_devs); do
|
|
num_entries=$(bridge -n $ns1 mdb show dev vx-test${i} | grep "permanent" | wc -l)
|
|
[[ $num_entries -eq $((max_grps * max_remotes)) ]]
|
|
log_test $? 0 "Large scale dump - VXLAN device #$i"
|
|
done
|
|
|
|
rm -rf $batch_file
|
|
}
|
|
|
|
dump_ipv4_ipv4()
|
|
{
|
|
local ns1=$ns1_v4
|
|
local local_addr=192.0.2.1
|
|
local remote_prefix=198.51.100.
|
|
local fn=ipv4_grps_get
|
|
|
|
echo
|
|
echo "Control path: Large scale MDB dump - IPv4 overlay / IPv4 underlay"
|
|
echo "-----------------------------------------------------------------"
|
|
|
|
dump_common $ns1 $local_addr $remote_prefix $fn
|
|
}
|
|
|
|
dump_ipv6_ipv4()
|
|
{
|
|
local ns1=$ns1_v4
|
|
local local_addr=192.0.2.1
|
|
local remote_prefix=198.51.100.
|
|
local fn=ipv6_grps_get
|
|
|
|
echo
|
|
echo "Control path: Large scale MDB dump - IPv6 overlay / IPv4 underlay"
|
|
echo "-----------------------------------------------------------------"
|
|
|
|
dump_common $ns1 $local_addr $remote_prefix $fn
|
|
}
|
|
|
|
dump_ipv4_ipv6()
|
|
{
|
|
local ns1=$ns1_v6
|
|
local local_addr=2001:db8:1::1
|
|
local remote_prefix=2001:db8:1000::
|
|
local fn=ipv4_grps_get
|
|
|
|
echo
|
|
echo "Control path: Large scale MDB dump - IPv4 overlay / IPv6 underlay"
|
|
echo "-----------------------------------------------------------------"
|
|
|
|
dump_common $ns1 $local_addr $remote_prefix $fn
|
|
}
|
|
|
|
dump_ipv6_ipv6()
|
|
{
|
|
local ns1=$ns1_v6
|
|
local local_addr=2001:db8:1::1
|
|
local remote_prefix=2001:db8:1000::
|
|
local fn=ipv6_grps_get
|
|
|
|
echo
|
|
echo "Control path: Large scale MDB dump - IPv6 overlay / IPv6 underlay"
|
|
echo "-----------------------------------------------------------------"
|
|
|
|
dump_common $ns1 $local_addr $remote_prefix $fn
|
|
}
|
|
|
|
flush()
|
|
{
|
|
local num_entries
|
|
|
|
echo
|
|
echo "Control path: Flush"
|
|
echo "-------------------"
|
|
|
|
# Add entries with different attributes and check that they are all
|
|
# flushed when the flush command is given with no parameters.
|
|
|
|
# Different source VNI.
|
|
run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.1 src_vni 10010"
|
|
run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.2 permanent dst 198.51.100.1 src_vni 10011"
|
|
|
|
# Different routing protocol.
|
|
run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.3 permanent proto bgp dst 198.51.100.1 src_vni 10010"
|
|
run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.4 permanent proto zebra dst 198.51.100.1 src_vni 10010"
|
|
|
|
# Different destination IP.
|
|
run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.5 permanent dst 198.51.100.1 src_vni 10010"
|
|
run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.6 permanent dst 198.51.100.2 src_vni 10010"
|
|
|
|
# Different destination port.
|
|
run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.7 permanent dst 198.51.100.1 dst_port 11111 src_vni 10010"
|
|
run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.8 permanent dst 198.51.100.1 dst_port 22222 src_vni 10010"
|
|
|
|
# Different VNI.
|
|
run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.9 permanent dst 198.51.100.1 vni 10010 src_vni 10010"
|
|
run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.10 permanent dst 198.51.100.1 vni 10020 src_vni 10010"
|
|
|
|
run_cmd "bridge -n $ns1_v4 mdb flush dev vx0"
|
|
num_entries=$(bridge -n $ns1_v4 mdb show dev vx0 | wc -l)
|
|
[[ $num_entries -eq 0 ]]
|
|
log_test $? 0 "Flush all"
|
|
|
|
# Check that entries are flushed when port is specified as the VXLAN
|
|
# device and that an error is returned when port is specified as a
|
|
# different net device.
|
|
|
|
run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.1 src_vni 10010"
|
|
run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.2 src_vni 10010"
|
|
|
|
run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 port vx0"
|
|
run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010"
|
|
log_test $? 254 "Flush by port - matching"
|
|
|
|
run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 port veth0"
|
|
log_test $? 255 "Flush by port - non-matching"
|
|
|
|
# Check that when flushing by source VNI only entries programmed with
|
|
# the specified source VNI are flushed and the rest are not.
|
|
|
|
run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.1 src_vni 10010"
|
|
run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.2 src_vni 10010"
|
|
run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.1 src_vni 10011"
|
|
run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.2 src_vni 10011"
|
|
|
|
run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 src_vni 10010"
|
|
|
|
run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010"
|
|
log_test $? 254 "Flush by source VNI - matching"
|
|
run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10011"
|
|
log_test $? 0 "Flush by source VNI - non-matching"
|
|
|
|
run_cmd "bridge -n $ns1_v4 mdb flush dev vx0"
|
|
|
|
# Check that all entries are flushed when "permanent" is specified and
|
|
# that an error is returned when "nopermanent" is specified.
|
|
|
|
run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.1 src_vni 10010"
|
|
run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.2 src_vni 10010"
|
|
|
|
run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 permanent"
|
|
run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010"
|
|
log_test $? 254 "Flush by \"permanent\" state"
|
|
|
|
run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 nopermanent"
|
|
log_test $? 255 "Flush by \"nopermanent\" state"
|
|
|
|
# Check that when flushing by routing protocol only entries programmed
|
|
# with the specified routing protocol are flushed and the rest are not.
|
|
|
|
run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent proto bgp dst 198.51.100.1 src_vni 10010"
|
|
run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent proto zebra dst 198.51.100.2 src_vni 10010"
|
|
|
|
run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 proto bgp"
|
|
|
|
run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep \"proto bgp\""
|
|
log_test $? 1 "Flush by routing protocol - matching"
|
|
run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep \"proto zebra\""
|
|
log_test $? 0 "Flush by routing protocol - non-matching"
|
|
|
|
run_cmd "bridge -n $ns1_v4 mdb flush dev vx0"
|
|
|
|
# Check that when flushing by destination IP only entries programmed
|
|
# with the specified destination IP are flushed and the rest are not.
|
|
|
|
# IPv4.
|
|
|
|
run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.1 src_vni 10010"
|
|
run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.2 src_vni 10010"
|
|
|
|
run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 dst 198.51.100.2"
|
|
|
|
run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep 198.51.100.2"
|
|
log_test $? 1 "Flush by IPv4 destination IP - matching"
|
|
run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep 198.51.100.1"
|
|
log_test $? 0 "Flush by IPv4 destination IP - non-matching"
|
|
|
|
run_cmd "bridge -n $ns1_v4 mdb flush dev vx0"
|
|
|
|
# IPv6.
|
|
|
|
run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 2001:db8:1000::1 src_vni 10010"
|
|
run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 2001:db8:1000::2 src_vni 10010"
|
|
|
|
run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 dst 2001:db8:1000::2"
|
|
|
|
run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep 2001:db8:1000::2"
|
|
log_test $? 1 "Flush by IPv6 destination IP - matching"
|
|
run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep 2001:db8:1000::1"
|
|
log_test $? 0 "Flush by IPv6 destination IP - non-matching"
|
|
|
|
run_cmd "bridge -n $ns1_v4 mdb flush dev vx0"
|
|
|
|
# Check that when flushing by UDP destination port only entries
|
|
# programmed with the specified port are flushed and the rest are not.
|
|
|
|
run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst_port 11111 dst 198.51.100.1 src_vni 10010"
|
|
run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst_port 22222 dst 198.51.100.2 src_vni 10010"
|
|
|
|
run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 dst_port 11111"
|
|
|
|
run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep \"dst_port 11111\""
|
|
log_test $? 1 "Flush by UDP destination port - matching"
|
|
run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep \"dst_port 22222\""
|
|
log_test $? 0 "Flush by UDP destination port - non-matching"
|
|
|
|
run_cmd "bridge -n $ns1_v4 mdb flush dev vx0"
|
|
|
|
# When not specifying a UDP destination port for an entry, traffic is
|
|
# encapsulated with the device's UDP destination port. Check that when
|
|
# flushing by the device's UDP destination port only entries programmed
|
|
# with this port are flushed and the rest are not.
|
|
|
|
run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.1 src_vni 10010"
|
|
run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst_port 22222 dst 198.51.100.2 src_vni 10010"
|
|
|
|
run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 dst_port 4789"
|
|
|
|
run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep 198.51.100.1"
|
|
log_test $? 1 "Flush by device's UDP destination port - matching"
|
|
run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep 198.51.100.2"
|
|
log_test $? 0 "Flush by device's UDP destination port - non-matching"
|
|
|
|
run_cmd "bridge -n $ns1_v4 mdb flush dev vx0"
|
|
|
|
# Check that when flushing by destination VNI only entries programmed
|
|
# with the specified destination VNI are flushed and the rest are not.
|
|
|
|
run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent vni 20010 dst 198.51.100.1 src_vni 10010"
|
|
run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent vni 20011 dst 198.51.100.2 src_vni 10010"
|
|
|
|
run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 vni 20010"
|
|
|
|
run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep \" vni 20010\""
|
|
log_test $? 1 "Flush by destination VNI - matching"
|
|
run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep \" vni 20011\""
|
|
log_test $? 0 "Flush by destination VNI - non-matching"
|
|
|
|
run_cmd "bridge -n $ns1_v4 mdb flush dev vx0"
|
|
|
|
# When not specifying a destination VNI for an entry, traffic is
|
|
# encapsulated with the source VNI. Check that when flushing by a
|
|
# destination VNI that is equal to the source VNI only such entries are
|
|
# flushed and the rest are not.
|
|
|
|
run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent dst 198.51.100.1 src_vni 10010"
|
|
run_cmd "bridge -n $ns1_v4 mdb add dev vx0 port vx0 grp 239.1.1.1 permanent vni 20010 dst 198.51.100.2 src_vni 10010"
|
|
|
|
run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 vni 10010"
|
|
|
|
run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep 198.51.100.1"
|
|
log_test $? 1 "Flush by destination VNI equal to source VNI - matching"
|
|
run_cmd "bridge -n $ns1_v4 -d -s mdb get dev vx0 grp 239.1.1.1 src_vni 10010 | grep 198.51.100.2"
|
|
log_test $? 0 "Flush by destination VNI equal to source VNI - non-matching"
|
|
|
|
run_cmd "bridge -n $ns1_v4 mdb flush dev vx0"
|
|
|
|
# Test that an error is returned when trying to flush using VLAN ID.
|
|
|
|
run_cmd "bridge -n $ns1_v4 mdb flush dev vx0 vid 10"
|
|
log_test $? 255 "Flush by VLAN ID"
|
|
}
|
|
|
|
################################################################################
|
|
# Tests - Data path
|
|
|
|
encap_params_common()
|
|
{
|
|
local ns1=$1; shift
|
|
local ns2=$1; shift
|
|
local vtep1_ip=$1; shift
|
|
local vtep2_ip=$1; shift
|
|
local plen=$1; shift
|
|
local enc_ethtype=$1; shift
|
|
local grp=$1; shift
|
|
local src=$1; shift
|
|
local mz=$1; shift
|
|
|
|
# Test that packets forwarded by the VXLAN MDB are encapsulated with
|
|
# the correct parameters. Transmit packets from the first namespace and
|
|
# check that they hit the corresponding filters on the ingress of the
|
|
# second namespace.
|
|
|
|
run_cmd "tc -n $ns2 qdisc replace dev veth0 clsact"
|
|
run_cmd "tc -n $ns2 qdisc replace dev vx0 clsact"
|
|
run_cmd "ip -n $ns2 address replace $vtep1_ip/$plen dev lo"
|
|
run_cmd "ip -n $ns2 address replace $vtep2_ip/$plen dev lo"
|
|
|
|
# Check destination IP.
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip src_vni 10010"
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep2_ip src_vni 10020"
|
|
|
|
run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_dst_ip $vtep1_ip action pass"
|
|
run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 101 1
|
|
log_test $? 0 "Destination IP - match"
|
|
|
|
run_cmd "ip netns exec $ns1 $mz br0.20 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 101 1
|
|
log_test $? 0 "Destination IP - no match"
|
|
|
|
run_cmd "tc -n $ns2 filter del dev vx0 ingress pref 1 handle 101 flower"
|
|
run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep2_ip src_vni 10020"
|
|
run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep1_ip src_vni 10010"
|
|
|
|
# Check destination port.
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip src_vni 10010"
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip dst_port 1111 src_vni 10020"
|
|
|
|
run_cmd "tc -n $ns2 filter replace dev veth0 ingress pref 1 handle 101 proto $enc_ethtype flower ip_proto udp dst_port 4789 action pass"
|
|
run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev veth0 ingress" 101 1
|
|
log_test $? 0 "Default destination port - match"
|
|
|
|
run_cmd "ip netns exec $ns1 $mz br0.20 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev veth0 ingress" 101 1
|
|
log_test $? 0 "Default destination port - no match"
|
|
|
|
run_cmd "tc -n $ns2 filter replace dev veth0 ingress pref 1 handle 101 proto $enc_ethtype flower ip_proto udp dst_port 1111 action pass"
|
|
run_cmd "ip netns exec $ns1 $mz br0.20 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev veth0 ingress" 101 1
|
|
log_test $? 0 "Non-default destination port - match"
|
|
|
|
run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev veth0 ingress" 101 1
|
|
log_test $? 0 "Non-default destination port - no match"
|
|
|
|
run_cmd "tc -n $ns2 filter del dev veth0 ingress pref 1 handle 101 flower"
|
|
run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep1_ip src_vni 10020"
|
|
run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep1_ip src_vni 10010"
|
|
|
|
# Check default VNI.
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip src_vni 10010"
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip src_vni 10020"
|
|
|
|
run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_key_id 10010 action pass"
|
|
run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 101 1
|
|
log_test $? 0 "Default destination VNI - match"
|
|
|
|
run_cmd "ip netns exec $ns1 $mz br0.20 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 101 1
|
|
log_test $? 0 "Default destination VNI - no match"
|
|
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip vni 10020 src_vni 10010"
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip vni 10010 src_vni 10020"
|
|
|
|
run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_key_id 10020 action pass"
|
|
run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 101 1
|
|
log_test $? 0 "Non-default destination VNI - match"
|
|
|
|
run_cmd "ip netns exec $ns1 $mz br0.20 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 101 1
|
|
log_test $? 0 "Non-default destination VNI - no match"
|
|
|
|
run_cmd "tc -n $ns2 filter del dev vx0 ingress pref 1 handle 101 flower"
|
|
run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep1_ip src_vni 10020"
|
|
run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep1_ip src_vni 10010"
|
|
}
|
|
|
|
encap_params_ipv4_ipv4()
|
|
{
|
|
local ns1=$ns1_v4
|
|
local ns2=$ns2_v4
|
|
local vtep1_ip=198.51.100.100
|
|
local vtep2_ip=198.51.100.200
|
|
local plen=32
|
|
local enc_ethtype="ip"
|
|
local grp=239.1.1.1
|
|
local src=192.0.2.129
|
|
|
|
echo
|
|
echo "Data path: Encapsulation parameters - IPv4 overlay / IPv4 underlay"
|
|
echo "------------------------------------------------------------------"
|
|
|
|
encap_params_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $enc_ethtype \
|
|
$grp $src "mausezahn"
|
|
}
|
|
|
|
encap_params_ipv6_ipv4()
|
|
{
|
|
local ns1=$ns1_v4
|
|
local ns2=$ns2_v4
|
|
local vtep1_ip=198.51.100.100
|
|
local vtep2_ip=198.51.100.200
|
|
local plen=32
|
|
local enc_ethtype="ip"
|
|
local grp=ff0e::1
|
|
local src=2001:db8:100::1
|
|
|
|
echo
|
|
echo "Data path: Encapsulation parameters - IPv6 overlay / IPv4 underlay"
|
|
echo "------------------------------------------------------------------"
|
|
|
|
encap_params_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $enc_ethtype \
|
|
$grp $src "mausezahn -6"
|
|
}
|
|
|
|
encap_params_ipv4_ipv6()
|
|
{
|
|
local ns1=$ns1_v6
|
|
local ns2=$ns2_v6
|
|
local vtep1_ip=2001:db8:1000::1
|
|
local vtep2_ip=2001:db8:2000::1
|
|
local plen=128
|
|
local enc_ethtype="ipv6"
|
|
local grp=239.1.1.1
|
|
local src=192.0.2.129
|
|
|
|
echo
|
|
echo "Data path: Encapsulation parameters - IPv4 overlay / IPv6 underlay"
|
|
echo "------------------------------------------------------------------"
|
|
|
|
encap_params_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $enc_ethtype \
|
|
$grp $src "mausezahn"
|
|
}
|
|
|
|
encap_params_ipv6_ipv6()
|
|
{
|
|
local ns1=$ns1_v6
|
|
local ns2=$ns2_v6
|
|
local vtep1_ip=2001:db8:1000::1
|
|
local vtep2_ip=2001:db8:2000::1
|
|
local plen=128
|
|
local enc_ethtype="ipv6"
|
|
local grp=ff0e::1
|
|
local src=2001:db8:100::1
|
|
|
|
echo
|
|
echo "Data path: Encapsulation parameters - IPv6 overlay / IPv6 underlay"
|
|
echo "------------------------------------------------------------------"
|
|
|
|
encap_params_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $enc_ethtype \
|
|
$grp $src "mausezahn -6"
|
|
}
|
|
|
|
starg_exclude_ir_common()
|
|
{
|
|
local ns1=$1; shift
|
|
local ns2=$1; shift
|
|
local vtep1_ip=$1; shift
|
|
local vtep2_ip=$1; shift
|
|
local plen=$1; shift
|
|
local grp=$1; shift
|
|
local valid_src=$1; shift
|
|
local invalid_src=$1; shift
|
|
local mz=$1; shift
|
|
|
|
# Install a (*, G) EXCLUDE MDB entry with one source and two remote
|
|
# VTEPs. Make sure that the source in the source list is not forwarded
|
|
# and that a source not in the list is forwarded. Remove one of the
|
|
# VTEPs from the entry and make sure that packets are only forwarded to
|
|
# the remaining VTEP.
|
|
|
|
run_cmd "tc -n $ns2 qdisc replace dev vx0 clsact"
|
|
run_cmd "ip -n $ns2 address replace $vtep1_ip/$plen dev lo"
|
|
run_cmd "ip -n $ns2 address replace $vtep2_ip/$plen dev lo"
|
|
|
|
run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_dst_ip $vtep1_ip action pass"
|
|
run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 102 proto all flower enc_dst_ip $vtep2_ip action pass"
|
|
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $invalid_src dst $vtep1_ip src_vni 10010"
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $invalid_src dst $vtep2_ip src_vni 10010"
|
|
|
|
# Check that invalid source is not forwarded to any VTEP.
|
|
run_cmd "ip netns exec $ns1 $mz br0.10 -A $invalid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 101 0
|
|
log_test $? 0 "Block excluded source - first VTEP"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 102 0
|
|
log_test $? 0 "Block excluded source - second VTEP"
|
|
|
|
# Check that valid source is forwarded to both VTEPs.
|
|
run_cmd "ip netns exec $ns1 $mz br0.10 -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 101 1
|
|
log_test $? 0 "Forward valid source - first VTEP"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 102 1
|
|
log_test $? 0 "Forward valid source - second VTEP"
|
|
|
|
# Remove second VTEP.
|
|
run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep2_ip src_vni 10010"
|
|
|
|
# Check that invalid source is not forwarded to any VTEP.
|
|
run_cmd "ip netns exec $ns1 $mz br0.10 -A $invalid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 101 1
|
|
log_test $? 0 "Block excluded source after removal - first VTEP"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 102 1
|
|
log_test $? 0 "Block excluded source after removal - second VTEP"
|
|
|
|
# Check that valid source is forwarded to the remaining VTEP.
|
|
run_cmd "ip netns exec $ns1 $mz br0.10 -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 101 2
|
|
log_test $? 0 "Forward valid source after removal - first VTEP"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 102 1
|
|
log_test $? 0 "Forward valid source after removal - second VTEP"
|
|
}
|
|
|
|
starg_exclude_ir_ipv4_ipv4()
|
|
{
|
|
local ns1=$ns1_v4
|
|
local ns2=$ns2_v4
|
|
local vtep1_ip=198.51.100.100
|
|
local vtep2_ip=198.51.100.200
|
|
local plen=32
|
|
local grp=239.1.1.1
|
|
local valid_src=192.0.2.129
|
|
local invalid_src=192.0.2.145
|
|
|
|
echo
|
|
echo "Data path: (*, G) EXCLUDE - IR - IPv4 overlay / IPv4 underlay"
|
|
echo "-------------------------------------------------------------"
|
|
|
|
starg_exclude_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
|
|
$valid_src $invalid_src "mausezahn"
|
|
}
|
|
|
|
starg_exclude_ir_ipv6_ipv4()
|
|
{
|
|
local ns1=$ns1_v4
|
|
local ns2=$ns2_v4
|
|
local vtep1_ip=198.51.100.100
|
|
local vtep2_ip=198.51.100.200
|
|
local plen=32
|
|
local grp=ff0e::1
|
|
local valid_src=2001:db8:100::1
|
|
local invalid_src=2001:db8:200::1
|
|
|
|
echo
|
|
echo "Data path: (*, G) EXCLUDE - IR - IPv6 overlay / IPv4 underlay"
|
|
echo "-------------------------------------------------------------"
|
|
|
|
starg_exclude_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
|
|
$valid_src $invalid_src "mausezahn -6"
|
|
}
|
|
|
|
starg_exclude_ir_ipv4_ipv6()
|
|
{
|
|
local ns1=$ns1_v6
|
|
local ns2=$ns2_v6
|
|
local vtep1_ip=2001:db8:1000::1
|
|
local vtep2_ip=2001:db8:2000::1
|
|
local plen=128
|
|
local grp=239.1.1.1
|
|
local valid_src=192.0.2.129
|
|
local invalid_src=192.0.2.145
|
|
|
|
echo
|
|
echo "Data path: (*, G) EXCLUDE - IR - IPv4 overlay / IPv6 underlay"
|
|
echo "-------------------------------------------------------------"
|
|
|
|
starg_exclude_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
|
|
$valid_src $invalid_src "mausezahn"
|
|
}
|
|
|
|
starg_exclude_ir_ipv6_ipv6()
|
|
{
|
|
local ns1=$ns1_v6
|
|
local ns2=$ns2_v6
|
|
local vtep1_ip=2001:db8:1000::1
|
|
local vtep2_ip=2001:db8:2000::1
|
|
local plen=128
|
|
local grp=ff0e::1
|
|
local valid_src=2001:db8:100::1
|
|
local invalid_src=2001:db8:200::1
|
|
|
|
echo
|
|
echo "Data path: (*, G) EXCLUDE - IR - IPv6 overlay / IPv6 underlay"
|
|
echo "-------------------------------------------------------------"
|
|
|
|
starg_exclude_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
|
|
$valid_src $invalid_src "mausezahn -6"
|
|
}
|
|
|
|
starg_include_ir_common()
|
|
{
|
|
local ns1=$1; shift
|
|
local ns2=$1; shift
|
|
local vtep1_ip=$1; shift
|
|
local vtep2_ip=$1; shift
|
|
local plen=$1; shift
|
|
local grp=$1; shift
|
|
local valid_src=$1; shift
|
|
local invalid_src=$1; shift
|
|
local mz=$1; shift
|
|
|
|
# Install a (*, G) INCLUDE MDB entry with one source and two remote
|
|
# VTEPs. Make sure that the source in the source list is forwarded and
|
|
# that a source not in the list is not forwarded. Remove one of the
|
|
# VTEPs from the entry and make sure that packets are only forwarded to
|
|
# the remaining VTEP.
|
|
|
|
run_cmd "tc -n $ns2 qdisc replace dev vx0 clsact"
|
|
run_cmd "ip -n $ns2 address replace $vtep1_ip/$plen dev lo"
|
|
run_cmd "ip -n $ns2 address replace $vtep2_ip/$plen dev lo"
|
|
|
|
run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_dst_ip $vtep1_ip action pass"
|
|
run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 102 proto all flower enc_dst_ip $vtep2_ip action pass"
|
|
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode include source_list $valid_src dst $vtep1_ip src_vni 10010"
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode include source_list $valid_src dst $vtep2_ip src_vni 10010"
|
|
|
|
# Check that invalid source is not forwarded to any VTEP.
|
|
run_cmd "ip netns exec $ns1 $mz br0.10 -A $invalid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 101 0
|
|
log_test $? 0 "Block excluded source - first VTEP"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 102 0
|
|
log_test $? 0 "Block excluded source - second VTEP"
|
|
|
|
# Check that valid source is forwarded to both VTEPs.
|
|
run_cmd "ip netns exec $ns1 $mz br0.10 -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 101 1
|
|
log_test $? 0 "Forward valid source - first VTEP"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 102 1
|
|
log_test $? 0 "Forward valid source - second VTEP"
|
|
|
|
# Remove second VTEP.
|
|
run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep2_ip src_vni 10010"
|
|
|
|
# Check that invalid source is not forwarded to any VTEP.
|
|
run_cmd "ip netns exec $ns1 $mz br0.10 -A $invalid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 101 1
|
|
log_test $? 0 "Block excluded source after removal - first VTEP"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 102 1
|
|
log_test $? 0 "Block excluded source after removal - second VTEP"
|
|
|
|
# Check that valid source is forwarded to the remaining VTEP.
|
|
run_cmd "ip netns exec $ns1 $mz br0.10 -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 101 2
|
|
log_test $? 0 "Forward valid source after removal - first VTEP"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 102 1
|
|
log_test $? 0 "Forward valid source after removal - second VTEP"
|
|
}
|
|
|
|
starg_include_ir_ipv4_ipv4()
|
|
{
|
|
local ns1=$ns1_v4
|
|
local ns2=$ns2_v4
|
|
local vtep1_ip=198.51.100.100
|
|
local vtep2_ip=198.51.100.200
|
|
local plen=32
|
|
local grp=239.1.1.1
|
|
local valid_src=192.0.2.129
|
|
local invalid_src=192.0.2.145
|
|
|
|
echo
|
|
echo "Data path: (*, G) INCLUDE - IR - IPv4 overlay / IPv4 underlay"
|
|
echo "-------------------------------------------------------------"
|
|
|
|
starg_include_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
|
|
$valid_src $invalid_src "mausezahn"
|
|
}
|
|
|
|
starg_include_ir_ipv6_ipv4()
|
|
{
|
|
local ns1=$ns1_v4
|
|
local ns2=$ns2_v4
|
|
local vtep1_ip=198.51.100.100
|
|
local vtep2_ip=198.51.100.200
|
|
local plen=32
|
|
local grp=ff0e::1
|
|
local valid_src=2001:db8:100::1
|
|
local invalid_src=2001:db8:200::1
|
|
|
|
echo
|
|
echo "Data path: (*, G) INCLUDE - IR - IPv6 overlay / IPv4 underlay"
|
|
echo "-------------------------------------------------------------"
|
|
|
|
starg_include_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
|
|
$valid_src $invalid_src "mausezahn -6"
|
|
}
|
|
|
|
starg_include_ir_ipv4_ipv6()
|
|
{
|
|
local ns1=$ns1_v6
|
|
local ns2=$ns2_v6
|
|
local vtep1_ip=2001:db8:1000::1
|
|
local vtep2_ip=2001:db8:2000::1
|
|
local plen=128
|
|
local grp=239.1.1.1
|
|
local valid_src=192.0.2.129
|
|
local invalid_src=192.0.2.145
|
|
|
|
echo
|
|
echo "Data path: (*, G) INCLUDE - IR - IPv4 overlay / IPv6 underlay"
|
|
echo "-------------------------------------------------------------"
|
|
|
|
starg_include_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
|
|
$valid_src $invalid_src "mausezahn"
|
|
}
|
|
|
|
starg_include_ir_ipv6_ipv6()
|
|
{
|
|
local ns1=$ns1_v6
|
|
local ns2=$ns2_v6
|
|
local vtep1_ip=2001:db8:1000::1
|
|
local vtep2_ip=2001:db8:2000::1
|
|
local plen=128
|
|
local grp=ff0e::1
|
|
local valid_src=2001:db8:100::1
|
|
local invalid_src=2001:db8:200::1
|
|
|
|
echo
|
|
echo "Data path: (*, G) INCLUDE - IR - IPv6 overlay / IPv6 underlay"
|
|
echo "-------------------------------------------------------------"
|
|
|
|
starg_include_ir_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $grp \
|
|
$valid_src $invalid_src "mausezahn -6"
|
|
}
|
|
|
|
starg_exclude_p2mp_common()
|
|
{
|
|
local ns1=$1; shift
|
|
local ns2=$1; shift
|
|
local mcast_grp=$1; shift
|
|
local plen=$1; shift
|
|
local grp=$1; shift
|
|
local valid_src=$1; shift
|
|
local invalid_src=$1; shift
|
|
local mz=$1; shift
|
|
|
|
# Install a (*, G) EXCLUDE MDB entry with one source and one multicast
|
|
# group to which packets are sent. Make sure that the source in the
|
|
# source list is not forwarded and that a source not in the list is
|
|
# forwarded.
|
|
|
|
run_cmd "tc -n $ns2 qdisc replace dev vx0 clsact"
|
|
run_cmd "ip -n $ns2 address replace $mcast_grp/$plen dev veth0 autojoin"
|
|
|
|
run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_dst_ip $mcast_grp action pass"
|
|
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode exclude source_list $invalid_src dst $mcast_grp src_vni 10010 via veth0"
|
|
|
|
# Check that invalid source is not forwarded.
|
|
run_cmd "ip netns exec $ns1 $mz br0.10 -A $invalid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 101 0
|
|
log_test $? 0 "Block excluded source"
|
|
|
|
# Check that valid source is forwarded.
|
|
run_cmd "ip netns exec $ns1 $mz br0.10 -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 101 1
|
|
log_test $? 0 "Forward valid source"
|
|
|
|
# Remove the VTEP from the multicast group.
|
|
run_cmd "ip -n $ns2 address del $mcast_grp/$plen dev veth0"
|
|
|
|
# Check that valid source is not received anymore.
|
|
run_cmd "ip netns exec $ns1 $mz br0.10 -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 101 1
|
|
log_test $? 0 "Receive of valid source after removal from group"
|
|
}
|
|
|
|
starg_exclude_p2mp_ipv4_ipv4()
|
|
{
|
|
local ns1=$ns1_v4
|
|
local ns2=$ns2_v4
|
|
local mcast_grp=238.1.1.1
|
|
local plen=32
|
|
local grp=239.1.1.1
|
|
local valid_src=192.0.2.129
|
|
local invalid_src=192.0.2.145
|
|
|
|
echo
|
|
echo "Data path: (*, G) EXCLUDE - P2MP - IPv4 overlay / IPv4 underlay"
|
|
echo "---------------------------------------------------------------"
|
|
|
|
starg_exclude_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
|
|
$valid_src $invalid_src "mausezahn"
|
|
}
|
|
|
|
starg_exclude_p2mp_ipv6_ipv4()
|
|
{
|
|
local ns1=$ns1_v4
|
|
local ns2=$ns2_v4
|
|
local mcast_grp=238.1.1.1
|
|
local plen=32
|
|
local grp=ff0e::1
|
|
local valid_src=2001:db8:100::1
|
|
local invalid_src=2001:db8:200::1
|
|
|
|
echo
|
|
echo "Data path: (*, G) EXCLUDE - P2MP - IPv6 overlay / IPv4 underlay"
|
|
echo "---------------------------------------------------------------"
|
|
|
|
starg_exclude_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
|
|
$valid_src $invalid_src "mausezahn -6"
|
|
}
|
|
|
|
starg_exclude_p2mp_ipv4_ipv6()
|
|
{
|
|
local ns1=$ns1_v6
|
|
local ns2=$ns2_v6
|
|
local mcast_grp=ff0e::2
|
|
local plen=128
|
|
local grp=239.1.1.1
|
|
local valid_src=192.0.2.129
|
|
local invalid_src=192.0.2.145
|
|
|
|
echo
|
|
echo "Data path: (*, G) EXCLUDE - P2MP - IPv4 overlay / IPv6 underlay"
|
|
echo "---------------------------------------------------------------"
|
|
|
|
starg_exclude_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
|
|
$valid_src $invalid_src "mausezahn"
|
|
}
|
|
|
|
starg_exclude_p2mp_ipv6_ipv6()
|
|
{
|
|
local ns1=$ns1_v6
|
|
local ns2=$ns2_v6
|
|
local mcast_grp=ff0e::2
|
|
local plen=128
|
|
local grp=ff0e::1
|
|
local valid_src=2001:db8:100::1
|
|
local invalid_src=2001:db8:200::1
|
|
|
|
echo
|
|
echo "Data path: (*, G) EXCLUDE - P2MP - IPv6 overlay / IPv6 underlay"
|
|
echo "---------------------------------------------------------------"
|
|
|
|
starg_exclude_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
|
|
$valid_src $invalid_src "mausezahn -6"
|
|
}
|
|
|
|
starg_include_p2mp_common()
|
|
{
|
|
local ns1=$1; shift
|
|
local ns2=$1; shift
|
|
local mcast_grp=$1; shift
|
|
local plen=$1; shift
|
|
local grp=$1; shift
|
|
local valid_src=$1; shift
|
|
local invalid_src=$1; shift
|
|
local mz=$1; shift
|
|
|
|
# Install a (*, G) INCLUDE MDB entry with one source and one multicast
|
|
# group to which packets are sent. Make sure that the source in the
|
|
# source list is forwarded and that a source not in the list is not
|
|
# forwarded.
|
|
|
|
run_cmd "tc -n $ns2 qdisc replace dev vx0 clsact"
|
|
run_cmd "ip -n $ns2 address replace $mcast_grp/$plen dev veth0 autojoin"
|
|
|
|
run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_dst_ip $mcast_grp action pass"
|
|
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent filter_mode include source_list $valid_src dst $mcast_grp src_vni 10010 via veth0"
|
|
|
|
# Check that invalid source is not forwarded.
|
|
run_cmd "ip netns exec $ns1 $mz br0.10 -A $invalid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 101 0
|
|
log_test $? 0 "Block excluded source"
|
|
|
|
# Check that valid source is forwarded.
|
|
run_cmd "ip netns exec $ns1 $mz br0.10 -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 101 1
|
|
log_test $? 0 "Forward valid source"
|
|
|
|
# Remove the VTEP from the multicast group.
|
|
run_cmd "ip -n $ns2 address del $mcast_grp/$plen dev veth0"
|
|
|
|
# Check that valid source is not received anymore.
|
|
run_cmd "ip netns exec $ns1 $mz br0.10 -A $valid_src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 101 1
|
|
log_test $? 0 "Receive of valid source after removal from group"
|
|
}
|
|
|
|
starg_include_p2mp_ipv4_ipv4()
|
|
{
|
|
local ns1=$ns1_v4
|
|
local ns2=$ns2_v4
|
|
local mcast_grp=238.1.1.1
|
|
local plen=32
|
|
local grp=239.1.1.1
|
|
local valid_src=192.0.2.129
|
|
local invalid_src=192.0.2.145
|
|
|
|
echo
|
|
echo "Data path: (*, G) INCLUDE - P2MP - IPv4 overlay / IPv4 underlay"
|
|
echo "---------------------------------------------------------------"
|
|
|
|
starg_include_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
|
|
$valid_src $invalid_src "mausezahn"
|
|
}
|
|
|
|
starg_include_p2mp_ipv6_ipv4()
|
|
{
|
|
local ns1=$ns1_v4
|
|
local ns2=$ns2_v4
|
|
local mcast_grp=238.1.1.1
|
|
local plen=32
|
|
local grp=ff0e::1
|
|
local valid_src=2001:db8:100::1
|
|
local invalid_src=2001:db8:200::1
|
|
|
|
echo
|
|
echo "Data path: (*, G) INCLUDE - P2MP - IPv6 overlay / IPv4 underlay"
|
|
echo "---------------------------------------------------------------"
|
|
|
|
starg_include_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
|
|
$valid_src $invalid_src "mausezahn -6"
|
|
}
|
|
|
|
starg_include_p2mp_ipv4_ipv6()
|
|
{
|
|
local ns1=$ns1_v6
|
|
local ns2=$ns2_v6
|
|
local mcast_grp=ff0e::2
|
|
local plen=128
|
|
local grp=239.1.1.1
|
|
local valid_src=192.0.2.129
|
|
local invalid_src=192.0.2.145
|
|
|
|
echo
|
|
echo "Data path: (*, G) INCLUDE - P2MP - IPv4 overlay / IPv6 underlay"
|
|
echo "---------------------------------------------------------------"
|
|
|
|
starg_include_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
|
|
$valid_src $invalid_src "mausezahn"
|
|
}
|
|
|
|
starg_include_p2mp_ipv6_ipv6()
|
|
{
|
|
local ns1=$ns1_v6
|
|
local ns2=$ns2_v6
|
|
local mcast_grp=ff0e::2
|
|
local plen=128
|
|
local grp=ff0e::1
|
|
local valid_src=2001:db8:100::1
|
|
local invalid_src=2001:db8:200::1
|
|
|
|
echo
|
|
echo "Data path: (*, G) INCLUDE - P2MP - IPv6 overlay / IPv6 underlay"
|
|
echo "---------------------------------------------------------------"
|
|
|
|
starg_include_p2mp_common $ns1 $ns2 $mcast_grp $plen $grp \
|
|
$valid_src $invalid_src "mausezahn -6"
|
|
}
|
|
|
|
egress_vni_translation_common()
|
|
{
|
|
local ns1=$1; shift
|
|
local ns2=$1; shift
|
|
local mcast_grp=$1; shift
|
|
local plen=$1; shift
|
|
local proto=$1; shift
|
|
local grp=$1; shift
|
|
local src=$1; shift
|
|
local mz=$1; shift
|
|
|
|
# When P2MP tunnels are used with optimized inter-subnet multicast
|
|
# (OISM) [1], the ingress VTEP does not perform VNI translation and
|
|
# uses the VNI of the source broadcast domain (BD). If the egress VTEP
|
|
# is a member in the source BD, then no VNI translation is needed.
|
|
# Otherwise, the egress VTEP needs to translate the VNI to the
|
|
# supplementary broadcast domain (SBD) VNI, which is usually the L3VNI.
|
|
#
|
|
# In this test, remove the VTEP in the second namespace from VLAN 10
|
|
# (VNI 10010) and make sure that a packet sent from this VLAN on the
|
|
# first VTEP is received by the SVI corresponding to the L3VNI (14000 /
|
|
# VLAN 4000) on the second VTEP.
|
|
#
|
|
# The second VTEP will be able to decapsulate the packet with VNI 10010
|
|
# because this VNI is configured on its shared VXLAN device. Later,
|
|
# when ingressing the bridge, the VNI to VLAN lookup will fail because
|
|
# the VTEP is not a member in VLAN 10, which will cause the packet to
|
|
# be tagged with VLAN 4000 since it is configured as PVID.
|
|
#
|
|
# [1] https://datatracker.ietf.org/doc/html/draft-ietf-bess-evpn-irb-mcast
|
|
|
|
run_cmd "tc -n $ns2 qdisc replace dev br0.4000 clsact"
|
|
run_cmd "ip -n $ns2 address replace $mcast_grp/$plen dev veth0 autojoin"
|
|
run_cmd "tc -n $ns2 filter replace dev br0.4000 ingress pref 1 handle 101 proto $proto flower src_ip $src dst_ip $grp action pass"
|
|
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp src $src permanent dst $mcast_grp src_vni 10010 via veth0"
|
|
|
|
# Remove the second VTEP from VLAN 10.
|
|
run_cmd "bridge -n $ns2 vlan del vid 10 dev vx0"
|
|
|
|
# Make sure that packets sent from the first VTEP over VLAN 10 are
|
|
# received by the SVI corresponding to the L3VNI (14000 / VLAN 4000) on
|
|
# the second VTEP, since it is configured as PVID.
|
|
run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev br0.4000 ingress" 101 1
|
|
log_test $? 0 "Egress VNI translation - PVID configured"
|
|
|
|
# Remove PVID flag from VLAN 4000 on the second VTEP and make sure
|
|
# packets are no longer received by the SVI interface.
|
|
run_cmd "bridge -n $ns2 vlan add vid 4000 dev vx0"
|
|
run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev br0.4000 ingress" 101 1
|
|
log_test $? 0 "Egress VNI translation - no PVID configured"
|
|
|
|
# Reconfigure the PVID and make sure packets are received again.
|
|
run_cmd "bridge -n $ns2 vlan add vid 4000 dev vx0 pvid"
|
|
run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev br0.4000 ingress" 101 2
|
|
log_test $? 0 "Egress VNI translation - PVID reconfigured"
|
|
}
|
|
|
|
egress_vni_translation_ipv4_ipv4()
|
|
{
|
|
local ns1=$ns1_v4
|
|
local ns2=$ns2_v4
|
|
local mcast_grp=238.1.1.1
|
|
local plen=32
|
|
local proto="ipv4"
|
|
local grp=239.1.1.1
|
|
local src=192.0.2.129
|
|
|
|
echo
|
|
echo "Data path: Egress VNI translation - IPv4 overlay / IPv4 underlay"
|
|
echo "----------------------------------------------------------------"
|
|
|
|
egress_vni_translation_common $ns1 $ns2 $mcast_grp $plen $proto $grp \
|
|
$src "mausezahn"
|
|
}
|
|
|
|
egress_vni_translation_ipv6_ipv4()
|
|
{
|
|
local ns1=$ns1_v4
|
|
local ns2=$ns2_v4
|
|
local mcast_grp=238.1.1.1
|
|
local plen=32
|
|
local proto="ipv6"
|
|
local grp=ff0e::1
|
|
local src=2001:db8:100::1
|
|
|
|
echo
|
|
echo "Data path: Egress VNI translation - IPv6 overlay / IPv4 underlay"
|
|
echo "----------------------------------------------------------------"
|
|
|
|
egress_vni_translation_common $ns1 $ns2 $mcast_grp $plen $proto $grp \
|
|
$src "mausezahn -6"
|
|
}
|
|
|
|
egress_vni_translation_ipv4_ipv6()
|
|
{
|
|
local ns1=$ns1_v6
|
|
local ns2=$ns2_v6
|
|
local mcast_grp=ff0e::2
|
|
local plen=128
|
|
local proto="ipv4"
|
|
local grp=239.1.1.1
|
|
local src=192.0.2.129
|
|
|
|
echo
|
|
echo "Data path: Egress VNI translation - IPv4 overlay / IPv6 underlay"
|
|
echo "----------------------------------------------------------------"
|
|
|
|
egress_vni_translation_common $ns1 $ns2 $mcast_grp $plen $proto $grp \
|
|
$src "mausezahn"
|
|
}
|
|
|
|
egress_vni_translation_ipv6_ipv6()
|
|
{
|
|
local ns1=$ns1_v6
|
|
local ns2=$ns2_v6
|
|
local mcast_grp=ff0e::2
|
|
local plen=128
|
|
local proto="ipv6"
|
|
local grp=ff0e::1
|
|
local src=2001:db8:100::1
|
|
|
|
echo
|
|
echo "Data path: Egress VNI translation - IPv6 overlay / IPv6 underlay"
|
|
echo "----------------------------------------------------------------"
|
|
|
|
egress_vni_translation_common $ns1 $ns2 $mcast_grp $plen $proto $grp \
|
|
$src "mausezahn -6"
|
|
}
|
|
|
|
all_zeros_mdb_common()
|
|
{
|
|
local ns1=$1; shift
|
|
local ns2=$1; shift
|
|
local vtep1_ip=$1; shift
|
|
local vtep2_ip=$1; shift
|
|
local vtep3_ip=$1; shift
|
|
local vtep4_ip=$1; shift
|
|
local plen=$1; shift
|
|
local ipv4_grp=239.1.1.1
|
|
local ipv4_unreg_grp=239.2.2.2
|
|
local ipv4_ll_grp=224.0.0.100
|
|
local ipv4_src=192.0.2.129
|
|
local ipv6_grp=ff0e::1
|
|
local ipv6_unreg_grp=ff0e::2
|
|
local ipv6_ll_grp=ff02::1
|
|
local ipv6_src=2001:db8:100::1
|
|
|
|
# Install all-zeros (catchall) MDB entries for IPv4 and IPv6 traffic
|
|
# and make sure they only forward unregistered IP multicast traffic
|
|
# which is not link-local. Also make sure that each entry only forwards
|
|
# traffic from the matching address family.
|
|
|
|
# Associate two different VTEPs with one all-zeros MDB entry: Two with
|
|
# the IPv4 entry (0.0.0.0) and another two with the IPv6 one (::).
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp 0.0.0.0 permanent dst $vtep1_ip src_vni 10010"
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp 0.0.0.0 permanent dst $vtep2_ip src_vni 10010"
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp :: permanent dst $vtep3_ip src_vni 10010"
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp :: permanent dst $vtep4_ip src_vni 10010"
|
|
|
|
# Associate one VTEP from each set with a regular MDB entry: One with
|
|
# an IPv4 entry and another with an IPv6 one.
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $ipv4_grp permanent dst $vtep1_ip src_vni 10010"
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $ipv6_grp permanent dst $vtep3_ip src_vni 10010"
|
|
|
|
# Add filters to match on decapsulated traffic in the second namespace.
|
|
run_cmd "tc -n $ns2 qdisc replace dev vx0 clsact"
|
|
run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_dst_ip $vtep1_ip action pass"
|
|
run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 102 proto all flower enc_dst_ip $vtep2_ip action pass"
|
|
run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 103 proto all flower enc_dst_ip $vtep3_ip action pass"
|
|
run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 104 proto all flower enc_dst_ip $vtep4_ip action pass"
|
|
|
|
# Configure the VTEP addresses in the second namespace to enable
|
|
# decapsulation.
|
|
run_cmd "ip -n $ns2 address replace $vtep1_ip/$plen dev lo"
|
|
run_cmd "ip -n $ns2 address replace $vtep2_ip/$plen dev lo"
|
|
run_cmd "ip -n $ns2 address replace $vtep3_ip/$plen dev lo"
|
|
run_cmd "ip -n $ns2 address replace $vtep4_ip/$plen dev lo"
|
|
|
|
# Send registered IPv4 multicast and make sure it only arrives to the
|
|
# first VTEP.
|
|
run_cmd "ip netns exec $ns1 mausezahn br0.10 -A $ipv4_src -B $ipv4_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 101 1
|
|
log_test $? 0 "Registered IPv4 multicast - first VTEP"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 102 0
|
|
log_test $? 0 "Registered IPv4 multicast - second VTEP"
|
|
|
|
# Send unregistered IPv4 multicast that is not link-local and make sure
|
|
# it arrives to the first and second VTEPs.
|
|
run_cmd "ip netns exec $ns1 mausezahn br0.10 -A $ipv4_src -B $ipv4_unreg_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 101 2
|
|
log_test $? 0 "Unregistered IPv4 multicast - first VTEP"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 102 1
|
|
log_test $? 0 "Unregistered IPv4 multicast - second VTEP"
|
|
|
|
# Send IPv4 link-local multicast traffic and make sure it does not
|
|
# arrive to any VTEP.
|
|
run_cmd "ip netns exec $ns1 mausezahn br0.10 -A $ipv4_src -B $ipv4_ll_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 101 2
|
|
log_test $? 0 "Link-local IPv4 multicast - first VTEP"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 102 1
|
|
log_test $? 0 "Link-local IPv4 multicast - second VTEP"
|
|
|
|
# Send registered IPv4 multicast using a unicast MAC address and make
|
|
# sure it does not arrive to any VTEP.
|
|
run_cmd "ip netns exec $ns1 mausezahn br0.10 -a own -b 00:11:22:33:44:55 -A $ipv4_src -B $ipv4_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 101 2
|
|
log_test $? 0 "Registered IPv4 multicast with a unicast MAC - first VTEP"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 102 1
|
|
log_test $? 0 "Registered IPv4 multicast with a unicast MAC - second VTEP"
|
|
|
|
# Send registered IPv4 multicast using a broadcast MAC address and make
|
|
# sure it does not arrive to any VTEP.
|
|
run_cmd "ip netns exec $ns1 mausezahn br0.10 -a own -b bcast -A $ipv4_src -B $ipv4_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 101 2
|
|
log_test $? 0 "Registered IPv4 multicast with a broadcast MAC - first VTEP"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 102 1
|
|
log_test $? 0 "Registered IPv4 multicast with a broadcast MAC - second VTEP"
|
|
|
|
# Make sure IPv4 traffic did not reach the VTEPs associated with
|
|
# IPv6 entries.
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 103 0
|
|
log_test $? 0 "IPv4 traffic - third VTEP"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 104 0
|
|
log_test $? 0 "IPv4 traffic - fourth VTEP"
|
|
|
|
# Reset IPv4 filters before testing IPv6 traffic.
|
|
run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto all flower enc_dst_ip $vtep1_ip action pass"
|
|
run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 102 proto all flower enc_dst_ip $vtep2_ip action pass"
|
|
|
|
# Send registered IPv6 multicast and make sure it only arrives to the
|
|
# third VTEP.
|
|
run_cmd "ip netns exec $ns1 mausezahn -6 br0.10 -A $ipv6_src -B $ipv6_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 103 1
|
|
log_test $? 0 "Registered IPv6 multicast - third VTEP"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 104 0
|
|
log_test $? 0 "Registered IPv6 multicast - fourth VTEP"
|
|
|
|
# Send unregistered IPv6 multicast that is not link-local and make sure
|
|
# it arrives to the third and fourth VTEPs.
|
|
run_cmd "ip netns exec $ns1 mausezahn -6 br0.10 -A $ipv6_src -B $ipv6_unreg_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 103 2
|
|
log_test $? 0 "Unregistered IPv6 multicast - third VTEP"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 104 1
|
|
log_test $? 0 "Unregistered IPv6 multicast - fourth VTEP"
|
|
|
|
# Send IPv6 link-local multicast traffic and make sure it does not
|
|
# arrive to any VTEP.
|
|
run_cmd "ip netns exec $ns1 mausezahn -6 br0.10 -A $ipv6_src -B $ipv6_ll_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 103 2
|
|
log_test $? 0 "Link-local IPv6 multicast - third VTEP"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 104 1
|
|
log_test $? 0 "Link-local IPv6 multicast - fourth VTEP"
|
|
|
|
# Send registered IPv6 multicast using a unicast MAC address and make
|
|
# sure it does not arrive to any VTEP.
|
|
run_cmd "ip netns exec $ns1 mausezahn -6 br0.10 -a own -b 00:11:22:33:44:55 -A $ipv6_src -B $ipv6_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 103 2
|
|
log_test $? 0 "Registered IPv6 multicast with a unicast MAC - third VTEP"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 104 1
|
|
log_test $? 0 "Registered IPv6 multicast with a unicast MAC - fourth VTEP"
|
|
|
|
# Send registered IPv6 multicast using a broadcast MAC address and make
|
|
# sure it does not arrive to any VTEP.
|
|
run_cmd "ip netns exec $ns1 mausezahn -6 br0.10 -a own -b bcast -A $ipv6_src -B $ipv6_grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 103 2
|
|
log_test $? 0 "Registered IPv6 multicast with a broadcast MAC - third VTEP"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 104 1
|
|
log_test $? 0 "Registered IPv6 multicast with a broadcast MAC - fourth VTEP"
|
|
|
|
# Make sure IPv6 traffic did not reach the VTEPs associated with
|
|
# IPv4 entries.
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 101 0
|
|
log_test $? 0 "IPv6 traffic - first VTEP"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 102 0
|
|
log_test $? 0 "IPv6 traffic - second VTEP"
|
|
}
|
|
|
|
all_zeros_mdb_ipv4()
|
|
{
|
|
local ns1=$ns1_v4
|
|
local ns2=$ns2_v4
|
|
local vtep1_ip=198.51.100.101
|
|
local vtep2_ip=198.51.100.102
|
|
local vtep3_ip=198.51.100.103
|
|
local vtep4_ip=198.51.100.104
|
|
local plen=32
|
|
|
|
echo
|
|
echo "Data path: All-zeros MDB entry - IPv4 underlay"
|
|
echo "----------------------------------------------"
|
|
|
|
all_zeros_mdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $vtep3_ip \
|
|
$vtep4_ip $plen
|
|
}
|
|
|
|
all_zeros_mdb_ipv6()
|
|
{
|
|
local ns1=$ns1_v6
|
|
local ns2=$ns2_v6
|
|
local vtep1_ip=2001:db8:1000::1
|
|
local vtep2_ip=2001:db8:2000::1
|
|
local vtep3_ip=2001:db8:3000::1
|
|
local vtep4_ip=2001:db8:4000::1
|
|
local plen=128
|
|
|
|
echo
|
|
echo "Data path: All-zeros MDB entry - IPv6 underlay"
|
|
echo "----------------------------------------------"
|
|
|
|
all_zeros_mdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $vtep3_ip \
|
|
$vtep4_ip $plen
|
|
}
|
|
|
|
mdb_fdb_common()
|
|
{
|
|
local ns1=$1; shift
|
|
local ns2=$1; shift
|
|
local vtep1_ip=$1; shift
|
|
local vtep2_ip=$1; shift
|
|
local plen=$1; shift
|
|
local proto=$1; shift
|
|
local grp=$1; shift
|
|
local src=$1; shift
|
|
local mz=$1; shift
|
|
|
|
# Install an MDB entry and an FDB entry and make sure that the FDB
|
|
# entry only forwards traffic that was not forwarded by the MDB.
|
|
|
|
# Associate the MDB entry with one VTEP and the FDB entry with another
|
|
# VTEP.
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp permanent dst $vtep1_ip src_vni 10010"
|
|
run_cmd "bridge -n $ns1 fdb add 00:00:00:00:00:00 dev vx0 self static dst $vtep2_ip src_vni 10010"
|
|
|
|
# Add filters to match on decapsulated traffic in the second namespace.
|
|
run_cmd "tc -n $ns2 qdisc replace dev vx0 clsact"
|
|
run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 101 proto $proto flower ip_proto udp dst_port 54321 enc_dst_ip $vtep1_ip action pass"
|
|
run_cmd "tc -n $ns2 filter replace dev vx0 ingress pref 1 handle 102 proto $proto flower ip_proto udp dst_port 54321 enc_dst_ip $vtep2_ip action pass"
|
|
|
|
# Configure the VTEP addresses in the second namespace to enable
|
|
# decapsulation.
|
|
run_cmd "ip -n $ns2 address replace $vtep1_ip/$plen dev lo"
|
|
run_cmd "ip -n $ns2 address replace $vtep2_ip/$plen dev lo"
|
|
|
|
# Send IP multicast traffic and make sure it is forwarded by the MDB
|
|
# and only arrives to the first VTEP.
|
|
run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 101 1
|
|
log_test $? 0 "IP multicast - first VTEP"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 102 0
|
|
log_test $? 0 "IP multicast - second VTEP"
|
|
|
|
# Send broadcast traffic and make sure it is forwarded by the FDB and
|
|
# only arrives to the second VTEP.
|
|
run_cmd "ip netns exec $ns1 $mz br0.10 -a own -b bcast -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 101 1
|
|
log_test $? 0 "Broadcast - first VTEP"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 102 1
|
|
log_test $? 0 "Broadcast - second VTEP"
|
|
|
|
# Remove the MDB entry and make sure that IP multicast is now forwarded
|
|
# by the FDB to the second VTEP.
|
|
run_cmd "bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp dst $vtep1_ip src_vni 10010"
|
|
run_cmd "ip netns exec $ns1 $mz br0.10 -A $src -B $grp -t udp sp=12345,dp=54321 -p 100 -c 1 -q"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 101 1
|
|
log_test $? 0 "IP multicast after removal - first VTEP"
|
|
tc_check_packets "$ns2" "dev vx0 ingress" 102 2
|
|
log_test $? 0 "IP multicast after removal - second VTEP"
|
|
}
|
|
|
|
mdb_fdb_ipv4_ipv4()
|
|
{
|
|
local ns1=$ns1_v4
|
|
local ns2=$ns2_v4
|
|
local vtep1_ip=198.51.100.100
|
|
local vtep2_ip=198.51.100.200
|
|
local plen=32
|
|
local proto="ipv4"
|
|
local grp=239.1.1.1
|
|
local src=192.0.2.129
|
|
|
|
echo
|
|
echo "Data path: MDB with FDB - IPv4 overlay / IPv4 underlay"
|
|
echo "------------------------------------------------------"
|
|
|
|
mdb_fdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $proto $grp $src \
|
|
"mausezahn"
|
|
}
|
|
|
|
mdb_fdb_ipv6_ipv4()
|
|
{
|
|
local ns1=$ns1_v4
|
|
local ns2=$ns2_v4
|
|
local vtep1_ip=198.51.100.100
|
|
local vtep2_ip=198.51.100.200
|
|
local plen=32
|
|
local proto="ipv6"
|
|
local grp=ff0e::1
|
|
local src=2001:db8:100::1
|
|
|
|
echo
|
|
echo "Data path: MDB with FDB - IPv6 overlay / IPv4 underlay"
|
|
echo "------------------------------------------------------"
|
|
|
|
mdb_fdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $proto $grp $src \
|
|
"mausezahn -6"
|
|
}
|
|
|
|
mdb_fdb_ipv4_ipv6()
|
|
{
|
|
local ns1=$ns1_v6
|
|
local ns2=$ns2_v6
|
|
local vtep1_ip=2001:db8:1000::1
|
|
local vtep2_ip=2001:db8:2000::1
|
|
local plen=128
|
|
local proto="ipv4"
|
|
local grp=239.1.1.1
|
|
local src=192.0.2.129
|
|
|
|
echo
|
|
echo "Data path: MDB with FDB - IPv4 overlay / IPv6 underlay"
|
|
echo "------------------------------------------------------"
|
|
|
|
mdb_fdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $proto $grp $src \
|
|
"mausezahn"
|
|
}
|
|
|
|
mdb_fdb_ipv6_ipv6()
|
|
{
|
|
local ns1=$ns1_v6
|
|
local ns2=$ns2_v6
|
|
local vtep1_ip=2001:db8:1000::1
|
|
local vtep2_ip=2001:db8:2000::1
|
|
local plen=128
|
|
local proto="ipv6"
|
|
local grp=ff0e::1
|
|
local src=2001:db8:100::1
|
|
|
|
echo
|
|
echo "Data path: MDB with FDB - IPv6 overlay / IPv6 underlay"
|
|
echo "------------------------------------------------------"
|
|
|
|
mdb_fdb_common $ns1 $ns2 $vtep1_ip $vtep2_ip $plen $proto $grp $src \
|
|
"mausezahn -6"
|
|
}
|
|
|
|
mdb_grp1_loop()
|
|
{
|
|
local ns1=$1; shift
|
|
local vtep1_ip=$1; shift
|
|
local grp1=$1; shift
|
|
|
|
while true; do
|
|
bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp1 dst $vtep1_ip src_vni 10010
|
|
bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp1 permanent dst $vtep1_ip src_vni 10010
|
|
done >/dev/null 2>&1
|
|
}
|
|
|
|
mdb_grp2_loop()
|
|
{
|
|
local ns1=$1; shift
|
|
local vtep1_ip=$1; shift
|
|
local vtep2_ip=$1; shift
|
|
local grp2=$1; shift
|
|
|
|
while true; do
|
|
bridge -n $ns1 mdb del dev vx0 port vx0 grp $grp2 dst $vtep1_ip src_vni 10010
|
|
bridge -n $ns1 mdb add dev vx0 port vx0 grp $grp2 permanent dst $vtep1_ip src_vni 10010
|
|
bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp2 permanent dst $vtep2_ip src_vni 10010
|
|
done >/dev/null 2>&1
|
|
}
|
|
|
|
mdb_torture_common()
|
|
{
|
|
local ns1=$1; shift
|
|
local vtep1_ip=$1; shift
|
|
local vtep2_ip=$1; shift
|
|
local grp1=$1; shift
|
|
local grp2=$1; shift
|
|
local src=$1; shift
|
|
local mz=$1; shift
|
|
local pid1
|
|
local pid2
|
|
local pid3
|
|
local pid4
|
|
|
|
# Continuously send two streams that are forwarded by two different MDB
|
|
# entries. The first entry will be added and deleted in a loop. This
|
|
# allows us to test that the data path does not use freed MDB entry
|
|
# memory. The second entry will have two remotes, one that is added and
|
|
# deleted in a loop and another that is replaced in a loop. This allows
|
|
# us to test that the data path does not use freed remote entry memory.
|
|
# The test is considered successful if nothing crashed.
|
|
|
|
# Create the MDB entries that will be continuously deleted / replaced.
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp1 permanent dst $vtep1_ip src_vni 10010"
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp2 permanent dst $vtep1_ip src_vni 10010"
|
|
run_cmd "bridge -n $ns1 mdb replace dev vx0 port vx0 grp $grp2 permanent dst $vtep2_ip src_vni 10010"
|
|
|
|
mdb_grp1_loop $ns1 $vtep1_ip $grp1 &
|
|
pid1=$!
|
|
mdb_grp2_loop $ns1 $vtep1_ip $vtep2_ip $grp2 &
|
|
pid2=$!
|
|
ip netns exec $ns1 $mz br0.10 -A $src -B $grp1 -t udp sp=12345,dp=54321 -p 100 -c 0 -q &
|
|
pid3=$!
|
|
ip netns exec $ns1 $mz br0.10 -A $src -B $grp2 -t udp sp=12345,dp=54321 -p 100 -c 0 -q &
|
|
pid4=$!
|
|
|
|
sleep 30
|
|
kill -9 $pid1 $pid2 $pid3 $pid4
|
|
wait $pid1 $pid2 $pid3 $pid4 2>/dev/null
|
|
|
|
log_test 0 0 "Torture test"
|
|
}
|
|
|
|
mdb_torture_ipv4_ipv4()
|
|
{
|
|
local ns1=$ns1_v4
|
|
local vtep1_ip=198.51.100.100
|
|
local vtep2_ip=198.51.100.200
|
|
local grp1=239.1.1.1
|
|
local grp2=239.2.2.2
|
|
local src=192.0.2.129
|
|
|
|
echo
|
|
echo "Data path: MDB torture test - IPv4 overlay / IPv4 underlay"
|
|
echo "----------------------------------------------------------"
|
|
|
|
mdb_torture_common $ns1 $vtep1_ip $vtep2_ip $grp1 $grp2 $src \
|
|
"mausezahn"
|
|
}
|
|
|
|
mdb_torture_ipv6_ipv4()
|
|
{
|
|
local ns1=$ns1_v4
|
|
local vtep1_ip=198.51.100.100
|
|
local vtep2_ip=198.51.100.200
|
|
local grp1=ff0e::1
|
|
local grp2=ff0e::2
|
|
local src=2001:db8:100::1
|
|
|
|
echo
|
|
echo "Data path: MDB torture test - IPv6 overlay / IPv4 underlay"
|
|
echo "----------------------------------------------------------"
|
|
|
|
mdb_torture_common $ns1 $vtep1_ip $vtep2_ip $grp1 $grp2 $src \
|
|
"mausezahn -6"
|
|
}
|
|
|
|
mdb_torture_ipv4_ipv6()
|
|
{
|
|
local ns1=$ns1_v6
|
|
local vtep1_ip=2001:db8:1000::1
|
|
local vtep2_ip=2001:db8:2000::1
|
|
local grp1=239.1.1.1
|
|
local grp2=239.2.2.2
|
|
local src=192.0.2.129
|
|
|
|
echo
|
|
echo "Data path: MDB torture test - IPv4 overlay / IPv6 underlay"
|
|
echo "----------------------------------------------------------"
|
|
|
|
mdb_torture_common $ns1 $vtep1_ip $vtep2_ip $grp1 $grp2 $src \
|
|
"mausezahn"
|
|
}
|
|
|
|
mdb_torture_ipv6_ipv6()
|
|
{
|
|
local ns1=$ns1_v6
|
|
local vtep1_ip=2001:db8:1000::1
|
|
local vtep2_ip=2001:db8:2000::1
|
|
local grp1=ff0e::1
|
|
local grp2=ff0e::2
|
|
local src=2001:db8:100::1
|
|
|
|
echo
|
|
echo "Data path: MDB torture test - IPv6 overlay / IPv6 underlay"
|
|
echo "----------------------------------------------------------"
|
|
|
|
mdb_torture_common $ns1 $vtep1_ip $vtep2_ip $grp1 $grp2 $src \
|
|
"mausezahn -6"
|
|
}
|
|
|
|
################################################################################
|
|
# Usage
|
|
|
|
usage()
|
|
{
|
|
cat <<EOF
|
|
usage: ${0##*/} OPTS
|
|
|
|
-t <test> Test(s) to run (default: all)
|
|
(options: $TESTS)
|
|
-c Control path tests only
|
|
-d Data path tests only
|
|
-p Pause on fail
|
|
-P Pause after each test before cleanup
|
|
-v Verbose mode (show commands and output)
|
|
EOF
|
|
}
|
|
|
|
################################################################################
|
|
# Main
|
|
|
|
trap cleanup EXIT
|
|
|
|
while getopts ":t:cdpPvh" opt; do
|
|
case $opt in
|
|
t) TESTS=$OPTARG;;
|
|
c) TESTS=${CONTROL_PATH_TESTS};;
|
|
d) TESTS=${DATA_PATH_TESTS};;
|
|
p) PAUSE_ON_FAIL=yes;;
|
|
P) PAUSE=yes;;
|
|
v) VERBOSE=$(($VERBOSE + 1));;
|
|
h) usage; exit 0;;
|
|
*) usage; exit 1;;
|
|
esac
|
|
done
|
|
|
|
# Make sure we don't pause twice.
|
|
[ "${PAUSE}" = "yes" ] && PAUSE_ON_FAIL=no
|
|
|
|
if [ "$(id -u)" -ne 0 ];then
|
|
echo "SKIP: Need root privileges"
|
|
exit $ksft_skip;
|
|
fi
|
|
|
|
if [ ! -x "$(command -v ip)" ]; then
|
|
echo "SKIP: Could not run test without ip tool"
|
|
exit $ksft_skip
|
|
fi
|
|
|
|
if [ ! -x "$(command -v bridge)" ]; then
|
|
echo "SKIP: Could not run test without bridge tool"
|
|
exit $ksft_skip
|
|
fi
|
|
|
|
if [ ! -x "$(command -v mausezahn)" ]; then
|
|
echo "SKIP: Could not run test without mausezahn tool"
|
|
exit $ksft_skip
|
|
fi
|
|
|
|
if [ ! -x "$(command -v jq)" ]; then
|
|
echo "SKIP: Could not run test without jq tool"
|
|
exit $ksft_skip
|
|
fi
|
|
|
|
bridge mdb help 2>&1 | grep -q "flush"
|
|
if [ $? -ne 0 ]; then
|
|
echo "SKIP: iproute2 bridge too old, missing VXLAN MDB flush support"
|
|
exit $ksft_skip
|
|
fi
|
|
|
|
# Start clean.
|
|
cleanup
|
|
|
|
for t in $TESTS
|
|
do
|
|
setup; $t; cleanup;
|
|
done
|
|
|
|
if [ "$TESTS" != "none" ]; then
|
|
printf "\nTests passed: %3d\n" ${nsuccess}
|
|
printf "Tests failed: %3d\n" ${nfail}
|
|
fi
|
|
|
|
exit $ret
|