Commit 36ee7281 authored by David S. Miller's avatar David S. Miller

Merge branch 'ip6gre-tests'

Ido Schimmel says:

====================
selftests: forwarding: Add ip6gre tests

This patchset adds forwarding selftests for ip6gre. The tests can be run
with veth pairs or with physical loopbacks.

Patch #1 adds a new config option to determine if 'skip_sw' / 'skip_hw'
flags are used when installing tc filters. By default, it is not set
which means the flags are not used. 'skip_sw' is useful to ensure
traffic is forwarded by the hardware data path.

Patch #2 adds a new helper function.

Patches #3-#4 add the forwarding selftests.

Patch #5 adds a mlxsw-specific selftest to validate correct behavior of
the 'decap_error' trap with IPv6 underlay.

Patches #6-#8 align the corresponding IPv4 underlay test to the IPv6
one.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 4c1e34c0 7f63cdde
......@@ -13,7 +13,7 @@
# |
# +-------------------|-----+
# | SW1 | |
# | $swp1 + |
# | $swp1 + |
# | 192.0.2.2/28 |
# | |
# | + g1a (gre) |
......@@ -27,8 +27,8 @@
# |
# +--|----------------------+
# | | VRF2 |
# | + $rp2 |
# | 198.51.100.2/28 |
# | + $rp2 |
# | 198.51.100.2/28 |
# +-------------------------+
lib_dir=$(dirname $0)/../../../net/forwarding
......@@ -116,12 +116,16 @@ cleanup()
forwarding_restore
}
ecn_payload_get()
ipip_payload_get()
{
local flags=$1; shift
local key=$1; shift
p=$(:
)"0"$( : GRE flags
)"$flags"$( : GRE flags
)"0:00:"$( : Reserved + version
)"08:00:"$( : ETH protocol type
)"$key"$( : Key
)"4"$( : IP version
)"5:"$( : IHL
)"00:"$( : IP TOS
......@@ -137,6 +141,11 @@ ecn_payload_get()
echo $p
}
ecn_payload_get()
{
echo $(ipip_payload_get "0")
}
ecn_decap_test()
{
local trap_name="decap_error"
......@@ -171,31 +180,6 @@ ecn_decap_test()
tc filter del dev $swp1 egress protocol ip pref 1 handle 101 flower
}
ipip_payload_get()
{
local flags=$1; shift
local key=$1; shift
p=$(:
)"$flags"$( : GRE flags
)"0:00:"$( : Reserved + version
)"08:00:"$( : ETH protocol type
)"$key"$( : Key
)"4"$( : IP version
)"5:"$( : IHL
)"00:"$( : IP TOS
)"00:14:"$( : IP total length
)"00:00:"$( : IP identification
)"20:00:"$( : IP flags + frag off
)"30:"$( : IP TTL
)"01:"$( : IP proto
)"E7:E6:"$( : IP header csum
)"C0:00:01:01:"$( : IP saddr : 192.0.1.1
)"C0:00:02:01:"$( : IP daddr : 192.0.2.1
)
echo $p
}
no_matching_tunnel_test()
{
local trap_name="decap_error"
......@@ -239,7 +223,8 @@ decap_error_test()
no_matching_tunnel_test "Decap error: Source IP check failed" \
192.0.2.68 "0"
no_matching_tunnel_test \
"Decap error: Key exists but was not expected" $sip "2" ":E9:"
"Decap error: Key exists but was not expected" $sip "2" \
"00:00:00:E9:"
# Destroy the tunnel and create new one with key
__addr_add_del g1 del 192.0.2.65/32
......@@ -251,7 +236,8 @@ decap_error_test()
no_matching_tunnel_test \
"Decap error: Key does not exist but was expected" $sip "0"
no_matching_tunnel_test \
"Decap error: Packet has a wrong key field" $sip "2" "E8:"
"Decap error: Packet has a wrong key field" $sip "2" \
"00:00:00:E8:"
}
trap cleanup EXIT
......
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
#
# Test devlink-trap tunnel exceptions functionality over mlxsw.
# Check all exception traps to make sure they are triggered under the right
# conditions.
# +-------------------------+
# | H1 |
# | $h1 + |
# | 2001:db8:1::1/64 | |
# +-------------------|-----+
# |
# +-------------------|-----+
# | SW1 | |
# | $swp1 + |
# | 2001:db8:1::2/64 |
# | |
# | + g1 (ip6gre) |
# | loc=2001:db8:3::1 |
# | rem=2001:db8:3::2 |
# | tos=inherit |
# | |
# | + $rp1 |
# | | 2001:db8:10::1/64 |
# +--|----------------------+
# |
# +--|----------------------+
# | | VRF2 |
# | + $rp2 |
# | 2001:db8:10::2/64 |
# +-------------------------+
lib_dir=$(dirname $0)/../../../../net/forwarding
ALL_TESTS="
decap_error_test
"
NUM_NETIFS=4
source $lib_dir/lib.sh
source $lib_dir/tc_common.sh
source $lib_dir/devlink_lib.sh
h1_create()
{
simple_if_init $h1 2001:db8:1::1/64
}
h1_destroy()
{
simple_if_fini $h1 2001:db8:1::1/64
}
vrf2_create()
{
simple_if_init $rp2 2001:db8:10::2/64
}
vrf2_destroy()
{
simple_if_fini $rp2 2001:db8:10::2/64
}
switch_create()
{
ip link set dev $swp1 up
__addr_add_del $swp1 add 2001:db8:1::2/64
tc qdisc add dev $swp1 clsact
tunnel_create g1 ip6gre 2001:db8:3::1 2001:db8:3::2 tos inherit \
ttl inherit
ip link set dev g1 up
__addr_add_del g1 add 2001:db8:3::1/128
ip link set dev $rp1 up
__addr_add_del $rp1 add 2001:db8:10::1/64
}
switch_destroy()
{
__addr_add_del $rp1 del 2001:db8:10::1/64
ip link set dev $rp1 down
__addr_add_del g1 del 2001:db8:3::1/128
ip link set dev g1 down
tunnel_destroy g1
tc qdisc del dev $swp1 clsact
__addr_add_del $swp1 del 2001:db8:1::2/64
ip link set dev $swp1 down
}
setup_prepare()
{
h1=${NETIFS[p1]}
swp1=${NETIFS[p2]}
rp1=${NETIFS[p3]}
rp2=${NETIFS[p4]}
forwarding_enable
vrf_prepare
h1_create
switch_create
vrf2_create
}
cleanup()
{
pre_cleanup
vrf2_destroy
switch_destroy
h1_destroy
vrf_cleanup
forwarding_restore
}
ipip_payload_get()
{
local saddr="20:01:0d:b8:00:02:00:00:00:00:00:00:00:00:00:01"
local daddr="20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:01"
local flags=$1; shift
local key=$1; shift
p=$(:
)"$flags"$( : GRE flags
)"0:00:"$( : Reserved + version
)"86:dd:"$( : ETH protocol type
)"$key"$( : Key
)"6"$( : IP version
)"0:0"$( : Traffic class
)"0:00:00:"$( : Flow label
)"00:00:"$( : Payload length
)"3a:"$( : Next header
)"04:"$( : Hop limit
)"$saddr:"$( : IP saddr
)"$daddr:"$( : IP daddr
)
echo $p
}
ecn_payload_get()
{
echo $(ipip_payload_get "0")
}
ecn_decap_test()
{
local trap_name="decap_error"
local desc=$1; shift
local ecn_desc=$1; shift
local outer_tos=$1; shift
local mz_pid
RET=0
tc filter add dev $swp1 egress protocol ipv6 pref 1 handle 101 \
flower src_ip 2001:db8:2::1 dst_ip 2001:db8:1::1 skip_sw \
action pass
rp1_mac=$(mac_get $rp1)
rp2_mac=$(mac_get $rp2)
payload=$(ecn_payload_get)
ip vrf exec v$rp2 $MZ -6 $rp2 -c 0 -d 1msec -a $rp2_mac -b $rp1_mac \
-A 2001:db8:3::2 -B 2001:db8:3::1 -t ip \
tos=$outer_tos,next=47,p=$payload -q &
mz_pid=$!
devlink_trap_exception_test $trap_name
tc_check_packets "dev $swp1 egress" 101 0
check_err $? "Packets were not dropped"
log_test "$desc: Inner ECN is not ECT and outer is $ecn_desc"
kill $mz_pid && wait $mz_pid &> /dev/null
tc filter del dev $swp1 egress protocol ipv6 pref 1 handle 101 flower
}
no_matching_tunnel_test()
{
local trap_name="decap_error"
local desc=$1; shift
local sip=$1; shift
local mz_pid
RET=0
tc filter add dev $swp1 egress protocol ipv6 pref 1 handle 101 \
flower src_ip 2001:db8:2::1 dst_ip 2001:db8:1::1 action pass
rp1_mac=$(mac_get $rp1)
rp2_mac=$(mac_get $rp2)
payload=$(ipip_payload_get "$@")
ip vrf exec v$rp2 $MZ -6 $rp2 -c 0 -d 1msec -a $rp2_mac -b $rp1_mac \
-A $sip -B 2001:db8:3::1 -t ip next=47,p=$payload -q &
mz_pid=$!
devlink_trap_exception_test $trap_name
tc_check_packets "dev $swp1 egress" 101 0
check_err $? "Packets were not dropped"
log_test "$desc"
kill $mz_pid && wait $mz_pid &> /dev/null
tc filter del dev $swp1 egress protocol ipv6 pref 1 handle 101 flower
}
decap_error_test()
{
# Correct source IP - the remote address
local sip=2001:db8:3::2
ecn_decap_test "Decap error" "ECT(1)" 01
ecn_decap_test "Decap error" "ECT(0)" 02
ecn_decap_test "Decap error" "CE" 03
no_matching_tunnel_test "Decap error: Source IP check failed" \
2001:db8:4::2 "0"
no_matching_tunnel_test \
"Decap error: Key exists but was not expected" $sip "2" \
"00:00:00:E9:"
# Destroy the tunnel and create new one with key
__addr_add_del g1 del 2001:db8:3::1/128
tunnel_destroy g1
tunnel_create g1 ip6gre 2001:db8:3::1 2001:db8:3::2 tos inherit \
ttl inherit key 233
__addr_add_del g1 add 2001:db8:3::1/128
no_matching_tunnel_test \
"Decap error: Key does not exist but was expected" $sip "0"
no_matching_tunnel_test \
"Decap error: Packet has a wrong key field" $sip "2" \
"00:00:00:E8:"
}
trap cleanup EXIT
setup_prepare
setup_wait
tests_run
exit $EXIT_STATUS
......@@ -39,3 +39,6 @@ NETIF_CREATE=yes
# Timeout (in seconds) before ping exits regardless of how many packets have
# been sent or received
PING_TIMEOUT=5
# Flag for tc match, supposed to be skip_sw/skip_hw which means do not process
# filter by software/hardware
TC_FLAG=skip_hw
#!/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
#!/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
#!/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
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
# Test IP-in-IP GRE tunnels without key.
# This test uses hierarchical topology for IP tunneling tests. See
# ip6gre_lib.sh for more details.
ALL_TESTS="
gre_hier
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_hierarchical_create $ol1 $ul1
sw2_hierarchical_create $ol2 $ul2
}
gre_hier()
{
test_traffic_ip4ip6 "GRE hierarchical IPv4-in-IPv6"
test_traffic_ip6ip6 "GRE hierarchical IPv6-in-IPv6"
}
gre_mtu_change()
{
test_mtu_change gre
}
cleanup()
{
pre_cleanup
sw2_hierarchical_destroy $ol2 $ul2
sw1_hierarchical_destroy $ol1 $ul1
h2_destroy
h1_destroy
vrf_cleanup
forwarding_restore
}
trap cleanup EXIT
setup_prepare
setup_wait
tests_run
exit $EXIT_STATUS
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
# Test IP-in-IP GRE tunnels without key.
# This test uses hierarchical topology for IP tunneling tests. See
# ip6gre_lib.sh for more details.
ALL_TESTS="
gre_hier
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_hierarchical_create $ol1 $ul1 key 22
sw2_hierarchical_create $ol2 $ul2 key 22
}
gre_hier()
{
test_traffic_ip4ip6 "GRE hierarchical IPv4-in-IPv6 with key"
test_traffic_ip6ip6 "GRE hierarchical IPv6-in-IPv6 with key"
}
gre_mtu_change()
{
test_mtu_change gre
}
cleanup()
{
pre_cleanup
sw2_hierarchical_destroy $ol2 $ul2
sw1_hierarchical_destroy $ol1 $ul1
h2_destroy
h1_destroy
vrf_cleanup
forwarding_restore
}
trap cleanup EXIT
setup_prepare
setup_wait
tests_run
exit $EXIT_STATUS
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
# Test IP-in-IP GRE tunnels without key.
# This test uses hierarchical topology for IP tunneling tests. See
# ip6gre_lib.sh for more details.
ALL_TESTS="
gre_hier
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_hierarchical_create $ol1 $ul1 ikey 111 okey 222
sw2_hierarchical_create $ol2 $ul2 ikey 222 okey 111
}
gre_hier()
{
test_traffic_ip4ip6 "GRE hierarchical IPv4-in-IPv6 with ikey/okey"
test_traffic_ip6ip6 "GRE hierarchical IPv6-in-IPv6 with ikey/okey"
}
gre_mtu_change()
{
test_mtu_change gre
}
cleanup()
{
pre_cleanup
sw2_hierarchical_destroy $ol2 $ul2
sw1_hierarchical_destroy $ol1 $ul1
h2_destroy
h1_destroy
vrf_cleanup
forwarding_restore
}
trap cleanup EXIT
setup_prepare
setup_wait
tests_run
exit $EXIT_STATUS
This diff is collapsed.
......@@ -16,6 +16,16 @@ tc_check_packets()
tc_rule_handle_stats_get "$id" "$handle" > /dev/null
}
tc_check_at_least_x_packets()
{
local id=$1
local handle=$2
local count=$3
busywait "$TC_HIT_TIMEOUT" until_counter_is ">= $count" \
tc_rule_handle_stats_get "$id" "$handle" > /dev/null
}
tc_check_packets_hitting()
{
local id=$1
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment