-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add IPv4 and IPv6 l2tp tests. Current set is over IP and with IPsec. v2 - add l2tp.sh to TEST_PROGS in Makefile Signed-off-by: David Ahern <dsahern@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
- Loading branch information
David Ahern
authored and
David S. Miller
committed
Aug 9, 2019
1 parent
9d2f112
commit e858ef1
Showing
2 changed files
with
383 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,382 @@ | ||
#!/bin/bash | ||
# SPDX-License-Identifier: GPL-2.0 | ||
# | ||
# L2TPv3 tunnel between 2 hosts | ||
# | ||
# host-1 | router | host-2 | ||
# | | | ||
# lo l2tp | | l2tp lo | ||
# 172.16.101.1 172.16.1.1 | | 172.16.1.2 172.16.101.2 | ||
# fc00:101::1 fc00:1::1 | | fc00:1::2 fc00:101::2 | ||
# | | | ||
# eth0 | | eth0 | ||
# 10.1.1.1 | | 10.1.2.1 | ||
# 2001:db8:1::1 | | 2001:db8:2::1 | ||
|
||
VERBOSE=0 | ||
PAUSE_ON_FAIL=no | ||
|
||
which ping6 > /dev/null 2>&1 && ping6=$(which ping6) || ping6=$(which ping) | ||
|
||
################################################################################ | ||
# | ||
log_test() | ||
{ | ||
local rc=$1 | ||
local expected=$2 | ||
local msg="$3" | ||
|
||
if [ ${rc} -eq ${expected} ]; then | ||
printf "TEST: %-60s [ OK ]\n" "${msg}" | ||
nsuccess=$((nsuccess+1)) | ||
else | ||
ret=1 | ||
nfail=$((nfail+1)) | ||
printf "TEST: %-60s [FAIL]\n" "${msg}" | ||
if [ "${PAUSE_ON_FAIL}" = "yes" ]; then | ||
echo | ||
echo "hit enter to continue, 'q' to quit" | ||
read a | ||
[ "$a" = "q" ] && exit 1 | ||
fi | ||
fi | ||
} | ||
|
||
run_cmd() | ||
{ | ||
local ns | ||
local cmd | ||
local out | ||
local rc | ||
|
||
ns="$1" | ||
shift | ||
cmd="$*" | ||
|
||
if [ "$VERBOSE" = "1" ]; then | ||
printf " COMMAND: $cmd\n" | ||
fi | ||
|
||
out=$(eval ip netns exec ${ns} ${cmd} 2>&1) | ||
rc=$? | ||
if [ "$VERBOSE" = "1" -a -n "$out" ]; then | ||
echo " $out" | ||
fi | ||
|
||
[ "$VERBOSE" = "1" ] && echo | ||
|
||
return $rc | ||
} | ||
|
||
################################################################################ | ||
# create namespaces and interconnects | ||
|
||
create_ns() | ||
{ | ||
local ns=$1 | ||
local addr=$2 | ||
local addr6=$3 | ||
|
||
[ -z "${addr}" ] && addr="-" | ||
[ -z "${addr6}" ] && addr6="-" | ||
|
||
ip netns add ${ns} | ||
|
||
ip -netns ${ns} link set lo up | ||
if [ "${addr}" != "-" ]; then | ||
ip -netns ${ns} addr add dev lo ${addr} | ||
fi | ||
if [ "${addr6}" != "-" ]; then | ||
ip -netns ${ns} -6 addr add dev lo ${addr6} | ||
fi | ||
|
||
ip -netns ${ns} ro add unreachable default metric 8192 | ||
ip -netns ${ns} -6 ro add unreachable default metric 8192 | ||
|
||
ip netns exec ${ns} sysctl -qw net.ipv4.ip_forward=1 | ||
ip netns exec ${ns} sysctl -qw net.ipv6.conf.all.keep_addr_on_down=1 | ||
ip netns exec ${ns} sysctl -qw net.ipv6.conf.all.forwarding=1 | ||
ip netns exec ${ns} sysctl -qw net.ipv6.conf.default.forwarding=1 | ||
ip netns exec ${ns} sysctl -qw net.ipv6.conf.default.accept_dad=0 | ||
} | ||
|
||
# create veth pair to connect namespaces and apply addresses. | ||
connect_ns() | ||
{ | ||
local ns1=$1 | ||
local ns1_dev=$2 | ||
local ns1_addr=$3 | ||
local ns1_addr6=$4 | ||
local ns2=$5 | ||
local ns2_dev=$6 | ||
local ns2_addr=$7 | ||
local ns2_addr6=$8 | ||
|
||
ip -netns ${ns1} li add ${ns1_dev} type veth peer name tmp | ||
ip -netns ${ns1} li set ${ns1_dev} up | ||
ip -netns ${ns1} li set tmp netns ${ns2} name ${ns2_dev} | ||
ip -netns ${ns2} li set ${ns2_dev} up | ||
|
||
if [ "${ns1_addr}" != "-" ]; then | ||
ip -netns ${ns1} addr add dev ${ns1_dev} ${ns1_addr} | ||
ip -netns ${ns2} addr add dev ${ns2_dev} ${ns2_addr} | ||
fi | ||
|
||
if [ "${ns1_addr6}" != "-" ]; then | ||
ip -netns ${ns1} addr add dev ${ns1_dev} ${ns1_addr6} | ||
ip -netns ${ns2} addr add dev ${ns2_dev} ${ns2_addr6} | ||
fi | ||
} | ||
|
||
################################################################################ | ||
# test setup | ||
|
||
cleanup() | ||
{ | ||
local ns | ||
|
||
for ns in host-1 host-2 router | ||
do | ||
ip netns del ${ns} 2>/dev/null | ||
done | ||
} | ||
|
||
setup_l2tp_ipv4() | ||
{ | ||
# | ||
# configure l2tpv3 tunnel on host-1 | ||
# | ||
ip -netns host-1 l2tp add tunnel tunnel_id 1041 peer_tunnel_id 1042 \ | ||
encap ip local 10.1.1.1 remote 10.1.2.1 | ||
ip -netns host-1 l2tp add session name l2tp4 tunnel_id 1041 \ | ||
session_id 1041 peer_session_id 1042 | ||
ip -netns host-1 link set dev l2tp4 up | ||
ip -netns host-1 addr add dev l2tp4 172.16.1.1 peer 172.16.1.2 | ||
|
||
# | ||
# configure l2tpv3 tunnel on host-2 | ||
# | ||
ip -netns host-2 l2tp add tunnel tunnel_id 1042 peer_tunnel_id 1041 \ | ||
encap ip local 10.1.2.1 remote 10.1.1.1 | ||
ip -netns host-2 l2tp add session name l2tp4 tunnel_id 1042 \ | ||
session_id 1042 peer_session_id 1041 | ||
ip -netns host-2 link set dev l2tp4 up | ||
ip -netns host-2 addr add dev l2tp4 172.16.1.2 peer 172.16.1.1 | ||
|
||
# | ||
# add routes to loopback addresses | ||
# | ||
ip -netns host-1 ro add 172.16.101.2/32 via 172.16.1.2 | ||
ip -netns host-2 ro add 172.16.101.1/32 via 172.16.1.1 | ||
} | ||
|
||
setup_l2tp_ipv6() | ||
{ | ||
# | ||
# configure l2tpv3 tunnel on host-1 | ||
# | ||
ip -netns host-1 l2tp add tunnel tunnel_id 1061 peer_tunnel_id 1062 \ | ||
encap ip local 2001:db8:1::1 remote 2001:db8:2::1 | ||
ip -netns host-1 l2tp add session name l2tp6 tunnel_id 1061 \ | ||
session_id 1061 peer_session_id 1062 | ||
ip -netns host-1 link set dev l2tp6 up | ||
ip -netns host-1 addr add dev l2tp6 fc00:1::1 peer fc00:1::2 | ||
|
||
# | ||
# configure l2tpv3 tunnel on host-2 | ||
# | ||
ip -netns host-2 l2tp add tunnel tunnel_id 1062 peer_tunnel_id 1061 \ | ||
encap ip local 2001:db8:2::1 remote 2001:db8:1::1 | ||
ip -netns host-2 l2tp add session name l2tp6 tunnel_id 1062 \ | ||
session_id 1062 peer_session_id 1061 | ||
ip -netns host-2 link set dev l2tp6 up | ||
ip -netns host-2 addr add dev l2tp6 fc00:1::2 peer fc00:1::1 | ||
|
||
# | ||
# add routes to loopback addresses | ||
# | ||
ip -netns host-1 -6 ro add fc00:101::2/128 via fc00:1::2 | ||
ip -netns host-2 -6 ro add fc00:101::1/128 via fc00:1::1 | ||
} | ||
|
||
setup() | ||
{ | ||
# start clean | ||
cleanup | ||
|
||
set -e | ||
create_ns host-1 172.16.101.1/32 fc00:101::1/128 | ||
create_ns host-2 172.16.101.2/32 fc00:101::2/128 | ||
create_ns router | ||
|
||
connect_ns host-1 eth0 10.1.1.1/24 2001:db8:1::1/64 \ | ||
router eth1 10.1.1.2/24 2001:db8:1::2/64 | ||
|
||
connect_ns host-2 eth0 10.1.2.1/24 2001:db8:2::1/64 \ | ||
router eth2 10.1.2.2/24 2001:db8:2::2/64 | ||
|
||
ip -netns host-1 ro add 10.1.2.0/24 via 10.1.1.2 | ||
ip -netns host-1 -6 ro add 2001:db8:2::/64 via 2001:db8:1::2 | ||
|
||
ip -netns host-2 ro add 10.1.1.0/24 via 10.1.2.2 | ||
ip -netns host-2 -6 ro add 2001:db8:1::/64 via 2001:db8:2::2 | ||
|
||
setup_l2tp_ipv4 | ||
setup_l2tp_ipv6 | ||
set +e | ||
} | ||
|
||
setup_ipsec() | ||
{ | ||
# | ||
# IPv4 | ||
# | ||
run_cmd host-1 ip xfrm policy add \ | ||
src 10.1.1.1 dst 10.1.2.1 dir out \ | ||
tmpl proto esp mode transport | ||
|
||
run_cmd host-1 ip xfrm policy add \ | ||
src 10.1.2.1 dst 10.1.1.1 dir in \ | ||
tmpl proto esp mode transport | ||
|
||
run_cmd host-2 ip xfrm policy add \ | ||
src 10.1.1.1 dst 10.1.2.1 dir in \ | ||
tmpl proto esp mode transport | ||
|
||
run_cmd host-2 ip xfrm policy add \ | ||
src 10.1.2.1 dst 10.1.1.1 dir out \ | ||
tmpl proto esp mode transport | ||
|
||
ip -netns host-1 xfrm state add \ | ||
src 10.1.1.1 dst 10.1.2.1 \ | ||
spi 0x1000 proto esp aead 'rfc4106(gcm(aes))' \ | ||
0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode transport | ||
|
||
ip -netns host-1 xfrm state add \ | ||
src 10.1.2.1 dst 10.1.1.1 \ | ||
spi 0x1001 proto esp aead 'rfc4106(gcm(aes))' \ | ||
0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode transport | ||
|
||
ip -netns host-2 xfrm state add \ | ||
src 10.1.1.1 dst 10.1.2.1 \ | ||
spi 0x1000 proto esp aead 'rfc4106(gcm(aes))' \ | ||
0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode transport | ||
|
||
ip -netns host-2 xfrm state add \ | ||
src 10.1.2.1 dst 10.1.1.1 \ | ||
spi 0x1001 proto esp aead 'rfc4106(gcm(aes))' \ | ||
0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode transport | ||
|
||
# | ||
# IPV6 | ||
# | ||
run_cmd host-1 ip -6 xfrm policy add \ | ||
src 2001:db8:1::1 dst 2001:db8:2::1 dir out \ | ||
tmpl proto esp mode transport | ||
|
||
run_cmd host-1 ip -6 xfrm policy add \ | ||
src 2001:db8:2::1 dst 2001:db8:1::1 dir in \ | ||
tmpl proto esp mode transport | ||
|
||
run_cmd host-2 ip -6 xfrm policy add \ | ||
src 2001:db8:1::1 dst 2001:db8:2::1 dir in \ | ||
tmpl proto esp mode transport | ||
|
||
run_cmd host-2 ip -6 xfrm policy add \ | ||
src 2001:db8:2::1 dst 2001:db8:1::1 dir out \ | ||
tmpl proto esp mode transport | ||
|
||
ip -netns host-1 -6 xfrm state add \ | ||
src 2001:db8:1::1 dst 2001:db8:2::1 \ | ||
spi 0x1000 proto esp aead 'rfc4106(gcm(aes))' \ | ||
0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode transport | ||
|
||
ip -netns host-1 -6 xfrm state add \ | ||
src 2001:db8:2::1 dst 2001:db8:1::1 \ | ||
spi 0x1001 proto esp aead 'rfc4106(gcm(aes))' \ | ||
0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode transport | ||
|
||
ip -netns host-2 -6 xfrm state add \ | ||
src 2001:db8:1::1 dst 2001:db8:2::1 \ | ||
spi 0x1000 proto esp aead 'rfc4106(gcm(aes))' \ | ||
0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode transport | ||
|
||
ip -netns host-2 -6 xfrm state add \ | ||
src 2001:db8:2::1 dst 2001:db8:1::1 \ | ||
spi 0x1001 proto esp aead 'rfc4106(gcm(aes))' \ | ||
0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode transport | ||
} | ||
|
||
teardown_ipsec() | ||
{ | ||
run_cmd host-1 ip xfrm state flush | ||
run_cmd host-1 ip xfrm policy flush | ||
run_cmd host-2 ip xfrm state flush | ||
run_cmd host-2 ip xfrm policy flush | ||
} | ||
|
||
################################################################################ | ||
# generate traffic through tunnel for various cases | ||
|
||
run_ping() | ||
{ | ||
local desc="$1" | ||
|
||
run_cmd host-1 ping -c1 -w1 172.16.1.2 | ||
log_test $? 0 "IPv4 basic L2TP tunnel ${desc}" | ||
|
||
run_cmd host-1 ping -c1 -w1 -I 172.16.101.1 172.16.101.2 | ||
log_test $? 0 "IPv4 route through L2TP tunnel ${desc}" | ||
|
||
run_cmd host-1 ${ping6} -c1 -w1 fc00:1::2 | ||
log_test $? 0 "IPv6 basic L2TP tunnel ${desc}" | ||
|
||
run_cmd host-1 ${ping6} -c1 -w1 -I fc00:101::1 fc00:101::2 | ||
log_test $? 0 "IPv6 route through L2TP tunnel ${desc}" | ||
} | ||
|
||
run_tests() | ||
{ | ||
local desc | ||
|
||
setup | ||
run_ping | ||
|
||
setup_ipsec | ||
run_ping "- with IPsec" | ||
run_cmd host-1 ping -c1 -w1 172.16.1.2 | ||
log_test $? 0 "IPv4 basic L2TP tunnel ${desc}" | ||
|
||
run_cmd host-1 ping -c1 -w1 -I 172.16.101.1 172.16.101.2 | ||
log_test $? 0 "IPv4 route through L2TP tunnel ${desc}" | ||
|
||
run_cmd host-1 ${ping6} -c1 -w1 fc00:1::2 | ||
log_test $? 0 "IPv6 basic L2TP tunnel - with IPsec" | ||
|
||
run_cmd host-1 ${ping6} -c1 -w1 -I fc00:101::1 fc00:101::2 | ||
log_test $? 0 "IPv6 route through L2TP tunnel - with IPsec" | ||
|
||
teardown_ipsec | ||
run_ping "- after IPsec teardown" | ||
} | ||
|
||
################################################################################ | ||
# main | ||
|
||
declare -i nfail=0 | ||
declare -i nsuccess=0 | ||
|
||
while getopts :pv o | ||
do | ||
case $o in | ||
p) PAUSE_ON_FAIL=yes;; | ||
v) VERBOSE=$(($VERBOSE + 1));; | ||
*) exit 1;; | ||
esac | ||
done | ||
|
||
run_tests | ||
cleanup | ||
|
||
printf "\nTests passed: %3d\n" ${nsuccess} | ||
printf "Tests failed: %3d\n" ${nfail} |