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

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
Loading
Loading
Loading
Loading
+18 −32
Original line number Diff line number Diff line
@@ -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
+250 −0
Original line number Diff line number Diff line
#!/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
+3 −0
Original line number Diff line number Diff line
@@ -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
+65 −0
Original line number Diff line number Diff line
#!/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
+65 −0
Original line number Diff line number Diff line
#!/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
Loading