xref: /netbsd-src/tests/net/if_ipsec/t_ipsec_unnumbered.sh (revision 4743d3462c611d26d6556d30b9af1d5ee2b60860)
1*4743d346Sknakahara#	$NetBSD: t_ipsec_unnumbered.sh,v 1.2 2023/09/27 08:48:01 knakahara Exp $
2d432a9d9Sknakahara#
3d432a9d9Sknakahara# Copyright (c) 2022 Internet Initiative Japan Inc.
4d432a9d9Sknakahara# All rights reserved.
5d432a9d9Sknakahara#
6d432a9d9Sknakahara# Redistribution and use in source and binary forms, with or without
7d432a9d9Sknakahara# modification, are permitted provided that the following conditions
8d432a9d9Sknakahara# are met:
9d432a9d9Sknakahara# 1. Redistributions of source code must retain the above copyright
10d432a9d9Sknakahara#    notice, this list of conditions and the following disclaimer.
11d432a9d9Sknakahara# 2. Redistributions in binary form must reproduce the above copyright
12d432a9d9Sknakahara#    notice, this list of conditions and the following disclaimer in the
13d432a9d9Sknakahara#    documentation and/or other materials provided with the distribution.
14d432a9d9Sknakahara#
15d432a9d9Sknakahara# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
16d432a9d9Sknakahara# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17d432a9d9Sknakahara# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18d432a9d9Sknakahara# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
19d432a9d9Sknakahara# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20d432a9d9Sknakahara# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21d432a9d9Sknakahara# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22d432a9d9Sknakahara# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23d432a9d9Sknakahara# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24d432a9d9Sknakahara# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25d432a9d9Sknakahara# POSSIBILITY OF SUCH DAMAGE.
26d432a9d9Sknakahara#
27d432a9d9Sknakahara
28d432a9d9SknakaharaSOCK_LOCAL=unix://ipsec_local
29d432a9d9SknakaharaSOCK_REMOTE=unix://ipsec_remote
30d432a9d9SknakaharaBUS_LOCAL_I=./bus_ipsec_local_inner
31d432a9d9SknakaharaBUS_REMOTE_I=./bus_ipsec_remote_inner
32d432a9d9SknakaharaBUS_GLOBAL=./bus_ipsec_global
33d432a9d9Sknakahara
34d432a9d9SknakaharaDEBUG=${DEBUG:-false}
35d432a9d9SknakaharaTIMEOUT=7
36d432a9d9Sknakahara
37d432a9d9Sknakaharasetup_servers_ipv4()
38d432a9d9Sknakahara{
39d432a9d9Sknakahara
40d432a9d9Sknakahara	rump_server_crypto_start $SOCK_LOCAL netipsec ipsec
41d432a9d9Sknakahara	rump_server_crypto_start $SOCK_REMOTE netipsec ipsec
42d432a9d9Sknakahara	rump_server_add_iface $SOCK_LOCAL shmif0 $BUS_GLOBAL
43d432a9d9Sknakahara	rump_server_add_iface $SOCK_LOCAL shmif1 $BUS_LOCAL_I
44d432a9d9Sknakahara	rump_server_add_iface $SOCK_REMOTE shmif0 $BUS_GLOBAL
45d432a9d9Sknakahara	rump_server_add_iface $SOCK_REMOTE shmif1 $BUS_REMOTE_I
46d432a9d9Sknakahara}
47d432a9d9Sknakahara
48d432a9d9Sknakaharasetup_servers_ipv6()
49d432a9d9Sknakahara{
50d432a9d9Sknakahara
51d432a9d9Sknakahara	rump_server_crypto_start $SOCK_LOCAL netipsec netinet6 ipsec
52d432a9d9Sknakahara	rump_server_crypto_start $SOCK_REMOTE netipsec netinet6 ipsec
53d432a9d9Sknakahara	rump_server_add_iface $SOCK_LOCAL shmif0 $BUS_GLOBAL
54d432a9d9Sknakahara	rump_server_add_iface $SOCK_LOCAL shmif1 $BUS_LOCAL_I
55d432a9d9Sknakahara	rump_server_add_iface $SOCK_REMOTE shmif0 $BUS_GLOBAL
56d432a9d9Sknakahara	rump_server_add_iface $SOCK_REMOTE shmif1 $BUS_REMOTE_I
57d432a9d9Sknakahara}
58d432a9d9Sknakahara
59d432a9d9Sknakaharasetup_servers()
60d432a9d9Sknakahara{
61d432a9d9Sknakahara	local proto=$1
62d432a9d9Sknakahara
63d432a9d9Sknakahara	setup_servers_$proto
64d432a9d9Sknakahara}
65d432a9d9Sknakahara
66d432a9d9Sknakaharaadd_sa()
67d432a9d9Sknakahara{
68d432a9d9Sknakahara	local outer=$1
69d432a9d9Sknakahara	local proto=$2
70d432a9d9Sknakahara	local algo="$3"
71d432a9d9Sknakahara	local src=$4
72d432a9d9Sknakahara	local dst=$5
73d432a9d9Sknakahara	local tmpfile=./tmp
74d432a9d9Sknakahara	local spi=10000
75d432a9d9Sknakahara	local algo_args="$(generate_algo_args esp $algo)"
76*4743d346Sknakahara	local uniq=8192 # 8192(reqid_base) + 2 * 0(unit id of "ipsec0")
77d432a9d9Sknakahara
78d432a9d9Sknakahara	export RUMP_SERVER=$SOCK_LOCAL
79d432a9d9Sknakahara	cat > $tmpfile <<-EOF
80d432a9d9Sknakahara	add $src $dst $proto $((spi)) -u $uniq -m transport $algo_args;
81d432a9d9Sknakahara	add $dst $src $proto $((spi + 1)) -u $uniq -m transport $algo_args;
82d432a9d9Sknakahara	EOF
83d432a9d9Sknakahara	$DEBUG && cat $tmpfile
84d432a9d9Sknakahara	atf_check -s exit:0 -o empty $HIJACKING setkey -c < $tmpfile
85d432a9d9Sknakahara	$DEBUG && $HIJACKING setkey -D
86d432a9d9Sknakahara	# XXX it can be expired if $lifetime is very short
87d432a9d9Sknakahara	#check_sa_entries $SOCK_LOCAL $ip_local $ip_remote
88d432a9d9Sknakahara
89d432a9d9Sknakahara	export RUMP_SERVER=$SOCK_REMOTE
90d432a9d9Sknakahara	cat > $tmpfile <<-EOF
91d432a9d9Sknakahara	add $src $dst $proto $((spi)) -u $uniq -m transport $algo_args;
92d432a9d9Sknakahara	add $dst $src $proto $((spi + 1)) -u $uniq -m transport $algo_args;
93d432a9d9Sknakahara	EOF
94d432a9d9Sknakahara	$DEBUG && cat $tmpfile
95d432a9d9Sknakahara	atf_check -s exit:0 -o empty $HIJACKING setkey -c < $tmpfile
96d432a9d9Sknakahara	$DEBUG && $HIJACKING setkey -D
97d432a9d9Sknakahara}
98d432a9d9Sknakahara
99d432a9d9Sknakaharatest_ipsecif_unnumbered_ipv4()
100d432a9d9Sknakahara{
101d432a9d9Sknakahara	local algo=$1
102d432a9d9Sknakahara	local ip_local_i=192.168.22.1
103d432a9d9Sknakahara	local ip_local_i_subnet=192.168.22.0/24
104d432a9d9Sknakahara	local ip_local_o=10.0.0.2
105d432a9d9Sknakahara	local ip_remote_i=192.168.33.1
106d432a9d9Sknakahara	local ip_remote_i_subnet=192.168.33.0/24
107d432a9d9Sknakahara	local ip_remote_o=10.0.0.3
108d432a9d9Sknakahara	local outfile=./out
109d432a9d9Sknakahara
110d432a9d9Sknakahara	setup_servers ipv4
111d432a9d9Sknakahara
112d432a9d9Sknakahara	export RUMP_SERVER=$SOCK_LOCAL
113d432a9d9Sknakahara	atf_check -s exit:0 rump.sysctl -q -w net.inet.ip.dad_count=0
114d432a9d9Sknakahara	atf_check -s exit:0 rump.sysctl -q -w net.ipsecif.use_fixed_reqid=1
115d432a9d9Sknakahara	atf_check -s exit:0 rump.ifconfig shmif0 $ip_local_o/24
116d432a9d9Sknakahara	atf_check -s exit:0 rump.ifconfig shmif1 $ip_local_i/24
117d432a9d9Sknakahara
118d432a9d9Sknakahara	export RUMP_SERVER=$SOCK_REMOTE
119d432a9d9Sknakahara	atf_check -s exit:0 rump.sysctl -q -w net.inet.ip.dad_count=0
120d432a9d9Sknakahara	atf_check -s exit:0 rump.sysctl -q -w net.ipsecif.use_fixed_reqid=1
121d432a9d9Sknakahara	atf_check -s exit:0 rump.ifconfig shmif0 $ip_remote_o/24
122d432a9d9Sknakahara	atf_check -s exit:0 rump.ifconfig shmif1 $ip_remote_i/24
123d432a9d9Sknakahara
124d432a9d9Sknakahara	export RUMP_SERVER=$SOCK_LOCAL
125d432a9d9Sknakahara	atf_check -s exit:0 -o ignore rump.ping -c 1 -n -w $TIMEOUT $ip_remote_o
126d432a9d9Sknakahara
127d432a9d9Sknakahara	# setup ipsecif(4) as unnumbered for local
128d432a9d9Sknakahara	export RUMP_SERVER=$SOCK_LOCAL
129d432a9d9Sknakahara	atf_check -s exit:0 -o ignore rump.ifconfig ipsec0 create
130d432a9d9Sknakahara	atf_check -s exit:0 -o ignore \
131d432a9d9Sknakahara		  rump.ifconfig ipsec0 tunnel $ip_local_o $ip_remote_o
132d432a9d9Sknakahara	atf_check -s exit:0 -o ignore rump.ifconfig ipsec0 unnumbered
133d432a9d9Sknakahara	atf_check -s exit:0 -o ignore rump.ifconfig ipsec0 $ip_local_i/32
134d432a9d9Sknakahara	atf_check -s exit:0 -o ignore \
135d432a9d9Sknakahara		  rump.route add -inet $ip_remote_i_subnet -ifp ipsec0 $ip_local_i
136d432a9d9Sknakahara	$DEBUG && rump.ifconfig -v ipsec0
137d432a9d9Sknakahara	$DEBUG && $HIJACKING setkey -DP
138d432a9d9Sknakahara	$DEBUG && rump.route -nL show
139d432a9d9Sknakahara
140d432a9d9Sknakahara	# setup ipsecif(4) as unnumbered for remote
141d432a9d9Sknakahara	export RUMP_SERVER=$SOCK_REMOTE
142d432a9d9Sknakahara	atf_check -s exit:0 -o ignore rump.ifconfig ipsec0 create
143d432a9d9Sknakahara	atf_check -s exit:0 -o ignore \
144d432a9d9Sknakahara		  rump.ifconfig ipsec0 tunnel $ip_remote_o $ip_local_o
145d432a9d9Sknakahara	atf_check -s exit:0 -o ignore rump.ifconfig ipsec0 unnumbered
146d432a9d9Sknakahara	atf_check -s exit:0 -o ignore rump.ifconfig ipsec0 $ip_remote_i/32
147d432a9d9Sknakahara	atf_check -s exit:0 -o ignore \
148d432a9d9Sknakahara		  rump.route add -inet $ip_local_i_subnet -ifp ipsec0 $ip_remote_i
149d432a9d9Sknakahara	$DEBUG && rump.ifconfig -v ipsec0
150d432a9d9Sknakahara	$DEBUG && $HIJACKING setkey -DP
151d432a9d9Sknakahara	$DEBUG && rump.route -nL show
152d432a9d9Sknakahara
153d432a9d9Sknakahara	add_sa ipv4 esp $algo $ip_local_o $ip_remote_o
154d432a9d9Sknakahara
155d432a9d9Sknakahara	# test unnumbered ipsecif(4)
156d432a9d9Sknakahara	extract_new_packets $BUS_GLOBAL > $outfile
157d432a9d9Sknakahara	export RUMP_SERVER=$SOCK_LOCAL
158d432a9d9Sknakahara	atf_check -s exit:0 -o ignore \
159d432a9d9Sknakahara		  rump.ping -c 1 -n -w $TIMEOUT -I $ip_local_i $ip_remote_i
160d432a9d9Sknakahara	extract_new_packets $BUS_GLOBAL > $outfile
161d432a9d9Sknakahara	$DEBUG && cat $outfile
162d432a9d9Sknakahara	atf_check -s exit:0 \
163d432a9d9Sknakahara	    -o match:"$ip_local_o > $ip_remote_o: ESP" \
164d432a9d9Sknakahara	    cat $outfile
165d432a9d9Sknakahara	atf_check -s exit:0 \
166d432a9d9Sknakahara	    -o match:"$ip_remote_o > $ip_local_o: ESP" \
167d432a9d9Sknakahara	    cat $outfile
168d432a9d9Sknakahara}
169d432a9d9Sknakahara
170d432a9d9Sknakaharatest_ipsecif_unnumbered_ipv6()
171d432a9d9Sknakahara{
172d432a9d9Sknakahara	local algo=$1
173d432a9d9Sknakahara	local ip_local_i=192.168.22.1
174d432a9d9Sknakahara	local ip_local_i_subnet=192.168.22.0/24
175d432a9d9Sknakahara	local ip_local_o=fc00::2
176d432a9d9Sknakahara	local ip_remote_i=192.168.33.1
177d432a9d9Sknakahara	local ip_remote_i_subnet=192.168.33.0/24
178d432a9d9Sknakahara	local ip_remote_o=fc00::3
179d432a9d9Sknakahara	local outfile=./out
180d432a9d9Sknakahara
181d432a9d9Sknakahara	setup_servers ipv6
182d432a9d9Sknakahara
183d432a9d9Sknakahara	export RUMP_SERVER=$SOCK_LOCAL
184d432a9d9Sknakahara	atf_check -s exit:0 rump.sysctl -q -w net.inet.ip.dad_count=0
185d432a9d9Sknakahara	atf_check -s exit:0 rump.sysctl -q -w net.inet6.ip6.dad_count=0
186d432a9d9Sknakahara	atf_check -s exit:0 rump.sysctl -q -w net.ipsecif.use_fixed_reqid=1
187d432a9d9Sknakahara	atf_check -s exit:0 rump.ifconfig shmif0 inet6 $ip_local_o/64
188d432a9d9Sknakahara	atf_check -s exit:0 rump.ifconfig shmif1 $ip_local_i/24
189d432a9d9Sknakahara
190d432a9d9Sknakahara	export RUMP_SERVER=$SOCK_REMOTE
191d432a9d9Sknakahara	atf_check -s exit:0 rump.sysctl -q -w net.inet.ip.dad_count=0
192d432a9d9Sknakahara	atf_check -s exit:0 rump.sysctl -q -w net.inet6.ip6.dad_count=0
193d432a9d9Sknakahara	atf_check -s exit:0 rump.sysctl -q -w net.ipsecif.use_fixed_reqid=1
194d432a9d9Sknakahara	atf_check -s exit:0 rump.ifconfig shmif0 inet6 $ip_remote_o/64
195d432a9d9Sknakahara	atf_check -s exit:0 rump.ifconfig shmif1 $ip_remote_i/24
196d432a9d9Sknakahara
197d432a9d9Sknakahara	export RUMP_SERVER=$SOCK_LOCAL
198d432a9d9Sknakahara	atf_check -s exit:0 -o ignore rump.ping6 -c 1 -n -X $TIMEOUT $ip_remote_o
199d432a9d9Sknakahara
200d432a9d9Sknakahara	# setup ipsecif(4) as unnumbered for local
201d432a9d9Sknakahara	export RUMP_SERVER=$SOCK_LOCAL
202d432a9d9Sknakahara	atf_check -s exit:0 -o ignore rump.ifconfig ipsec0 create
203d432a9d9Sknakahara	atf_check -s exit:0 -o ignore \
204d432a9d9Sknakahara		  rump.ifconfig ipsec0 tunnel $ip_local_o $ip_remote_o
205d432a9d9Sknakahara	atf_check -s exit:0 -o ignore rump.ifconfig ipsec0 unnumbered
206d432a9d9Sknakahara	atf_check -s exit:0 -o ignore rump.ifconfig ipsec0 $ip_local_i/32
207d432a9d9Sknakahara	atf_check -s exit:0 -o ignore \
208d432a9d9Sknakahara		  rump.route add -inet $ip_remote_i_subnet -ifp ipsec0 $ip_local_i
209d432a9d9Sknakahara	$DEBUG && rump.ifconfig -v ipsec0
210d432a9d9Sknakahara	$DEBUG && rump.route -nL show
211d432a9d9Sknakahara
212d432a9d9Sknakahara	# setup ipsecif(4) as unnumbered for remote
213d432a9d9Sknakahara	export RUMP_SERVER=$SOCK_REMOTE
214d432a9d9Sknakahara	atf_check -s exit:0 -o ignore rump.ifconfig ipsec0 create
215d432a9d9Sknakahara	atf_check -s exit:0 -o ignore \
216d432a9d9Sknakahara		  rump.ifconfig ipsec0 tunnel $ip_remote_o $ip_local_o
217d432a9d9Sknakahara	atf_check -s exit:0 -o ignore rump.ifconfig ipsec0 unnumbered
218d432a9d9Sknakahara	atf_check -s exit:0 -o ignore rump.ifconfig ipsec0 $ip_remote_i/32
219d432a9d9Sknakahara	atf_check -s exit:0 -o ignore \
220d432a9d9Sknakahara		  rump.route add -inet $ip_local_i_subnet -ifp ipsec0 $ip_remote_i
221d432a9d9Sknakahara	$DEBUG && rump.ifconfig -v ipsec0
222d432a9d9Sknakahara	$DEBUG && rump.route -nL show
223d432a9d9Sknakahara
224d432a9d9Sknakahara	add_sa ipv6 esp $algo $ip_local_o $ip_remote_o
225d432a9d9Sknakahara
226d432a9d9Sknakahara	# test unnumbered gif(4)
227d432a9d9Sknakahara	extract_new_packets $BUS_GLOBAL > $outfile
228d432a9d9Sknakahara	export RUMP_SERVER=$SOCK_LOCAL
229d432a9d9Sknakahara	atf_check -s exit:0 -o ignore \
230d432a9d9Sknakahara		  rump.ping -c 1 -n -w $TIMEOUT -I $ip_local_i $ip_remote_i
231d432a9d9Sknakahara	extract_new_packets $BUS_GLOBAL > $outfile
232d432a9d9Sknakahara	$DEBUG && cat $outfile
233d432a9d9Sknakahara	atf_check -s exit:0 \
234d432a9d9Sknakahara	    -o match:"$ip_local_o > $ip_remote_o: ESP" \
235d432a9d9Sknakahara	    cat $outfile
236d432a9d9Sknakahara	atf_check -s exit:0 \
237d432a9d9Sknakahara	    -o match:"$ip_remote_o > $ip_local_o: ESP" \
238d432a9d9Sknakahara	    cat $outfile
239d432a9d9Sknakahara}
240d432a9d9Sknakahara
241d432a9d9Sknakaharaadd_test_ipsecif_unnumbered()
242d432a9d9Sknakahara{
243d432a9d9Sknakahara	local outer=$1
244d432a9d9Sknakahara	local algo=$2
245d432a9d9Sknakahara	local _algo=$(echo $algo | sed 's/-//g')
246d432a9d9Sknakahara	local name=
247d432a9d9Sknakahara	local desc=
248d432a9d9Sknakahara
249d432a9d9Sknakahara	name="ipsecif_unnumbered_over${outer}_${_algo}"
250d432a9d9Sknakahara	desc="Does unnumbered ipsecif over ${outer} $algo"
251d432a9d9Sknakahara
252d432a9d9Sknakahara	atf_test_case ${name} cleanup
253d432a9d9Sknakahara	eval "
254d432a9d9Sknakahara	     ${name}_head() {
255d432a9d9Sknakahara		atf_set descr \"${desc}\"
256d432a9d9Sknakahara		atf_set require.progs rump_server setkey
257d432a9d9Sknakahara	    }
258d432a9d9Sknakahara	    ${name}_body() {
259d432a9d9Sknakahara		test_ipsecif_unnumbered_${outer} $algo
260d432a9d9Sknakahara		rump_server_destroy_ifaces
261d432a9d9Sknakahara	    }
262d432a9d9Sknakahara	    ${name}_cleanup() {
263d432a9d9Sknakahara			\$DEBUG && dump
264d432a9d9Sknakahara			cleanup
265d432a9d9Sknakahara	    }"
266d432a9d9Sknakahara	atf_add_test_case ${name}
267d432a9d9Sknakahara}
268d432a9d9Sknakahara
269d432a9d9Sknakaharaatf_init_test_cases()
270d432a9d9Sknakahara{
271d432a9d9Sknakahara	local algo=
272d432a9d9Sknakahara
273d432a9d9Sknakahara	for algo in $ESP_ENCRYPTION_ALGORITHMS_MINIMUM; do
274d432a9d9Sknakahara		add_test_ipsecif_unnumbered ipv4 $algo
275d432a9d9Sknakahara		add_test_ipsecif_unnumbered ipv6 $algo
276d432a9d9Sknakahara	done
277d432a9d9Sknakahara}
278