Skip to content

Commit

Permalink
Merge branch 'selftests-Add-tests-for-mirroring-to-gretap'
Browse files Browse the repository at this point in the history
Petr Machata says:

====================
selftests: Add tests for mirroring to gretap

This suite tests GRE-encapsulated mirroring. The general topology that
most of the tests use is as follows, but each test defines details of
the topology based on its needs, and some tests actually use a somewhat
different topology.

+---------------------+                      +---------------------+
| H1                  |                      |                  H2 |
|     + $h1           |                      |           $h2 +     |
+-----|---------------+                      +---------------|-----+
      |                                                      |
+-----|------------------------------------------------------|-----+
| SW  o---> mirror                                           |     |
| +---|------------------------------------------------------|---+ |
| |   + $swp1               BR                         $swp2 +   | |
| +--------------------------------------------------------------+ |
|                                                                  |
|     + $swp3          + gt6 (ip6gretap)    + gt4 (gretap)         |
+-----|----------------:--------------------:----------------------+
      |                :                    :
+-----|----------------:--------------------:----------------------+
|     + $h3            + h3-gt6(ip6gretap)  + h3-gt4 (gretap)      |
| H3                                                               |
+------------------------------------------------------------------+

The following axes of configuration space are tested:

- ingress and egress mirroring
- mirroring triggered by matchall and flower
- mirroring to ipgretap and ip6gretap
- remote tunnel reachable directly or through a next-hop route
- skip_sw as well as skip_hw configurations

Apart from basic tests with the above mentioned features, the following
tests are included:

- handling of changes to neighbors pertinent to routing decisions in
  mirrored underlay
- handling of configuration changes at the mirrored-to tunnel (endpoint
  addresses, upness)

A suite of mlxsw-specific tests will be part of a separate submission
through linux-mlxsw patch queue.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
David S. Miller committed Apr 27, 2018
2 parents 6a26ef9 + 4531567 commit e6b43d8
Show file tree
Hide file tree
Showing 10 changed files with 1,230 additions and 0 deletions.
96 changes: 96 additions & 0 deletions tools/testing/selftests/net/forwarding/lib.sh
Original file line number Diff line number Diff line change
Expand Up @@ -321,6 +321,25 @@ simple_if_fini()
vrf_destroy $vrf_name
}

tunnel_create()
{
local name=$1; shift
local type=$1; shift
local local=$1; shift
local remote=$1; shift

ip link add name $name type $type \
local $local remote $remote "$@"
ip link set dev $name up
}

tunnel_destroy()
{
local name=$1; shift

ip link del dev $name
}

master_name_get()
{
local if_name=$1
Expand All @@ -335,6 +354,15 @@ link_stats_tx_packets_get()
ip -j -s link show dev $if_name | jq '.[]["stats64"]["tx"]["packets"]'
}

tc_rule_stats_get()
{
local dev=$1; shift
local pref=$1; shift

tc -j -s filter show dev $dev ingress pref $pref |
jq '.[1].options.actions[].stats.packets'
}

mac_get()
{
local if_name=$1
Expand Down Expand Up @@ -381,6 +409,74 @@ tc_offload_check()
return 0
}

slow_path_trap_install()
{
local dev=$1; shift
local direction=$1; shift

if [ "${tcflags/skip_hw}" != "$tcflags" ]; then
# For slow-path testing, we need to install a trap to get to
# slow path the packets that would otherwise be switched in HW.
tc filter add dev $dev $direction pref 1 \
flower skip_sw action trap
fi
}

slow_path_trap_uninstall()
{
local dev=$1; shift
local direction=$1; shift

if [ "${tcflags/skip_hw}" != "$tcflags" ]; then
tc filter del dev $dev $direction pref 1 flower skip_sw
fi
}

__icmp_capture_add_del()
{
local add_del=$1; shift
local pref=$1; shift
local vsuf=$1; shift
local tundev=$1; shift
local filter=$1; shift

tc filter $add_del dev "$tundev" ingress \
proto ip$vsuf pref $pref \
flower ip_proto icmp$vsuf $filter \
action pass
}

icmp_capture_install()
{
__icmp_capture_add_del add 100 "" "$@"
}

icmp_capture_uninstall()
{
__icmp_capture_add_del del 100 "" "$@"
}

icmp6_capture_install()
{
__icmp_capture_add_del add 100 v6 "$@"
}

icmp6_capture_uninstall()
{
__icmp_capture_add_del del 100 v6 "$@"
}

matchall_sink_create()
{
local dev=$1; shift

tc qdisc add dev $dev clsact
tc filter add dev $dev ingress \
pref 10000 \
matchall \
action drop
}

##############################################################################
# Tests

Expand Down
139 changes: 139 additions & 0 deletions tools/testing/selftests/net/forwarding/mirror_gre.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0

# This test uses standard topology for testing gretap. See
# mirror_gre_topo_lib.sh for more details.
#
# Test for "tc action mirred egress mirror" when the device to mirror to is a
# gretap or ip6gretap netdevice. Expect that the packets come out encapsulated,
# and another gretap / ip6gretap netdevice is then capable of decapsulating the
# traffic. Test that the payload is what is expected (ICMP ping request or
# reply, depending on test).

NUM_NETIFS=6
source lib.sh
source mirror_lib.sh
source mirror_gre_lib.sh
source mirror_gre_topo_lib.sh

setup_prepare()
{
h1=${NETIFS[p1]}
swp1=${NETIFS[p2]}

swp2=${NETIFS[p3]}
h2=${NETIFS[p4]}

swp3=${NETIFS[p5]}
h3=${NETIFS[p6]}

vrf_prepare
mirror_gre_topo_create

ip address add dev $swp3 192.0.2.129/28
ip address add dev $h3 192.0.2.130/28

ip address add dev $swp3 2001:db8:2::1/64
ip address add dev $h3 2001:db8:2::2/64
}

cleanup()
{
pre_cleanup

ip address del dev $h3 2001:db8:2::2/64
ip address del dev $swp3 2001:db8:2::1/64

ip address del dev $h3 192.0.2.130/28
ip address del dev $swp3 192.0.2.129/28

mirror_gre_topo_destroy
vrf_cleanup
}

test_span_gre_mac()
{
local tundev=$1; shift
local direction=$1; shift
local prot=$1; shift
local what=$1; shift

local swp3mac=$(mac_get $swp3)
local h3mac=$(mac_get $h3)

RET=0

mirror_install $swp1 $direction $tundev "matchall $tcflags"
tc qdisc add dev $h3 clsact
tc filter add dev $h3 ingress pref 77 prot $prot \
flower ip_proto 0x2f src_mac $swp3mac dst_mac $h3mac \
action pass

mirror_test v$h1 192.0.2.1 192.0.2.2 $h3 77 10

tc filter del dev $h3 ingress pref 77
tc qdisc del dev $h3 clsact
mirror_uninstall $swp1 $direction

log_test "$direction $what: envelope MAC ($tcflags)"
}

test_two_spans()
{
RET=0

mirror_install $swp1 ingress gt4 "matchall $tcflags"
mirror_install $swp1 egress gt6 "matchall $tcflags"
quick_test_span_gre_dir gt4 ingress
quick_test_span_gre_dir gt6 egress

mirror_uninstall $swp1 ingress
fail_test_span_gre_dir gt4 ingress
quick_test_span_gre_dir gt6 egress

mirror_install $swp1 ingress gt4 "matchall $tcflags"
mirror_uninstall $swp1 egress
quick_test_span_gre_dir gt4 ingress
fail_test_span_gre_dir gt6 egress

mirror_uninstall $swp1 ingress
log_test "two simultaneously configured mirrors ($tcflags)"
}

test_all()
{
slow_path_trap_install $swp1 ingress
slow_path_trap_install $swp1 egress

full_test_span_gre_dir gt4 ingress 8 0 "mirror to gretap"
full_test_span_gre_dir gt6 ingress 8 0 "mirror to ip6gretap"
full_test_span_gre_dir gt4 egress 0 8 "mirror to gretap"
full_test_span_gre_dir gt6 egress 0 8 "mirror to ip6gretap"

test_span_gre_mac gt4 ingress ip "mirror to gretap"
test_span_gre_mac gt6 ingress ipv6 "mirror to ip6gretap"
test_span_gre_mac gt4 egress ip "mirror to gretap"
test_span_gre_mac gt6 egress ipv6 "mirror to ip6gretap"

test_two_spans

slow_path_trap_uninstall $swp1 egress
slow_path_trap_uninstall $swp1 ingress
}

trap cleanup EXIT

setup_prepare
setup_wait

tcflags="skip_hw"
test_all

if ! tc_offload_check; then
echo "WARN: Could not test offloaded functionality"
else
tcflags="skip_sw"
test_all
fi

exit $EXIT_STATUS
Loading

0 comments on commit e6b43d8

Please sign in to comment.