# SPDX-License-Identifier: GPL-2.0
|
|
# Test offloading a number of mirrors-to-gretap. The test creates a number of
|
# tunnels. Then it adds one flower mirror for each of the tunnels, matching a
|
# given host IP. Then it generates traffic at each of the host IPs and checks
|
# that the traffic has been mirrored at the appropriate tunnel.
|
#
|
# +--------------------------+ +--------------------------+
|
# | H1 | | H2 |
|
# | + $h1 | | $h2 + |
|
# | | 2001:db8:1:X::1/64 | | 2001:db8:1:X::2/64 | |
|
# +-----|--------------------+ +--------------------|-----+
|
# | |
|
# +-----|-------------------------------------------------------------|-----+
|
# | SW o--> mirrors | |
|
# | +---|-------------------------------------------------------------|---+ |
|
# | | + $swp1 BR $swp2 + | |
|
# | +---------------------------------------------------------------------+ |
|
# | |
|
# | + $swp3 + gt6-<X> (ip6gretap) |
|
# | | 2001:db8:2:X::1/64 : loc=2001:db8:2:X::1 |
|
# | | : rem=2001:db8:2:X::2 |
|
# | | : ttl=100 |
|
# | | : tos=inherit |
|
# | | : |
|
# +-----|--------------------------------:----------------------------------+
|
# | :
|
# +-----|--------------------------------:----------------------------------+
|
# | H3 + $h3 + h3-gt6-<X> (ip6gretap) |
|
# | 2001:db8:2:X::2/64 loc=2001:db8:2:X::2 |
|
# | rem=2001:db8:2:X::1 |
|
# | ttl=100 |
|
# | tos=inherit |
|
# | |
|
# +-------------------------------------------------------------------------+
|
|
source ../../../../net/forwarding/mirror_lib.sh
|
|
MIRROR_NUM_NETIFS=6
|
|
mirror_gre_ipv6_addr()
|
{
|
local net=$1; shift
|
local num=$1; shift
|
|
printf "2001:db8:%x:%x" $net $num
|
}
|
|
mirror_gre_tunnels_create()
|
{
|
local count=$1; shift
|
local should_fail=$1; shift
|
|
MIRROR_GRE_BATCH_FILE="$(mktemp)"
|
for ((i=0; i < count; ++i)); do
|
local match_dip=$(mirror_gre_ipv6_addr 1 $i)::2
|
local htun=h3-gt6-$i
|
local tun=gt6-$i
|
|
((mirror_gre_tunnels++))
|
|
ip address add dev $h1 $(mirror_gre_ipv6_addr 1 $i)::1/64
|
ip address add dev $h2 $(mirror_gre_ipv6_addr 1 $i)::2/64
|
|
ip address add dev $swp3 $(mirror_gre_ipv6_addr 2 $i)::1/64
|
ip address add dev $h3 $(mirror_gre_ipv6_addr 2 $i)::2/64
|
|
tunnel_create $tun ip6gretap \
|
$(mirror_gre_ipv6_addr 2 $i)::1 \
|
$(mirror_gre_ipv6_addr 2 $i)::2 \
|
ttl 100 tos inherit allow-localremote
|
|
tunnel_create $htun ip6gretap \
|
$(mirror_gre_ipv6_addr 2 $i)::2 \
|
$(mirror_gre_ipv6_addr 2 $i)::1
|
ip link set $htun vrf v$h3
|
matchall_sink_create $htun
|
|
cat >> $MIRROR_GRE_BATCH_FILE <<-EOF
|
filter add dev $swp1 ingress pref 1000 \
|
protocol ipv6 \
|
flower $tcflags dst_ip $match_dip \
|
action mirred egress mirror dev $tun
|
EOF
|
done
|
|
tc -b $MIRROR_GRE_BATCH_FILE
|
check_err_fail $should_fail $? "Mirror rule insertion"
|
}
|
|
mirror_gre_tunnels_destroy()
|
{
|
local count=$1; shift
|
|
for ((i=0; i < count; ++i)); do
|
local htun=h3-gt6-$i
|
local tun=gt6-$i
|
|
ip address del dev $h3 $(mirror_gre_ipv6_addr 2 $i)::2/64
|
ip address del dev $swp3 $(mirror_gre_ipv6_addr 2 $i)::1/64
|
|
ip address del dev $h2 $(mirror_gre_ipv6_addr 1 $i)::2/64
|
ip address del dev $h1 $(mirror_gre_ipv6_addr 1 $i)::1/64
|
|
tunnel_destroy $htun
|
tunnel_destroy $tun
|
done
|
}
|
|
__mirror_gre_test()
|
{
|
local count=$1; shift
|
local should_fail=$1; shift
|
|
mirror_gre_tunnels_create $count $should_fail
|
if ((should_fail)); then
|
return
|
fi
|
|
sleep 5
|
|
for ((i = 0; i < count; ++i)); do
|
local dip=$(mirror_gre_ipv6_addr 1 $i)::2
|
local htun=h3-gt6-$i
|
local message
|
|
icmp6_capture_install $htun
|
mirror_test v$h1 "" $dip $htun 100 10
|
icmp6_capture_uninstall $htun
|
done
|
}
|
|
mirror_gre_test()
|
{
|
local count=$1; shift
|
local should_fail=$1; shift
|
|
if ! tc_offload_check $TC_FLOWER_NUM_NETIFS; then
|
check_err 1 "Could not test offloaded functionality"
|
return
|
fi
|
|
tcflags="skip_sw"
|
__mirror_gre_test $count $should_fail
|
}
|
|
mirror_gre_setup_prepare()
|
{
|
h1=${NETIFS[p1]}
|
swp1=${NETIFS[p2]}
|
|
swp2=${NETIFS[p3]}
|
h2=${NETIFS[p4]}
|
|
swp3=${NETIFS[p5]}
|
h3=${NETIFS[p6]}
|
|
mirror_gre_tunnels=0
|
|
vrf_prepare
|
|
simple_if_init $h1
|
simple_if_init $h2
|
simple_if_init $h3
|
|
ip link add name br1 type bridge vlan_filtering 1
|
ip link set dev br1 up
|
|
ip link set dev $swp1 master br1
|
ip link set dev $swp1 up
|
tc qdisc add dev $swp1 clsact
|
|
ip link set dev $swp2 master br1
|
ip link set dev $swp2 up
|
|
ip link set dev $swp3 up
|
}
|
|
mirror_gre_cleanup()
|
{
|
mirror_gre_tunnels_destroy $mirror_gre_tunnels
|
|
ip link set dev $swp3 down
|
|
ip link set dev $swp2 down
|
|
tc qdisc del dev $swp1 clsact
|
ip link set dev $swp1 down
|
|
ip link del dev br1
|
|
simple_if_fini $h3
|
simple_if_fini $h2
|
simple_if_fini $h1
|
|
vrf_cleanup
|
}
|