xref: /minix/tests/net/arp/t_arp.sh (revision 0a6a1f1d)
1#	$NetBSD: t_arp.sh,v 1.9 2015/08/31 08:08:20 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
28inetserver="rump_server -lrumpnet -lrumpnet_net -lrumpnet_netinet -lrumpnet_shmif"
29HIJACKING="env LD_PRELOAD=/usr/lib/librumphijack.so RUMPHIJACK=sysctl=yes"
30
31SOCKSRC=unix://commsock1
32SOCKDST=unix://commsock2
33IP4SRC=10.0.1.1
34IP4DST=10.0.1.2
35
36DEBUG=false
37TIMEOUT=1
38
39atf_test_case cache_expiration_5s cleanup
40atf_test_case cache_expiration_10s cleanup
41atf_test_case command cleanup
42atf_test_case garp cleanup
43atf_test_case cache_overwriting cleanup
44
45cache_expiration_5s_head()
46{
47	atf_set "descr" "Tests for ARP cache expiration (5s)"
48	atf_set "require.progs" "rump_server"
49}
50
51cache_expiration_10s_head()
52{
53	atf_set "descr" "Tests for ARP cache expiration (10s)"
54	atf_set "require.progs" "rump_server"
55}
56
57command_head()
58{
59	atf_set "descr" "Tests for commands of arp(8)"
60	atf_set "require.progs" "rump_server"
61}
62
63garp_head()
64{
65	atf_set "descr" "Tests for GARP"
66	atf_set "require.progs" "rump_server"
67}
68
69cache_overwriting_head()
70{
71	atf_set "descr" "Tests for behavior of overwriting ARP caches"
72	atf_set "require.progs" "rump_server"
73}
74
75setup_dst_server()
76{
77	export RUMP_SERVER=$SOCKDST
78	atf_check -s exit:0 rump.ifconfig shmif0 create
79	atf_check -s exit:0 rump.ifconfig shmif0 linkstr bus1
80	atf_check -s exit:0 rump.ifconfig shmif0 inet $IP4DST/24
81	atf_check -s exit:0 rump.ifconfig shmif0 up
82	atf_check -s exit:0 rump.ifconfig -w 10
83
84	$DEBUG && rump.ifconfig shmif0
85	$DEBUG && rump.arp -n -a
86}
87
88setup_src_server()
89{
90	local keep=$1
91
92	export RUMP_SERVER=$SOCKSRC
93
94	# Adjust ARP parameters
95	atf_check -s exit:0 -o ignore rump.sysctl -w net.inet.arp.keep=$keep
96
97	# Setup an interface
98	atf_check -s exit:0 rump.ifconfig shmif0 create
99	atf_check -s exit:0 rump.ifconfig shmif0 linkstr bus1
100	atf_check -s exit:0 rump.ifconfig shmif0 inet $IP4SRC/24
101	atf_check -s exit:0 rump.ifconfig shmif0 up
102	atf_check -s exit:0 rump.ifconfig -w 10
103
104	# Sanity check
105	$DEBUG && rump.ifconfig shmif0
106	$DEBUG && rump.arp -n -a
107	atf_check -s exit:0 -o ignore rump.arp -n $IP4SRC
108	atf_check -s not-exit:0 -e ignore rump.arp -n $IP4DST
109}
110
111test_cache_expiration()
112{
113	local arp_keep=$1
114	local bonus=2
115
116	atf_check -s exit:0 ${inetserver} $SOCKSRC
117	atf_check -s exit:0 ${inetserver} $SOCKDST
118
119	setup_dst_server
120	setup_src_server $arp_keep
121
122	#
123	# Check if a cache is expired expectedly
124	#
125	export RUMP_SERVER=$SOCKSRC
126	atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 $IP4DST
127
128	$DEBUG && rump.arp -n -a
129	atf_check -s exit:0 -o ignore rump.arp -n $IP4SRC
130	# Should be cached
131	atf_check -s exit:0 -o ignore rump.arp -n $IP4DST
132
133	atf_check -s exit:0 sleep $(($arp_keep + $bonus))
134
135	$DEBUG && rump.arp -n -a
136	atf_check -s exit:0 -o ignore rump.arp -n $IP4SRC
137	# Should be expired
138	atf_check -s not-exit:0 -e ignore rump.arp -n $IP4DST
139}
140
141cache_expiration_5s_body()
142{
143	test_cache_expiration 5
144}
145
146cache_expiration_10s_body()
147{
148	test_cache_expiration 10
149}
150
151command_body()
152{
153	local arp_keep=5
154	local bonus=2
155
156	atf_check -s exit:0 ${inetserver} $SOCKSRC
157	atf_check -s exit:0 ${inetserver} $SOCKDST
158
159	setup_dst_server
160	setup_src_server $arp_keep
161
162	export RUMP_SERVER=$SOCKSRC
163
164	# Add and delete a static entry
165	$DEBUG && rump.arp -n -a
166	atf_check -s exit:0 -o ignore rump.arp -s 10.0.1.10 b2:a0:20:00:00:10
167	$DEBUG && rump.arp -n -a
168	atf_check -s exit:0 -o match:'b2:a0:20:00:00:10' rump.arp -n 10.0.1.10
169	atf_check -s exit:0 -o match:'permanent' rump.arp -n 10.0.1.10
170	atf_check -s exit:0 -o ignore rump.arp -d 10.0.1.10
171	$DEBUG && rump.arp -n -a
172	atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.10
173
174	# Add multiple entries via a file
175	cat - > ./list <<-EOF
176	10.0.1.11 b2:a0:20:00:00:11
177	10.0.1.12 b2:a0:20:00:00:12
178	10.0.1.13 b2:a0:20:00:00:13
179	10.0.1.14 b2:a0:20:00:00:14
180	10.0.1.15 b2:a0:20:00:00:15
181	EOF
182	$DEBUG && rump.arp -n -a
183	atf_check -s exit:0 -o ignore rump.arp -f ./list
184	$DEBUG && rump.arp -n -a
185	atf_check -s exit:0 -o match:'b2:a0:20:00:00:11' rump.arp -n 10.0.1.11
186	atf_check -s exit:0 -o match:'permanent' rump.arp -n 10.0.1.11
187	atf_check -s exit:0 -o match:'b2:a0:20:00:00:12' rump.arp -n 10.0.1.12
188	atf_check -s exit:0 -o match:'permanent' rump.arp -n 10.0.1.12
189	atf_check -s exit:0 -o match:'b2:a0:20:00:00:13' rump.arp -n 10.0.1.13
190	atf_check -s exit:0 -o match:'permanent' rump.arp -n 10.0.1.13
191	atf_check -s exit:0 -o match:'b2:a0:20:00:00:14' rump.arp -n 10.0.1.14
192	atf_check -s exit:0 -o match:'permanent' rump.arp -n 10.0.1.14
193	atf_check -s exit:0 -o match:'b2:a0:20:00:00:15' rump.arp -n 10.0.1.15
194	atf_check -s exit:0 -o match:'permanent' rump.arp -n 10.0.1.15
195
196	# Test arp -a
197	atf_check -s exit:0 -o match:'10.0.1.11' rump.arp -n -a
198	atf_check -s exit:0 -o match:'10.0.1.12' rump.arp -n -a
199	atf_check -s exit:0 -o match:'10.0.1.13' rump.arp -n -a
200	atf_check -s exit:0 -o match:'10.0.1.14' rump.arp -n -a
201	atf_check -s exit:0 -o match:'10.0.1.15' rump.arp -n -a
202
203	# Flush all entries
204	$DEBUG && rump.arp -n -a
205	atf_check -s exit:0 -o ignore rump.arp -d -a
206	atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.11
207	atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.12
208	atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.13
209	atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.14
210	atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.15
211	atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.1
212
213	# Test temp option
214	$DEBUG && rump.arp -n -a
215	atf_check -s exit:0 -o ignore rump.arp -s 10.0.1.10 b2:a0:20:00:00:10 temp
216	$DEBUG && rump.arp -n -a
217	atf_check -s exit:0 -o match:'b2:a0:20:00:00:10' rump.arp -n 10.0.1.10
218	atf_check -s exit:0 -o not-match:'permanent' rump.arp -n 10.0.1.10
219
220	# Hm? the cache doesn't expire...
221	atf_check -s exit:0 sleep $(($arp_keep + $bonus))
222	$DEBUG && rump.arp -n -a
223	#atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.10
224
225	return 0
226}
227
228make_pkt_str()
229{
230	local target=$1
231	local sender=$2
232	pkt="> ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42:"
233	pkt="$pkt Request who-has $target tell $sender, length 28"
234	echo $pkt
235}
236
237garp_body()
238{
239	local pkt=
240
241	atf_check -s exit:0 ${inetserver} $SOCKSRC
242	export RUMP_SERVER=$SOCKSRC
243
244	# Setup an interface
245	atf_check -s exit:0 rump.ifconfig shmif0 create
246	atf_check -s exit:0 rump.ifconfig shmif0 linkstr bus1
247	atf_check -s exit:0 rump.ifconfig shmif0 inet 10.0.0.1/24
248	atf_check -s exit:0 rump.ifconfig shmif0 inet 10.0.0.2/24 alias
249	atf_check -s exit:0 rump.ifconfig shmif0 up
250	$DEBUG && rump.ifconfig shmif0
251
252	atf_check -s exit:0 sleep 1
253	shmif_dumpbus -p - bus1 2>/dev/null| tcpdump -n -e -r - > ./out
254
255	# A GARP packet is sent for the primary address
256	pkt=$(make_pkt_str 10.0.0.1 10.0.0.1)
257	atf_check -s exit:0 -x "cat ./out |grep -q '$pkt'"
258	# No GARP packet is sent for the alias address
259	pkt=$(make_pkt_str 10.0.0.2 10.0.0.2)
260	atf_check -s not-exit:0 -x "cat ./out |grep -q '$pkt'"
261
262	atf_check -s exit:0 rump.ifconfig -w 10
263	atf_check -s exit:0 rump.ifconfig shmif0 inet 10.0.0.3/24
264	atf_check -s exit:0 rump.ifconfig shmif0 inet 10.0.0.4/24 alias
265
266	# No GARP packets are sent during IFF_UP
267	shmif_dumpbus -p - bus1 2>/dev/null| tcpdump -n -e -r - > ./out
268	pkt=$(make_pkt_str 10.0.0.3 10.0.0.3)
269	atf_check -s not-exit:0 -x "cat ./out |grep -q '$pkt'"
270	pkt=$(make_pkt_str 10.0.0.4 10.0.0.4)
271	atf_check -s not-exit:0 -x "cat ./out |grep -q '$pkt'"
272}
273
274cache_overwriting_body()
275{
276	local arp_keep=5
277	local bonus=2
278
279	atf_check -s exit:0 ${inetserver} $SOCKSRC
280	atf_check -s exit:0 ${inetserver} $SOCKDST
281
282	setup_dst_server
283	setup_src_server $arp_keep
284
285	export RUMP_SERVER=$SOCKSRC
286
287	# Cannot overwrite a permanent cache
288	atf_check -s not-exit:0 -e ignore rump.arp -s $IP4SRC b2:a0:20:00:00:ff
289	$DEBUG && rump.arp -n -a
290
291	atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 $IP4DST
292	$DEBUG && rump.arp -n -a
293	# Can overwrite a dynamic cache
294	atf_check -s exit:0 -o ignore rump.arp -s $IP4DST b2:a0:20:00:00:00
295	$DEBUG && rump.arp -n -a
296	atf_check -s exit:0 -o match:'b2:a0:20:00:00:00' rump.arp -n $IP4DST
297	atf_check -s exit:0 -o match:'permanent' rump.arp -n $IP4DST
298
299	atf_check -s exit:0 -o ignore rump.arp -s 10.0.1.10 b2:a0:20:00:00:10 temp
300	$DEBUG && rump.arp -n -a
301	atf_check -s exit:0 -o match:'b2:a0:20:00:00:10' rump.arp -n 10.0.1.10
302	atf_check -s exit:0 -o not-match:'permanent' rump.arp -n 10.0.1.10
303	# Cannot overwrite a temp cache
304	atf_check -s not-exit:0 -e ignore rump.arp -s 10.0.1.10 b2:a0:20:00:00:ff
305	$DEBUG && rump.arp -n -a
306
307	return 0
308}
309
310cleanup()
311{
312	env RUMP_SERVER=$SOCKSRC rump.halt
313	env RUMP_SERVER=$SOCKDST rump.halt
314}
315
316dump_src()
317{
318	export RUMP_SERVER=$SOCKSRC
319	rump.netstat -nr
320	rump.arp -n -a
321	rump.ifconfig
322	$HIJACKING dmesg
323}
324
325dump_dst()
326{
327	export RUMP_SERVER=$SOCKDST
328	rump.netstat -nr
329	rump.arp -n -a
330	rump.ifconfig
331	$HIJACKING dmesg
332}
333
334dump()
335{
336	dump_src
337	dump_dst
338	shmif_dumpbus -p - bus1 2>/dev/null| tcpdump -n -e -r -
339}
340
341cache_expiration_5s_cleanup()
342{
343	$DEBUG && dump
344	cleanup
345}
346
347cache_expiration_10s_cleanup()
348{
349	$DEBUG && dump
350	cleanup
351}
352
353command_cleanup()
354{
355	$DEBUG && dump
356	cleanup
357}
358
359garp_cleanup()
360{
361	$DEBUG && dump_src
362	$DEBUG && shmif_dumpbus -p - bus1 2>/dev/null| tcpdump -n -e -r -
363	env RUMP_SERVER=$SOCKSRC rump.halt
364}
365
366cache_overwriting_cleanup()
367{
368	$DEBUG && dump
369	cleanup
370}
371
372atf_init_test_cases()
373{
374	atf_add_test_case cache_expiration_5s
375	atf_add_test_case cache_expiration_10s
376	atf_add_test_case command
377	atf_add_test_case garp
378	atf_add_test_case cache_overwriting
379}
380