selftests: forwarding: Add IPv6 GRE flat tests

Add tests that check IPv6-in-IPv6, IPv4-in-IPv6 and MTU change of GRE
tunnel. The tests use flat model - overlay and underlay share the same VRF.

These tests can be run with TC_FLAG=skip_sw, so then they will verify
that packets go through hardware as part of enacp and decap phases.

Signed-off-by: Amit Cohen <amcohen@nvidia.com>
Reviewed-by: Petr Machata <petrm@nvidia.com>
Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Amit Cohen 2021-10-08 16:12:36 +03:00 committed by David S. Miller
parent c08d227290
commit 7df29960fa
4 changed files with 465 additions and 0 deletions

View file

@ -0,0 +1,65 @@
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
# Test IP-in-IP GRE tunnel without key.
# This test uses flat topology for IP tunneling tests. See ip6gre_lib.sh for
# more details.
ALL_TESTS="
gre_flat
gre_mtu_change
"
NUM_NETIFS=6
source lib.sh
source ip6gre_lib.sh
setup_prepare()
{
h1=${NETIFS[p1]}
ol1=${NETIFS[p2]}
ul1=${NETIFS[p3]}
ul2=${NETIFS[p4]}
ol2=${NETIFS[p5]}
h2=${NETIFS[p6]}
forwarding_enable
vrf_prepare
h1_create
h2_create
sw1_flat_create $ol1 $ul1
sw2_flat_create $ol2 $ul2
}
gre_flat()
{
test_traffic_ip4ip6 "GRE flat IPv4-in-IPv6"
test_traffic_ip6ip6 "GRE flat IPv6-in-IPv6"
}
gre_mtu_change()
{
test_mtu_change
}
cleanup()
{
pre_cleanup
sw2_flat_destroy $ol2 $ul2
sw1_flat_destroy $ol1 $ul1
h2_destroy
h1_destroy
vrf_cleanup
forwarding_restore
}
trap cleanup EXIT
setup_prepare
setup_wait
tests_run
exit $EXIT_STATUS

View file

@ -0,0 +1,65 @@
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
# Test IP-in-IP GRE tunnel with key.
# This test uses flat topology for IP tunneling tests. See ip6gre_lib.sh for
# more details.
ALL_TESTS="
gre_flat
gre_mtu_change
"
NUM_NETIFS=6
source lib.sh
source ip6gre_lib.sh
setup_prepare()
{
h1=${NETIFS[p1]}
ol1=${NETIFS[p2]}
ul1=${NETIFS[p3]}
ul2=${NETIFS[p4]}
ol2=${NETIFS[p5]}
h2=${NETIFS[p6]}
forwarding_enable
vrf_prepare
h1_create
h2_create
sw1_flat_create $ol1 $ul1 key 233
sw2_flat_create $ol2 $ul2 key 233
}
gre_flat()
{
test_traffic_ip4ip6 "GRE flat IPv4-in-IPv6 with key"
test_traffic_ip6ip6 "GRE flat IPv6-in-IPv6 with key"
}
gre_mtu_change()
{
test_mtu_change
}
cleanup()
{
pre_cleanup
sw2_flat_destroy $ol2 $ul2
sw1_flat_destroy $ol1 $ul1
h2_destroy
h1_destroy
vrf_cleanup
forwarding_restore
}
trap cleanup EXIT
setup_prepare
setup_wait
tests_run
exit $EXIT_STATUS

View file

@ -0,0 +1,65 @@
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
# Test IP-in-IP GRE tunnel with keys.
# This test uses flat topology for IP tunneling tests. See ip6gre_lib.sh for
# more details.
ALL_TESTS="
gre_flat
gre_mtu_change
"
NUM_NETIFS=6
source lib.sh
source ip6gre_lib.sh
setup_prepare()
{
h1=${NETIFS[p1]}
ol1=${NETIFS[p2]}
ul1=${NETIFS[p3]}
ul2=${NETIFS[p4]}
ol2=${NETIFS[p5]}
h2=${NETIFS[p6]}
forwarding_enable
vrf_prepare
h1_create
h2_create
sw1_flat_create $ol1 $ul1 ikey 111 okey 222
sw2_flat_create $ol2 $ul2 ikey 222 okey 111
}
gre_flat()
{
test_traffic_ip4ip6 "GRE flat IPv4-in-IPv6 with ikey/okey"
test_traffic_ip6ip6 "GRE flat IPv6-in-IPv6 with ikey/okey"
}
gre_mtu_change()
{
test_mtu_change gre
}
cleanup()
{
pre_cleanup
sw2_flat_destroy $ol2 $ul2
sw1_flat_destroy $ol1 $ul1
h2_destroy
h1_destroy
vrf_cleanup
forwarding_restore
}
trap cleanup EXIT
setup_prepare
setup_wait
tests_run
exit $EXIT_STATUS

View file

@ -0,0 +1,270 @@
# SPDX-License-Identifier: GPL-2.0
#!/bin/bash
# Handles creation and destruction of IP-in-IP or GRE tunnels over the given
# topology.
#
# Flat Model:
# Overlay and underlay share the same VRF.
# SW1 uses default VRF so tunnel has no bound dev.
# SW2 uses non-default VRF tunnel has a bound dev.
# +--------------------------------+
# | H1 |
# | $h1 + |
# | 198.51.100.1/24 | |
# | 2001:db8:1::1/64 | |
# +-------------------------|------+
# |
# +-------------------------|-------------------+
# | SW1 | |
# | $ol1 + |
# | 198.51.100.2/24 |
# | 2001:db8:1::2/64 |
# | |
# | + g1a (ip6gre) |
# | loc=2001:db8:3::1 |
# | rem=2001:db8:3::2 --. |
# | tos=inherit | |
# | . |
# | .--------------------- |
# | | |
# | v |
# | + $ul1.111 (vlan) |
# | | 2001:db8:10::1/64 |
# | \ |
# | \____________ |
# | | |
# | VRF default + $ul1 |
# +---------------------|-----------------------+
# |
# +---------------------|-----------------------+
# | SW2 | |
# | $ul2 + |
# | ___________| |
# | / |
# | / |
# | + $ul2.111 (vlan) |
# | ^ 2001:db8:10::2/64 |
# | | |
# | | |
# | '----------------------. |
# | + g2a (ip6gre) | |
# | loc=2001:db8:3::2 | |
# | rem=2001:db8:3::1 --' |
# | tos=inherit |
# | |
# | + $ol2 |
# | | 203.0.113.2/24 |
# | VRF v$ol2 | 2001:db8:2::2/64 |
# +---------------------|-----------------------+
# +---------------------|----------+
# | H2 | |
# | $h2 + |
# | 203.0.113.1/24 |
# | 2001:db8:2::1/64 |
# +--------------------------------+
source lib.sh
source tc_common.sh
h1_create()
{
simple_if_init $h1 198.51.100.1/24 2001:db8:1::1/64
ip route add vrf v$h1 203.0.113.0/24 via 198.51.100.2
ip -6 route add vrf v$h1 2001:db8:2::/64 via 2001:db8:1::2
}
h1_destroy()
{
ip -6 route del vrf v$h1 2001:db8:2::/64 via 2001:db8:1::2
ip route del vrf v$h1 203.0.113.0/24 via 198.51.100.2
simple_if_fini $h1 198.51.100.1/24 2001:db8:1::1/64
}
h2_create()
{
simple_if_init $h2 203.0.113.1/24 2001:db8:2::1/64
ip route add vrf v$h2 198.51.100.0/24 via 203.0.113.2
ip -6 route add vrf v$h2 2001:db8:1::/64 via 2001:db8:2::2
}
h2_destroy()
{
ip -6 route del vrf v$h2 2001:db8:1::/64 via 2001:db8:2::2
ip route del vrf v$h2 198.51.100.0/24 via 203.0.113.2
simple_if_fini $h2 203.0.113.1/24 2001:db8:2::1/64
}
sw1_flat_create()
{
local ol1=$1; shift
local ul1=$1; shift
ip link set dev $ol1 up
__addr_add_del $ol1 add 198.51.100.2/24 2001:db8:1::2/64
ip link set dev $ul1 up
vlan_create $ul1 111 "" 2001:db8:10::1/64
tunnel_create g1a ip6gre 2001:db8:3::1 2001:db8:3::2 tos inherit \
ttl inherit "$@"
ip link set dev g1a up
__addr_add_del g1a add "2001:db8:3::1/128"
ip -6 route add 2001:db8:3::2/128 via 2001:db8:10::2
ip route add 203.0.113.0/24 dev g1a
ip -6 route add 2001:db8:2::/64 dev g1a
}
sw1_flat_destroy()
{
local ol1=$1; shift
local ul1=$1; shift
ip -6 route del 2001:db8:2::/64
ip route del 203.0.113.0/24
ip -6 route del 2001:db8:3::2/128 via 2001:db8:10::2
__simple_if_fini g1a 2001:db8:3::1/128
tunnel_destroy g1a
vlan_destroy $ul1 111
__simple_if_fini $ul1
__simple_if_fini $ol1 198.51.100.2/24 2001:db8:1::2/64
}
sw2_flat_create()
{
local ol2=$1; shift
local ul2=$1; shift
simple_if_init $ol2 203.0.113.2/24 2001:db8:2::2/64
__simple_if_init $ul2 v$ol2
vlan_create $ul2 111 v$ol2 2001:db8:10::2/64
tunnel_create g2a ip6gre 2001:db8:3::2 2001:db8:3::1 tos inherit \
ttl inherit dev v$ol2 "$@"
__simple_if_init g2a v$ol2 2001:db8:3::2/128
# Replace neighbor to avoid 1 dropped packet due to "unresolved neigh"
ip neigh replace dev $ol2 203.0.113.1 lladdr $(mac_get $h2)
ip -6 neigh replace dev $ol2 2001:db8:2::1 lladdr $(mac_get $h2)
ip -6 route add vrf v$ol2 2001:db8:3::1/128 via 2001:db8:10::1
ip route add vrf v$ol2 198.51.100.0/24 dev g2a
ip -6 route add vrf v$ol2 2001:db8:1::/64 dev g2a
}
sw2_flat_destroy()
{
local ol2=$1; shift
local ul2=$1; shift
ip -6 route del vrf v$ol2 2001:db8:2::/64
ip route del vrf v$ol2 198.51.100.0/24
ip -6 route del vrf v$ol2 2001:db8:3::1/128 via 2001:db8:10::1
__simple_if_fini g2a 2001:db8:3::2/128
tunnel_destroy g2a
vlan_destroy $ul2 111
__simple_if_fini $ul2
simple_if_fini $ol2 203.0.113.2/24 2001:db8:2::2/64
}
test_traffic_ip4ip6()
{
RET=0
h1mac=$(mac_get $h1)
ol1mac=$(mac_get $ol1)
tc qdisc add dev $ul1 clsact
tc filter add dev $ul1 egress proto all pref 1 handle 101 \
flower $TC_FLAG action pass
tc qdisc add dev $ol2 clsact
tc filter add dev $ol2 egress protocol ipv4 pref 1 handle 101 \
flower $TC_FLAG dst_ip 203.0.113.1 action pass
$MZ $h1 -c 1000 -p 64 -a $h1mac -b $ol1mac -A 198.51.100.1 \
-B 203.0.113.1 -t ip -q -d 1msec
# Check ports after encap and after decap.
tc_check_at_least_x_packets "dev $ul1 egress" 101 1000
check_err $? "Packets did not go through $ul1, tc_flag = $TC_FLAG"
tc_check_at_least_x_packets "dev $ol2 egress" 101 1000
check_err $? "Packets did not go through $ol2, tc_flag = $TC_FLAG"
log_test "$@"
tc filter del dev $ol2 egress protocol ipv4 pref 1 handle 101 flower
tc qdisc del dev $ol2 clsact
tc filter del dev $ul1 egress proto all pref 1 handle 101 flower
tc qdisc del dev $ul1 clsact
}
test_traffic_ip6ip6()
{
RET=0
h1mac=$(mac_get $h1)
ol1mac=$(mac_get $ol1)
tc qdisc add dev $ul1 clsact
tc filter add dev $ul1 egress proto all pref 1 handle 101 \
flower $TC_FLAG action pass
tc qdisc add dev $ol2 clsact
tc filter add dev $ol2 egress protocol ipv6 pref 1 handle 101 \
flower $TC_FLAG dst_ip 2001:db8:2::1 action pass
$MZ -6 $h1 -c 1000 -p 64 -a $h1mac -b $ol1mac -A 2001:db8:1::1 \
-B 2001:db8:2::1 -t ip -q -d 1msec
# Check ports after encap and after decap.
tc_check_at_least_x_packets "dev $ul1 egress" 101 1000
check_err $? "Packets did not go through $ul1, tc_flag = $TC_FLAG"
tc_check_at_least_x_packets "dev $ol2 egress" 101 1000
check_err $? "Packets did not go through $ol2, tc_flag = $TC_FLAG"
log_test "$@"
tc filter del dev $ol2 egress protocol ipv6 pref 1 handle 101 flower
tc qdisc del dev $ol2 clsact
tc filter del dev $ul1 egress proto all pref 1 handle 101 flower
tc qdisc del dev $ul1 clsact
}
topo_mtu_change()
{
local mtu=$1
ip link set mtu $mtu dev $h1
ip link set mtu $mtu dev $ol1
ip link set mtu $mtu dev g1a
ip link set mtu $mtu dev $ul1
ip link set mtu $mtu dev $ul1.111
ip link set mtu $mtu dev $h2
ip link set mtu $mtu dev $ol2
ip link set mtu $mtu dev g2a
ip link set mtu $mtu dev $ul2
ip link set mtu $mtu dev $ul2.111
}
test_mtu_change()
{
RET=0
ping6_do $h1 2001:db8:2::1 "-s 1800 -w 3"
check_fail $? "ping GRE IPv6 should not pass with packet size 1800"
RET=0
topo_mtu_change 2000
ping6_do $h1 2001:db8:2::1 "-s 1800 -w 3"
check_err $?
log_test "ping GRE IPv6, packet size 1800 after MTU change"
}