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: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
36ee7281c5
|
@ -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
|
||||
|
|
|
@ -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
|
|
@ -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
|
||||
|
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -0,0 +1,65 @@
|
|||
#!/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
|
|
@ -0,0 +1,65 @@
|
|||
#!/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
|
|
@ -0,0 +1,65 @@
|
|||
#!/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
|
|
@ -0,0 +1,438 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
#!/bin/bash
|
||||
|
||||
# Handles creation and destruction of IP-in-IP or GRE tunnels over the given
|
||||
# topology. Supports both flat and hierarchical models.
|
||||
#
|
||||
# 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 |
|
||||
# +--------------------------------+
|
||||
#
|
||||
# Hierarchical model:
|
||||
# The tunnel is bound to a device in a different VRF
|
||||
#
|
||||
# +--------------------------------+
|
||||
# | 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 | |
|
||||
# | | ^ | |
|
||||
# | | VRF v$ol1 | | |
|
||||
# | +--------------------|--------------------+ |
|
||||
# | | |
|
||||
# | +--------------------|--------------------+ |
|
||||
# | | VRF v$ul1 | | |
|
||||
# | | | | |
|
||||
# | | v | |
|
||||
# | | dummy1 + | |
|
||||
# | | 2001:db8:3::1/64 | |
|
||||
# | | .-----------' | |
|
||||
# | | | | |
|
||||
# | | v | |
|
||||
# | | + $ul1.111 (vlan) | |
|
||||
# | | | 2001:db8:10::1/64 | |
|
||||
# | | \ | |
|
||||
# | | \__________ | |
|
||||
# | | | | |
|
||||
# | | + $ul1 | |
|
||||
# | +---------------------|-------------------+ |
|
||||
# +-----------------------|---------------------+
|
||||
# |
|
||||
# +-----------------------|---------------------+
|
||||
# | SW2 | |
|
||||
# | +---------------------|-------------------+ |
|
||||
# | | + $ul2 | |
|
||||
# | | _____| | |
|
||||
# | | / | |
|
||||
# | | / | |
|
||||
# | | | $ul2.111 (vlan) | |
|
||||
# | | + 2001:db8:10::2/64 | |
|
||||
# | | ^ | |
|
||||
# | | | | |
|
||||
# | | '------. | |
|
||||
# | | dummy2 + | |
|
||||
# | | 2001:db8:3::2/64 | |
|
||||
# | | ^ | |
|
||||
# | | | | |
|
||||
# | | | | |
|
||||
# | | VRF v$ul2 | | |
|
||||
# | +---------------------|-------------------+ |
|
||||
# | | |
|
||||
# | +---------------------|-------------------+ |
|
||||
# | | VRF v$ol2 | | |
|
||||
# | | | | |
|
||||
# | | v | |
|
||||
# | | g2a (ip6gre) + | |
|
||||
# | | loc=2001:db8:3::2 | |
|
||||
# | | rem=2001:db8:3::1 | |
|
||||
# | | tos=inherit | |
|
||||
# | | | |
|
||||
# | | $ol2 + | |
|
||||
# | | 203.0.113.2/24 | | |
|
||||
# | | 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
|
||||
}
|
||||
|
||||
sw1_hierarchical_create()
|
||||
{
|
||||
local ol1=$1; shift
|
||||
local ul1=$1; shift
|
||||
|
||||
simple_if_init $ol1 198.51.100.2/24 2001:db8:1::2/64
|
||||
simple_if_init $ul1
|
||||
ip link add name dummy1 type dummy
|
||||
__simple_if_init dummy1 v$ul1 2001:db8:3::1/64
|
||||
|
||||
vlan_create $ul1 111 v$ul1 2001:db8:10::1/64
|
||||
tunnel_create g1a ip6gre 2001:db8:3::1 2001:db8:3::2 tos inherit \
|
||||
ttl inherit dev dummy1 "$@"
|
||||
ip link set dev g1a master v$ol1
|
||||
|
||||
ip -6 route add vrf v$ul1 2001:db8:3::2/128 via 2001:db8:10::2
|
||||
ip route add vrf v$ol1 203.0.113.0/24 dev g1a
|
||||
ip -6 route add vrf v$ol1 2001:db8:2::/64 dev g1a
|
||||
}
|
||||
|
||||
sw1_hierarchical_destroy()
|
||||
{
|
||||
local ol1=$1; shift
|
||||
local ul1=$1; shift
|
||||
|
||||
ip -6 route del vrf v$ol1 2001:db8:2::/64
|
||||
ip route del vrf v$ol1 203.0.113.0/24
|
||||
ip -6 route del vrf v$ul1 2001:db8:3::2/128
|
||||
|
||||
tunnel_destroy g1a
|
||||
vlan_destroy $ul1 111
|
||||
|
||||
__simple_if_fini dummy1 2001:db8:3::1/64
|
||||
ip link del dev dummy1
|
||||
|
||||
simple_if_fini $ul1
|
||||
simple_if_fini $ol1 198.51.100.2/24 2001:db8:1::2/64
|
||||
}
|
||||
|
||||
sw2_hierarchical_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
|
||||
|
||||
ip link add name dummy2 type dummy
|
||||
__simple_if_init dummy2 v$ul2 2001:db8:3::2/64
|
||||
|
||||
vlan_create $ul2 111 v$ul2 2001:db8:10::2/64
|
||||
tunnel_create g2a ip6gre 2001:db8:3::2 2001:db8:3::1 tos inherit \
|
||||
ttl inherit dev dummy2 "$@"
|
||||
ip link set dev g2a master v$ol2
|
||||
|
||||
# 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$ul2 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_hierarchical_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$ul2 2001:db8:3::1/128
|
||||
|
||||
tunnel_destroy g2a
|
||||
vlan_destroy $ul2 111
|
||||
|
||||
__simple_if_fini dummy2 2001:db8:3::2/64
|
||||
ip link del dev dummy2
|
||||
|
||||
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"
|
||||
}
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue