xref: /freebsd/contrib/netbsd-tests/net/arp/t_arp.sh (revision d370fd1cd8fc69e87dc63f4f4a82e5a8b4956c93)
1*cdebaff8SEnji Cooper#	$NetBSD: t_arp.sh,v 1.22 2016/11/25 08:51:16 ozaki-r Exp $
2640235e2SEnji Cooper#
3640235e2SEnji Cooper# Copyright (c) 2015 The NetBSD Foundation, Inc.
4640235e2SEnji Cooper# All rights reserved.
5640235e2SEnji Cooper#
6640235e2SEnji Cooper# Redistribution and use in source and binary forms, with or without
7640235e2SEnji Cooper# modification, are permitted provided that the following conditions
8640235e2SEnji Cooper# are met:
9640235e2SEnji Cooper# 1. Redistributions of source code must retain the above copyright
10640235e2SEnji Cooper#    notice, this list of conditions and the following disclaimer.
11640235e2SEnji Cooper# 2. Redistributions in binary form must reproduce the above copyright
12640235e2SEnji Cooper#    notice, this list of conditions and the following disclaimer in the
13640235e2SEnji Cooper#    documentation and/or other materials provided with the distribution.
14640235e2SEnji Cooper#
15640235e2SEnji Cooper# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
16640235e2SEnji Cooper# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17640235e2SEnji Cooper# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18640235e2SEnji Cooper# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
19640235e2SEnji Cooper# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20640235e2SEnji Cooper# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21640235e2SEnji Cooper# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22640235e2SEnji Cooper# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23640235e2SEnji Cooper# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24640235e2SEnji Cooper# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25640235e2SEnji Cooper# POSSIBILITY OF SUCH DAMAGE.
26640235e2SEnji Cooper#
27640235e2SEnji Cooper
28640235e2SEnji CooperSOCKSRC=unix://commsock1
29640235e2SEnji CooperSOCKDST=unix://commsock2
30640235e2SEnji CooperIP4SRC=10.0.1.1
31640235e2SEnji CooperIP4DST=10.0.1.2
32640235e2SEnji CooperIP4DST_PROXYARP1=10.0.1.3
33640235e2SEnji CooperIP4DST_PROXYARP2=10.0.1.4
34640235e2SEnji Cooper
35*cdebaff8SEnji CooperDEBUG=${DEBUG:-false}
36640235e2SEnji CooperTIMEOUT=1
37640235e2SEnji Cooper
38640235e2SEnji Cooperatf_test_case arp_cache_expiration_5s cleanup
39640235e2SEnji Cooperatf_test_case arp_cache_expiration_10s cleanup
40640235e2SEnji Cooperatf_test_case arp_command cleanup
41640235e2SEnji Cooperatf_test_case arp_garp cleanup
42640235e2SEnji Cooperatf_test_case arp_cache_overwriting cleanup
43640235e2SEnji Cooperatf_test_case arp_proxy_arp_pub cleanup
44640235e2SEnji Cooperatf_test_case arp_proxy_arp_pubproxy cleanup
45640235e2SEnji Cooperatf_test_case arp_link_activation cleanup
46640235e2SEnji Cooperatf_test_case arp_static cleanup
47640235e2SEnji Cooper
48640235e2SEnji Cooperarp_cache_expiration_5s_head()
49640235e2SEnji Cooper{
50640235e2SEnji Cooper	atf_set "descr" "Tests for ARP cache expiration (5s)"
51640235e2SEnji Cooper	atf_set "require.progs" "rump_server"
52640235e2SEnji Cooper}
53640235e2SEnji Cooper
54640235e2SEnji Cooperarp_cache_expiration_10s_head()
55640235e2SEnji Cooper{
56640235e2SEnji Cooper	atf_set "descr" "Tests for ARP cache expiration (10s)"
57640235e2SEnji Cooper	atf_set "require.progs" "rump_server"
58640235e2SEnji Cooper}
59640235e2SEnji Cooper
60640235e2SEnji Cooperarp_command_head()
61640235e2SEnji Cooper{
62640235e2SEnji Cooper	atf_set "descr" "Tests for arp_commands of arp(8)"
63640235e2SEnji Cooper	atf_set "require.progs" "rump_server"
64640235e2SEnji Cooper}
65640235e2SEnji Cooper
66640235e2SEnji Cooperarp_garp_head()
67640235e2SEnji Cooper{
68640235e2SEnji Cooper	atf_set "descr" "Tests for GARP"
69640235e2SEnji Cooper	atf_set "require.progs" "rump_server"
70640235e2SEnji Cooper}
71640235e2SEnji Cooper
72640235e2SEnji Cooperarp_cache_overwriting_head()
73640235e2SEnji Cooper{
74640235e2SEnji Cooper	atf_set "descr" "Tests for behavior of overwriting ARP caches"
75640235e2SEnji Cooper	atf_set "require.progs" "rump_server"
76640235e2SEnji Cooper}
77640235e2SEnji Cooper
78640235e2SEnji Cooperarp_proxy_arp_pub_head()
79640235e2SEnji Cooper{
80640235e2SEnji Cooper	atf_set "descr" "Tests for Proxy ARP (pub)"
81640235e2SEnji Cooper	atf_set "require.progs" "rump_server"
82640235e2SEnji Cooper}
83640235e2SEnji Cooper
84640235e2SEnji Cooperarp_proxy_arp_pubproxy_head()
85640235e2SEnji Cooper{
86640235e2SEnji Cooper	atf_set "descr" "Tests for Proxy ARP (pub proxy)"
87640235e2SEnji Cooper	atf_set "require.progs" "rump_server"
88640235e2SEnji Cooper}
89640235e2SEnji Cooper
90640235e2SEnji Cooperarp_link_activation_head()
91640235e2SEnji Cooper{
92640235e2SEnji Cooper	atf_set "descr" "Tests for activating a new MAC address"
93640235e2SEnji Cooper	atf_set "require.progs" "rump_server"
94640235e2SEnji Cooper}
95640235e2SEnji Cooper
96640235e2SEnji Cooperarp_static_head()
97640235e2SEnji Cooper{
98640235e2SEnji Cooper
99640235e2SEnji Cooper	atf_set "descr" "Tests for static ARP entries"
100640235e2SEnji Cooper	atf_set "require.progs" "rump_server"
101640235e2SEnji Cooper}
102640235e2SEnji Cooper
103640235e2SEnji Coopersetup_dst_server()
104640235e2SEnji Cooper{
105*cdebaff8SEnji Cooper
106*cdebaff8SEnji Cooper	rump_server_add_iface $SOCKDST shmif0 bus1
107640235e2SEnji Cooper	export RUMP_SERVER=$SOCKDST
108640235e2SEnji Cooper	atf_check -s exit:0 rump.ifconfig shmif0 inet $IP4DST/24
109640235e2SEnji Cooper	atf_check -s exit:0 rump.ifconfig shmif0 up
110640235e2SEnji Cooper	atf_check -s exit:0 rump.ifconfig -w 10
111640235e2SEnji Cooper
112640235e2SEnji Cooper	$DEBUG && rump.ifconfig shmif0
113640235e2SEnji Cooper	$DEBUG && rump.arp -n -a
114640235e2SEnji Cooper}
115640235e2SEnji Cooper
116640235e2SEnji Coopersetup_src_server()
117640235e2SEnji Cooper{
118640235e2SEnji Cooper	local keep=$1
119640235e2SEnji Cooper
120640235e2SEnji Cooper	export RUMP_SERVER=$SOCKSRC
121640235e2SEnji Cooper
122640235e2SEnji Cooper	# Adjust ARP parameters
123640235e2SEnji Cooper	atf_check -s exit:0 -o ignore rump.sysctl -w net.inet.arp.keep=$keep
124640235e2SEnji Cooper
125640235e2SEnji Cooper	# Setup an interface
126*cdebaff8SEnji Cooper	rump_server_add_iface $SOCKSRC shmif0 bus1
127640235e2SEnji Cooper	atf_check -s exit:0 rump.ifconfig shmif0 inet $IP4SRC/24
128640235e2SEnji Cooper	atf_check -s exit:0 rump.ifconfig shmif0 up
129640235e2SEnji Cooper	atf_check -s exit:0 rump.ifconfig -w 10
130640235e2SEnji Cooper
131640235e2SEnji Cooper	# Sanity check
132640235e2SEnji Cooper	$DEBUG && rump.ifconfig shmif0
133640235e2SEnji Cooper	$DEBUG && rump.arp -n -a
134640235e2SEnji Cooper	atf_check -s exit:0 -o ignore rump.arp -n $IP4SRC
135640235e2SEnji Cooper	atf_check -s not-exit:0 -e ignore rump.arp -n $IP4DST
136640235e2SEnji Cooper}
137640235e2SEnji Cooper
138640235e2SEnji Coopertest_cache_expiration()
139640235e2SEnji Cooper{
140640235e2SEnji Cooper	local arp_keep=$1
141640235e2SEnji Cooper	local bonus=2
142640235e2SEnji Cooper
143*cdebaff8SEnji Cooper	rump_server_start $SOCKSRC
144*cdebaff8SEnji Cooper	rump_server_start $SOCKDST
145640235e2SEnji Cooper
146640235e2SEnji Cooper	setup_dst_server
147640235e2SEnji Cooper	setup_src_server $arp_keep
148640235e2SEnji Cooper
149640235e2SEnji Cooper	#
150640235e2SEnji Cooper	# Check if a cache is expired expectedly
151640235e2SEnji Cooper	#
152640235e2SEnji Cooper	export RUMP_SERVER=$SOCKSRC
153640235e2SEnji Cooper	atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 $IP4DST
154640235e2SEnji Cooper
155640235e2SEnji Cooper	$DEBUG && rump.arp -n -a
156640235e2SEnji Cooper	atf_check -s exit:0 -o ignore rump.arp -n $IP4SRC
157640235e2SEnji Cooper	# Should be cached
158640235e2SEnji Cooper	atf_check -s exit:0 -o ignore rump.arp -n $IP4DST
159640235e2SEnji Cooper
160640235e2SEnji Cooper	atf_check -s exit:0 sleep $(($arp_keep + $bonus))
161640235e2SEnji Cooper
162640235e2SEnji Cooper	$DEBUG && rump.arp -n -a
163640235e2SEnji Cooper	atf_check -s exit:0 -o ignore rump.arp -n $IP4SRC
164640235e2SEnji Cooper	# Should be expired
165640235e2SEnji Cooper	atf_check -s not-exit:0 -e ignore rump.arp -n $IP4DST
166640235e2SEnji Cooper}
167640235e2SEnji Cooper
168640235e2SEnji Cooperarp_cache_expiration_5s_body()
169640235e2SEnji Cooper{
170*cdebaff8SEnji Cooper
171640235e2SEnji Cooper	test_cache_expiration 5
172*cdebaff8SEnji Cooper	rump_server_destroy_ifaces
173640235e2SEnji Cooper}
174640235e2SEnji Cooper
175640235e2SEnji Cooperarp_cache_expiration_10s_body()
176640235e2SEnji Cooper{
177*cdebaff8SEnji Cooper
178640235e2SEnji Cooper	test_cache_expiration 10
179*cdebaff8SEnji Cooper	rump_server_destroy_ifaces
180640235e2SEnji Cooper}
181640235e2SEnji Cooper
182640235e2SEnji Cooperarp_command_body()
183640235e2SEnji Cooper{
184640235e2SEnji Cooper	local arp_keep=5
185640235e2SEnji Cooper	local bonus=2
186640235e2SEnji Cooper
187*cdebaff8SEnji Cooper	rump_server_start $SOCKSRC
188*cdebaff8SEnji Cooper	rump_server_start $SOCKDST
189640235e2SEnji Cooper
190640235e2SEnji Cooper	setup_dst_server
191640235e2SEnji Cooper	setup_src_server $arp_keep
192640235e2SEnji Cooper
193640235e2SEnji Cooper	export RUMP_SERVER=$SOCKSRC
194640235e2SEnji Cooper
195640235e2SEnji Cooper	# We can delete the entry for the interface's IP address
196640235e2SEnji Cooper	atf_check -s exit:0 -o ignore rump.arp -d $IP4SRC
197640235e2SEnji Cooper
198640235e2SEnji Cooper	# Add and delete a static entry
199640235e2SEnji Cooper	$DEBUG && rump.arp -n -a
200640235e2SEnji Cooper	atf_check -s exit:0 -o ignore rump.arp -s 10.0.1.10 b2:a0:20:00:00:10
201640235e2SEnji Cooper	$DEBUG && rump.arp -n -a
202640235e2SEnji Cooper	atf_check -s exit:0 -o match:'b2:a0:20:00:00:10' rump.arp -n 10.0.1.10
203640235e2SEnji Cooper	atf_check -s exit:0 -o match:'permanent' rump.arp -n 10.0.1.10
204640235e2SEnji Cooper	atf_check -s exit:0 -o ignore rump.arp -d 10.0.1.10
205640235e2SEnji Cooper	$DEBUG && rump.arp -n -a
206640235e2SEnji Cooper	atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.10
207640235e2SEnji Cooper
208640235e2SEnji Cooper	# Add multiple entries via a file
209640235e2SEnji Cooper	cat - > ./list <<-EOF
210640235e2SEnji Cooper	10.0.1.11 b2:a0:20:00:00:11
211640235e2SEnji Cooper	10.0.1.12 b2:a0:20:00:00:12
212640235e2SEnji Cooper	10.0.1.13 b2:a0:20:00:00:13
213640235e2SEnji Cooper	10.0.1.14 b2:a0:20:00:00:14
214640235e2SEnji Cooper	10.0.1.15 b2:a0:20:00:00:15
215640235e2SEnji Cooper	EOF
216640235e2SEnji Cooper	$DEBUG && rump.arp -n -a
217640235e2SEnji Cooper	atf_check -s exit:0 -o ignore rump.arp -f ./list
218640235e2SEnji Cooper	$DEBUG && rump.arp -n -a
219640235e2SEnji Cooper	atf_check -s exit:0 -o match:'b2:a0:20:00:00:11' rump.arp -n 10.0.1.11
220640235e2SEnji Cooper	atf_check -s exit:0 -o match:'permanent' rump.arp -n 10.0.1.11
221640235e2SEnji Cooper	atf_check -s exit:0 -o match:'b2:a0:20:00:00:12' rump.arp -n 10.0.1.12
222640235e2SEnji Cooper	atf_check -s exit:0 -o match:'permanent' rump.arp -n 10.0.1.12
223640235e2SEnji Cooper	atf_check -s exit:0 -o match:'b2:a0:20:00:00:13' rump.arp -n 10.0.1.13
224640235e2SEnji Cooper	atf_check -s exit:0 -o match:'permanent' rump.arp -n 10.0.1.13
225640235e2SEnji Cooper	atf_check -s exit:0 -o match:'b2:a0:20:00:00:14' rump.arp -n 10.0.1.14
226640235e2SEnji Cooper	atf_check -s exit:0 -o match:'permanent' rump.arp -n 10.0.1.14
227640235e2SEnji Cooper	atf_check -s exit:0 -o match:'b2:a0:20:00:00:15' rump.arp -n 10.0.1.15
228640235e2SEnji Cooper	atf_check -s exit:0 -o match:'permanent' rump.arp -n 10.0.1.15
229640235e2SEnji Cooper
230640235e2SEnji Cooper	# Test arp -a
231640235e2SEnji Cooper	atf_check -s exit:0 -o match:'10.0.1.11' rump.arp -n -a
232640235e2SEnji Cooper	atf_check -s exit:0 -o match:'10.0.1.12' rump.arp -n -a
233640235e2SEnji Cooper	atf_check -s exit:0 -o match:'10.0.1.13' rump.arp -n -a
234640235e2SEnji Cooper	atf_check -s exit:0 -o match:'10.0.1.14' rump.arp -n -a
235640235e2SEnji Cooper	atf_check -s exit:0 -o match:'10.0.1.15' rump.arp -n -a
236640235e2SEnji Cooper
237640235e2SEnji Cooper	# Flush all entries
238640235e2SEnji Cooper	$DEBUG && rump.arp -n -a
239640235e2SEnji Cooper	atf_check -s exit:0 -o ignore rump.arp -d -a
240640235e2SEnji Cooper	atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.11
241640235e2SEnji Cooper	atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.12
242640235e2SEnji Cooper	atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.13
243640235e2SEnji Cooper	atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.14
244640235e2SEnji Cooper	atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.15
245640235e2SEnji Cooper	atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.1
246640235e2SEnji Cooper
247640235e2SEnji Cooper	# Test temp option
248640235e2SEnji Cooper	$DEBUG && rump.arp -n -a
249640235e2SEnji Cooper	atf_check -s exit:0 -o ignore rump.arp -s 10.0.1.10 b2:a0:20:00:00:10 temp
250640235e2SEnji Cooper	$DEBUG && rump.arp -n -a
251640235e2SEnji Cooper	atf_check -s exit:0 -o match:'b2:a0:20:00:00:10' rump.arp -n 10.0.1.10
252640235e2SEnji Cooper	atf_check -s exit:0 -o not-match:'permanent' rump.arp -n 10.0.1.10
253640235e2SEnji Cooper
254640235e2SEnji Cooper	# Hm? the cache doesn't expire...
255640235e2SEnji Cooper	atf_check -s exit:0 sleep $(($arp_keep + $bonus))
256640235e2SEnji Cooper	$DEBUG && rump.arp -n -a
257640235e2SEnji Cooper	#atf_check -s not-exit:0 -e ignore rump.arp -n 10.0.1.10
258640235e2SEnji Cooper
259*cdebaff8SEnji Cooper	rump_server_destroy_ifaces
260640235e2SEnji Cooper}
261640235e2SEnji Cooper
262640235e2SEnji Coopermake_pkt_str_arpreq()
263640235e2SEnji Cooper{
264640235e2SEnji Cooper	local target=$1
265640235e2SEnji Cooper	local sender=$2
266640235e2SEnji Cooper	pkt="> ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42:"
267640235e2SEnji Cooper	pkt="$pkt Request who-has $target tell $sender, length 28"
268640235e2SEnji Cooper	echo $pkt
269640235e2SEnji Cooper}
270640235e2SEnji Cooper
271640235e2SEnji Cooperarp_garp_body()
272640235e2SEnji Cooper{
273640235e2SEnji Cooper	local pkt=
274640235e2SEnji Cooper
275*cdebaff8SEnji Cooper	rump_server_start $SOCKSRC
276*cdebaff8SEnji Cooper
277640235e2SEnji Cooper	export RUMP_SERVER=$SOCKSRC
278640235e2SEnji Cooper
279640235e2SEnji Cooper	# Setup an interface
280*cdebaff8SEnji Cooper	rump_server_add_iface $SOCKSRC shmif0 bus1
281640235e2SEnji Cooper	atf_check -s exit:0 rump.ifconfig shmif0 inet 10.0.0.1/24
282640235e2SEnji Cooper	atf_check -s exit:0 rump.ifconfig shmif0 inet 10.0.0.2/24 alias
283640235e2SEnji Cooper	atf_check -s exit:0 rump.ifconfig shmif0 up
284640235e2SEnji Cooper	$DEBUG && rump.ifconfig shmif0
285640235e2SEnji Cooper
286640235e2SEnji Cooper	atf_check -s exit:0 sleep 1
287640235e2SEnji Cooper	shmif_dumpbus -p - bus1 2>/dev/null| tcpdump -n -e -r - > ./out
288640235e2SEnji Cooper
289640235e2SEnji Cooper	# A GARP packet is sent for the primary address
290640235e2SEnji Cooper	pkt=$(make_pkt_str_arpreq 10.0.0.1 10.0.0.1)
291640235e2SEnji Cooper	atf_check -s exit:0 -x "cat ./out |grep -q '$pkt'"
292640235e2SEnji Cooper	# No GARP packet is sent for the alias address
293640235e2SEnji Cooper	pkt=$(make_pkt_str_arpreq 10.0.0.2 10.0.0.2)
294640235e2SEnji Cooper	atf_check -s not-exit:0 -x "cat ./out |grep -q '$pkt'"
295640235e2SEnji Cooper
296640235e2SEnji Cooper	atf_check -s exit:0 rump.ifconfig -w 10
297640235e2SEnji Cooper	atf_check -s exit:0 rump.ifconfig shmif0 inet 10.0.0.3/24
298640235e2SEnji Cooper	atf_check -s exit:0 rump.ifconfig shmif0 inet 10.0.0.4/24 alias
299640235e2SEnji Cooper
300640235e2SEnji Cooper	# No GARP packets are sent during IFF_UP
301640235e2SEnji Cooper	shmif_dumpbus -p - bus1 2>/dev/null| tcpdump -n -e -r - > ./out
302640235e2SEnji Cooper	pkt=$(make_pkt_str_arpreq 10.0.0.3 10.0.0.3)
303640235e2SEnji Cooper	atf_check -s not-exit:0 -x "cat ./out |grep -q '$pkt'"
304640235e2SEnji Cooper	pkt=$(make_pkt_str_arpreq 10.0.0.4 10.0.0.4)
305640235e2SEnji Cooper	atf_check -s not-exit:0 -x "cat ./out |grep -q '$pkt'"
306*cdebaff8SEnji Cooper
307*cdebaff8SEnji Cooper	rump_server_destroy_ifaces
308640235e2SEnji Cooper}
309640235e2SEnji Cooper
310640235e2SEnji Cooperarp_cache_overwriting_body()
311640235e2SEnji Cooper{
312640235e2SEnji Cooper	local arp_keep=5
313640235e2SEnji Cooper	local bonus=2
314640235e2SEnji Cooper
315*cdebaff8SEnji Cooper	rump_server_start $SOCKSRC
316*cdebaff8SEnji Cooper	rump_server_start $SOCKDST
317640235e2SEnji Cooper
318640235e2SEnji Cooper	setup_dst_server
319640235e2SEnji Cooper	setup_src_server $arp_keep
320640235e2SEnji Cooper
321640235e2SEnji Cooper	export RUMP_SERVER=$SOCKSRC
322640235e2SEnji Cooper
323640235e2SEnji Cooper	# Cannot overwrite a permanent cache
324640235e2SEnji Cooper	atf_check -s not-exit:0 -e match:'File exists' \
325640235e2SEnji Cooper	    rump.arp -s $IP4SRC b2:a0:20:00:00:ff
326640235e2SEnji Cooper	$DEBUG && rump.arp -n -a
327640235e2SEnji Cooper
328640235e2SEnji Cooper	atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 $IP4DST
329640235e2SEnji Cooper	$DEBUG && rump.arp -n -a
330640235e2SEnji Cooper	# Can overwrite a dynamic cache
331640235e2SEnji Cooper	atf_check -s exit:0 -o ignore rump.arp -s $IP4DST b2:a0:20:00:00:00
332640235e2SEnji Cooper	$DEBUG && rump.arp -n -a
333640235e2SEnji Cooper	atf_check -s exit:0 -o match:'b2:a0:20:00:00:00' rump.arp -n $IP4DST
334640235e2SEnji Cooper	atf_check -s exit:0 -o match:'permanent' rump.arp -n $IP4DST
335640235e2SEnji Cooper
336640235e2SEnji Cooper	atf_check -s exit:0 -o ignore rump.arp -s 10.0.1.10 b2:a0:20:00:00:10 temp
337640235e2SEnji Cooper	$DEBUG && rump.arp -n -a
338640235e2SEnji Cooper	atf_check -s exit:0 -o match:'b2:a0:20:00:00:10' rump.arp -n 10.0.1.10
339640235e2SEnji Cooper	atf_check -s exit:0 -o not-match:'permanent' rump.arp -n 10.0.1.10
340640235e2SEnji Cooper	# Can overwrite a temp cache
341640235e2SEnji Cooper	atf_check -s exit:0 -o ignore rump.arp -s 10.0.1.10 b2:a0:20:00:00:ff
342640235e2SEnji Cooper	atf_check -s exit:0 -o match:'b2:a0:20:00:00:ff' rump.arp -n 10.0.1.10
343640235e2SEnji Cooper	$DEBUG && rump.arp -n -a
344640235e2SEnji Cooper
345*cdebaff8SEnji Cooper	rump_server_destroy_ifaces
346640235e2SEnji Cooper}
347640235e2SEnji Cooper
348640235e2SEnji Coopermake_pkt_str_arprep()
349640235e2SEnji Cooper{
350640235e2SEnji Cooper	local ip=$1
351640235e2SEnji Cooper	local mac=$2
352640235e2SEnji Cooper	pkt="ethertype ARP (0x0806), length 42: "
353640235e2SEnji Cooper	pkt="Reply $ip is-at $mac, length 28"
354640235e2SEnji Cooper	echo $pkt
355640235e2SEnji Cooper}
356640235e2SEnji Cooper
357640235e2SEnji Coopermake_pkt_str_garp()
358640235e2SEnji Cooper{
359640235e2SEnji Cooper	local ip=$1
360640235e2SEnji Cooper	local mac=$2
361640235e2SEnji Cooper	local pkt=
362640235e2SEnji Cooper	pkt="$mac > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806),"
363640235e2SEnji Cooper	pkt="$pkt length 42: Request who-has $ip tell $ip, length 28"
364640235e2SEnji Cooper	echo $pkt
365640235e2SEnji Cooper}
366640235e2SEnji Cooper
367640235e2SEnji Coopertest_proxy_arp()
368640235e2SEnji Cooper{
369640235e2SEnji Cooper	local arp_keep=5
370640235e2SEnji Cooper	local opts= title= flags=
371640235e2SEnji Cooper	local type=$1
372640235e2SEnji Cooper
373*cdebaff8SEnji Cooper	rump_server_start $SOCKSRC
374*cdebaff8SEnji Cooper	rump_server_start $SOCKDST tap
375640235e2SEnji Cooper
376640235e2SEnji Cooper	setup_dst_server
377640235e2SEnji Cooper	setup_src_server $arp_keep
378640235e2SEnji Cooper
379640235e2SEnji Cooper	export RUMP_SERVER=$SOCKDST
380640235e2SEnji Cooper	atf_check -s exit:0 -o ignore rump.sysctl -w net.inet.ip.forwarding=1
381*cdebaff8SEnji Cooper	macaddr_dst=$(get_macaddr $SOCKDST shmif0)
382640235e2SEnji Cooper
383640235e2SEnji Cooper	if [ "$type" = "pub" ]; then
384640235e2SEnji Cooper		opts="pub"
385640235e2SEnji Cooper		title="permanent published"
386640235e2SEnji Cooper	else
387640235e2SEnji Cooper		opts="pub proxy"
388640235e2SEnji Cooper		title='permanent published \(proxy only\)'
389640235e2SEnji Cooper	fi
390640235e2SEnji Cooper
391640235e2SEnji Cooper	#
392640235e2SEnji Cooper	# Test#1: First setup an endpoint then create proxy arp entry
393640235e2SEnji Cooper	#
394640235e2SEnji Cooper	export RUMP_SERVER=$SOCKDST
395640235e2SEnji Cooper	atf_check -s exit:0 rump.ifconfig tap1 create
396640235e2SEnji Cooper	atf_check -s exit:0 rump.ifconfig tap1 $IP4DST_PROXYARP1/24 up
397640235e2SEnji Cooper	atf_check -s exit:0 rump.ifconfig -w 10
398640235e2SEnji Cooper
399640235e2SEnji Cooper	# Try to ping (should fail w/o proxy arp)
400640235e2SEnji Cooper	export RUMP_SERVER=$SOCKSRC
401640235e2SEnji Cooper	atf_check -s not-exit:0 -o ignore -e ignore \
402640235e2SEnji Cooper	    rump.ping -n -w 1 -c 1 $IP4DST_PROXYARP1
403640235e2SEnji Cooper
404640235e2SEnji Cooper	# Flushing
405*cdebaff8SEnji Cooper	extract_new_packets bus1 > ./out
406640235e2SEnji Cooper
407640235e2SEnji Cooper	# Set up proxy ARP entry
408640235e2SEnji Cooper	export RUMP_SERVER=$SOCKDST
409640235e2SEnji Cooper	atf_check -s exit:0 -o ignore \
410640235e2SEnji Cooper	    rump.arp -s $IP4DST_PROXYARP1 $macaddr_dst $opts
411640235e2SEnji Cooper	atf_check -s exit:0 -o match:"$title" rump.arp -n $IP4DST_PROXYARP1
412640235e2SEnji Cooper
413640235e2SEnji Cooper	# Try to ping
414640235e2SEnji Cooper	export RUMP_SERVER=$SOCKSRC
415640235e2SEnji Cooper	if [ "$type" = "pub" ]; then
416640235e2SEnji Cooper		# XXX fails
417640235e2SEnji Cooper		atf_check -s not-exit:0 -o ignore -e ignore \
418640235e2SEnji Cooper		    rump.ping -n -w 1 -c 1 $IP4DST_PROXYARP1
419640235e2SEnji Cooper	else
420640235e2SEnji Cooper		atf_check -s exit:0 -o ignore \
421640235e2SEnji Cooper		    rump.ping -n -w 1 -c 1 $IP4DST_PROXYARP1
422640235e2SEnji Cooper	fi
423640235e2SEnji Cooper
424*cdebaff8SEnji Cooper	extract_new_packets bus1 > ./out
425640235e2SEnji Cooper	$DEBUG && cat ./out
426640235e2SEnji Cooper
427640235e2SEnji Cooper	pkt1=$(make_pkt_str_arprep $IP4DST_PROXYARP1 $macaddr_dst)
428640235e2SEnji Cooper	pkt2=$(make_pkt_str_garp $IP4DST_PROXYARP1 $macaddr_dst)
429640235e2SEnji Cooper	if [ "$type" = "pub" ]; then
430640235e2SEnji Cooper		atf_check -s not-exit:0 -x \
431640235e2SEnji Cooper		    "cat ./out |grep -q -e '$pkt1' -e '$pkt2'"
432640235e2SEnji Cooper	else
433640235e2SEnji Cooper		atf_check -s exit:0 -x "cat ./out |grep -q -e '$pkt1' -e '$pkt2'"
434640235e2SEnji Cooper	fi
435640235e2SEnji Cooper
436640235e2SEnji Cooper	#
437640235e2SEnji Cooper	# Test#2: Create proxy arp entry then set up an endpoint
438640235e2SEnji Cooper	#
439640235e2SEnji Cooper	export RUMP_SERVER=$SOCKDST
440640235e2SEnji Cooper	atf_check -s exit:0 -o ignore \
441640235e2SEnji Cooper	    rump.arp -s $IP4DST_PROXYARP2 $macaddr_dst $opts
442640235e2SEnji Cooper	atf_check -s exit:0 -o match:"$title" rump.arp -n $IP4DST_PROXYARP2
443640235e2SEnji Cooper	$DEBUG && rump.netstat -nr -f inet
444640235e2SEnji Cooper
445640235e2SEnji Cooper	# Try to ping (should fail because no endpoint exists)
446640235e2SEnji Cooper	export RUMP_SERVER=$SOCKSRC
447640235e2SEnji Cooper	atf_check -s not-exit:0 -o ignore -e ignore \
448640235e2SEnji Cooper	    rump.ping -n -w 1 -c 1 $IP4DST_PROXYARP2
449640235e2SEnji Cooper
450*cdebaff8SEnji Cooper	extract_new_packets bus1 > ./out
451640235e2SEnji Cooper	$DEBUG && cat ./out
452640235e2SEnji Cooper
453640235e2SEnji Cooper	# ARP reply should be sent
454640235e2SEnji Cooper	pkt=$(make_pkt_str_arprep $IP4DST_PROXYARP2 $macaddr_dst)
455640235e2SEnji Cooper	atf_check -s exit:0 -x "cat ./out |grep -q '$pkt'"
456640235e2SEnji Cooper
457640235e2SEnji Cooper	export RUMP_SERVER=$SOCKDST
458640235e2SEnji Cooper	atf_check -s exit:0 rump.ifconfig tap2 create
459640235e2SEnji Cooper	atf_check -s exit:0 rump.ifconfig tap2 $IP4DST_PROXYARP2/24 up
460640235e2SEnji Cooper	atf_check -s exit:0 rump.ifconfig -w 10
461640235e2SEnji Cooper
462640235e2SEnji Cooper	# Try to ping
463640235e2SEnji Cooper	export RUMP_SERVER=$SOCKSRC
464640235e2SEnji Cooper	atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 $IP4DST_PROXYARP2
465640235e2SEnji Cooper}
466640235e2SEnji Cooper
467640235e2SEnji Cooperarp_proxy_arp_pub_body()
468640235e2SEnji Cooper{
469640235e2SEnji Cooper
470640235e2SEnji Cooper	test_proxy_arp pub
471*cdebaff8SEnji Cooper	rump_server_destroy_ifaces
472640235e2SEnji Cooper}
473640235e2SEnji Cooper
474640235e2SEnji Cooperarp_proxy_arp_pubproxy_body()
475640235e2SEnji Cooper{
476640235e2SEnji Cooper
477640235e2SEnji Cooper	test_proxy_arp pubproxy
478*cdebaff8SEnji Cooper	rump_server_destroy_ifaces
479640235e2SEnji Cooper}
480640235e2SEnji Cooper
481640235e2SEnji Cooperarp_link_activation_body()
482640235e2SEnji Cooper{
483640235e2SEnji Cooper	local arp_keep=5
484640235e2SEnji Cooper	local bonus=2
485640235e2SEnji Cooper
486*cdebaff8SEnji Cooper	rump_server_start $SOCKSRC
487*cdebaff8SEnji Cooper	rump_server_start $SOCKDST
488640235e2SEnji Cooper
489640235e2SEnji Cooper	setup_dst_server
490640235e2SEnji Cooper	setup_src_server $arp_keep
491640235e2SEnji Cooper
492640235e2SEnji Cooper	# flush old packets
493*cdebaff8SEnji Cooper	extract_new_packets bus1 > ./out
494640235e2SEnji Cooper
495640235e2SEnji Cooper	export RUMP_SERVER=$SOCKSRC
496640235e2SEnji Cooper
497640235e2SEnji Cooper	atf_check -s exit:0 -o ignore rump.ifconfig shmif0 link \
498640235e2SEnji Cooper	    b2:a1:00:00:00:01
499640235e2SEnji Cooper
500640235e2SEnji Cooper	atf_check -s exit:0 sleep 1
501*cdebaff8SEnji Cooper	extract_new_packets bus1 > ./out
502640235e2SEnji Cooper	$DEBUG && cat ./out
503640235e2SEnji Cooper
504640235e2SEnji Cooper	pkt=$(make_pkt_str_arpreq $IP4SRC $IP4SRC)
505640235e2SEnji Cooper	atf_check -s not-exit:0 -x "cat ./out |grep -q '$pkt'"
506640235e2SEnji Cooper
507640235e2SEnji Cooper	atf_check -s exit:0 -o ignore rump.ifconfig shmif0 link \
508640235e2SEnji Cooper	    b2:a1:00:00:00:02 active
509640235e2SEnji Cooper
510640235e2SEnji Cooper	atf_check -s exit:0 sleep 1
511*cdebaff8SEnji Cooper	extract_new_packets bus1 > ./out
512640235e2SEnji Cooper	$DEBUG && cat ./out
513640235e2SEnji Cooper
514640235e2SEnji Cooper	pkt=$(make_pkt_str_arpreq $IP4SRC $IP4SRC)
515640235e2SEnji Cooper	atf_check -s exit:0 -x \
516640235e2SEnji Cooper	    "cat ./out |grep '$pkt' |grep -q 'b2:a1:00:00:00:02'"
517*cdebaff8SEnji Cooper
518*cdebaff8SEnji Cooper	rump_server_destroy_ifaces
519640235e2SEnji Cooper}
520640235e2SEnji Cooper
521640235e2SEnji Cooperarp_static_body()
522640235e2SEnji Cooper{
523640235e2SEnji Cooper	local arp_keep=5
524640235e2SEnji Cooper	local macaddr_src=
525640235e2SEnji Cooper
526*cdebaff8SEnji Cooper	rump_server_start $SOCKSRC
527*cdebaff8SEnji Cooper	rump_server_start $SOCKDST
528640235e2SEnji Cooper
529640235e2SEnji Cooper	setup_dst_server
530640235e2SEnji Cooper	setup_src_server $arp_keep
531640235e2SEnji Cooper
532*cdebaff8SEnji Cooper	macaddr_src=$(get_macaddr $SOCKSRC shmif0)
533640235e2SEnji Cooper
534640235e2SEnji Cooper	# Set a (valid) static ARP entry for the src server
535640235e2SEnji Cooper	export RUMP_SERVER=$SOCKDST
536640235e2SEnji Cooper	$DEBUG && rump.arp -n -a
537640235e2SEnji Cooper	atf_check -s exit:0 -o ignore rump.arp -s $IP4SRC $macaddr_src
538640235e2SEnji Cooper	$DEBUG && rump.arp -n -a
539640235e2SEnji Cooper
540640235e2SEnji Cooper	# Test receiving an ARP request with the static ARP entry (as spa/sha)
541640235e2SEnji Cooper	export RUMP_SERVER=$SOCKSRC
542640235e2SEnji Cooper	atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 $IP4DST
543640235e2SEnji Cooper
544*cdebaff8SEnji Cooper	rump_server_destroy_ifaces
545640235e2SEnji Cooper}
546640235e2SEnji Cooper
547640235e2SEnji Cooperarp_cache_expiration_5s_cleanup()
548640235e2SEnji Cooper{
549640235e2SEnji Cooper	$DEBUG && dump
550640235e2SEnji Cooper	cleanup
551640235e2SEnji Cooper}
552640235e2SEnji Cooper
553640235e2SEnji Cooperarp_cache_expiration_10s_cleanup()
554640235e2SEnji Cooper{
555640235e2SEnji Cooper	$DEBUG && dump
556640235e2SEnji Cooper	cleanup
557640235e2SEnji Cooper}
558640235e2SEnji Cooper
559640235e2SEnji Cooperarp_command_cleanup()
560640235e2SEnji Cooper{
561640235e2SEnji Cooper	$DEBUG && dump
562640235e2SEnji Cooper	cleanup
563640235e2SEnji Cooper}
564640235e2SEnji Cooper
565640235e2SEnji Cooperarp_garp_cleanup()
566640235e2SEnji Cooper{
567*cdebaff8SEnji Cooper	$DEBUG && dump
568*cdebaff8SEnji Cooper	cleanup
569640235e2SEnji Cooper}
570640235e2SEnji Cooper
571640235e2SEnji Cooperarp_cache_overwriting_cleanup()
572640235e2SEnji Cooper{
573640235e2SEnji Cooper	$DEBUG && dump
574640235e2SEnji Cooper	cleanup
575640235e2SEnji Cooper}
576640235e2SEnji Cooper
577640235e2SEnji Cooperarp_proxy_arp_pub_cleanup()
578640235e2SEnji Cooper{
579640235e2SEnji Cooper	$DEBUG && dump
580640235e2SEnji Cooper	cleanup
581640235e2SEnji Cooper}
582640235e2SEnji Cooper
583640235e2SEnji Cooperarp_proxy_arp_pubproxy_cleanup()
584640235e2SEnji Cooper{
585640235e2SEnji Cooper	$DEBUG && dump
586640235e2SEnji Cooper	cleanup
587640235e2SEnji Cooper}
588640235e2SEnji Cooper
589640235e2SEnji Cooperarp_link_activation_cleanup()
590640235e2SEnji Cooper{
591640235e2SEnji Cooper	$DEBUG && dump
592640235e2SEnji Cooper	cleanup
593640235e2SEnji Cooper}
594640235e2SEnji Cooper
595640235e2SEnji Cooperarp_static_cleanup()
596640235e2SEnji Cooper{
597640235e2SEnji Cooper	$DEBUG && dump
598640235e2SEnji Cooper	cleanup
599640235e2SEnji Cooper}
600640235e2SEnji Cooper
601640235e2SEnji Cooperatf_init_test_cases()
602640235e2SEnji Cooper{
603640235e2SEnji Cooper	atf_add_test_case arp_cache_expiration_5s
604640235e2SEnji Cooper	atf_add_test_case arp_cache_expiration_10s
605640235e2SEnji Cooper	atf_add_test_case arp_command
606640235e2SEnji Cooper	atf_add_test_case arp_garp
607640235e2SEnji Cooper	atf_add_test_case arp_cache_overwriting
608640235e2SEnji Cooper	atf_add_test_case arp_proxy_arp_pub
609640235e2SEnji Cooper	atf_add_test_case arp_proxy_arp_pubproxy
610640235e2SEnji Cooper	atf_add_test_case arp_link_activation
611640235e2SEnji Cooper	atf_add_test_case arp_static
612640235e2SEnji Cooper}
613