-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
selftests: forwarding: Test changes in mirror-to-gretap
These tests set up mirroring in a situation that the configuration is incorrect, i.e. mirrored packets, if any, are not supposed to reach destination tunnel device. Then the configuration is rectified and mirroring is checked to have started working. Signed-off-by: Petr Machata <petrm@mellanox.com> Reviewed-by: Jiri Pirko <jiri@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
- Loading branch information
Petr Machata
authored and
David S. Miller
committed
Apr 27, 2018
1 parent
ff68e6f
commit 4531567
Showing
1 changed file
with
194 additions
and
0 deletions.
There are no files selected for viewing
194 changes: 194 additions & 0 deletions
194
tools/testing/selftests/net/forwarding/mirror_gre_changes.sh
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,194 @@ | ||
#!/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 how mirrors to gretap and ip6gretap react to changes to relevant | ||
# configuration. | ||
|
||
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 | ||
|
||
# This test downs $swp3, which deletes the configured IPv6 address | ||
# unless this sysctl is set. | ||
local key=net.ipv6.conf.$swp3.keep_addr_on_down | ||
SWP3_KEEP_ADDR_ON_DOWN=$(sysctl -n $key) | ||
sysctl -qw $key=1 | ||
|
||
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 | ||
|
||
local key=net.ipv6.conf.$swp3.keep_addr_on_down | ||
sysctl -qw $key=$SWP3_KEEP_ADDR_ON_DOWN | ||
|
||
mirror_gre_topo_destroy | ||
vrf_cleanup | ||
} | ||
|
||
test_span_gre_ttl() | ||
{ | ||
local tundev=$1; shift | ||
local type=$1; shift | ||
local prot=$1; shift | ||
local what=$1; shift | ||
|
||
RET=0 | ||
|
||
mirror_install $swp1 ingress $tundev "matchall $tcflags" | ||
tc qdisc add dev $h3 clsact | ||
tc filter add dev $h3 ingress pref 77 prot $prot \ | ||
flower ip_ttl 50 action pass | ||
|
||
mirror_test v$h1 192.0.2.1 192.0.2.2 $h3 77 0 | ||
|
||
ip link set dev $tundev type $type ttl 50 | ||
mirror_test v$h1 192.0.2.1 192.0.2.2 $h3 77 10 | ||
|
||
ip link set dev $tundev type $type ttl 100 | ||
tc filter del dev $h3 ingress pref 77 | ||
tc qdisc del dev $h3 clsact | ||
mirror_uninstall $swp1 ingress | ||
|
||
log_test "$what: TTL change ($tcflags)" | ||
} | ||
|
||
test_span_gre_tun_up() | ||
{ | ||
local tundev=$1; shift | ||
local what=$1; shift | ||
|
||
RET=0 | ||
|
||
ip link set dev $tundev down | ||
mirror_install $swp1 ingress $tundev "matchall $tcflags" | ||
fail_test_span_gre_dir $tundev ingress | ||
|
||
ip link set dev $tundev up | ||
|
||
quick_test_span_gre_dir $tundev ingress | ||
mirror_uninstall $swp1 ingress | ||
|
||
log_test "$what: tunnel down/up ($tcflags)" | ||
} | ||
|
||
test_span_gre_egress_up() | ||
{ | ||
local tundev=$1; shift | ||
local remote_ip=$1; shift | ||
local what=$1; shift | ||
|
||
RET=0 | ||
|
||
ip link set dev $swp3 down | ||
mirror_install $swp1 ingress $tundev "matchall $tcflags" | ||
fail_test_span_gre_dir $tundev ingress | ||
|
||
# After setting the device up, wait for neighbor to get resolved so that | ||
# we can expect mirroring to work. | ||
ip link set dev $swp3 up | ||
while true; do | ||
ip neigh sh dev $swp3 $remote_ip nud reachable | | ||
grep -q ^ | ||
if [[ $? -ne 0 ]]; then | ||
sleep 1 | ||
else | ||
break | ||
fi | ||
done | ||
|
||
quick_test_span_gre_dir $tundev ingress | ||
mirror_uninstall $swp1 ingress | ||
|
||
log_test "$what: egress down/up ($tcflags)" | ||
} | ||
|
||
test_span_gre_remote_ip() | ||
{ | ||
local tundev=$1; shift | ||
local type=$1; shift | ||
local correct_ip=$1; shift | ||
local wrong_ip=$1; shift | ||
local what=$1; shift | ||
|
||
RET=0 | ||
|
||
ip link set dev $tundev type $type remote $wrong_ip | ||
mirror_install $swp1 ingress $tundev "matchall $tcflags" | ||
fail_test_span_gre_dir $tundev ingress | ||
|
||
ip link set dev $tundev type $type remote $correct_ip | ||
quick_test_span_gre_dir $tundev ingress | ||
mirror_uninstall $swp1 ingress | ||
|
||
log_test "$what: remote address change ($tcflags)" | ||
} | ||
|
||
test_all() | ||
{ | ||
slow_path_trap_install $swp1 ingress | ||
slow_path_trap_install $swp1 egress | ||
|
||
test_span_gre_ttl gt4 gretap ip "mirror to gretap" | ||
test_span_gre_ttl gt6 ip6gretap ipv6 "mirror to ip6gretap" | ||
|
||
test_span_gre_tun_up gt4 "mirror to gretap" | ||
test_span_gre_tun_up gt6 "mirror to ip6gretap" | ||
|
||
test_span_gre_egress_up gt4 192.0.2.130 "mirror to gretap" | ||
test_span_gre_egress_up gt6 2001:db8:2::2 "mirror to ip6gretap" | ||
|
||
test_span_gre_remote_ip gt4 gretap 192.0.2.130 192.0.2.132 "mirror to gretap" | ||
test_span_gre_remote_ip gt6 ip6gretap 2001:db8:2::2 2001:db8:2::4 "mirror to ip6gretap" | ||
|
||
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 |