t_ifconfig.sh revision 313498
1# $NetBSD: t_ifconfig.sh,v 1.11 2016/08/10 22:30:02 kre 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
28RUMP_SERVER1=unix://./r1
29RUMP_SERVER2=unix://./r2
30
31RUMP_FLAGS=\
32"-lrumpnet -lrumpnet_net -lrumpnet_netinet -lrumpnet_netinet6 -lrumpnet_shmif"
33RUMP_FLAGS="${RUMP_FLAGS} -lrumpdev"
34
35TIMEOUT=3
36
37atf_test_case ifconfig_create_destroy cleanup
38ifconfig_create_destroy_head()
39{
40
41	atf_set "descr" "tests of ifconfig create and destroy"
42	atf_set "require.progs" "rump_server"
43}
44
45ifconfig_create_destroy_body()
46{
47	atf_check -s exit:0 rump_server ${RUMP_FLAGS} ${RUMP_SERVER1}
48
49	export RUMP_SERVER=${RUMP_SERVER1}
50
51	# Create and destroy (no address)
52	atf_check -s exit:0 rump.ifconfig shmif0 create
53	atf_check -s exit:0 rump.ifconfig shmif0 destroy
54
55	# Create and destroy (with an IPv4 address)
56	atf_check -s exit:0 rump.ifconfig shmif0 create
57	atf_check -s exit:0 rump.ifconfig shmif0 linkstr shmbus
58	atf_check -s exit:0 rump.ifconfig shmif0 192.168.0.1/24
59	atf_check -s exit:0 rump.ifconfig shmif0 up
60	atf_check -s exit:0 rump.ifconfig shmif0 destroy
61
62	# Create and destroy (with an IPv6 address)
63	atf_check -s exit:0 rump.ifconfig shmif0 create
64	atf_check -s exit:0 rump.ifconfig shmif0 linkstr shmbus
65	atf_check -s exit:0 rump.ifconfig shmif0 inet6 fc00::1
66	atf_check -s exit:0 rump.ifconfig shmif0 up
67	atf_check -s exit:0 rump.ifconfig shmif0 destroy
68
69	unset RUMP_SERVER
70}
71
72ifconfig_create_destroy_cleanup()
73{
74
75	RUMP_SERVER=${RUMP_SERVER1} rump.halt
76}
77
78atf_test_case ifconfig_options cleanup
79ifconfig_options_head()
80{
81
82	atf_set "descr" "tests of ifconfig options"
83	atf_set "require.progs" "rump_server"
84}
85
86ifconfig_options_body()
87{
88
89	export RUMP_SERVER=${RUMP_SERVER1}
90	atf_check -s exit:0 rump_server $RUMP_FLAGS $RUMP_SERVER1
91
92	atf_check -s exit:0 -o ignore rump.ifconfig shmif0 create
93	atf_check -s exit:0 -o ignore rump.ifconfig shmif0 linkstr bus1
94	atf_check -s exit:0 -o ignore rump.ifconfig shmif0 inet 10.0.0.1/24
95	atf_check -s exit:0 -o ignore rump.ifconfig shmif0 inet6 fc00::1/64
96	atf_check -s exit:0 -o ignore rump.ifconfig shmif0 up
97	atf_check -s exit:0 -o ignore rump.ifconfig -w 10
98	$DEBUG && rump.ifconfig shmif0
99
100	# ifconfig [-N] interface address_family
101	#   -N resolves hostnames
102	atf_check -s exit:0 -o match:'inet 127.0.0.1' rump.ifconfig lo0 inet
103	atf_check -s exit:0 -o match:'inet localhost' rump.ifconfig -N lo0 inet
104	atf_check -s exit:0 -o match:'inet6 ::1' rump.ifconfig lo0 inet6
105	atf_check -s exit:0 -o match:'inet6 localhost' rump.ifconfig -N lo0 inet6
106	atf_check -s not-exit:0 -e match:'not supported' rump.ifconfig lo0 atalk
107	atf_check -s not-exit:0 -e match:'not supported' rump.ifconfig -N lo0 atalk
108	atf_check -s exit:0 -o ignore rump.ifconfig lo0 link
109	atf_check -s exit:0 -o ignore rump.ifconfig -N lo0 link
110
111	# ifconfig [-hLmNvz] interface
112	#   -h -v shows statistics in human readable format
113	atf_check -s exit:0 -o ignore rump.ifconfig -h -v lo0
114	#   -L shows IPv6 lifetime
115	atf_check -s exit:0 -o ignore rump.ifconfig shmif0 inet6 fc00::2 \
116	    pltime 100
117	$DEBUG && rump.ifconfig -L shmif0
118	atf_check -s exit:0 -o match:'pltime' rump.ifconfig -L shmif0
119	atf_check -s exit:0 -o match:'vltime' rump.ifconfig -L shmif0
120	#   -m shows all of the supported media (not supported in shmif)
121	$DEBUG && rump.ifconfig -m shmif0
122	atf_check -s exit:0 -o ignore rump.ifconfig -m shmif0
123	atf_check -s exit:0 -o match:'localhost' rump.ifconfig -N lo0
124	atf_check -s exit:0 -o match:'0 packets' rump.ifconfig -v lo0
125	atf_check -s exit:0 -o ignore rump.ping -c 1 -w $TIMEOUT localhost
126	#   -z clears and shows statistics at that point
127	atf_check -s exit:0 -o match:'2 packets' rump.ifconfig -z lo0
128	atf_check -s exit:0 -o match:'0 packets' rump.ifconfig -v lo0
129
130	# ifconfig -a [-bdhLNmsuvz]
131	#   -a shows all interfaces in the system
132	$DEBUG && rump.ifconfig -a
133	atf_check -s exit:0 -o match:'shmif0' -o match:'lo0' rump.ifconfig -a
134	#   -a -b shows only broadcast interfaces
135	atf_check -s exit:0 -o match:'shmif0' -o not-match:'lo0' rump.ifconfig -a -b
136	#   -a -d shows only down interfaces
137	atf_check -s exit:0 -o ignore rump.ifconfig shmif0 down
138	atf_check -s exit:0 -o match:'shmif0' rump.ifconfig -a -d
139	atf_check -s exit:0 -o ignore rump.ifconfig shmif0 up
140	atf_check -s exit:0 -o not-match:'shmif0' rump.ifconfig -a -d
141	atf_check -s exit:0 -o match:'pltime' rump.ifconfig -a -L
142	atf_check -s exit:0 -o match:'vltime' rump.ifconfig -a -L
143	atf_check -s exit:0 -o match:'localhost' rump.ifconfig -a -N
144	atf_check -s exit:0 -o ignore rump.ifconfig -a -m
145	#   -a -s shows only interfaces connected to a network
146	#   (shmif is always connected)
147	$DEBUG && rump.ifconfig -a -s
148	atf_check -s exit:0 -o ignore rump.ifconfig -a -s
149	#   -a -u shows only up interfaces
150	atf_check -s exit:0 -o match:'shmif0' rump.ifconfig -a -u
151	atf_check -s exit:0 -o ignore rump.ifconfig shmif0 down
152	atf_check -s exit:0 -o not-match:'shmif0' rump.ifconfig -a -u
153	atf_check -s exit:0 -o ignore rump.ifconfig shmif0 up
154	atf_check -s exit:0 -o match:'0 packets' rump.ifconfig -a -v
155	atf_check -s exit:0 -o ignore rump.ping -c 1 -w $TIMEOUT localhost
156	atf_check -s exit:0 -o ignore rump.ifconfig shmif0 down
157	atf_check -s exit:0 -o match:'2 packets' rump.ifconfig -a -z
158	atf_check -s exit:0 -o not-match:'2 packets' rump.ifconfig -a -v
159	atf_check -s exit:0 -o match:'0 packets' rump.ifconfig -a -v
160	atf_check -s exit:0 -o ignore rump.ifconfig shmif0 up
161
162	# ifconfig -l [-bdsu]
163	#   -l shows only inteface names
164	atf_check -s exit:0 -o match:'lo0' rump.ifconfig -l
165	atf_check -s exit:0 -o match:'shmif0' rump.ifconfig -l
166	atf_check -s exit:0 -o match:'shmif0' rump.ifconfig -l -b
167	atf_check -s exit:0 -o not-match:'lo0' rump.ifconfig -l -b
168	atf_check -s exit:0 -o ignore rump.ifconfig -l -d
169	atf_check -s exit:0 -o match:'lo0' rump.ifconfig -l -s
170	atf_check -s exit:0 -o match:'shmif0' rump.ifconfig -l -s
171	atf_check -s exit:0 -o match:'lo0' rump.ifconfig -l -u
172	atf_check -s exit:0 -o match:'shmif0' rump.ifconfig -l -u
173
174	# ifconfig -s interface
175	#   -s interface exists with 0 / 1 if connected / disconnected
176	atf_check -s exit:0 -o empty rump.ifconfig -s lo0
177	atf_check -s exit:0 -o empty rump.ifconfig -s shmif0
178
179	# ifconfig -C
180	#   -C shows all of the interface cloners available on the system
181	atf_check -s exit:0 -o match:'shmif lo carp' rump.ifconfig -C
182
183	unset RUMP_SERVER
184}
185
186ifconfig_options_cleanup()
187{
188
189	env RUMP_SERVER=${RUMP_SERVER1} rump.halt
190}
191
192
193atf_test_case ifconfig_parameters cleanup
194ifconfig_parameters_head()
195{
196	atf_set "descr" "tests of interface parameters"
197	atf_set "require.progs" "rump_server"
198}
199
200ifconfig_parameters_body()
201{
202	local interval=
203
204	atf_check -s exit:0 rump_server ${RUMP_FLAGS} ${RUMP_SERVER1}
205	atf_check -s exit:0 rump_server ${RUMP_FLAGS} ${RUMP_SERVER2}
206
207	export RUMP_SERVER=${RUMP_SERVER1}
208	atf_check -s exit:0 rump.ifconfig shmif0 create
209	atf_check -s exit:0 rump.ifconfig shmif0 linkstr shmbus
210	atf_check -s exit:0 rump.ifconfig shmif0 192.168.0.1/24
211	atf_check -s exit:0 rump.ifconfig shmif0 up
212	unset RUMP_SERVER
213
214	export RUMP_SERVER=${RUMP_SERVER2}
215	atf_check -s exit:0 rump.ifconfig shmif0 create
216	atf_check -s exit:0 rump.ifconfig shmif0 linkstr shmbus
217	atf_check -s exit:0 rump.ifconfig shmif0 192.168.0.2/24
218	atf_check -s exit:0 rump.ifconfig shmif0 inet 192.168.0.3/24 alias
219	atf_check -s exit:0 rump.ifconfig shmif0 up
220	unset RUMP_SERVER
221
222	export RUMP_SERVER=${RUMP_SERVER1}
223
224	# active
225	atf_check -s exit:0 rump.ifconfig shmif0 link b2:a0:75:00:00:01 active
226	atf_check -s exit:0 -o match:'address:.b2:a0:75:00:00:01' \
227	    rump.ifconfig shmif0
228	# down, up
229	atf_check -s exit:0 rump.ifconfig shmif0 down
230	atf_check -s ignore -o ignore -e match:'down' rump.ping -c 1 \
231	    -w $TIMEOUT -n 192.168.0.2
232	atf_check -s exit:0 rump.ifconfig shmif0 up
233	atf_check -s exit:0 -o ignore rump.ping -c 1 -w $TIMEOUT -n 192.168.0.2
234
235	# alias
236	atf_check -s exit:0 rump.ifconfig shmif0 inet 192.168.1.1/24 alias
237	atf_check -s exit:0 -o match:'alias 192.168.1.1' rump.ifconfig shmif0
238	atf_check -s exit:0 rump.ifconfig shmif0 inet 192.168.1.1/24 -alias
239	atf_check -s exit:0 -o not-match:'192.168.1.1' rump.ifconfig shmif0
240	atf_check -s exit:0 rump.ifconfig shmif0 inet6 fc00::1
241	atf_check -s exit:0 rump.ifconfig shmif0 inet6 fc00::2
242	atf_check -s exit:0 -o match:'fc00::1' rump.ifconfig shmif0 inet6
243	atf_check -s exit:0 -o match:'fc00::2' rump.ifconfig shmif0 inet6
244
245	# delete
246	atf_check -s exit:0 rump.ifconfig shmif0 inet 192.168.1.1 alias
247	atf_check -s exit:0 rump.ifconfig shmif0 inet 192.168.1.1 delete
248	atf_check -s exit:0 -o not-match:'192.168.1.1' rump.ifconfig shmif0 inet
249	atf_check -s exit:0 rump.ifconfig shmif0 inet 192.168.0.1 delete
250	atf_check -s exit:0 -o not-match:'192.168.0.1' rump.ifconfig shmif0 inet
251	atf_check -s exit:0 rump.ifconfig shmif0 inet6 fc00::1 delete
252	atf_check -s exit:0 rump.ifconfig shmif0 inet6 fc00::2 delete
253	atf_check -s exit:0 -o not-match:'fc00::1' rump.ifconfig shmif0 inet6
254	atf_check -s exit:0 -o not-match:'fc00::2' rump.ifconfig shmif0 inet6
255	# can delete inactive link
256	atf_check -s exit:0 rump.ifconfig shmif0 link b2:a0:75:00:00:02
257	atf_check -s exit:0 rump.ifconfig shmif0 link b2:a0:75:00:00:02 delete
258	# cannot delete active link
259	atf_check -s not-exit:0 -e match:'SIOCDLIFADDR: Device busy' \
260	    rump.ifconfig shmif0 link b2:a0:75:00:00:01 delete
261
262	atf_check -s exit:0 rump.ifconfig shmif0 inet 192.168.0.1/24
263
264	# arp
265	atf_check -s exit:0 rump.ifconfig shmif0 -arp
266	atf_check -s not-exit:0 -o ignore -e ignore \
267	    rump.ping -c 1 -w $TIMEOUT -n 192.168.0.3
268	atf_check -s exit:0 -o not-match:'192.168.0.3' rump.arp -an
269	# The entry shouldn't appear in the routing table anymore
270	atf_check -s exit:0 -o not-match:'192.168.0.3' rump.netstat -nr
271
272	# netmask
273	atf_check -s exit:0 rump.ifconfig shmif0 inet 172.16.0.1 netmask 255.255.255.0 alias
274	atf_check -s exit:0 -o match:'172.16.0/24' rump.netstat -rn -f inet
275	atf_check -s exit:0 rump.ifconfig shmif0 inet 172.16.0.1 delete
276
277	# broadcast (does it not work?)
278	atf_check -s exit:0 rump.ifconfig shmif0 inet 172.16.0.1 \
279	    broadcast 255.255.255.255 alias
280	atf_check -s exit:0 -o match:'broadcast 255.255.255.255' \
281	    rump.ifconfig shmif0 inet
282
283	# metric (external only)
284	atf_check -s exit:0 rump.ifconfig shmif0 metric 10
285	atf_check -s exit:0 rump.ifconfig shmif0 metric 0
286
287	# prefixlen
288	atf_check -s exit:0 rump.ifconfig shmif0 inet6 fc00::1 prefixlen 70
289	atf_check -s exit:0 -o match:'fc00::/70' rump.netstat -rn -f inet6
290
291	# anycast
292	atf_check -s exit:0 rump.ifconfig shmif0 inet6 fc00::2 anycast
293	atf_check -s exit:0 -o match:'fc00::2.+anycast' rump.ifconfig shmif0 inet6
294
295	# deprecated
296	atf_check -s exit:0 rump.ifconfig shmif0 inet6 fc00::3 deprecated
297	# Not deprecated immediately. Need to wait nd6_timer that does it is scheduled.
298	interval=$(sysctl -n net.inet6.icmp6.nd6_prune)
299	atf_check -s exit:0 sleep $((interval + 1))
300	atf_check -s exit:0 -o match:'fc00::3.+deprecated' rump.ifconfig shmif0 inet6
301	atf_check -s exit:0 rump.ifconfig shmif0 inet6 fc00::3 -deprecated
302	atf_check -s exit:0 -o not-match:'fc00::3.+deprecated' rump.ifconfig shmif0 inet6
303
304	# pltime
305	atf_check -s exit:0 rump.ifconfig shmif0 inet6 fc00::3 pltime 3
306	atf_check -s exit:0 -o not-match:'fc00::3.+deprecated' rump.ifconfig shmif0 inet6
307	atf_check -s exit:0 sleep 5
308	atf_check -s exit:0 -o match:'fc00::3.+deprecated' rump.ifconfig shmif0 inet6
309
310	# eui64
311	atf_check -s exit:0 rump.ifconfig shmif0 inet6 fc00:1::0 eui64
312	atf_check -s exit:0 -o match:'fc00:1::' rump.ifconfig shmif0 inet6
313
314	unset RUMP_SERVER
315}
316
317ifconfig_parameters_cleanup()
318{
319	env RUMP_SERVER=${RUMP_SERVER1} rump.halt
320	env RUMP_SERVER=${RUMP_SERVER2} rump.halt
321}
322
323atf_init_test_cases()
324{
325
326	atf_add_test_case ifconfig_create_destroy
327	atf_add_test_case ifconfig_options
328	atf_add_test_case ifconfig_parameters
329}
330