1#	$NetBSD: t_flags.sh,v 1.15 2016/12/21 02:46:08 ozaki-r Exp $
2#
3# Copyright (c) 2015 The NetBSD Foundation, Inc.
4# All rights reserved.
5#
6# Redistribution and use in source and binary forms, with or without
7# modification, are permitted provided that the following conditions
8# are met:
9# 1. Redistributions of source code must retain the above copyright
10#    notice, this list of conditions and the following disclaimer.
11# 2. Redistributions in binary form must reproduce the above copyright
12#    notice, this list of conditions and the following disclaimer in the
13#    documentation and/or other materials provided with the distribution.
14#
15# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
16# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
19# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25# POSSIBILITY OF SUCH DAMAGE.
26#
27
28SOCK_LOCAL=unix://commsock1
29SOCK_PEER=unix://commsock2
30SOCK_GW=unix://commsock3
31BUS=bus1
32BUS2=bus2
33
34DEBUG=${DEBUG:-false}
35
36setup_local()
37{
38
39	rump_server_start $SOCK_LOCAL
40	rump_server_add_iface $SOCK_LOCAL shmif0 $BUS
41
42	export RUMP_SERVER=$SOCK_LOCAL
43	atf_check -s exit:0 -o ignore rump.ifconfig shmif0 10.0.0.2/24
44	atf_check -s exit:0 -o ignore rump.ifconfig shmif0 up
45	atf_check -s exit:0 -o ignore rump.ifconfig -w 10
46
47	$DEBUG && rump.ifconfig
48	$DEBUG && rump.netstat -rn -f inet
49}
50
51setup_peer()
52{
53
54	rump_server_start $SOCK_PEER
55	rump_server_add_iface $SOCK_PEER shmif0 $BUS
56
57	export RUMP_SERVER=$SOCK_PEER
58	atf_check -s exit:0 -o ignore rump.ifconfig shmif0 10.0.0.1/24
59	atf_check -s exit:0 -o ignore rump.ifconfig shmif0 up
60	atf_check -s exit:0 -o ignore rump.ifconfig -w 10
61
62	$DEBUG && rump.ifconfig
63	$DEBUG && rump.netstat -rn -f inet
64}
65
66setup_gw()
67{
68
69	rump_server_start $SOCK_GW
70	rump_server_add_iface $SOCK_GW shmif0 $BUS
71	rump_server_add_iface $SOCK_GW shmif1 $BUS2
72
73	export RUMP_SERVER=$SOCK_GW
74	atf_check -s exit:0 -o ignore rump.ifconfig shmif0 10.0.0.254/24
75	atf_check -s exit:0 -o ignore rump.ifconfig shmif0 up
76
77	atf_check -s exit:0 -o ignore rump.ifconfig shmif1 10.0.2.1/24
78	atf_check -s exit:0 -o ignore rump.ifconfig shmif1 alias 10.0.2.2/24
79	atf_check -s exit:0 -o ignore rump.ifconfig shmif1 up
80
81	# Wait until DAD completes (10 sec at most)
82	atf_check -s exit:0 -o ignore rump.ifconfig -w 10
83	atf_check -s not-exit:0 -x "rump.ifconfig shmif1 |grep -q tentative"
84
85	$DEBUG && rump.ifconfig
86	$DEBUG && rump.netstat -rn -f inet
87}
88
89test_lo()
90{
91
92	export RUMP_SERVER=$SOCK_LOCAL
93
94	# Up, Host, local
95	check_route_flags 127.0.0.1 UHl
96}
97
98test_connected()
99{
100
101	export RUMP_SERVER=$SOCK_LOCAL
102
103	# Up, Host, LLINFO, local
104	check_route_flags 10.0.0.2 UHl
105
106	# Up, Cloning
107	check_route_flags 10.0.0/24 UC
108}
109
110test_default_gateway()
111{
112
113	export RUMP_SERVER=$SOCK_LOCAL
114
115	atf_check -s exit:0 -o ignore rump.route add default 10.0.0.1
116	$DEBUG && rump.netstat -rn -f inet
117
118	# Up, Gateway, Static
119	check_route_flags default UGS
120}
121
122test_static()
123{
124
125	export RUMP_SERVER=$SOCK_LOCAL
126
127	# Static route to host
128	atf_check -s exit:0 -o ignore rump.route add 10.0.1.1 10.0.0.1
129	$DEBUG && rump.netstat -rn -f inet
130
131	# Up, Gateway, Host, Static
132	check_route_flags 10.0.1.1 UGHS
133
134	# Static route to network
135	atf_check -s exit:0 -o ignore rump.route add -net 10.0.2.0/24 10.0.0.1
136	$DEBUG && rump.netstat -rn -f inet
137
138	# Up, Gateway, Static
139	check_route_flags 10.0.2/24 UGS
140}
141
142test_blackhole()
143{
144
145	export RUMP_SERVER=$SOCK_LOCAL
146
147	atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 10.0.0.1
148
149	# Delete an existing route first
150	atf_check -s exit:0 -o ignore rump.route delete -net 10.0.0.0/24
151
152	# Gateway must be lo0
153	atf_check -s exit:0 -o ignore \
154	    rump.route add -net 10.0.0.0/24 127.0.0.1 -blackhole
155	$DEBUG && rump.netstat -rn -f inet
156
157	# Up, Gateway, Blackhole, Static
158	check_route_flags 10.0.0/24 UGBS
159
160	atf_check -s not-exit:0 -o match:'100.0% packet loss' \
161	    rump.ping -n -w 1 -c 1 10.0.0.1
162	$DEBUG && rump.netstat -rn -f inet
163
164	# Shouldn't be created
165	check_route_no_entry 10.0.0.1
166}
167
168test_reject()
169{
170
171	export RUMP_SERVER=$SOCK_LOCAL
172
173	# Delete an existing route first
174	atf_check -s exit:0 -o ignore rump.route delete -net 10.0.0.0/24
175
176	atf_check -s exit:0 -o ignore rump.route add -net 10.0.0.0/24 10.0.0.1 -reject
177	$DEBUG && rump.netstat -rn -f inet
178
179	# Up, Gateway, Reject, Static
180	check_route_flags 10.0.0/24 UGRS
181
182	atf_check -s not-exit:0 -o ignore -e match:'No route to host' \
183	    rump.ping -n -w 1 -c 1 10.0.0.1
184	$DEBUG && rump.netstat -rn -f inet
185
186	# Shouldn't be created
187	check_route_no_entry 10.0.0.1
188
189	# Gateway is lo0 (RTF_GATEWAY)
190
191	# Delete an existing route first
192	atf_check -s exit:0 -o ignore rump.route delete -net 10.0.0.0/24
193
194	atf_check -s exit:0 -o ignore \
195	    rump.route add -net 10.0.0.0/24 127.0.0.1 -reject
196	$DEBUG && rump.netstat -rn -f inet
197
198	# Up, Gateway, Reject, Static
199	check_route_flags 10.0.0/24 UGRS
200
201	atf_check -s not-exit:0 -o ignore -e match:'Network is unreachable' \
202	    rump.ping -n -w 1 -c 1 10.0.0.1
203	$DEBUG && rump.netstat -rn -f inet
204
205	# Shouldn't be created
206	check_route_no_entry 10.0.0.1
207
208	# Gateway is lo0 (RTF_HOST)
209
210	# Delete an existing route first
211	atf_check -s exit:0 -o ignore rump.route delete -net 10.0.0.0/24
212
213	atf_check -s exit:0 -o ignore \
214	    rump.route add -host 10.0.0.1/24 127.0.0.1 -iface -reject
215	$DEBUG && rump.netstat -rn -f inet
216
217	# Up, Host, Reject, Static
218	check_route_flags 10.0.0.1 UHRS
219
220	atf_check -s not-exit:0 -o ignore -e match:'No route to host' \
221	    rump.ping -n -w 1 -c 1 10.0.0.1
222	$DEBUG && rump.netstat -rn -f inet
223
224	return 0
225}
226
227test_icmp_redirect()
228{
229
230	### Testing Dynamic flag ###
231
232	#
233	# Setup a gateway 10.0.0.254. 10.0.2.1 is behind it.
234	#
235	setup_gw
236
237	#
238	# Teach the peer that 10.0.2.* is behind 10.0.0.254
239	#
240	export RUMP_SERVER=$SOCK_PEER
241	atf_check -s exit:0 -o ignore rump.route add -net 10.0.2.0/24 10.0.0.254
242	# Up, Gateway, Static
243	check_route_flags 10.0.2/24 UGS
244
245	#
246	# Setup the default gateway to the peer, 10.0.0.1
247	#
248	export RUMP_SERVER=$SOCK_LOCAL
249	atf_check -s exit:0 -o ignore rump.route add default 10.0.0.1
250	# Up, Gateway, Static
251	check_route_flags default UGS
252
253	# Try ping 10.0.2.1
254	atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 10.0.2.1
255	$DEBUG && rump.netstat -rn -f inet
256
257	# Up, Gateway, Host, Dynamic
258	check_route_flags 10.0.2.1 UGHD
259	check_route_gw 10.0.2.1 10.0.0.254
260
261	export RUMP_SERVER=$SOCK_PEER
262	$DEBUG && rump.netstat -rn -f inet
263
264	### Testing Modified flag ###
265
266	#
267	# Teach a wrong route to 10.0.2.2
268	#
269	export RUMP_SERVER=$SOCK_LOCAL
270	atf_check -s exit:0 -o ignore rump.route add 10.0.2.2 10.0.0.1
271	# Up, Gateway, Host, Static
272	check_route_flags 10.0.2.2 UGHS
273	check_route_gw 10.0.2.2 10.0.0.1
274
275	# Try ping 10.0.2.2
276	atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 10.0.2.2
277	$DEBUG && rump.netstat -rn -f inet
278
279	# Up, Gateway, Host, Modified, Static
280	check_route_flags 10.0.2.2 UGHMS
281	check_route_gw 10.0.2.2 10.0.0.254
282}
283
284test_announce()
285{
286	export RUMP_SERVER=$SOCK_LOCAL
287
288	# Delete an existing route first
289	atf_check -s exit:0 -o ignore rump.route delete -net 10.0.0.0/24
290
291	atf_check -s exit:0 -o ignore rump.route add -net 10.0.0.0/24 10.0.0.1 -proxy
292	$DEBUG && rump.netstat -rn -f inet
293
294	# Up, Gateway, Static, proxy
295	check_route_flags 10.0.0/24 UGSp
296
297	# TODO test its behavior
298}
299
300add_test()
301{
302	local name=$1
303	local desc="$2"
304
305	atf_test_case "route_flags_${name}" cleanup
306	eval "route_flags_${name}_head() { \
307			atf_set \"descr\" \"${desc}\"; \
308			atf_set \"require.progs\" \"rump_server\"; \
309		}; \
310	    route_flags_${name}_body() { \
311			setup_local; \
312			setup_peer; \
313			test_${name}; \
314			rump_server_destroy_ifaces; \
315		}; \
316	    route_flags_${name}_cleanup() { \
317			$DEBUG && dump; \
318			cleanup; \
319		}"
320	atf_add_test_case "route_flags_${name}"
321}
322
323atf_init_test_cases()
324{
325
326	add_test lo              "Tests route flags: loop back interface"
327	add_test connected       "Tests route flags: connected route"
328	add_test default_gateway "Tests route flags: default gateway"
329	add_test static          "Tests route flags: static route"
330	add_test blackhole       "Tests route flags: blackhole route"
331	add_test reject          "Tests route flags: reject route"
332	add_test icmp_redirect   "Tests route flags: icmp redirect"
333	add_test announce        "Tests route flags: announce flag"
334}
335