Skip to content

Commit

Permalink
Merge branch 'ip6gre-tests'
Browse files Browse the repository at this point in the history
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: David S. Miller <[email protected]>
  • Loading branch information
davem330 committed Oct 8, 2021
2 parents 4c1e34c + 7f63cdd commit 36ee728
Show file tree
Hide file tree
Showing 11 changed files with 1,109 additions and 32 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
# |
# +-------------------|-----+
# | SW1 | |
# | $swp1 + |
# | $swp1 + |
# | 192.0.2.2/28 |
# | |
# | + g1a (gre) |
Expand All @@ -27,8 +27,8 @@
# |
# +--|----------------------+
# | | VRF2 |
# | + $rp2 |
# | 198.51.100.2/28 |
# | + $rp2 |
# | 198.51.100.2/28 |
# +-------------------------+

lib_dir=$(dirname $0)/../../../net/forwarding
Expand Down Expand Up @@ -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
Expand All @@ -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"
Expand Down Expand Up @@ -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"
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,250 @@
#!/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
Original file line number Diff line number Diff line change
Expand Up @@ -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
Loading

0 comments on commit 36ee728

Please sign in to comment.